diff --git a/.patch-version b/.patch-version index d00491fd7..0cfbf0888 100644 --- a/.patch-version +++ b/.patch-version @@ -1 +1 @@ -1 +2 diff --git a/dist/133.48263fce9542c3e0b864.css b/dist/133.f7b0e36077dea7bb93a4.css similarity index 99% rename from dist/133.48263fce9542c3e0b864.css rename to dist/133.f7b0e36077dea7bb93a4.css index 7cb8321dc..8d800d40b 100644 --- a/dist/133.48263fce9542c3e0b864.css +++ b/dist/133.f7b0e36077dea7bb93a4.css @@ -3,4 +3,4 @@ .CropModal .modal-dialog{width:calc(100% - 2rem);max-width:35rem;height:calc(100% - 1rem);max-height:35rem;position:relative}.CropModal .modal-content,.CropModal #avatar-crop{overflow:hidden}.CropModal .confirm-button{position:absolute;bottom:1rem;right:1rem;box-shadow:0 1px 2px var(--color-default-shadow)}.CropModal #avatar-crop{max-width:25rem;margin:0 auto;position:relative}.CropModal #avatar-crop::before{content:"";display:block;padding-top:100%}.CropModal #avatar-crop .cr-boundary{position:absolute;top:0;left:0;border-radius:var(--border-radius-messages-small)}.CropModal #avatar-crop .cr-viewport{border:none;box-shadow:0 0 2000px 2000px rgba(255,255,255,.5)}.CropModal #avatar-crop .cr-slider::-webkit-slider-runnable-track{background:var(--color-borders)}.CropModal #avatar-crop .cr-slider::-moz-range-track{background:var(--color-borders)}.CropModal #avatar-crop .cr-slider::-ms-track{background:var(--color-borders)}.CropModal #avatar-crop .cr-slider::-webkit-slider-thumb{background:var(--color-primary);cursor:pointer;transform:scale(1);-webkit-transition:transform .25s ease-in-out;transition:transform .25s ease-in-out}.CropModal #avatar-crop .cr-slider::-webkit-slider-thumb:hover{transform:scale(1.2)}.CropModal #avatar-crop .cr-slider::-moz-range-thumb{background:var(--color-primary);cursor:pointer;transform:scale(1);-moz-transition:transform .25s ease-in-out;transition:transform .25s ease-in-out}.CropModal #avatar-crop .cr-slider::-moz-range-thumb:hover{transform:scale(1.2)}.CropModal #avatar-crop .cr-slider::-ms-thumb{background:var(--color-primary);cursor:pointer;transform:scale(1);-ms-transition:transform .25s ease-in-out;transition:transform .25s ease-in-out}.CropModal #avatar-crop .cr-slider::-ms-thumb:hover{transform:scale(1.2)} .AvatarEditable label{margin-left:auto;margin-right:auto;width:7.5rem;height:7.5rem;margin-bottom:2rem;display:flex !important;align-items:center;justify-content:center;background-color:var(--color-primary);border-radius:50%;color:#fff;font-size:3rem;cursor:pointer;position:relative;overflow:hidden;outline:none !important}.AvatarEditable label input{display:none}.AvatarEditable label img{position:absolute;top:0;left:0;width:100%;height:100%}.AvatarEditable label i{transform:scale(1);transition:transform .15s linear;z-index:var(--z-register-add-avatar)}.Transition>div:not(.active) .AvatarEditable label input,.Transition>div:not(.active) .AvatarEditable label i,.Transition>div:not(.active) .AvatarEditable label::after,body.animating-right-column .AvatarEditable label input,body.animating-right-column .AvatarEditable label i,body.animating-right-column .AvatarEditable label::after{display:none !important}.Transition>div:not(.active) .AvatarEditable label img,body.animating-right-column .AvatarEditable label img{position:static !important}.AvatarEditable label:hover i{transform:scale(1.2)}.AvatarEditable label.filled{background-color:var(--color-background)}.AvatarEditable label.filled::after{content:"";display:block;position:absolute;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,.4)}.AvatarEditable label.disabled{pointer-events:none}.AvatarEditable label.disabled i{display:none}.AvatarEditable label.disabled::after{display:none} -/*# sourceMappingURL=133.48263fce9542c3e0b864.css.map*/ \ No newline at end of file +/*# sourceMappingURL=133.f7b0e36077dea7bb93a4.css.map*/ \ No newline at end of file diff --git a/dist/133.48263fce9542c3e0b864.css.map b/dist/133.f7b0e36077dea7bb93a4.css.map similarity index 99% rename from dist/133.48263fce9542c3e0b864.css.map rename to dist/133.f7b0e36077dea7bb93a4.css.map index 071c7ca66..6f63b6b98 100644 --- a/dist/133.48263fce9542c3e0b864.css.map +++ b/dist/133.f7b0e36077dea7bb93a4.css.map @@ -1 +1 @@ -{"version":3,"file":"133.48263fce9542c3e0b864.css","mappings":"AAAA,QACE,kBACA,cACA,iBACA,kBACA,aACA,cACA,sBAEA,gDATF,QAUI,YACA,aACA,sBAGF,YACE,YACA,aAGF,yBACE,kBACA,OACA,MACA,WACA,YAEA,gCACE,aAIJ,wBACE,WACA,YACA,qBACA,wD;ACpCJ,OACE,kBACA,uBAGE,4IACE,gBAKF,gCACE,gBAKF,4BACE,gBAKF,4BACE,gBAIJ,wBACE,eACA,MACA,SACA,OACA,QACA,aACA,uBACA,mBAGF,uBACE,eACA,MACA,QACA,SACA,OACA,WACA,iCAGF,4CACE,6BAGF,qBACE,kBACA,oBACA,sBACA,WACA,gBACA,kBACA,iBACA,yCACA,8DACA,2CACA,mCAEA,+CAEA,4CACE,gBACA,0BAGF,yBApBF,qBAqBI,yCAIJ,0BACE,+BAGF,6BACE,kCAGF,oDACE,oBACA,aACA,mBACA,cAGF,oBACE,kBACA,gBACA,cACA,gBACA,uBAEA,qCACE,mBAIJ,+BAEE,4CAEA,oDACE,kBACA,eACA,WACA,qBACA,iBACA,qBACA,sBACA,eAIJ,sBACE,WACA,YACA,aACA,gBAEA,qDAEE,sBAIJ,kEAGE,uBACA,mBAGF,uBACE,aACA,qBAEA,qEACE,iBAIJ,8BACE,WACA,YACA,iBACA,iBACA,gBACA,qB;AC/IF,yBACE,wBACA,gBACA,yBACA,iBACA,kBAGF,kDACE,gBAGF,2BACE,kBACA,YACA,WACA,iDAGF,wBACE,gBACA,cACA,kBAEA,gCACE,WACA,cACA,iBAGF,qCACE,kBACA,MACA,OACA,kDAGF,qCACE,YACA,kDAOA,kEACE,gCAGF,qDACE,gCAGF,8CACE,gCAGF,yDArEJ,gCACA,eACA,mBACA,oFAEA,+DACE,qBAmEE,qDAzEJ,gCACA,eACA,mBACA,iFAEA,2DACE,qBAuEE,8CA7EJ,gCACA,eACA,mBACA,gFAEA,oDACE,qB;ACJF,sBACE,iBACA,kBACA,aACA,cACA,mBACA,wBACA,mBACA,uBACA,sCACA,kBACA,WACA,eACA,eACA,kBACA,gBACA,wBAEA,4BACE,aAGF,0BACE,kBACA,MACA,OACA,WACA,YAGF,wBACE,mBACA,iCACA,qCAKA,6UACE,wBAGF,6GACE,2BAKF,8BACE,qBAIJ,6BACE,yCAEA,oCACE,WACA,cACA,kBACA,OACA,MACA,WACA,YACA,gCAIJ,+BACE,oBAEA,iCACE,aAGF,sCACE,a","sources":["webpack://telegram-t/./src/components/common/PasswordMonkey.scss","webpack://telegram-t/./src/components/ui/Modal.scss","webpack://telegram-t/./src/components/ui/CropModal.scss","webpack://telegram-t/./src/components/ui/AvatarEditable.scss"],"sourcesContent":["#monkey {\n position: relative;\n display: block;\n margin-left: auto;\n margin-right: auto;\n width: 7.5rem;\n height: 7.5rem;\n margin-bottom: 1.75rem;\n\n @media (min-width: 600px) and (min-height: 450px) {\n width: 10rem;\n height: 10rem;\n margin-bottom: 2.5rem;\n }\n\n &.big {\n width: 10rem;\n height: 10rem;\n }\n\n .AnimatedSticker {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n\n &.hidden {\n display: none\n }\n }\n\n .monkey-preview {\n width: 100%;\n height: 100%;\n background-size: 100%;\n background: url('../../assets/monkey.svg') center;\n }\n}\n",".Modal {\n position: relative;\n z-index: var(--z-modal);\n\n &.delete, &.error, &.confirm, &.pin, &.unpin-all {\n .modal-dialog {\n max-width: 23rem;\n }\n }\n\n &.error {\n .modal-content > div {\n margin-top: 1rem;\n }\n }\n\n &.narrow {\n .modal-dialog {\n max-width: 20rem;\n }\n }\n\n &.report {\n .modal-dialog {\n max-width: 15rem;\n }\n }\n\n .modal-container {\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n .modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n background-color: rgba(0, 0, 0, .25);\n }\n\n &.transparent-backdrop .modal-backdrop {\n background-color: transparent;\n }\n\n .modal-dialog {\n position: relative;\n display: inline-flex;\n flex-direction: column;\n width: 100%;\n max-width: 35rem;\n min-width: 17.5rem;\n margin: 2rem auto;\n background-color: var(--color-background);\n box-shadow: 0 .25rem .5rem .125rem var(--color-default-shadow);\n border-radius: var(--border-radius-default);\n transform: translate3d(0, -1rem, 0);\n\n transition: transform .2s ease, opacity .2s ease;\n\n body.animation-level-0 & {\n transition: none;\n transform: none !important;\n }\n\n @media (max-width: 450px) {\n max-width: calc(100vw - 3rem) !important;\n }\n }\n\n &.open .modal-dialog {\n transform: translate3d(0, 0, 0);\n }\n\n &.closing .modal-dialog {\n transform: translate3d(0, 1rem, 0);\n }\n\n .modal-header {\n padding: 1rem 1rem 0;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n }\n\n .modal-title {\n font-size: 1.25rem;\n font-weight: 500;\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:not(:only-child) {\n margin: 0 1.3125rem;\n }\n }\n\n .modal-header-condensed {\n @extend .modal-header;\n padding: .5rem 1.25rem 0 .9375rem !important;\n\n .modal-action-button {\n font-size: 0.875rem;\n height: 2.25rem;\n width: auto;\n line-height: 1.625rem;\n margin-left: auto;\n padding-left: 1.25rem;\n padding-right: 1.25rem;\n min-width: 5rem;\n }\n }\n\n .modal-content {\n width: 100%;\n flex-grow: 1;\n padding: 1rem;\n overflow-y: auto;\n\n b,\n strong {\n word-break: break-word;\n }\n }\n\n .modal-title,\n .modal-content,\n .modal-content > p {\n unicode-bidi: plaintext;\n text-align: initial;\n }\n\n .dialog-buttons {\n display: flex;\n align-items: flex-end;\n\n .confirm-dialog-button + .confirm-dialog-button {\n margin-left: 1rem;\n }\n }\n\n .confirm-dialog-button {\n width: auto;\n height: auto;\n margin-left: auto;\n text-align: right;\n font-weight: 500;\n white-space: pre-wrap;\n }\n}\n","@mixin thumb-styles() {\n background: var(--color-primary);\n cursor: pointer;\n transform: scale(1);\n transition: transform .25s ease-in-out;\n\n &:hover {\n transform: scale(1.2);\n }\n}\n\n.CropModal {\n .modal-dialog {\n width: calc(100% - 2rem);\n max-width: 35rem;\n height: calc(100% - 1rem);\n max-height: 35rem;\n position: relative;\n }\n\n .modal-content, #avatar-crop {\n overflow: hidden;\n }\n\n .confirm-button {\n position: absolute;\n bottom: 1rem;\n right: 1rem;\n box-shadow: 0 1px 2px var(--color-default-shadow);\n }\n\n #avatar-crop {\n max-width: 25rem;\n margin: 0 auto;\n position: relative;\n\n &::before {\n content: '';\n display: block;\n padding-top: 100%;\n }\n\n .cr-boundary {\n position: absolute;\n top: 0;\n left: 0;\n border-radius: var(--border-radius-messages-small);\n }\n\n .cr-viewport {\n border: none;\n box-shadow: 0 0 2000px 2000px rgba(white, 0.5);\n }\n\n .cr-slider {\n // Note that while we're repeating code here, that's necessary as you can't comma-separate these type of selectors.\n // Browsers will drop the entire selector if it doesn't understand a part of it.\n\n &::-webkit-slider-runnable-track {\n background: var(--color-borders);\n }\n\n &::-moz-range-track {\n background: var(--color-borders);\n }\n\n &::-ms-track {\n background: var(--color-borders);\n }\n\n &::-webkit-slider-thumb {\n @include thumb-styles();\n }\n\n &::-moz-range-thumb {\n @include thumb-styles();\n }\n\n &::-ms-thumb {\n @include thumb-styles();\n }\n }\n }\n}\n","@import '../../styles/mixins';\n\n.AvatarEditable {\n label {\n margin-left: auto;\n margin-right: auto;\n width: 7.5rem;\n height: 7.5rem;\n margin-bottom: 2rem;\n display: flex !important;\n align-items: center;\n justify-content: center;\n background-color: var(--color-primary);\n border-radius: 50%;\n color: white;\n font-size: 3rem;\n cursor: pointer;\n position: relative;\n overflow: hidden;\n outline: none !important;\n\n input {\n display: none;\n }\n\n img {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n\n i {\n transform: scale(1);\n transition: transform .15s linear;\n z-index: var(--z-register-add-avatar);\n }\n\n // @optimization The weirdest workaround for screen animation lag\n @include while-transition() {\n input, i, &::after {\n display: none !important;\n }\n\n img {\n position: static !important;\n }\n }\n\n &:hover {\n i {\n transform: scale(1.2);\n }\n }\n\n &.filled {\n background-color: var(--color-background);\n\n &::after {\n content: '';\n display: block;\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(black, 0.4);\n }\n }\n\n &.disabled {\n pointer-events: none;\n\n i {\n display: none;\n }\n\n &::after {\n display: none;\n }\n }\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"133.f7b0e36077dea7bb93a4.css","mappings":"AAAA,QACE,kBACA,cACA,iBACA,kBACA,aACA,cACA,sBAEA,gDATF,QAUI,YACA,aACA,sBAGF,YACE,YACA,aAGF,yBACE,kBACA,OACA,MACA,WACA,YAEA,gCACE,aAIJ,wBACE,WACA,YACA,qBACA,wD;ACpCJ,OACE,kBACA,uBAGE,4IACE,gBAKF,gCACE,gBAKF,4BACE,gBAKF,4BACE,gBAIJ,wBACE,eACA,MACA,SACA,OACA,QACA,aACA,uBACA,mBAGF,uBACE,eACA,MACA,QACA,SACA,OACA,WACA,iCAGF,4CACE,6BAGF,qBACE,kBACA,oBACA,sBACA,WACA,gBACA,kBACA,iBACA,yCACA,8DACA,2CACA,mCAEA,+CAEA,4CACE,gBACA,0BAGF,yBApBF,qBAqBI,yCAIJ,0BACE,+BAGF,6BACE,kCAGF,oDACE,oBACA,aACA,mBACA,cAGF,oBACE,kBACA,gBACA,cACA,gBACA,uBAEA,qCACE,mBAIJ,+BAEE,4CAEA,oDACE,kBACA,eACA,WACA,qBACA,iBACA,qBACA,sBACA,eAIJ,sBACE,WACA,YACA,aACA,gBAEA,qDAEE,sBAIJ,kEAGE,uBACA,mBAGF,uBACE,aACA,qBAEA,qEACE,iBAIJ,8BACE,WACA,YACA,iBACA,iBACA,gBACA,qB;AC/IF,yBACE,wBACA,gBACA,yBACA,iBACA,kBAGF,kDACE,gBAGF,2BACE,kBACA,YACA,WACA,iDAGF,wBACE,gBACA,cACA,kBAEA,gCACE,WACA,cACA,iBAGF,qCACE,kBACA,MACA,OACA,kDAGF,qCACE,YACA,kDAOA,kEACE,gCAGF,qDACE,gCAGF,8CACE,gCAGF,yDArEJ,gCACA,eACA,mBACA,oFAEA,+DACE,qBAmEE,qDAzEJ,gCACA,eACA,mBACA,iFAEA,2DACE,qBAuEE,8CA7EJ,gCACA,eACA,mBACA,gFAEA,oDACE,qB;ACJF,sBACE,iBACA,kBACA,aACA,cACA,mBACA,wBACA,mBACA,uBACA,sCACA,kBACA,WACA,eACA,eACA,kBACA,gBACA,wBAEA,4BACE,aAGF,0BACE,kBACA,MACA,OACA,WACA,YAGF,wBACE,mBACA,iCACA,qCAKA,6UACE,wBAGF,6GACE,2BAKF,8BACE,qBAIJ,6BACE,yCAEA,oCACE,WACA,cACA,kBACA,OACA,MACA,WACA,YACA,gCAIJ,+BACE,oBAEA,iCACE,aAGF,sCACE,a","sources":["webpack://telegram-t/./src/components/common/PasswordMonkey.scss","webpack://telegram-t/./src/components/ui/Modal.scss","webpack://telegram-t/./src/components/ui/CropModal.scss","webpack://telegram-t/./src/components/ui/AvatarEditable.scss"],"sourcesContent":["#monkey {\n position: relative;\n display: block;\n margin-left: auto;\n margin-right: auto;\n width: 7.5rem;\n height: 7.5rem;\n margin-bottom: 1.75rem;\n\n @media (min-width: 600px) and (min-height: 450px) {\n width: 10rem;\n height: 10rem;\n margin-bottom: 2.5rem;\n }\n\n &.big {\n width: 10rem;\n height: 10rem;\n }\n\n .AnimatedSticker {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n\n &.hidden {\n display: none\n }\n }\n\n .monkey-preview {\n width: 100%;\n height: 100%;\n background-size: 100%;\n background: url('../../assets/monkey.svg') center;\n }\n}\n",".Modal {\n position: relative;\n z-index: var(--z-modal);\n\n &.delete, &.error, &.confirm, &.pin, &.unpin-all {\n .modal-dialog {\n max-width: 23rem;\n }\n }\n\n &.error {\n .modal-content > div {\n margin-top: 1rem;\n }\n }\n\n &.narrow {\n .modal-dialog {\n max-width: 20rem;\n }\n }\n\n &.report {\n .modal-dialog {\n max-width: 15rem;\n }\n }\n\n .modal-container {\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n .modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n background-color: rgba(0, 0, 0, .25);\n }\n\n &.transparent-backdrop .modal-backdrop {\n background-color: transparent;\n }\n\n .modal-dialog {\n position: relative;\n display: inline-flex;\n flex-direction: column;\n width: 100%;\n max-width: 35rem;\n min-width: 17.5rem;\n margin: 2rem auto;\n background-color: var(--color-background);\n box-shadow: 0 .25rem .5rem .125rem var(--color-default-shadow);\n border-radius: var(--border-radius-default);\n transform: translate3d(0, -1rem, 0);\n\n transition: transform .2s ease, opacity .2s ease;\n\n body.animation-level-0 & {\n transition: none;\n transform: none !important;\n }\n\n @media (max-width: 450px) {\n max-width: calc(100vw - 3rem) !important;\n }\n }\n\n &.open .modal-dialog {\n transform: translate3d(0, 0, 0);\n }\n\n &.closing .modal-dialog {\n transform: translate3d(0, 1rem, 0);\n }\n\n .modal-header {\n padding: 1rem 1rem 0;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n }\n\n .modal-title {\n font-size: 1.25rem;\n font-weight: 500;\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:not(:only-child) {\n margin: 0 1.3125rem;\n }\n }\n\n .modal-header-condensed {\n @extend .modal-header;\n padding: .5rem 1.25rem 0 .9375rem !important;\n\n .modal-action-button {\n font-size: 0.875rem;\n height: 2.25rem;\n width: auto;\n line-height: 1.625rem;\n margin-left: auto;\n padding-left: 1.25rem;\n padding-right: 1.25rem;\n min-width: 5rem;\n }\n }\n\n .modal-content {\n width: 100%;\n flex-grow: 1;\n padding: 1rem;\n overflow-y: auto;\n\n b,\n strong {\n word-break: break-word;\n }\n }\n\n .modal-title,\n .modal-content,\n .modal-content > p {\n unicode-bidi: plaintext;\n text-align: initial;\n }\n\n .dialog-buttons {\n display: flex;\n align-items: flex-end;\n\n .confirm-dialog-button + .confirm-dialog-button {\n margin-left: 1rem;\n }\n }\n\n .confirm-dialog-button {\n width: auto;\n height: auto;\n margin-left: auto;\n text-align: right;\n font-weight: 500;\n white-space: pre-wrap;\n }\n}\n","@mixin thumb-styles() {\n background: var(--color-primary);\n cursor: pointer;\n transform: scale(1);\n transition: transform .25s ease-in-out;\n\n &:hover {\n transform: scale(1.2);\n }\n}\n\n.CropModal {\n .modal-dialog {\n width: calc(100% - 2rem);\n max-width: 35rem;\n height: calc(100% - 1rem);\n max-height: 35rem;\n position: relative;\n }\n\n .modal-content, #avatar-crop {\n overflow: hidden;\n }\n\n .confirm-button {\n position: absolute;\n bottom: 1rem;\n right: 1rem;\n box-shadow: 0 1px 2px var(--color-default-shadow);\n }\n\n #avatar-crop {\n max-width: 25rem;\n margin: 0 auto;\n position: relative;\n\n &::before {\n content: '';\n display: block;\n padding-top: 100%;\n }\n\n .cr-boundary {\n position: absolute;\n top: 0;\n left: 0;\n border-radius: var(--border-radius-messages-small);\n }\n\n .cr-viewport {\n border: none;\n box-shadow: 0 0 2000px 2000px rgba(white, 0.5);\n }\n\n .cr-slider {\n // Note that while we're repeating code here, that's necessary as you can't comma-separate these type of selectors.\n // Browsers will drop the entire selector if it doesn't understand a part of it.\n\n &::-webkit-slider-runnable-track {\n background: var(--color-borders);\n }\n\n &::-moz-range-track {\n background: var(--color-borders);\n }\n\n &::-ms-track {\n background: var(--color-borders);\n }\n\n &::-webkit-slider-thumb {\n @include thumb-styles();\n }\n\n &::-moz-range-thumb {\n @include thumb-styles();\n }\n\n &::-ms-thumb {\n @include thumb-styles();\n }\n }\n }\n}\n","@import '../../styles/mixins';\n\n.AvatarEditable {\n label {\n margin-left: auto;\n margin-right: auto;\n width: 7.5rem;\n height: 7.5rem;\n margin-bottom: 2rem;\n display: flex !important;\n align-items: center;\n justify-content: center;\n background-color: var(--color-primary);\n border-radius: 50%;\n color: white;\n font-size: 3rem;\n cursor: pointer;\n position: relative;\n overflow: hidden;\n outline: none !important;\n\n input {\n display: none;\n }\n\n img {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n\n i {\n transform: scale(1);\n transition: transform .15s linear;\n z-index: var(--z-register-add-avatar);\n }\n\n // @optimization The weirdest workaround for screen animation lag\n @include while-transition() {\n input, i, &::after {\n display: none !important;\n }\n\n img {\n position: static !important;\n }\n }\n\n &:hover {\n i {\n transform: scale(1.2);\n }\n }\n\n &.filled {\n background-color: var(--color-background);\n\n &::after {\n content: '';\n display: block;\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(black, 0.4);\n }\n }\n\n &.disabled {\n pointer-events: none;\n\n i {\n display: none;\n }\n\n &::after {\n display: none;\n }\n }\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/dist/133.48263fce9542c3e0b864.js b/dist/133.f7b0e36077dea7bb93a4.js similarity index 99% rename from dist/133.48263fce9542c3e0b864.js rename to dist/133.f7b0e36077dea7bb93a4.js index 122ad2d50..c33c7c471 100644 --- a/dist/133.48263fce9542c3e0b864.js +++ b/dist/133.f7b0e36077dea7bb93a4.js @@ -1,2 +1,2 @@ "use strict";(self.webpackChunktelegram_t=self.webpackChunktelegram_t||[]).push([[133],{1133:(e,t,n)=>{n.r(t),n.d(t,{AuthCode:()=>f,AuthPassword:()=>E,AuthRegister:()=>w});var a=n(4050),o=n(5116),r=n(7361),s=n(782),i=n(2340),l=n(6590),c=n(9107),d=n(7687),u=n(4288),m=n(3716),p=n(7324),h=n(7799);const g=r.wB?m.qp:m.z7,Z=(0,a.X$)((({code:e,codeLength:t,trackingDirection:n,isTracking:o,isBig:r})=>{const[s,i]=(0,a.eJ)(),[l,c]=(0,a.eJ)(),[d,u]=(0,a.eJ)(!1),Z=165/t;(0,a.d4)((()=>{s||(0,p.Z)("MonkeyIdle").then(i)}),[s]),(0,a.d4)((()=>{l||(0,p.Z)("MonkeyTracking").then(c)}),[l]);const f=(0,a.I4)((()=>u(!0)),[]);return a.ZP.createElement("div",{id:"monkey",className:r?"big":""},!d&&a.ZP.createElement("div",{className:"monkey-preview"}),s&&a.ZP.createElement(h.Z,{id:"idleMonkey",size:r?m.K2:g,className:o?"hidden":void 0,animationData:s,play:!o,onLoad:f}),l&&a.ZP.createElement(h.Z,{id:"trackingMonkey",size:r?m.K2:g,className:o?"shown":"hidden",animationData:l,playSegment:o?function(){const a=e&&e.length>1||n<0?15+Z*(e.length-1):0,o=e.length===t?180:15+Z*e.length;return n<1?[o,a]:[a,o]}():void 0,speed:2,noLoop:!0}))})),f=(0,a.X$)((0,o.c$)((e=>(0,s.ei)(e,["authPhoneNumber","authIsCodeViaApp","authIsLoading","authError"])),((e,t)=>(0,s.ei)(t,["setAuthCode","returnToAuthPhoneNumber","clearAuthError"])))((({authPhoneNumber:e,authIsCodeViaApp:t,authIsLoading:n,authError:o,setAuthCode:s,returnToAuthPhoneNumber:m,clearAuthError:p})=>{const h=(0,c.Z)(),g=(0,a.sO)(null),[f,P]=(0,a.eJ)(""),[v,E]=(0,a.eJ)(!1),[b,y]=(0,a.eJ)(1);(0,a.d4)((()=>{r.$b||g.current.focus()}),[]),(0,l.ZP)(!0,m);const w=(0,a.I4)((e=>{o&&p();const{currentTarget:t}=e;t.value=t.value.replace(/[^\d]+/,"").substr(0,5),t.value!==f&&(P(t.value),v?t.value.length||E(!1):E(!0),f&&f.length>t.value.length?y(-1):y(1),5===t.value.length&&s({code:t.value}))}),[o,p,f,v,s]);return a.ZP.createElement("div",{id:"auth-code-form",className:"custom-scroll"},a.ZP.createElement("div",{className:"auth-form"},a.ZP.createElement(Z,{code:f,codeLength:5,isTracking:v,trackingDirection:b}),a.ZP.createElement("h2",null,e,a.ZP.createElement("div",{className:"auth-number-edit",onClick:m,role:"button",tabIndex:0,title:h("WrongNumber")},a.ZP.createElement("i",{className:"icon-edit"}))),a.ZP.createElement("p",{className:"note"},(0,i.Z)(h(t?"SentAppCode":"Login.JustSentSms"),["simple_markdown"])),a.ZP.createElement(d.Z,{ref:g,id:"sign-in-code",label:h("Code"),onInput:w,value:f,error:o&&h(o),autoComplete:"one-time-code",inputMode:"numeric"}),n&&a.ZP.createElement(u.Z,null)))})));var P=n(3490),v=n(9364);const E=(0,a.X$)((0,o.c$)((e=>(0,s.ei)(e,["authIsLoading","authError","authHint"])),((e,t)=>(0,s.ei)(t,["setAuthPassword","clearAuthError"])))((({authIsLoading:e,authError:t,authHint:n,setAuthPassword:o,clearAuthError:r})=>{const s=(0,c.Z)(),[i,l]=(0,a.eJ)(!1),d=(0,a.I4)((e=>{l(e)}),[]),u=(0,a.I4)((e=>{o({password:e})}),[o]);return a.ZP.createElement("div",{id:"auth-password-form",className:"custom-scroll"},a.ZP.createElement("div",{className:"auth-form"},a.ZP.createElement(P.Z,{isPasswordVisible:i}),a.ZP.createElement("h2",null,s("Login.Header.Password")),a.ZP.createElement("p",{className:"note"},s("Login.EnterPasswordDescription")),a.ZP.createElement(v.Z,{clearError:r,error:t&&s(t),hint:n,isLoading:e,isPasswordVisible:i,onChangePasswordVisibility:d,onSubmit:u})))})));var b=n(231),y=n(710);const w=(0,a.X$)((0,o.c$)((e=>(0,s.ei)(e,["authIsLoading","authError"])),((e,t)=>(0,s.ei)(t,["signUp","clearAuthError","uploadProfilePhoto"])))((({authIsLoading:e,authError:t,signUp:n,clearAuthError:o,uploadProfilePhoto:r})=>{const s=(0,c.Z)(),[i,l]=(0,a.eJ)(!1),[u,m]=(0,a.eJ)(),[p,h]=(0,a.eJ)(""),[g,Z]=(0,a.eJ)("");return a.ZP.createElement("div",{id:"auth-registration-form",className:"custom-scroll"},a.ZP.createElement("div",{className:"auth-form"},a.ZP.createElement("form",{action:"",method:"post",onSubmit:function(e){e.preventDefault(),n({firstName:p,lastName:g}),u&&r({file:u})}},a.ZP.createElement(y.Z,{onChange:m}),a.ZP.createElement("h2",null,s("YourName")),a.ZP.createElement("p",{className:"note"},s("Login.Register.Desc")),a.ZP.createElement(d.Z,{id:"registration-first-name",label:s("Login.Register.FirstName.Placeholder"),onChange:function(e){t&&o();const{target:n}=e;h(n.value),l(n.value.length>0)},value:p,error:t&&s(t),autoComplete:"given-name"}),a.ZP.createElement(d.Z,{id:"registration-last-name",label:s("Login.Register.LastName.Placeholder"),onChange:function(e){const{target:t}=e;Z(t.value)},value:g,autoComplete:"family-name"}),i&&a.ZP.createElement(b.Z,{type:"submit",ripple:!0,isLoading:e},s("Next")))))})))},7799:(e,t,n)=>{n.d(t,{Z:()=>u});var a=n(4050),o=n(9118),r=n(6752),s=n(8674),i=n(5332);let l,c;async function d(){return l||(l=n.e(941).then(n.bind(n,7941)),c=(await l).default),l}setTimeout(d,5e3);const u=(0,a.X$)((({className:e,id:t,animationData:n,play:l,playSegment:u,speed:m,noLoop:p,size:h,quality:g,isLowPriority:Z,onLoad:f,color:P})=>{const[v,E]=(0,a.eJ)(),b=(0,a.sO)(null),y=(0,a.sO)(!1),w=(0,a.sO)(!1),k=(0,a.sO)();k.current=l;const N=(0,a.sO)();N.current=u,(0,a.d4)((()=>{if(v||!n)return;const e=()=>{if(!b.current)return;const e=new c(t,b.current,n,{noLoop:p,size:h,quality:g,isLowPriority:Z},f,P);m&&e.setSpeed(m),E(e)};c?e():d().then((()=>{(0,o.T2)((()=>{b.current&&e()}))}))}),[P,v,n,t,Z,p,f,g,h,m]),(0,a.d4)((()=>{v&&v.setColor(P)}),[P,v]),(0,a.d4)((()=>()=>{v&&v.destroy()}),[v]);const C=(0,a.I4)(((e=!1)=>{v&&(k.current||N.current)&&(N.current?v.playSegment(N.current):e?v.goToAndPlay(0):v.play())}),[v]),L=(0,a.I4)((()=>{v&&v.pause()}),[v]),A=(0,a.I4)((()=>{w.current=!0,v&&(y.current||(y.current=v.isPlaying()),L())}),[v,L]),I=(0,a.I4)((()=>{y.current&&C(),y.current=!1,w.current=!1}),[C]),x=(0,a.I4)((()=>{(0,o.T2)(I)}),[I]);(0,a.d4)((()=>{v&&(l||u?w.current?y.current=!0:C(p):w.current?y.current=!1:L())}),[v,l,u,p,C,L]),(0,a.d4)((()=>{v&&(v.changeData(n),C())}),[C,v,n]),(0,s.ZP)(A,I),(0,i.Z)(A,x);const M=(0,r.Z)("AnimatedSticker",e),S=h?`width: ${h}px; height: ${h}px;`:void 0;return a.ZP.createElement("div",{ref:b,className:M,style:S})}))},9364:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(4050),o=n(3716),r=n(7361),s=n(6752),i=n(9107),l=n(231);const c=r.wB?550:400,d=(0,a.X$)((({isLoading:e=!1,isPasswordVisible:t,error:n,hint:d,placeholder:u="Password",submitLabel:m="Next",clearError:p,onChangePasswordVisibility:h,onInputChange:g,onSubmit:Z})=>{const f=(0,a.sO)(null),P=(0,i.Z)(),[v,E]=(0,a.eJ)(""),[b,y]=(0,a.eJ)(!1);return(0,a.d4)((()=>{r.$b||setTimeout((()=>{f.current.focus()}),c)}),[]),(0,a.d4)((()=>{n&&requestAnimationFrame((()=>{f.current.focus(),f.current.select()}))}),[n]),a.ZP.createElement("form",{action:"",onSubmit:function(t){t.preventDefault(),e||b&&Z(v)},autoComplete:"off"},a.ZP.createElement("div",{className:(0,s.Z)("input-group password-input",v&&"touched",n&&"error"),dir:P.isRtl?"rtl":void 0},a.ZP.createElement("input",{ref:f,className:"form-control",type:t?"text":"password",id:"sign-in-password",value:v||"",autoComplete:"current-password",onChange:function(e){n&&p();const{target:t}=e;E(t.value),y(t.value.length>=o.lo),g&&g(t.value)},dir:"auto"}),a.ZP.createElement("label",null,n||d||u),a.ZP.createElement("div",{className:"toggle-password",onClick:function(){h(!t)},role:"button",tabIndex:0,title:"Toggle password visibility"},a.ZP.createElement("i",{className:t?"icon-eye":"icon-eye-closed"}))),b&&a.ZP.createElement(l.Z,{type:"submit",ripple:!0,isLoading:e},m))}))},3490:(e,t,n)=>{n.d(t,{Z:()=>m});var a=n(4050),o=n(3716),r=n(7361),s=n(7324),i=n(7799);const l=[0,50],c=[0,20],d=[20,0],u=r.wB?o.qp:o.z7,m=(0,a.X$)((({isPasswordVisible:e,isBig:t})=>{const[n,r]=(0,a.eJ)(),[m,p]=(0,a.eJ)(),[h,g]=(0,a.eJ)(!1),[Z,f]=(0,a.eJ)(!1);(0,a.d4)((()=>{n?setTimeout((()=>f(!0)),2e3):(0,s.Z)("MonkeyClose").then(r)}),[n]),(0,a.d4)((()=>{m||(0,s.Z)("MonkeyPeek").then(p)}),[m]);const P=(0,a.I4)((()=>g(!0)),[]);return a.ZP.createElement("div",{id:"monkey",className:t?"big":""},!h&&a.ZP.createElement("div",{className:"monkey-preview"}),n&&a.ZP.createElement(i.Z,{id:"closeMonkey",size:t?o.K2:u,className:Z?"hidden":"shown",animationData:n,playSegment:l,noLoop:!0,onLoad:P}),m&&a.ZP.createElement(i.Z,{id:"peekMonkey",size:t?o.K2:u,className:Z?"shown":"hidden",animationData:m,playSegment:e?c:d,noLoop:!0}))}))},7324:(e,t,n)=>{n.d(t,{Z:()=>s});var a=n(6137),o=n(647);const r={MonkeyIdle:n(1679),MonkeyTracking:n(4889),MonkeyClose:n(4185),MonkeyPeek:n(8431),FoldersAll:n(6041),FoldersNew:n(7196),DiscussionGroups:n(4349),CameraFlip:n(6280),HandFilled:n(9129),HandOutline:n(1039),Speaker:n(9261),VoiceAllowTalk:n(2873),VoiceMini:n(7242),VoiceMuted:n(1274),VoiceOutlined:n(973)};function s(e){const t=r[e].replace(window.location.origin,"");return o.he(`file${t}`,a.IU.Lottie)}},710:(e,t,n)=>{n.d(t,{Z:()=>Z});var a=n(4050),o=n(6752),r=n(3716),s=n(1394),i=n(9107),l=n(231),c=n(3103),d=n(4288);const u={type:"blob",quality:1,format:"jpeg",circle:!1};let m,p,h;const g=(0,a.X$)((({file:e,onChange:t,onClose:o})=>{const[g,Z]=(0,a.eJ)(!1);(0,a.d4)((()=>{e&&(g?async function(e){try{const t=document.getElementById("avatar-crop");if(!t)return;const{offsetWidth:n,offsetHeight:a}=t;h=new m(t,{enableZoom:!0,boundary:{width:n,height:a},viewport:{width:n-16,height:a-16,type:"circle"}});const o=await(0,s.YJ)(e);await h.bind({url:o})}catch(e){r.eM&&console.error(e)}}(e):async function(){return p||(p=Promise.all([n.e(99),n.e(472)]).then(n.bind(n,3472)),m=(await p).default),p}().then((()=>Z(!0))))}),[e,g]);const f=(0,i.Z)();return a.ZP.createElement(c.Z,{isOpen:Boolean(e),onClose:o,title:"Drag to reposition",className:"CropModal",hasCloseButton:!0},g?a.ZP.createElement("div",{id:"avatar-crop"}):a.ZP.createElement(d.Z,null),a.ZP.createElement(l.Z,{className:"confirm-button",round:!0,color:"primary",onClick:async function(){if(!h)return;const e=await h.result(u),n="string"==typeof e?e:(0,s.hl)(e,"avatar.jpg");t(n)},ariaLabel:f("CropImage")},a.ZP.createElement("i",{className:"icon-check"})))})),Z=(0,a.X$)((({title:e="Change your profile picture",disabled:t,currentAvatarBlobUrl:n,onChange:r})=>{const[s,i]=(0,a.eJ)(),[l,c]=(0,a.eJ)(n);(0,a.d4)((()=>{c(n)}),[n]);const d=(0,o.Z)(l&&"filled",t&&"disabled");return a.ZP.createElement("div",{className:"AvatarEditable"},a.ZP.createElement("label",{className:d,role:"button",tabIndex:0,title:e},a.ZP.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"}),a.ZP.createElement("i",{className:"icon-camera-add"}),l&&a.ZP.createElement("img",{src:l,alt:"Avatar"})),a.ZP.createElement(g,{file:s,onClose:function(){i(void 0)},onChange:function(e){i(void 0),r(e),l&&URL.revokeObjectURL(l),c(URL.createObjectURL(e))}}))}))},3103:(e,t,n)=>{n.d(t,{Z:()=>p});var a=n(4050),o=n(517),r=n(6752),s=n(8674),i=n(1212),l=n(274),c=n(9107),d=n(6590),u=n(231),m=n(2898);const p=({dialogRef:e,title:t,className:n,isOpen:p,header:h,hasCloseButton:g,noBackdrop:Z,children:f,onClose:P,onCloseAnimationEnd:v,onEnter:E,shouldSkipHistoryAnimations:b})=>{const{shouldRender:y,transitionClassNames:w}=(0,i.Z)(p,v,b,void 0,b),k=(0,a.sO)(null);(0,a.d4)((()=>p?(0,o.Z)({onEsc:P,onEnter:E}):void 0),[p,P,E]),(0,a.d4)((()=>p&&k.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 o=0;a>=0&&(o=t.shiftKey?a>0?a-1:n.length-1:a{document.removeEventListener("keydown",t,!1)}}(k.current):void 0),[p]);const{forceClose:N}=(0,d.ZP)(p,P);(0,a.d4)((()=>()=>{p&&N()}),[]),(0,l.Z)((([e])=>(document.body.classList.toggle("has-open-dialog",p),(p||!p&&void 0!==e)&&(0,s.YW)(200),()=>{document.body.classList.remove("has-open-dialog")})),[p]);const C=(0,c.Z)();if(!y)return;const L=(0,r.Z)("Modal",n,w,Z&&"transparent-backdrop");return a.ZP.createElement(m.Z,null,a.ZP.createElement("div",{ref:k,className:L,tabIndex:-1,role:"dialog"},a.ZP.createElement("div",{className:"modal-container"},a.ZP.createElement("div",{className:"modal-backdrop",onClick:P}),a.ZP.createElement("div",{className:"modal-dialog",ref:e},h||(t?a.ZP.createElement("div",{className:"modal-header"},g&&a.ZP.createElement(u.Z,{round:!0,color:"translucent",size:"smaller",ariaLabel:C("Close"),onClick:P},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement("div",{className:"modal-title"},t)):void 0),a.ZP.createElement("div",{className:"modal-content custom-scroll"},f)))))}},2898:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(4050),o=n(2916);const r=({containerId:e,className:t,children:n})=>{const r=(0,a.sO)();return r.current||(r.current=document.createElement("div")),(0,a.bt)((()=>{const n=document.querySelector(e||"#portals");if(!n)return;const a=r.current;return t&&a.classList.add(t),n.appendChild(a),()=>{o.Z.render(void 0,a),n.removeChild(a)}}),[t,e]),o.Z.render(n,r.current)}},5332:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(4050);function o(e,t){(0,a.d4)((()=>(e&&!document.hasFocus()&&e(),e&&window.addEventListener("blur",e),t&&window.addEventListener("focus",t),()=>{t&&window.removeEventListener("focus",t),e&&window.removeEventListener("blur",e)})),[e,t])}},4349:(e,t,n)=>{e.exports=n.p+"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a..tgs"},6041:(e,t,n)=>{e.exports=n.p+"FoldersAll.3f9f9e243d19f0fbf9aa..tgs"},7196:(e,t,n)=>{e.exports=n.p+"FoldersNew.9a40d71c0c8be70f5bd1..tgs"},4185:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3e..tgs"},1679:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab..tgs"},8431:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyPeek.1905436b042520363d7e..tgs"},4889:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12..tgs"},6280:(e,t,n)=>{e.exports=n.p+"CameraFlip.1a9fe44cf01fcb22347d..tgs"},9129:(e,t,n)=>{e.exports=n.p+"HandFilled.f87939d160f1dc288586..tgs"},1039:(e,t,n)=>{e.exports=n.p+"HandOutline.f9831751ba60df30c484..tgs"},9261:(e,t,n)=>{e.exports=n.p+"Speaker.04bb3743412b41ff83c5..tgs"},2873:(e,t,n)=>{e.exports=n.p+"VoiceAllowTalk.a9cc7c39ec438973ddc9..tgs"},7242:(e,t,n)=>{e.exports=n.p+"VoiceMini.bf00ffdf69625c579569..tgs"},1274:(e,t,n)=>{e.exports=n.p+"VoiceMuted.a4b4ec6bfd7c6c5fb275..tgs"},973:(e,t,n)=>{e.exports=n.p+"VoiceOutlined.91b394ab3562cdfad6bc..tgs"}}]); -//# sourceMappingURL=133.48263fce9542c3e0b864.js.map \ No newline at end of file +//# sourceMappingURL=133.f7b0e36077dea7bb93a4.js.map \ No newline at end of file diff --git a/dist/133.48263fce9542c3e0b864.js.map b/dist/133.f7b0e36077dea7bb93a4.js.map similarity index 99% rename from dist/133.48263fce9542c3e0b864.js.map rename to dist/133.f7b0e36077dea7bb93a4.js.map index 90558232b..2d834c8ba 100644 --- a/dist/133.48263fce9542c3e0b864.js.map +++ b/dist/133.f7b0e36077dea7bb93a4.js.map @@ -1 +1 @@ -{"version":3,"file":"133.48263fce9542c3e0b864.js","mappings":"uSAoBA,MAEMA,EAAeC,EAAAA,GAA0BC,EAAAA,GAA2BC,EAAAA,GA+E1E,GAAeC,EAAAA,EAAAA,KA7EsB,EACnCC,KAAAA,EACAC,WAAAA,EACAC,kBAAAA,EACAC,WAAAA,EACAC,MAAAA,MAEA,MAAOC,EAAgBC,IAAqBC,EAAAA,EAAAA,OACrCC,EAAoBC,IAAyBF,EAAAA,EAAAA,OAC7CG,EAAqBC,IAA0BJ,EAAAA,EAAAA,KAAS,GACzDK,EAA6B,IAA8CX,GAEjFY,EAAAA,EAAAA,KAAU,KACHR,IACHS,EAAAA,EAAAA,GAAiB,cAAcC,KAAKT,KAErC,CAACD,KAEJQ,EAAAA,EAAAA,KAAU,KACHL,IACHM,EAAAA,EAAAA,GAAiB,kBAAkBC,KAAKN,KAEzC,CAACD,IAEJ,MAAMQ,GAAwBC,EAAAA,EAAAA,KAAY,IAAMN,GAAuB,IAAO,IAuB9E,OACE,0BAAKO,GAAG,SAASC,UAAWf,EAAQ,MAAQ,KACxCM,GACA,0BAAKS,UAAU,mBAEhBd,GACC,mBAACe,EAAA,EAAD,CACEF,GAAG,aACHG,KAAMjB,EAAQkB,EAAAA,GAAsB3B,EACpCwB,UAAWhB,EAAa,cAAWoB,EACnCC,cAAenB,EACfoB,MAAOtB,EACPuB,OAAQV,IAGXR,GACC,mBAACY,EAAA,EAAD,CACEF,GAAG,iBACHG,KAAMjB,EAAQkB,EAAAA,GAAsB3B,EACpCwB,UAAYhB,EAAwB,QAAX,SACzBqB,cAAehB,EACfmB,YAAaxB,EA1CrB,WACE,MAAMyB,EAAc5B,GAAQA,EAAK6B,OAAS,GAAM3B,EAAoB,EA/B3C,GAgCEU,GAA8BZ,EAAK6B,OAAS,GACnE,EACEC,EAAW9B,EAAK6B,SAAW5B,EAjCV,IADE,GAoCEW,EAA6BZ,EAAK6B,OAE7D,OAAI3B,EAAoB,EACf,CACL4B,EACAF,GAIG,CACLA,EACAE,GAyB8BC,QAAsBR,EAChDS,MAAO,EACPC,QAAM,QC0BhB,GAAelC,EAAAA,EAAAA,KAAKmC,EAAAA,EAAAA,KACjBC,IAAuBC,EAAAA,EAAAA,IAAKD,EAAQ,CAAC,kBAAmB,mBAAoB,gBAAiB,gBAC9F,CAACE,EAAWC,KAA2BF,EAAAA,EAAAA,IAAKE,EAAS,CACnD,cACA,0BACA,oBALgBJ,EAhG6B,EAC/CK,gBAAAA,EACAC,iBAAAA,EACAC,cAAAA,EACAC,UAAAA,EACAC,YAAAA,EACAC,wBAAAA,EACAC,eAAAA,MAEA,MAAMC,GAAOC,EAAAA,EAAAA,KAEPC,GAAWC,EAAAA,EAAAA,IAAyB,OAEnCjD,EAAMkD,IAAW3C,EAAAA,EAAAA,IAAiB,KAClCJ,EAAYgD,IAAiB5C,EAAAA,EAAAA,KAAS,IACtCL,EAAmBkD,IAAwB7C,EAAAA,EAAAA,IAAS,IAE3DM,EAAAA,EAAAA,KAAU,KACHwC,EAAAA,IACHL,EAASM,QAASC,UAEnB,KAEHC,EAAAA,EAAAA,KAAe,EAAMZ,GAErB,MAAMa,GAAexC,EAAAA,EAAAA,KAAayC,IAC5BhB,GACFG,IAGF,MAAQc,cAAeC,GAAWF,EAClCE,EAAOC,MAAQD,EAAOC,MAAMC,QAAQ,SAAU,IAAIC,OAAO,EAjCzC,GAmCZH,EAAOC,QAAU7D,IAIrBkD,EAAQU,EAAOC,OAEV1D,EAEOyD,EAAOC,MAAMhC,QACvBsB,GAAc,GAFdA,GAAc,GAKZnD,GAAQA,EAAK6B,OAAS+B,EAAOC,MAAMhC,OACrCuB,GAAsB,GAEtBA,EAAqB,GAlDP,IAqDZQ,EAAOC,MAAMhC,QACfc,EAAY,CAAE3C,KAAM4D,EAAOC,WAE5B,CAACnB,EAAWG,EAAgB7C,EAAMG,EAAYwC,IAEjD,OACE,0BAAKzB,GAAG,iBAAiBC,UAAU,iBACjC,0BAAKA,UAAU,aACb,mBAAC,EAAD,CACEnB,KAAMA,EACNC,WA/DU,EAgEVE,WAAYA,EACZD,kBAAmBA,IAErB,6BACGqC,EACD,0BACEpB,UAAU,mBACV6C,QAASpB,EACTqB,KAAK,SACLC,SAAU,EACVC,MAAOrB,EAAK,gBAEZ,wBAAG3B,UAAU,gBAGjB,wBAAGA,UAAU,SACViD,EAAAA,EAAAA,GAAWtB,EAAKN,EAAmB,cAAgB,qBAAsB,CAAC,qBAE7E,mBAAC6B,EAAA,EAAD,CACEC,IAAKtB,EACL9B,GAAG,eACHqD,MAAOzB,EAAK,QACZ0B,QAASf,EACTI,MAAO7D,EACPyE,MAAO/B,GAAaI,EAAKJ,GACzBgC,aAAa,gBACbC,UAAU,YAEXlC,GAAiB,mBAACmC,EAAA,EAAD,Y,wBClG1B,MAkCA,GAAe7E,EAAAA,EAAAA,KAAKmC,EAAAA,EAAAA,KACjBC,IAAuBC,EAAAA,EAAAA,IAAKD,EAAQ,CAAC,gBAAiB,YAAa,eACpE,CAACE,EAAWC,KAA2BF,EAAAA,EAAAA,IAAKE,EAAS,CAAC,kBAAmB,oBAFvDJ,EAlCiC,EACnDO,cAAAA,EAAeC,UAAAA,EAAWmC,SAAAA,EAAUC,gBAAAA,EAAiBjC,eAAAA,MAErD,MAAMC,GAAOC,EAAAA,EAAAA,MACNgC,EAAcC,IAAmBzE,EAAAA,EAAAA,KAAS,GAE3C0E,GAAiChE,EAAAA,EAAAA,KAAaiE,IAClDF,EAAgBE,KACf,IAEGC,GAAelE,EAAAA,EAAAA,KAAamE,IAChCN,EAAgB,CAAEM,SAAAA,MACjB,CAACN,IAEJ,OACE,0BAAK5D,GAAG,qBAAqBC,UAAU,iBACrC,0BAAKA,UAAU,aACb,mBAAC,IAAD,CAAgBkE,kBAAmBN,IACnC,6BAAKjC,EAAK,0BACV,wBAAG3B,UAAU,QAAQ2B,EAAK,mCAC1B,mBAACwC,EAAA,EAAD,CACEC,WAAY1C,EACZ4B,MAAO/B,GAAaI,EAAKJ,GACzB8C,KAAMX,EACNY,UAAWhD,EACX4C,kBAAmBN,EACnBW,2BAA4BT,EAC5BU,SAAUR,U,sBC3BpB,MAmEA,GAAepF,EAAAA,EAAAA,KAAKmC,EAAAA,EAAAA,KACjBC,IAAuBC,EAAAA,EAAAA,IAAKD,EAAQ,CAAC,gBAAiB,gBACvD,CAACE,EAAWC,KAA2BF,EAAAA,EAAAA,IAAKE,EAAS,CAAC,SAAU,iBAAkB,wBAFhEJ,EAnEiC,EACnDO,cAAAA,EAAeC,UAAAA,EAAWkD,OAAAA,EAAQ/C,eAAAA,EAAgBgD,mBAAAA,MAElD,MAAM/C,GAAOC,EAAAA,EAAAA,MACN+C,EAAeC,IAAoBxF,EAAAA,EAAAA,KAAS,IAC5CyF,EAAaC,IAAkB1F,EAAAA,EAAAA,OAC/B2F,EAAWC,IAAgB5F,EAAAA,EAAAA,IAAS,KACpC6F,EAAUC,IAAe9F,EAAAA,EAAAA,IAAS,IA6BzC,OACE,0BAAKW,GAAG,yBAAyBC,UAAU,iBACzC,0BAAKA,UAAU,aACb,2BAAMmF,OAAO,GAAGC,OAAO,OAAOZ,SAbpC,SAAsBa,GACpBA,EAAMC,iBAENb,EAAO,CAAEM,UAAAA,EAAWE,SAAAA,IAEhBJ,GACFH,EAAmB,CAAEa,KAAMV,MAQvB,mBAACW,EAAA,EAAD,CAAgBC,SAAUX,IAC1B,6BAAKnD,EAAK,aACV,wBAAG3B,UAAU,QAAQ2B,EAAK,wBAC1B,mBAACuB,EAAA,EAAD,CACEnD,GAAG,0BACHqD,MAAOzB,EAAK,wCACZ8D,SArCV,SAA+BJ,GACzB9D,GACFG,IAGF,MAAM,OAAEe,GAAW4C,EAEnBL,EAAavC,EAAOC,OACpBkC,EAAiBnC,EAAOC,MAAMhC,OAAS,IA8B/BgC,MAAOqC,EACPzB,MAAO/B,GAAaI,EAAKJ,GACzBgC,aAAa,eAEf,mBAACL,EAAA,EAAD,CACEnD,GAAG,yBACHqD,MAAOzB,EAAK,uCACZ8D,SAlCV,SAA8BJ,GAC5B,MAAM,OAAE5C,GAAW4C,EAEnBH,EAAYzC,EAAOC,QAgCXA,MAAOuC,EACP1B,aAAa,gBAEdoB,GACC,mBAACe,EAAA,EAAD,CAAQC,KAAK,SAASC,QAAM,EAACtB,UAAWhD,GAAgBK,EAAK,iB,sFCjDzE,IAAIkE,EACAC,EAKJC,eAAeC,IAMb,OALKH,IACHA,EAAgB,8BAChBC,SAAiBD,GAAsBI,SAGlCJ,EAGTK,WAAWF,EAXe,KAa1B,MAkLA,GAAepH,EAAAA,EAAAA,KAlLuB,EACpCoB,UAAAA,EACAD,GAAAA,EACAM,cAAAA,EACAC,KAAAA,EACAE,YAAAA,EACAK,MAAAA,EACAC,OAAAA,EACAZ,KAAAA,EACAiG,QAAAA,EACAC,cAAAA,EACA7F,OAAAA,EACA8F,MAAAA,MAEA,MAAOC,EAAWC,IAAgBnH,EAAAA,EAAAA,MAE5BoH,GAAY1E,EAAAA,EAAAA,IAAuB,MACnC2E,GAAa3E,EAAAA,EAAAA,KAAO,GACpB4E,GAAW5E,EAAAA,EAAAA,KAAO,GAElB6E,GAAU7E,EAAAA,EAAAA,MAChB6E,EAAQxE,QAAU7B,EAClB,MAAMsG,GAAiB9E,EAAAA,EAAAA,MACvB8E,EAAezE,QAAU3B,GAEzBd,EAAAA,EAAAA,KAAU,KACR,GAAI4G,IAAcjG,EAChB,OAGF,MAAMwG,EAAO,KACX,IAAKL,EAAUrE,QACb,OAGF,MAAM2E,EAAe,IAAIhB,EACvB/F,EACAyG,EAAUrE,QACV9B,EACA,CACES,OAAAA,EACAZ,KAAAA,EACAiG,QAAAA,EACAC,cAAAA,GAEF7F,EACA8F,GAGExF,GACFiG,EAAaC,SAASlG,GAGxB0F,EAAaO,IAGXhB,EACFe,IAEAb,IAAepG,MAAK,MAClBoH,EAAAA,EAAAA,KAAQ,KACFR,EAAUrE,SACZ0E,YAKP,CAACR,EAAOC,EAAWjG,EAAeN,EAAIqG,EAAetF,EAAQP,EAAQ4F,EAASjG,EAAMW,KAEvFnB,EAAAA,EAAAA,KAAU,KACH4G,GAELA,EAAUW,SAASZ,KAClB,CAACA,EAAOC,KAEX5G,EAAAA,EAAAA,KAAU,IACD,KACD4G,GACFA,EAAUY,YAGb,CAACZ,IAEJ,MAAMa,GAAgBrH,EAAAA,EAAAA,KAAY,CAACsH,GAAgB,KAC7Cd,IAAcK,EAAQxE,SAAWyE,EAAezE,WAC9CyE,EAAezE,QACjBmE,EAAU9F,YAAYoG,EAAezE,SAC5BiF,EACTd,EAAUe,YAAY,GAEtBf,EAAUhG,UAGb,CAACgG,IAEEgB,GAAiBxH,EAAAA,EAAAA,KAAY,KAC5BwG,GAILA,EAAUiB,UACT,CAACjB,IAEEkB,GAAkB1H,EAAAA,EAAAA,KAAY,KAClC4G,EAASvE,SAAU,EAEdmE,IAIAG,EAAWtE,UACdsE,EAAWtE,QAAUmE,EAAUmB,aAGjCH,OACC,CAAChB,EAAWgB,IAETI,GAAoB5H,EAAAA,EAAAA,KAAY,KAChC2G,EAAWtE,SACbgF,IAGFV,EAAWtE,SAAU,EACrBuE,EAASvE,SAAU,IAClB,CAACgF,IAEEQ,GAAyB7H,EAAAA,EAAAA,KAAY,MACzCkH,EAAAA,EAAAA,IAAQU,KACP,CAACA,KAEJhI,EAAAA,EAAAA,KAAU,KACH4G,IAIDhG,GAAQE,EACNkG,EAASvE,QACXsE,EAAWtE,SAAU,EAErBgF,EAAcrG,GAIZ4F,EAASvE,QACXsE,EAAWtE,SAAU,EAErBmF,OAGH,CAAChB,EAAWhG,EAAME,EAAaM,EAAQqG,EAAeG,KAEzD5H,EAAAA,EAAAA,KAAU,KACJ4G,IACFA,EAAUsB,WAAWvH,GACrB8G,OAED,CAACA,EAAeb,EAAWjG,KAE9BwH,EAAAA,EAAAA,IAAuBL,EAAiBE,IAIxCI,EAAAA,EAAAA,GAAkBN,EAAiBG,GAEnC,MAAMI,GAAgBC,EAAAA,EAAAA,GAAe,kBAAmBhI,GAElDiI,EAAQ/H,EAAQ,UAASA,gBAAmBA,YAAYE,EAE9D,OACE,0BACE+C,IAAKqD,EACLxG,UAAW+H,EAEXE,MAAOA,Q,+FC/Lb,MAAMC,EAAyBzJ,EAAAA,GAA0B,IAAM,IAuG/D,GAAeG,EAAAA,EAAAA,KArGoB,EACjC0F,UAAAA,GAAY,EACZJ,kBAAAA,EACAZ,MAAAA,EACAe,KAAAA,EACA8D,YAAAA,EAAc,WACdC,YAAAA,EAAc,OACdhE,WAAAA,EACAG,2BAAAA,EACA8D,cAAAA,EACA7D,SAAAA,MAGA,MAAM3C,GAAWC,EAAAA,EAAAA,IAAyB,MACpCH,GAAOC,EAAAA,EAAAA,MAENqC,EAAUqE,IAAelJ,EAAAA,EAAAA,IAAS,KAClCmJ,EAAWC,IAAgBpJ,EAAAA,EAAAA,KAAS,GAgD3C,OA9CAM,EAAAA,EAAAA,KAAU,KACHwC,EAAAA,IACHgE,YAAW,KACTrE,EAASM,QAASC,UACjB8F,KAEJ,KAEHxI,EAAAA,EAAAA,KAAU,KACJ4D,GACFmF,uBAAsB,KACpB5G,EAASM,QAASC,QAClBP,EAASM,QAASuG,cAGrB,CAACpF,IAgCF,2BAAM6B,OAAO,GAAGX,SAblB,SAAsBa,GACpBA,EAAMC,iBAEFhB,GAIAiE,GACF/D,EAASP,IAK6BV,aAAa,OACnD,0BACEvD,WAAWgI,EAAAA,EAAAA,GAAe,6BAA8B/D,GAAY,UAAWX,GAAS,SACxFqF,IAAKhH,EAAKiH,MAAQ,WAAQxI,GAE1B,4BACE+C,IAAKtB,EACL7B,UAAU,eACV2F,KAAMzB,EAAoB,OAAS,WACnCnE,GAAG,mBACH2C,MAAOuB,GAAY,GACnBV,aAAa,mBACbkC,SA1CR,SAA0BlD,GACpBe,GACFc,IAGF,MAAM,OAAE3B,GAAWF,EACnB+F,EAAY7F,EAAOC,OACnB8F,EAAa/F,EAAOC,MAAMhC,QAAUmI,EAAAA,IAChCR,GACFA,EAAc5F,EAAOC,QAkCjBiG,IAAI,SAEN,gCAAQrF,GAASe,GAAQ8D,GACzB,0BACEnI,UAAU,kBACV6C,QAnCR,WACE0B,GAA4BL,IAmCtBpB,KAAK,SACLC,SAAU,EACVC,MAAM,8BAEN,wBAAGhD,UAAWkE,EAAoB,WAAa,sBAGlDqE,GACC,mBAAC,IAAD,CAAQ5C,KAAK,SAASC,QAAM,EAACtB,UAAWA,GACrC8D,Q,sFCxGX,MACMU,EAAuC,CAAC,EAAG,IAC3CC,EAAwC,CAAC,EAAG,IAC5CC,EAAsC,CAAC,GAAI,GAC3CxK,EAAeC,EAAAA,GAA0BC,EAAAA,GAA2BC,EAAAA,GAsD1E,GAAeC,EAAAA,EAAAA,KApDsB,EAAGsF,kBAAAA,EAAmBjF,MAAAA,MACzD,MAAOgK,EAAiBC,IAAsB9J,EAAAA,EAAAA,OACvC+J,EAAgBC,IAAqBhK,EAAAA,EAAAA,OACrCG,EAAqBC,IAA0BJ,EAAAA,EAAAA,KAAS,IACxDiK,EAAaC,IAAkBlK,EAAAA,EAAAA,KAAS,IAE/CM,EAAAA,EAAAA,KAAU,KACHuJ,EAGH/C,YAAW,IAAMoD,GAAe,IAhBP,MAczB3J,EAAAA,EAAAA,GAAiB,eAAeC,KAAKsJ,KAItC,CAACD,KAEJvJ,EAAAA,EAAAA,KAAU,KACHyJ,IACHxJ,EAAAA,EAAAA,GAAiB,cAAcC,KAAKwJ,KAErC,CAACD,IAEJ,MAAMtJ,GAAwBC,EAAAA,EAAAA,KAAY,IAAMN,GAAuB,IAAO,IAE9E,OACE,0BAAKO,GAAG,SAASC,UAAWf,EAAQ,MAAQ,KACxCM,GACA,0BAAKS,UAAU,mBAEhBiJ,GACC,mBAAC,IAAD,CACElJ,GAAG,cACHG,KAAMjB,EAAQkB,EAAAA,GAAsB3B,EACpCwB,UAAWqJ,EAAc,SAAW,QACpChJ,cAAe4I,EACfzI,YAAasI,EACbhI,QAAM,EACNP,OAAQV,IAGXsJ,GACC,mBAAC,IAAD,CACEpJ,GAAG,aACHG,KAAMjB,EAAQkB,EAAAA,GAAsB3B,EACpCwB,UAAWqJ,EAAc,QAAU,SACnChJ,cAAe8I,EACf3I,YAAa0D,EAAoB6E,EAAsBC,EACvDlI,QAAM,S,uDCjCT,MAAMyI,EAA0B,CACrCC,W,QACAC,e,QACAC,Y,QACAC,W,QACAC,W,QACAC,W,QACAC,iB,QACAC,W,QACAC,W,QACAC,Y,QACAC,Q,QACAC,e,QACAC,U,QACAC,W,QACAC,c,QAGa,SAAS3K,EAAiB4K,GACvC,MAAMC,EAAOjB,EAAwBgB,GAAM5H,QAAQ8H,OAAOC,SAASC,OAAQ,IAE3E,OAAOC,EAAAA,GAAmB,OAAMJ,IAAQK,EAAAA,GAAAA,U,kHCzC1C,MAAMC,EAAiE,CACrEnF,KAAM,OACNQ,QAAS,EACT4E,OAAQ,OACRC,QAAQ,GAIV,IAAIC,EACAC,EAWAC,EAwCJ,MAwDA,GAAevM,EAAAA,EAAAA,KAxDiB,EAAG2G,KAAAA,EAAME,SAAAA,EAAU2F,QAAAA,MACjD,MAAOC,EAAgBC,IAAqBlM,EAAAA,EAAAA,KAAS,IAErDM,EAAAA,EAAAA,KAAU,KACH6F,IAIA8F,EA9CTtF,eAA2BwF,GACzB,IACE,MAAMC,EAAgBC,SAASC,eAAe,eAC9C,IAAKF,EACH,OAGF,MAAM,YAAEG,EAAF,aAAeC,GAAiBJ,EAEtCL,EAAU,IAAIF,EAAQO,EAAe,CACnCK,YAAY,EACZC,SAAU,CACRC,MAAOJ,EACPK,OAAQJ,GAEVK,SAAU,CACRF,MAAOJ,EAAc,GACrBK,OAAQJ,EAAe,GACvBjG,KAAM,YAIV,MAAMuG,QAAgBC,EAAAA,EAAAA,IAAcZ,SAC9BJ,EAAQiB,KAAK,CAAEC,IAAKH,IAC1B,MAAOI,GACHC,EAAAA,IAEFC,QAAQlJ,MAAMgJ,IAyBhBG,CAAYlH,GA/DhBQ,iBAME,OALKmF,IACHA,EAAiB,qDACjBD,SAAiBC,GAAgBjF,SAG5BiF,EAoDHwB,GAAgB9M,MAAK,IAAM0L,GAAkB,QAM9C,CAAC/F,EAAM8F,IAEV,MAAM1J,GAAOC,EAAAA,EAAAA,KAab,OACE,mBAAC+K,EAAA,EAAD,CACEC,OAAQC,QAAQtH,GAChB6F,QAASA,EACTpI,MAAM,qBACNhD,UAAU,YACV8M,gBAAc,GAEbzB,EACC,0BAAKtL,GAAG,gBAER,mBAAC0D,EAAA,EAAD,MAEF,mBAACiC,EAAA,EAAD,CACE1F,UAAU,iBACV+M,OAAK,EACL1G,MAAM,UACNxD,QA5BNkD,iBACE,IAAKoF,EACH,OAGF,MAAM6B,QAA8B7B,EAAQ6B,OAAOlC,GAC7CmC,EAA+B,iBAAXD,EAAsBA,GAASE,EAAAA,EAAAA,IAAWF,EAAQ,cAE5EvH,EAASwH,IAqBLE,UAAWxL,EAAK,cAEhB,wBAAG3B,UAAU,oBC3CrB,GAAepB,EAAAA,EAAAA,KAhEsB,EACnCoE,MAAAA,EAAQ,8BACRoK,SAAAA,EACAC,qBAAAA,EACA5H,SAAAA,MAEA,MAAO6H,EAAcC,IAAmBnO,EAAAA,EAAAA,OACjCoO,EAAgBC,IAAqBrO,EAAAA,EAAAA,IAA6BiO,IAEzE3N,EAAAA,EAAAA,KAAU,KACR+N,EAAkBJ,KACjB,CAACA,IA2BJ,MAAMK,GAAiB1F,EAAAA,EAAAA,GACrBwF,GAAkB,SAClBJ,GAAY,YAGd,OACE,0BAAKpN,UAAU,kBACb,4BACEA,UAAW0N,EACX5K,KAAK,SACLC,SAAU,EACVC,MAAOA,GAEP,4BACE2C,KAAK,OACLF,SAxCR,SAA0BJ,GACxB,MAAM5C,EAAS4C,EAAM5C,OAEhBA,GAAWA,EAAOkL,OAAUlL,EAAOkL,MAAM,KAI9CJ,EAAgB9K,EAAOkL,MAAM,IAC7BlL,EAAOC,MAAQ,KAiCTkL,OAAO,0BAET,wBAAG5N,UAAU,oBACZwN,GAAkB,0BAAKK,IAAKL,EAAgBM,IAAI,YAEnD,mBAAC,EAAD,CAAWvI,KAAM+H,EAAclC,QAzBnC,WACEmC,OAAgBnN,IAwB4CqF,SAnC9D,SAA0BwH,GACxBM,OAAgBnN,GAChBqF,EAASwH,GAELO,GACFO,IAAIC,gBAAgBR,GAEtBC,EAAkBM,IAAIE,gBAAgBhB,Y,qIC5B1C,MAqIA,EAjHyC,EACvCiB,UAAAA,EACAlL,MAAAA,EACAhD,UAAAA,EACA4M,OAAAA,EACAuB,OAAAA,EACArB,eAAAA,EACAsB,WAAAA,EACAC,SAAAA,EACAjD,QAAAA,EACAkD,oBAAAA,EACAC,QAAAA,EACAC,4BAAAA,MAEA,MAAM,aACJC,EADI,qBAEJC,IACEC,EAAAA,EAAAA,GACF/B,EAAQ0B,EAAqBE,OAA6BpO,EAAWoO,GAGjEI,GAAW9M,EAAAA,EAAAA,IAAuB,OAExCpC,EAAAA,EAAAA,KAAU,IAAOkN,GACbiC,EAAAA,EAAAA,GAAyB,CAAEC,MAAO1D,EAASmD,QAAAA,SAC3CnO,GAAY,CAACwM,EAAQxB,EAASmD,KAClC7O,EAAAA,EAAAA,KAAU,IAAOkN,GAAUgC,EAASzM,QCnEvB,SAAmB4M,GAChC,SAASC,EAAczM,GACrB,GAAc,QAAVA,EAAE0M,IACJ,OAGF1M,EAAE+C,iBACF/C,EAAE2M,kBAEF,MAAMC,EAAoBC,MAAMC,KAC9BN,EAAQO,iBAAiB,6EAE3B,IAAKH,EAAkBzO,OACrB,OAGF,MAAM6O,EAAsBJ,EAAkBK,WAAWC,GAAOA,EAAGC,WAAWjE,SAASkE,iBACvF,IAAIC,EAAkB,EAClBL,GAAuB,IAEvBK,EADErN,EAAEsN,SACcN,EAAsB,EACpCA,EAAsB,EACtBJ,EAAkBzO,OAAS,EAEb6O,EAAsBJ,EAAkBzO,OAAS,EAC/D6O,EAAsB,EACtB,GAIRJ,EAAkBS,GAAiBxN,QAKrC,OAFAqJ,SAASqE,iBAAiB,UAAWd,GAAe,GAE7C,KACLvD,SAASsE,oBAAoB,UAAWf,GAAe,ID+BXgB,CAAUpB,EAASzM,cAAW/B,GAAY,CAACwM,IAEzF,MAAM,WAAEqD,IAAe5N,EAAAA,EAAAA,IAAeuK,EAAQxB,IAG9C1L,EAAAA,EAAAA,KAAU,IACD,KACDkN,GACFqD,MAIH,KAEHC,EAAAA,EAAAA,IAAsB,EAAEC,MACtB1E,SAAS2E,KAAKC,UAAUC,OAAO,kBAAmB1D,IAC9CA,IAAYA,QAAyBxM,IAAf+P,KACxBI,EAAAA,EAAAA,IA/DqB,KAkEhB,KACL9E,SAAS2E,KAAKC,UAAUG,OAAO,sBAEhC,CAAC5D,IAEJ,MAAMjL,GAAOC,EAAAA,EAAAA,KAEb,IAAK6M,EACH,OA8BF,MAAM1G,GAAgBC,EAAAA,EAAAA,GACpB,QACAhI,EACA0O,EACAN,GAAc,wBAGhB,OACE,mBAACqC,EAAA,EAAD,KACE,0BACEtN,IAAKyL,EACL5O,UAAW+H,EACXhF,UAAW,EACXD,KAAK,UAEL,0BAAK9C,UAAU,mBACb,0BAAKA,UAAU,iBAAiB6C,QAASuI,IACzC,0BAAKpL,UAAU,eAAemD,IAAK+K,GA3CrCC,IAICnL,EAKH,0BAAKhD,UAAU,gBACZ8M,GACC,mBAACpH,EAAA,EAAD,CACEqH,OAAK,EACL1G,MAAM,cACNnG,KAAK,UACLiN,UAAWxL,EAAK,SAChBkB,QAASuI,GAET,wBAAGpL,UAAU,gBAGjB,0BAAKA,UAAU,eAAegD,SAjBlC,GAyCQ,0BAAKhD,UAAU,+BACZqO,S,wDExIf,MA4BA,EA5B6B,EAAGqC,YAAAA,EAAa1Q,UAAAA,EAAWqO,SAAAA,MACtD,MAAMsC,GAAa7O,EAAAA,EAAAA,MAwBnB,OAvBK6O,EAAWxO,UACdwO,EAAWxO,QAAUsJ,SAASmF,cAAc,SAG9CC,EAAAA,EAAAA,KAAgB,KACd,MAAMrK,EAAYiF,SAASqF,cAA8BJ,GAAe,YACxE,IAAKlK,EACH,OAGF,MAAMuI,EAAU4B,EAAWxO,QAO3B,OANInC,GACF+O,EAAQsB,UAAUU,IAAI/Q,GAGxBwG,EAAUwK,YAAYjC,GAEf,KACLkC,EAAAA,EAAAA,YAAgB7Q,EAAW2O,GAC3BvI,EAAU0K,YAAYnC,MAEvB,CAAC/O,EAAW0Q,IAERO,EAAAA,EAAAA,OAAgB5C,EAAUsC,EAAWxO,W,8CChC/B,SAAS2F,EACtBqJ,EACAC,IAEA1R,EAAAA,EAAAA,KAAU,KACJyR,IAAW1F,SAAS4F,YACtBF,IAGEA,GACF1G,OAAOqF,iBAAiB,OAAQqB,GAG9BC,GACF3G,OAAOqF,iBAAiB,QAASsB,GAG5B,KACDA,GACF3G,OAAOsF,oBAAoB,QAASqB,GAGlCD,GACF1G,OAAOsF,oBAAoB,OAAQoB,MAGtC,CAACA,EAAQC,M","sources":["webpack://telegram-t/./src/components/common/TrackingMonkey.tsx","webpack://telegram-t/./src/components/auth/AuthCode.tsx","webpack://telegram-t/./src/components/auth/AuthPassword.tsx","webpack://telegram-t/./src/components/auth/AuthRegister.tsx","webpack://telegram-t/./src/components/common/AnimatedSticker.tsx","webpack://telegram-t/./src/components/common/PasswordForm.tsx","webpack://telegram-t/./src/components/common/PasswordMonkey.tsx","webpack://telegram-t/./src/components/common/helpers/animatedAssets.ts","webpack://telegram-t/./src/components/ui/CropModal.tsx","webpack://telegram-t/./src/components/ui/AvatarEditable.tsx","webpack://telegram-t/./src/components/ui/Modal.tsx","webpack://telegram-t/./src/util/trapFocus.ts","webpack://telegram-t/./src/components/ui/Portal.ts","webpack://telegram-t/./src/hooks/useBackgroundMode.ts"],"sourcesContent":["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_SINGLE_COLUMN_LAYOUT } 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_SINGLE_COLUMN_LAYOUT ? 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","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';\nimport renderText from '../common/helpers/renderText';\nimport useHistoryBack from '../../hooks/useHistoryBack';\nimport useLang from '../../hooks/useLang';\n\nimport InputText from '../ui/InputText';\nimport Loading from '../ui/Loading';\nimport TrackingMonkey from '../common/TrackingMonkey';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst CODE_LENGTH = 5;\n\nconst AuthCode: FC = ({\n authPhoneNumber,\n authIsCodeViaApp,\n authIsLoading,\n authError,\n setAuthCode,\n returnToAuthPhoneNumber,\n clearAuthError,\n}) => {\n const lang = useLang();\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(true, 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 {renderText(lang(authIsCodeViaApp ? 'SentAppCode' : 'Login.JustSentSms'), ['simple_markdown'])}\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, [\n 'setAuthCode',\n 'returnToAuthPhoneNumber',\n 'clearAuthError',\n ]),\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';\nimport useLang from '../../hooks/useLang';\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 lang = useLang();\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

{lang('Login.Header.Password')}

\n

{lang('Login.EnterPasswordDescription')}

\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';\nimport useLang from '../../hooks/useLang';\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 lang = useLang();\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

{lang('YourName')}

\n

{lang('Login.Register.Desc')}

\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","import React, {\n FC, useEffect, useRef, memo, useCallback, useState,\n} from '../../lib/teact/teact';\n\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 color?: [number, number, number];\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 color,\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 color,\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 }, [color, animation, animationData, id, isLowPriority, noLoop, onLoad, quality, size, speed]);\n\n useEffect(() => {\n if (!animation) return;\n\n animation.setColor(color);\n }, [color, animation]);\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 useEffect(() => {\n if (animation) {\n animation.changeData(animationData);\n playAnimation();\n }\n }, [playAnimation, animation, animationData]);\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('AnimatedSticker', className);\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 { 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_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\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_SINGLE_COLUMN_LAYOUT ? 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 const lang = useLang();\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_SINGLE_COLUMN_LAYOUT } 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_SINGLE_COLUMN_LAYOUT ? 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 { 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// @ts-ignore\nimport CameraFlip from '../../../assets/animatedIcons/CameraFlip.tgs';\n// @ts-ignore\nimport HandFilled from '../../../assets/animatedIcons/HandFilled.tgs';\n// @ts-ignore\nimport HandOutline from '../../../assets/animatedIcons/HandOutline.tgs';\n// @ts-ignore\nimport Speaker from '../../../assets/animatedIcons/Speaker.tgs';\n// @ts-ignore\nimport VoiceAllowTalk from '../../../assets/animatedIcons/VoiceAllowTalk.tgs';\n// @ts-ignore\nimport VoiceMini from '../../../assets/animatedIcons/VoiceMini.tgs';\n// @ts-ignore\nimport VoiceMuted from '../../../assets/animatedIcons/VoiceMuted.tgs';\n// @ts-ignore\nimport VoiceOutlined from '../../../assets/animatedIcons/VoiceOutlined.tgs';\n\nexport const ANIMATED_STICKERS_PATHS = {\n MonkeyIdle,\n MonkeyTracking,\n MonkeyClose,\n MonkeyPeek,\n FoldersAll,\n FoldersNew,\n DiscussionGroups,\n CameraFlip,\n HandFilled,\n HandOutline,\n Speaker,\n VoiceAllowTalk,\n VoiceMini,\n VoiceMuted,\n VoiceOutlined,\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","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: 1,\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 { RefObject } from 'react';\nimport React, {\n FC, useEffect, useRef,\n} from '../../lib/teact/teact';\n\nimport { TextPart } from '../common/helpers/renderMessageText';\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';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Button from './Button';\nimport Portal from './Portal';\n\nimport './Modal.scss';\n\nconst ANIMATION_DURATION = 200;\n\ntype OwnProps = {\n title?: string | TextPart[];\n className?: string;\n isOpen?: boolean;\n header?: any;\n hasCloseButton?: boolean;\n noBackdrop?: boolean;\n children: any;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onEnter?: () => void;\n dialogRef?: RefObject;\n};\n\ntype StateProps = {\n shouldSkipHistoryAnimations?: boolean;\n};\n\nconst Modal: FC = ({\n dialogRef,\n title,\n className,\n isOpen,\n header,\n hasCloseButton,\n noBackdrop,\n children,\n onClose,\n onCloseAnimationEnd,\n onEnter,\n shouldSkipHistoryAnimations,\n}) => {\n const {\n shouldRender,\n transitionClassNames,\n } = useShowTransition(\n isOpen, onCloseAnimationEnd, shouldSkipHistoryAnimations, undefined, shouldSkipHistoryAnimations,\n );\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 const { forceClose } = useHistoryBack(isOpen, onClose);\n\n // For modals that are closed by unmounting without changing `isOpen` to `false`\n useEffect(() => {\n return () => {\n if (isOpen) {\n forceClose();\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffectWithPrevDeps(([prevIsOpen]) => {\n document.body.classList.toggle('has-open-dialog', isOpen);\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 { 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();\n if (!elementRef.current) {\n elementRef.current = document.createElement('div');\n }\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 { useEffect } from '../lib/teact/teact';\n\nexport default function useBackgroundMode(\n onBlur?: AnyToVoidFunction,\n onFocus?: AnyToVoidFunction,\n) {\n useEffect(() => {\n if (onBlur && !document.hasFocus()) {\n onBlur();\n }\n\n if (onBlur) {\n window.addEventListener('blur', onBlur);\n }\n\n if (onFocus) {\n window.addEventListener('focus', onFocus);\n }\n\n return () => {\n if (onFocus) {\n window.removeEventListener('focus', onFocus);\n }\n\n if (onBlur) {\n window.removeEventListener('blur', onBlur);\n }\n };\n }, [onBlur, onFocus]);\n}\n"],"names":["STICKER_SIZE","IS_SINGLE_COLUMN_LAYOUT","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_AUTH","memo","code","codeLength","trackingDirection","isTracking","isBig","idleMonkeyData","setIdleMonkeyData","useState","trackingMonkeyData","setTrackingMonkeyData","isFirstMonkeyLoaded","setIsFirstMonkeyLoaded","TRACKING_FRAMES_PER_SYMBOL","useEffect","getAnimationData","then","handleFirstMonkeyLoad","useCallback","id","className","AnimatedSticker","size","STICKER_SIZE_TWO_FA","undefined","animationData","play","onLoad","playSegment","startFrame","length","endFrame","getTrackingFrames","speed","noLoop","withGlobal","global","pick","setGlobal","actions","authPhoneNumber","authIsCodeViaApp","authIsLoading","authError","setAuthCode","returnToAuthPhoneNumber","clearAuthError","lang","useLang","inputRef","useRef","setCode","setIsTracking","setTrackingDirection","IS_TOUCH_ENV","current","focus","useHistoryBack","onCodeChange","e","currentTarget","target","value","replace","substr","onClick","role","tabIndex","title","renderText","InputText","ref","label","onInput","error","autoComplete","inputMode","Loading","authHint","setAuthPassword","showPassword","setShowPassword","handleChangePasswordVisibility","isVisible","handleSubmit","password","isPasswordVisible","PasswordForm","clearError","hint","isLoading","onChangePasswordVisibility","onSubmit","signUp","uploadProfilePhoto","isButtonShown","setIsButtonShown","croppedFile","setCroppedFile","firstName","setFirstName","lastName","setLastName","action","method","event","preventDefault","file","AvatarEditable","onChange","Button","type","ripple","lottiePromise","RLottie","async","ensureLottie","default","setTimeout","quality","isLowPriority","color","animation","setAnimation","container","wasPlaying","isFrozen","playRef","playSegmentRef","exec","newAnimation","setSpeed","fastRaf","setColor","destroy","playAnimation","shouldRestart","goToAndPlay","pauseAnimation","pause","freezeAnimation","isPlaying","unfreezeAnimation","unfreezeAnimationOnRaf","changeData","useHeavyAnimationCheck","useBackgroundMode","fullClassName","buildClassName","style","FOCUS_DELAY_TIMEOUT_MS","placeholder","submitLabel","onInputChange","setPassword","canSubmit","setCanSubmit","requestAnimationFrame","select","dir","isRtl","MIN_PASSWORD_LENGTH","SEGMENT_COVER_EYES","SEGMENT_UNCOVER_EYE","SEGMENT_COVER_EYE","closeMonkeyData","setCloseMonkeyData","peekMonkeyData","setPeekMonkeyData","isPeekShown","setIsPeekShown","ANIMATED_STICKERS_PATHS","MonkeyIdle","MonkeyTracking","MonkeyClose","MonkeyPeek","FoldersAll","FoldersNew","DiscussionGroups","CameraFlip","HandFilled","HandOutline","Speaker","VoiceAllowTalk","VoiceMini","VoiceMuted","VoiceOutlined","name","path","window","location","origin","mediaLoader","ApiMediaFormat","cropperResultOptions","format","circle","Croppie","croppiePromise","cropper","onClose","isCroppieReady","setIsCroppieReady","imgFile","cropContainer","document","getElementById","offsetWidth","offsetHeight","enableZoom","boundary","width","height","viewport","dataUri","blobToDataUri","bind","url","err","DEBUG","console","initCropper","ensureCroppie","Modal","isOpen","Boolean","hasCloseButton","round","result","croppedImg","blobToFile","ariaLabel","disabled","currentAvatarBlobUrl","selectedFile","setSelectedFile","croppedBlobUrl","setCroppedBlobUrl","labelClassName","files","accept","src","alt","URL","revokeObjectURL","createObjectURL","dialogRef","header","noBackdrop","children","onCloseAnimationEnd","onEnter","shouldSkipHistoryAnimations","shouldRender","transitionClassNames","useShowTransition","modalRef","captureKeyboardListeners","onEsc","element","handleKeyDown","key","stopPropagation","focusableElements","Array","from","querySelectorAll","currentFocusedIndex","findIndex","em","isSameNode","activeElement","newFocusedIndex","shiftKey","addEventListener","removeEventListener","trapFocus","forceClose","useEffectWithPrevDeps","prevIsOpen","body","classList","toggle","dispatchHeavyAnimationEvent","remove","Portal","containerId","elementRef","createElement","useLayoutEffect","querySelector","add","appendChild","TeactDOM","removeChild","onBlur","onFocus","hasFocus"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"133.f7b0e36077dea7bb93a4.js","mappings":"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","sources":["webpack://telegram-t/./src/components/common/TrackingMonkey.tsx","webpack://telegram-t/./src/components/auth/AuthCode.tsx","webpack://telegram-t/./src/components/auth/AuthPassword.tsx","webpack://telegram-t/./src/components/auth/AuthRegister.tsx","webpack://telegram-t/./src/components/common/AnimatedSticker.tsx","webpack://telegram-t/./src/components/common/PasswordForm.tsx","webpack://telegram-t/./src/components/common/PasswordMonkey.tsx","webpack://telegram-t/./src/components/common/helpers/animatedAssets.ts","webpack://telegram-t/./src/components/ui/CropModal.tsx","webpack://telegram-t/./src/components/ui/AvatarEditable.tsx","webpack://telegram-t/./src/components/ui/Modal.tsx","webpack://telegram-t/./src/util/trapFocus.ts","webpack://telegram-t/./src/components/ui/Portal.ts","webpack://telegram-t/./src/hooks/useBackgroundMode.ts"],"sourcesContent":["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_SINGLE_COLUMN_LAYOUT } 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_SINGLE_COLUMN_LAYOUT ? 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","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';\nimport renderText from '../common/helpers/renderText';\nimport useHistoryBack from '../../hooks/useHistoryBack';\nimport useLang from '../../hooks/useLang';\n\nimport InputText from '../ui/InputText';\nimport Loading from '../ui/Loading';\nimport TrackingMonkey from '../common/TrackingMonkey';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst CODE_LENGTH = 5;\n\nconst AuthCode: FC = ({\n authPhoneNumber,\n authIsCodeViaApp,\n authIsLoading,\n authError,\n setAuthCode,\n returnToAuthPhoneNumber,\n clearAuthError,\n}) => {\n const lang = useLang();\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(true, 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 {renderText(lang(authIsCodeViaApp ? 'SentAppCode' : 'Login.JustSentSms'), ['simple_markdown'])}\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, [\n 'setAuthCode',\n 'returnToAuthPhoneNumber',\n 'clearAuthError',\n ]),\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';\nimport useLang from '../../hooks/useLang';\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 lang = useLang();\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

{lang('Login.Header.Password')}

\n

{lang('Login.EnterPasswordDescription')}

\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';\nimport useLang from '../../hooks/useLang';\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 lang = useLang();\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

{lang('YourName')}

\n

{lang('Login.Register.Desc')}

\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","import React, {\n FC, useEffect, useRef, memo, useCallback, useState,\n} from '../../lib/teact/teact';\n\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 color?: [number, number, number];\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 color,\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 color,\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 }, [color, animation, animationData, id, isLowPriority, noLoop, onLoad, quality, size, speed]);\n\n useEffect(() => {\n if (!animation) return;\n\n animation.setColor(color);\n }, [color, animation]);\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 useEffect(() => {\n if (animation) {\n animation.changeData(animationData);\n playAnimation();\n }\n }, [playAnimation, animation, animationData]);\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('AnimatedSticker', className);\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 { 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_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\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_SINGLE_COLUMN_LAYOUT ? 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 const lang = useLang();\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_SINGLE_COLUMN_LAYOUT } 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_SINGLE_COLUMN_LAYOUT ? 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 { 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// @ts-ignore\nimport CameraFlip from '../../../assets/animatedIcons/CameraFlip.tgs';\n// @ts-ignore\nimport HandFilled from '../../../assets/animatedIcons/HandFilled.tgs';\n// @ts-ignore\nimport HandOutline from '../../../assets/animatedIcons/HandOutline.tgs';\n// @ts-ignore\nimport Speaker from '../../../assets/animatedIcons/Speaker.tgs';\n// @ts-ignore\nimport VoiceAllowTalk from '../../../assets/animatedIcons/VoiceAllowTalk.tgs';\n// @ts-ignore\nimport VoiceMini from '../../../assets/animatedIcons/VoiceMini.tgs';\n// @ts-ignore\nimport VoiceMuted from '../../../assets/animatedIcons/VoiceMuted.tgs';\n// @ts-ignore\nimport VoiceOutlined from '../../../assets/animatedIcons/VoiceOutlined.tgs';\n\nexport const ANIMATED_STICKERS_PATHS = {\n MonkeyIdle,\n MonkeyTracking,\n MonkeyClose,\n MonkeyPeek,\n FoldersAll,\n FoldersNew,\n DiscussionGroups,\n CameraFlip,\n HandFilled,\n HandOutline,\n Speaker,\n VoiceAllowTalk,\n VoiceMini,\n VoiceMuted,\n VoiceOutlined,\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","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: 1,\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 { RefObject } from 'react';\nimport React, {\n FC, useEffect, useRef,\n} from '../../lib/teact/teact';\n\nimport { TextPart } from '../common/helpers/renderMessageText';\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';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Button from './Button';\nimport Portal from './Portal';\n\nimport './Modal.scss';\n\nconst ANIMATION_DURATION = 200;\n\ntype OwnProps = {\n title?: string | TextPart[];\n className?: string;\n isOpen?: boolean;\n header?: any;\n hasCloseButton?: boolean;\n noBackdrop?: boolean;\n children: any;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onEnter?: () => void;\n dialogRef?: RefObject;\n};\n\ntype StateProps = {\n shouldSkipHistoryAnimations?: boolean;\n};\n\nconst Modal: FC = ({\n dialogRef,\n title,\n className,\n isOpen,\n header,\n hasCloseButton,\n noBackdrop,\n children,\n onClose,\n onCloseAnimationEnd,\n onEnter,\n shouldSkipHistoryAnimations,\n}) => {\n const {\n shouldRender,\n transitionClassNames,\n } = useShowTransition(\n isOpen, onCloseAnimationEnd, shouldSkipHistoryAnimations, undefined, shouldSkipHistoryAnimations,\n );\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 const { forceClose } = useHistoryBack(isOpen, onClose);\n\n // For modals that are closed by unmounting without changing `isOpen` to `false`\n useEffect(() => {\n return () => {\n if (isOpen) {\n forceClose();\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffectWithPrevDeps(([prevIsOpen]) => {\n document.body.classList.toggle('has-open-dialog', isOpen);\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 { 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();\n if (!elementRef.current) {\n elementRef.current = document.createElement('div');\n }\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 { useEffect } from '../lib/teact/teact';\n\nexport default function useBackgroundMode(\n onBlur?: AnyToVoidFunction,\n onFocus?: AnyToVoidFunction,\n) {\n useEffect(() => {\n if (onBlur && !document.hasFocus()) {\n onBlur();\n }\n\n if (onBlur) {\n window.addEventListener('blur', onBlur);\n }\n\n if (onFocus) {\n window.addEventListener('focus', onFocus);\n }\n\n return () => {\n if (onFocus) {\n window.removeEventListener('focus', onFocus);\n }\n\n if (onBlur) {\n window.removeEventListener('blur', onBlur);\n }\n };\n }, [onBlur, onFocus]);\n}\n"],"names":["STICKER_SIZE","IS_SINGLE_COLUMN_LAYOUT","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_AUTH","memo","code","codeLength","trackingDirection","isTracking","isBig","idleMonkeyData","setIdleMonkeyData","useState","trackingMonkeyData","setTrackingMonkeyData","isFirstMonkeyLoaded","setIsFirstMonkeyLoaded","TRACKING_FRAMES_PER_SYMBOL","useEffect","getAnimationData","then","handleFirstMonkeyLoad","useCallback","id","className","AnimatedSticker","size","STICKER_SIZE_TWO_FA","undefined","animationData","play","onLoad","playSegment","startFrame","length","endFrame","getTrackingFrames","speed","noLoop","withGlobal","global","pick","setGlobal","actions","authPhoneNumber","authIsCodeViaApp","authIsLoading","authError","setAuthCode","returnToAuthPhoneNumber","clearAuthError","lang","useLang","inputRef","useRef","setCode","setIsTracking","setTrackingDirection","IS_TOUCH_ENV","current","focus","useHistoryBack","onCodeChange","e","currentTarget","target","value","replace","substr","onClick","role","tabIndex","title","renderText","InputText","ref","label","onInput","error","autoComplete","inputMode","Loading","authHint","setAuthPassword","showPassword","setShowPassword","handleChangePasswordVisibility","isVisible","handleSubmit","password","isPasswordVisible","PasswordForm","clearError","hint","isLoading","onChangePasswordVisibility","onSubmit","signUp","uploadProfilePhoto","isButtonShown","setIsButtonShown","croppedFile","setCroppedFile","firstName","setFirstName","lastName","setLastName","action","method","event","preventDefault","file","AvatarEditable","onChange","Button","type","ripple","lottiePromise","RLottie","async","ensureLottie","default","setTimeout","quality","isLowPriority","color","animation","setAnimation","container","wasPlaying","isFrozen","playRef","playSegmentRef","exec","newAnimation","setSpeed","fastRaf","setColor","destroy","playAnimation","shouldRestart","goToAndPlay","pauseAnimation","pause","freezeAnimation","isPlaying","unfreezeAnimation","unfreezeAnimationOnRaf","changeData","useHeavyAnimationCheck","useBackgroundMode","fullClassName","buildClassName","style","FOCUS_DELAY_TIMEOUT_MS","placeholder","submitLabel","onInputChange","setPassword","canSubmit","setCanSubmit","requestAnimationFrame","select","dir","isRtl","MIN_PASSWORD_LENGTH","SEGMENT_COVER_EYES","SEGMENT_UNCOVER_EYE","SEGMENT_COVER_EYE","closeMonkeyData","setCloseMonkeyData","peekMonkeyData","setPeekMonkeyData","isPeekShown","setIsPeekShown","ANIMATED_STICKERS_PATHS","MonkeyIdle","MonkeyTracking","MonkeyClose","MonkeyPeek","FoldersAll","FoldersNew","DiscussionGroups","CameraFlip","HandFilled","HandOutline","Speaker","VoiceAllowTalk","VoiceMini","VoiceMuted","VoiceOutlined","name","path","window","location","origin","mediaLoader","ApiMediaFormat","cropperResultOptions","format","circle","Croppie","croppiePromise","cropper","onClose","isCroppieReady","setIsCroppieReady","imgFile","cropContainer","document","getElementById","offsetWidth","offsetHeight","enableZoom","boundary","width","height","viewport","dataUri","blobToDataUri","bind","url","err","DEBUG","console","initCropper","ensureCroppie","Modal","isOpen","Boolean","hasCloseButton","round","result","croppedImg","blobToFile","ariaLabel","disabled","currentAvatarBlobUrl","selectedFile","setSelectedFile","croppedBlobUrl","setCroppedBlobUrl","labelClassName","files","accept","src","alt","URL","revokeObjectURL","createObjectURL","dialogRef","header","noBackdrop","children","onCloseAnimationEnd","onEnter","shouldSkipHistoryAnimations","shouldRender","transitionClassNames","useShowTransition","modalRef","captureKeyboardListeners","onEsc","element","handleKeyDown","key","stopPropagation","focusableElements","Array","from","querySelectorAll","currentFocusedIndex","findIndex","em","isSameNode","activeElement","newFocusedIndex","shiftKey","addEventListener","removeEventListener","trapFocus","forceClose","useEffectWithPrevDeps","prevIsOpen","body","classList","toggle","dispatchHeavyAnimationEvent","remove","Portal","containerId","elementRef","createElement","useLayoutEffect","querySelector","add","appendChild","TeactDOM","removeChild","onBlur","onFocus","hasFocus"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/211.1fd3812a4d5830a98eb6.js b/dist/211.1fd3812a4d5830a98eb6.js deleted file mode 100644 index 943382582..000000000 --- a/dist/211.1fd3812a4d5830a98eb6.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunktelegram_t=self.webpackChunktelegram_t||[]).push([[211],{5211:(e,t,s)=>{s.r(t),s.d(t,{Main:()=>Mo});var n=s(5116),a=s(3716),o=s(4050),r=(s(7895),s(307)),i=s(1638),c=s(735),l=s(2858);function d(e){const{chatId:t,threadId:s}=(0,i.Bt)(e)||{};return t&&s?(e=(0,r.qr)(e,t,s,!1),e=(0,r.Pb)(e,t,s,void 0)):e}(0,n.Q6)("openLocalTextSearch",(e=>{const{chatId:t,threadId:s}=(0,i.Bt)(e)||{};if(t&&s)return(0,r.qr)(e,t,s,!0)})),(0,n.Q6)("closeLocalTextSearch",d),(0,n.Q6)("setLocalTextSearchQuery",((e,t,s)=>{const{chatId:n,threadId:a}=(0,i.Bt)(e)||{};if(!n||!a)return;const{query:o}=s,d=(0,l.uw)(n,a),{query:u}=e.localTextSearch.byChatThreadKey[d]||{};return o!==u&&(e=(0,r.Pb)(e,n,a,c.D)),(0,r.qr)(e,n,a,!0,o)})),(0,n.Q6)("setLocalMediaSearchType",((e,t,s)=>{const{chatId:n}=(0,i.Bt)(e)||{};if(!n)return;const{mediaType:a}=s;return(0,r.z5)(e,n,a)})),(0,n.Q6)("openChat",((e,t,s)=>{const{id:a,threadId:o=-1,type:c="thread",shouldReplaceHistory:l=!1}=s,u=(0,i.Bt)(e);return u&&u.chatId===a&&u.threadId===o&&u.type===c||(e=(0,r.pf)(e,a,o,"replyStack",[]),e=d(e=(0,r.i9)(e)),e={...e,messages:{...e.messages,contentToBeScheduled:void 0},...a!==e.forwardMessages.toChatId&&{forwardMessages:{}}},(0,n.R3)(e)),(0,r.Wy)(e,a,o,c,l)})),(0,n.Q6)("openPreviousChat",(e=>(0,r.Wy)(e,void 0))),(0,n.Q6)("openChatWithInfo",((e,t,s)=>{(0,n.R3)({...e,isChatInfoShown:!0}),t.openChat(s)})),(0,n.Q6)("resetChatCreation",(e=>({...e,chatCreation:void 0}))),(0,n.Q6)("setNewChatMembersDialogState",((e,t,s)=>({...e,newChatMembersProgress:s}))),(0,n.Q6)("openNextChat",((e,t,s)=>{const{targetIndexDelta:n,orderedIds:a}=s,{chatId:o}=(0,i.Bt)(e)||{};if(!o)return void t.openChat({id:a[0]});const r=a.indexOf(o);if(-1===r)return;const c=a[r+n];t.openChat({id:c,shouldReplaceHistory:!0})}));var u=s(6137),m=s(1713),h=s(7361),g=s(782),p=s(2267),f=s(3099);const I=a.ck+a.fK;let v;(0,n.Q6)("setScrollOffset",((e,t,s)=>{const{chatId:n,threadId:a,scrollOffset:o}=s;return(0,r.pf)(e,n,a,"scrollOffset",o)})),(0,n.Q6)("setReplyingToId",((e,t,s)=>{const{messageId:n}=s,a=(0,i.Bt)(e);if(!a)return;const{chatId:o,threadId:c}=a;return(0,r.pf)(e,o,c,"replyingToId",n)})),(0,n.Q6)("setEditingId",((e,t,s)=>{const{messageId:n}=s,a=(0,i.Bt)(e);if(!a)return;const{chatId:o,threadId:c,type:l}=a,d="scheduled"===l?"editingScheduledId":"editingId";return(0,r.pf)(e,o,c,d,n)})),(0,n.Q6)("editLastMessage",(e=>{const{chatId:t,threadId:s}=(0,i.Bt)(e)||{};if(!t||!s)return;const n=(0,i.Zw)(e,t),a=(0,i.Cb)(e,t,s);if(!n||!a)return;const o=(0,g.dF)(a,(t=>Boolean(n[t]&&(0,i._k)(e,n[t],s).canEdit)));return o?(0,r.pf)(e,t,s,"editingId",o):void 0})),(0,n.Q6)("replyToNextMessage",((e,t,s)=>{const{targetIndexDelta:n}=s,{chatId:a,threadId:o}=(0,i.Bt)(e)||{};if(!a||!o)return;const r=(0,i.Zw)(e,a),c=(0,i.Cb)(e,a,o);if(!r||!c)return;const l=(0,i.Yy)(e,a,o);let d;if((0,i.b9)(e,a,o)&&l){const e=Object.keys(r),t=e.indexOf(l.toString())+n;d=t<=e.length+1&&t>=0?Number(e[t]):void 0}else if(o===u._f){var m;const t=(0,i.Z1)(e,a);d=null==t||null===(m=t.lastMessage)||void 0===m?void 0:m.id}else{const t=(0,i.tZ)(e,a,o);d=null==t?void 0:t.lastMessageId}t.setReplyingToId({messageId:d}),t.focusMessage({chatId:a,threadId:o,messageId:d})})),(0,n.Q6)("openMediaViewer",((e,t,s)=>{const{chatId:n,threadId:a,messageId:o,avatarOwnerId:r,profilePhotoIndex:i,origin:c}=s;return{...e,mediaViewer:{chatId:n,threadId:a,messageId:o,avatarOwnerId:r,profilePhotoIndex:i,origin:c},forwardMessages:{}}})),(0,n.Q6)("closeMediaViewer",(e=>({...e,mediaViewer:{}}))),(0,n.Q6)("openAudioPlayer",((e,t,s)=>{const{chatId:n,threadId:a,messageId:o,origin:r,volume:i,playbackRate:c,isMuted:l}=s;return{...e,audioPlayer:{chatId:n,threadId:a,messageId:o,origin:null!=r?r:e.audioPlayer.origin,volume:null!=i?i:e.audioPlayer.volume,playbackRate:c||e.audioPlayer.playbackRate,isMuted:l||e.audioPlayer.isMuted}}})),(0,n.Q6)("setAudioPlayerVolume",((e,t,s)=>{const{volume:n}=s;return{...e,audioPlayer:{...e.audioPlayer,volume:n}}})),(0,n.Q6)("setAudioPlayerPlaybackRate",((e,t,s)=>{const{playbackRate:n}=s;return{...e,audioPlayer:{...e.audioPlayer,playbackRate:n}}})),(0,n.Q6)("setAudioPlayerMuted",((e,t,s)=>{const{isMuted:n}=s;return{...e,audioPlayer:{...e.audioPlayer,isMuted:n}}})),(0,n.Q6)("setAudioPlayerOrigin",((e,t,s)=>{const{origin:n}=s;return{...e,audioPlayer:{...e.audioPlayer,origin:n}}})),(0,n.Q6)("closeAudioPlayer",(e=>({...e,audioPlayer:{volume:e.audioPlayer.volume,playbackRate:e.audioPlayer.playbackRate,isMuted:e.audioPlayer.isMuted}}))),(0,n.Q6)("openPollResults",((e,t,s)=>{const{chatId:a,messageId:o}=s;(0,i.Jf)(e)?a===e.pollResults.chatId&&o===e.pollResults.messageId||(0,n.R3)({...e,pollResults:{chatId:a,messageId:o,voters:{}}}):window.setTimeout((()=>{const e=(0,n.Rd)();(0,n.R3)({...e,pollResults:{chatId:a,messageId:o,voters:{}}})}),450)})),(0,n.Q6)("closePollResults",(e=>{(0,n.R3)({...e,pollResults:{}})})),(0,n.Q6)("focusLastMessage",((e,t)=>{const s=(0,i.Bt)(e);if(!s)return;const{chatId:n,threadId:a}=s;let o;if(a===u._f){var r;const t=(0,i.Z1)(e,n);o=null==t||null===(r=t.lastMessage)||void 0===r?void 0:r.id}else{const t=(0,i.tZ)(e,n,a);o=null==t?void 0:t.lastMessageId}o&&t.focusMessage({chatId:n,threadId:a,messageId:o,noHighlight:!0})})),(0,n.Q6)("focusNextReply",((e,t)=>{const s=(0,i.Bt)(e);if(!s)return;const{chatId:a,threadId:o}=s,c=(0,i.p9)(e,a,o);if(c&&0!==c.length){const s=c.pop();e=(0,r.pf)(e,a,o,"replyStack",[...c]),(0,n.R3)(e),t.focusMessage({chatId:a,threadId:o,messageId:s})}else t.focusLastMessage()})),(0,n.Q6)("focusMessage",((e,t,s)=>{const{chatId:a,threadId:o=u._f,messageListType:c="thread",noHighlight:l,groupedId:d,groupedChatId:h,replyMessageId:g,isResizingContainer:p}=s;let{messageId:f}=s;if(void 0!==d){const t=(0,i.y8)(e,h,d);null!=t&&t.length&&([f]=t)}const y=(0,i.Bt)(e),P=!y||a!==y.chatId||o!==y.threadId||c!==y.type;if(v&&(clearTimeout(v),v=void 0),v=window.setTimeout((()=>{let e=(0,n.Rd)();e=(0,r.cq)(e),e=(0,r.wV)(e),(0,n.R3)(e)}),l?I:1500),e=(0,r.cq)(e,a,f,l,p),e=(0,r.wV)(e,void 0),g){const t=(0,i.p9)(e,a,o)||[];e=(0,r.pf)(e,a,o,"replyStack",[...t,g])}P&&(e=(0,r.wV)(e,m.fo.Static));const Z=(0,i.Cb)(e,a,o);if(Z&&Z.includes(f))return(0,n.R3)(e),void t.openChat({id:a,threadId:o});if(P&&(e=(0,r.pf)(e,a,o,"viewportIds",void 0)),e=(0,r.pf)(e,a,o,"outlyingIds",void 0),Z&&!P){const t=f>Z[0]?m.fo.Down:m.fo.Up;e=(0,r.wV)(e,t)}(0,n.R3)(e),t.openChat({id:a,threadId:o}),t.loadViewportMessages()})),(0,n.Q6)("openForwardMenu",((e,t,s)=>{const{fromChatId:n,messageIds:a,groupedId:o}=s;let r;return o&&(r=(0,i.xH)(e,n,o)),{...e,forwardMessages:{fromChatId:n,messageIds:r||a,isModalShown:!0}}})),(0,n.Q6)("exitForwardMode",(e=>{(0,n.R3)({...e,forwardMessages:{}})})),(0,n.Q6)("setForwardChatId",((e,t,s)=>{const{id:a}=s;(0,n.R3)({...e,forwardMessages:{...e.forwardMessages,toChatId:a,isModalShown:!1}}),t.openChat({id:a}),t.closeMediaViewer(),t.exitMessageSelectMode()})),(0,n.Q6)("openForwardMenuForSelectedMessages",((e,t)=>{if(!e.selectedMessages)return;const{chatId:s,messageIds:n}=e.selectedMessages;t.openForwardMenu({fromChatId:s,messageIds:n})})),(0,n.Q6)("cancelMessageMediaDownload",((e,t,s)=>{const{message:a}=s,o=e.activeDownloads.byChatId[a.chatId];o&&o.length&&(0,n.R3)({...e,activeDownloads:{byChatId:{...e.activeDownloads.byChatId,[a.chatId]:o.filter((e=>e!==a.id))}}})})),(0,n.Q6)("downloadMessageMedia",((e,t,s)=>{const{message:a}=s;a&&(0,n.R3)({...e,activeDownloads:{byChatId:{...e.activeDownloads.byChatId,[a.chatId]:[...e.activeDownloads.byChatId[a.chatId]||[],a.id]}}})})),(0,n.Q6)("downloadSelectedMessages",((e,t)=>{if(!e.selectedMessages)return;const{chatId:s,messageIds:n}=e.selectedMessages,{threadId:a}=(0,i.Bt)(e)||{},o=(0,i.Zw)(e,s);o&&a&&n.map((e=>o[e])).filter((t=>(0,i._k)(e,t,a).canDownload)).forEach((e=>t.downloadMessageMedia({message:e})))})),(0,n.Q6)("enterMessageSelectMode",((e,t,s)=>{const{messageId:n}=s||{},a=(0,i.jr)(e);return a?(0,r.M6)(e,a.id,n):e})),(0,n.Q6)("toggleMessageSelection",((e,t,s)=>{const{messageId:a,groupedId:o,childMessageIds:c,withShift:l}=s,d=(0,i.Bt)(e);if(!d)return;const{chatId:u,threadId:m,type:g}=d;e=(0,r.Ob)(e,u,m,g,a,o,c,l),(0,n.R3)(e),e.shouldShowContextMenuHint&&(t.disableContextMenuHint(),t.showNotification({message:`To **edit** or **reply**, close this menu. Then ${h.$b?"long tap":"right click"} on a message.`}))})),(0,n.Q6)("disableContextMenuHint",(e=>{if(e.shouldShowContextMenuHint)return{...e,shouldShowContextMenuHint:!1}})),(0,n.Q6)("exitMessageSelectMode",r.i9),(0,n.Q6)("openPollModal",(e=>({...e,isPollModalOpen:!0}))),(0,n.Q6)("closePollModal",(e=>({...e,isPollModalOpen:!1}))),(0,n.Q6)("checkVersionNotification",((e,t)=>{const s=a.Ji.split(".").slice(0,2).join("."),{serviceNotifications:n}=e;if(n.find((({version:e})=>e===s)))return;const o={chatId:a.aw,date:(0,p.b)(e.serverTimeOffset),content:{text:(0,f.Z)("**Telegram Web Z was updated to version alpha 1.23**\n\n👏 **Harder**\n· An early version of **Video Chats** is available in all groups.\n\n🤩 **Better**\n· Various UI improvements.\n\n🚀 **Faster**\n· Optimized the rendering engine.\n. Optimized rendering the chat list.\n· Fixed memory leaks in large audio playlists.\n\n💪 **Stronger**\n· Fixed videos pausing during playback.\n· Fixed missing sounds when notifications are disabled.\n· Fixed page refresh when listening to voice messages.\n· Fixed incorrect track order in audio playlists.\n· Fixed opening links without `https://` formatting.\n· Fixed scroll jumps in new chats.\n")},isOutgoing:!1};t.createServiceNotification({message:o,version:s})})),(0,n.Q6)("createServiceNotification",((e,t,s)=>{var o;const{message:r,version:c}=s,{serviceNotifications:l}=e,d=(0,i.Z1)(e,a.aw),u=Math.max((null===(o=d.lastMessage)||void 0===o?void 0:o.id)||0,...l.map((({id:e})=>e))),m=(l.length+1)/1e3,h=Math.floor(u)+m;r.id=h;const g={id:h,message:r,version:c,isUnread:!0};(0,n.R3)({...e,serviceNotifications:[...l.slice(-1e3),g]}),t.apiUpdate({"@type":"newMessage",id:r.id,chatId:r.chatId,message:r})})),(0,n.Q6)("setGlobalSearchQuery",((e,t,s)=>{const{query:n}=s,{chatId:a}=e.globalSearch;return(0,r.No)(e,{globalResults:{},localResults:{},resultsByType:void 0,...n?{fetchingStatus:{chats:!a,messages:!0}}:{fetchingStatus:void 0},query:n})})),(0,n.Q6)("addRecentlyFoundChatId",((e,t,s)=>{const{id:n}=s,{recentlyFoundChatIds:a}=e.globalSearch;if(!a)return(0,r.No)(e,{recentlyFoundChatIds:[n]});const o=a.filter((e=>e!==n));return o.unshift(n),o.length>10&&o.pop(),(0,r.No)(e,{recentlyFoundChatIds:o})})),(0,n.Q6)("clearRecentlyFoundChats",(e=>(0,r.No)(e,{recentlyFoundChatIds:void 0}))),(0,n.Q6)("setGlobalSearchContent",((e,t,s)=>{const{content:n}=s;return(0,r.Og)(e,n)})),(0,n.Q6)("setGlobalSearchChatId",((e,t,s)=>{const{id:n}=s;return(0,r.No)(e,{chatId:n,query:void 0,resultsByType:void 0})})),(0,n.Q6)("setStickerSearchQuery",((e,t,s)=>{const{query:n}=s;return{...e,stickers:{...e.stickers,search:{query:n,resultIds:void 0}}}})),(0,n.Q6)("setGifSearchQuery",((e,t,s)=>{const{query:n}=s;return{...e,gifs:{...e.gifs,search:{query:n,offsetId:void 0,results:void 0}}}})),(0,n.Q6)("openUserInfo",((e,t,s)=>{const{id:n}=s;t.openChat({id:n})})),(0,n.Q6)("openChat",(e=>(0,r.x1)(e,void 0))),(0,n.Q6)("setUserSearchQuery",((e,t,s)=>{const{query:n}=s;return(0,r.Lm)(e,{globalUserIds:void 0,localUserIds:void 0,fetchingStatus:Boolean(n),query:n})})),s(3781);var y=s(1947),P=s(6926);(0,n.Q6)("toggleChatInfo",(e=>({...e,isChatInfoShown:!e.isChatInfoShown}))),(0,n.Q6)("setLeftColumnWidth",((e,t,s)=>({...e,leftColumnWidth:s}))),(0,n.Q6)("resetLeftColumnWidth",(e=>({...e,leftColumnWidth:void 0}))),(0,n.Q6)("toggleManagement",(e=>{const{chatId:t}=(0,i.Bt)(e)||{};if(t)return{...e,management:{byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t],isActive:!(e.management.byChatId[t]||{}).isActive}}}}})),(0,n.Q6)("closeManagement",(e=>{const{chatId:t}=(0,i.Bt)(e)||{};if(t)return{...e,management:{byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t],isActive:!1}}}}})),(0,n.Q6)("openChat",(e=>{if(h.wB||h.p7)return{...e,isLeftColumnShown:0===e.messages.messageLists.length}})),(0,n.Q6)("toggleLeftColumn",(e=>({...e,isLeftColumnShown:!e.isLeftColumnShown}))),(0,n.Q6)("addRecentEmoji",((e,t,s)=>{const{emoji:n}=s,{recentEmojis:a}=e;if(!a)return{...e,recentEmojis:[n]};const o=a.filter((e=>e!==n));return o.unshift(n),o.length>18&&o.pop(),{...e,recentEmojis:o}})),(0,n.Q6)("addRecentSticker",((e,t,s)=>{const{sticker:n}=s,{recent:a}=e.stickers;if(!a)return{...e,stickers:{...e.stickers,recent:{hash:"0",stickers:[n]}}};const o=a.stickers.filter((e=>e.id!==n.id));return o.unshift(n),{...e,stickers:{...e.stickers,recent:{...a,stickers:o}}}})),(0,n.Q6)("showNotification",((e,t,s)=>{const n=s;n.localId=(0,P.Z)({});const a=[...e.notifications],o=a.findIndex((e=>e.message===n.message));return-1!==o&&a.splice(o,1),a.push(n),{...e,notifications:a}})),(0,n.Q6)("dismissNotification",((e,t,s)=>{const n=e.notifications.filter((({localId:e})=>e!==s.localId));return{...e,notifications:n}})),(0,n.Q6)("showDialog",((e,t,s)=>{const{data:n}=s;if("message"in n&&n.hasErrorKey&&!(0,y.ZP)(n))return e;const a=[...e.dialogs];if("message"in n){const e=a.findIndex((e=>e.message===n.message));-1!==e&&a.splice(e,1)}return a.push(n),{...e,dialogs:a}})),(0,n.Q6)("dismissDialog",(e=>{const t=[...e.dialogs];return t.pop(),{...e,dialogs:t}})),(0,n.Q6)("toggleSafeLinkModal",((e,t,s)=>{const{url:n}=s;return{...e,safeLinkModalUrl:n}})),(0,n.Q6)("openHistoryCalendar",((e,t,s)=>{const{selectedAt:n}=s;return{...e,historyCalendarSelectedAt:n}})),(0,n.Q6)("closeHistoryCalendar",(e=>({...e,historyCalendarSelectedAt:void 0}))),(0,n.Q6)("openPaymentModal",((e,t,s)=>{const{chatId:n,messageId:a}=s;return{...e,payment:{...e.payment,chatId:n,messageId:a,isPaymentModalOpen:!0}}})),(0,n.Q6)("closePaymentModal",(e=>{const t=(0,r.bp)(e);return(0,r.WY)(t)})),(0,n.Q6)("addPaymentError",((e,t,s)=>{const{error:n}=s;return{...e,payment:{...e.payment,error:n}}})),s(1689),s(1363),s(6204);var Z=s(1226),C=s(9118);const w=new Map,b=(0,C.Ds)((e=>e()),500,!1);async function M(e,t,s,o,c=!1,l=!1){const d=e.id;let u;switch(o){case m.Uq.Backwards:u=void 0;break;case m.Uq.Around:u=-(Math.round(a.hT/2)+1);break;case m.Uq.Forwards:u=-(a.hT+1)}const h=await(0,Z.t9)("fetchMessages",{chat:(0,i.Cm)((0,n.Rd)(),d,t),offsetId:s,addOffset:u,limit:a.hT,threadId:t});if(!h)return;const{messages:p,users:f,chats:I,threadInfos:v}=h;let y=(0,n.Rd)();const P=d===a.aw?y.serviceNotifications.map((({message:e})=>e)):[],C=[].concat(p,P),w=(0,g.ee)(C,"id"),b=Object.keys(w).map(Number);y=(0,r.c_)(y,d,w),y=c?(0,r.ff)(y,d,t,b):(0,r.xj)(y,d,t,b),y=(0,r.Sh)(y,(0,g.ee)(f,"id")),y=(0,r.fZ)(y,(0,g.ee)(I,"id")),y=(0,r.j6)(y,d,v);let M=(0,i.gb)(y,d,t);const E=(0,i.qC)(y,d,t);if(c&&M&&E&&(E.length&&!(0,g.YE)(M,E)||(y=(0,r.xj)(y,d,t,E),M=(0,i.gb)(y,d,t),y=(0,r.pf)(y,d,t,"outlyingIds",void 0),c=!1)),!l){const e=c?E:M,{newViewportIds:n}=S(e,s,o);y=(0,r.y9)(y,d,t,n)}(0,n.R3)(y)}function S(e,t,s){const{length:n}=e,o=t?function(e,t){return te[e.length-1]?e.length-1:e.findIndex(((s,n)=>s===t||st))}(e,t):-1,r=s===m.Uq.Backwards?o:o+1||n,i=r-a.hT,c=r+a.hT-1,l=e.slice(Math.max(0,i),c+1);let d,u;switch(s){case m.Uq.Backwards:d=r>0,u=i>=0;break;case m.Uq.Forwards:d=r0,u=l.length===a.hT}return{newViewportIds:l,areSomeLocal:d,areAllLocal:u}}async function E(e){let t;const s=e.attachment?(e,a)=>{w.has(a)||(t=a,w.set(a,s));const o=(0,n.Rd)();(0,n.R3)({...o,fileUploads:{byMessageLocalId:{...o.fileUploads.byMessageLocalId,[a]:{progress:e}}}})}:void 0;(e.replyingTo||h.cj)&&await(0,C.Pn)();const a=(0,n.Rd)();e.serverTimeOffset=a.serverTimeOffset;const o=(0,i.Bt)(a);if(!o)return;const{threadId:r}=o;e.replyingTo||r===u._f||(e.replyingTo=(0,i.qS)(a,e.chat.id,r)),await(0,Z.t9)("sendMessage",e,s),s&&t&&w.delete(t)}(0,n.Q6)("loadViewportMessages",((e,t,s)=>{const{direction:n=m.Uq.Around,isBudgetPreload:o=!1}=s||{};let{chatId:c,threadId:l}=s||{};if(!c){const t=(0,i.Bt)(e);if(!t)return;c=t.chatId,l=t.threadId}const d=(0,i.Z1)(e,c);if(!d||d.isRestricted)return;const u=(0,i.Cb)(e,c,l),h=(0,i.gb)(e,c,l),g=(0,i.qC)(e,c,l);if(u&&u.length&&n!==m.Uq.Around){const s=n===m.Uq.Backwards?u[0]:u[u.length-1],a=Boolean(g),i=a?g:h,{newViewportIds:p,areSomeLocal:f,areAllLocal:I}=S(i,s,n);if(f&&(e=(0,r.y9)(e,c,l,p)),async function(e,t,s,n,a,o,r,i){t||await M(a,o,i,r,s,n),n||(await Promise.resolve(),e.loadViewportMessages({chatId:a.id,threadId:o,direction:r,isBudgetPreload:!0}))}(t,I,a,o,d,l,n,s),o)return}else{const t=(0,i.G$)(e,c)||(0,i.rd)(e,c,l),s=Boolean(t&&h&&!h.includes(t)),n=(s?g:h)||[],{newViewportIds:u,areSomeLocal:p,areAllLocal:f}=S(n,t,m.Uq.Around);p&&u.length>=a.hT&&(e=(0,r.y9)(e,c,l,u)),f||M(d,l,t,m.Uq.Around,s,o)}return e})),(0,n.Q6)("loadMessage",((e,t,s)=>{const{chatId:a,messageId:o,replyOriginForId:c,threadUpdate:l}=s,d=(0,i.Z1)(e,a);d&&(async()=>{const e=await async function(e,t,s){const a=await(0,Z.t9)("fetchMessage",{chat:e,messageId:t});if(!a)return;if(a===u._Q){if(s){let t=(0,n.Rd)();const a=(0,i.hj)(t,e.id,s);t=(0,r.cY)(t,e.id,s,{...a,replyToMessageId:void 0}),(0,n.R3)(t)}return}let o=(0,n.Rd)();return o=(0,r.cY)(o,e.id,t,a.message),o=(0,r.Sh)(o,(0,g.ee)(a.users,"id")),(0,n.R3)(o),a.message}(d,o,c);if(e&&l){const{lastMessageId:t,isDeleting:s}=l;(0,n.R3)((0,r.lG)((0,n.Rd)(),e,a,t,s))}})()})),(0,n.Q6)("sendMessage",((e,t,s)=>{const n=(0,i.Bt)(e);if(!n)return;const{chatId:o,threadId:r,type:c}=n;if("scheduled"===c&&!s.scheduledAt)return{...e,messages:{...e.messages,contentToBeScheduled:s}};const l=(0,i.Z1)(e,o);t.setReplyingToId({messageId:void 0}),t.clearWebPagePreview({chatId:o,threadId:r,value:!1});const d={...s,chat:l,replyingTo:(0,i.Yy)(e,o,r),noWebPage:(0,i.tV)(e,o,r)},u=!s.attachments||s.attachments.length<=1,m=!u&&s.attachments&&s.attachments.length>1;if(u){const{attachments:e,...t}=d;E({...t,attachment:e?e[0]:void 0})}else if(m){const{text:e,entities:t,attachments:s,...n}=d,o=(0,g.Vl)(s,a.DU);for(let s=0;s0?i:void 0}),r.forEach((e=>{E({...n,attachment:e,groupedId:i})}))}}else{const{text:e,entities:t,attachments:s,replyingTo:n,...a}=d;e&&E({...a,text:e,entities:t,replyingTo:n}),s.forEach((e=>{E({...a,attachment:e})}))}})),(0,n.Q6)("editMessage",((e,t,s)=>{const{serverTimeOffset:n}=e,{text:a,entities:o}=s,r=(0,i.Bt)(e);if(!r)return;const{chatId:c,threadId:l,type:d}=r,u=(0,i.Z1)(e,c),m=(0,i.kK)(e,c,l,d);u&&m&&((0,Z.t9)("editMessage",{chat:u,message:m,text:a,entities:o,noWebPage:(0,i.tV)(e,c,l),serverTimeOffset:n}),t.setEditingId({messageId:void 0}))})),(0,n.Q6)("cancelSendingMessage",((e,t,s)=>{const{chatId:n,messageId:a}=s,o=(0,i.hj)(e,n,a),r=o&&w.get(o.previousLocalId||o.id);r&&(0,Z.u3)(r),t.apiUpdate({"@type":"deleteMessages",ids:[a],chatId:n})})),(0,n.Q6)("saveDraft",((e,t,s)=>{const{chatId:n,threadId:a,draft:o}=s;if(!o)return;const{text:c,entities:l}=o,d=(0,i.Z1)(e,n);return a===u._f&&(0,Z.t9)("saveDraft",{chat:d,text:c,entities:l,replyToMsgId:(0,i.Yy)(e,n,a)}),e=(0,r.pf)(e,n,a,"draft",o),(0,r.a4)(e,n,{draftDate:Math.round(Date.now()/1e3)})})),(0,n.Q6)("clearDraft",((e,t,s)=>{const{chatId:n,threadId:a,localOnly:o}=s;if(!(0,i.Ms)(e,n,a))return;const c=(0,i.Z1)(e,n);return o||a!==u._f||(0,Z.t9)("clearDraft",c),e=(0,r.pf)(e,n,a,"draft",void 0),(0,r.a4)(e,n,{draftDate:void 0})})),(0,n.Q6)("toggleMessageWebPage",((e,t,s)=>{const{chatId:n,threadId:a,noWebPage:o}=s;return(0,r.pf)(e,n,a,"noWebPage",o)})),(0,n.Q6)("pinMessage",((e,t,s)=>{const n=(0,i.jr)(e);if(!n)return;const{messageId:a,isUnpin:o,isOneSide:r,isSilent:c}=s;(0,Z.t9)("pinMessage",{chat:n,messageId:a,isUnpin:o,isOneSide:r,isSilent:c})})),(0,n.Q6)("unpinAllMessages",((e,t,s)=>{const a=(0,i.Z1)(e,s.chatId);a&&async function(e){await(0,Z.t9)("unpinAllMessages",{chat:e});let t=(0,n.Rd)();t=(0,r.pf)(t,e.id,u._f,"pinnedIds",[]),(0,n.R3)(t)}(a)})),(0,n.Q6)("deleteMessages",((e,t,s)=>{const{messageIds:n,shouldDeleteForAll:a}=s,o=(0,i.Bt)(e);if(!o)return;const{chatId:r,threadId:c}=o,l=(0,i.Z1)(e,r);(0,Z.t9)("deleteMessages",{chat:l,messageIds:n,shouldDeleteForAll:a});const d=(0,i._$)(e,r,c);n.includes(d)&&t.setEditingId({messageId:void 0})})),(0,n.Q6)("deleteScheduledMessages",((e,t,s)=>{const{messageIds:n}=s,a=(0,i.Bt)(e);if(!a)return;const{chatId:o}=a,r=(0,i.Z1)(e,o);(0,Z.t9)("deleteScheduledMessages",{chat:r,messageIds:n});const c=(0,i.wU)(e,o);n.includes(c)&&t.setEditingId({messageId:void 0})})),(0,n.Q6)("deleteHistory",((e,t,s)=>{(async()=>{var n;const{chatId:a,shouldDeleteForAll:o}=s,r=(0,i.Z1)(e,a);if(!r)return;const c=null===(n=r.lastMessage)||void 0===n?void 0:n.id;await(0,Z.t9)("deleteHistory",{chat:r,shouldDeleteForAll:o,maxId:c});const l=(0,i.Bt)(e);l&&l.chatId===a&&t.openChat({id:void 0})})()})),(0,n.Q6)("reportMessages",((e,t,s)=>{(async()=>{const{messageIds:n,reason:a,description:o}=s,r=(0,i.Bt)(e);if(!r)return;const{chatId:c}=r,l=(0,i.Z1)(e,c),d=await(0,Z.t9)("reportMessages",{peer:l,messageIds:n,reason:a,description:o});t.showNotification({message:d?"Thank you! Your report will be reviewed by our team.":"Error occured while submiting report. Please, try again later."})})()})),(0,n.Q6)("markMessageListRead",((e,t,s)=>{const{serverTimeOffset:n}=e,o=(0,i.Bt)(e);if(!o)return;const{chatId:c,threadId:l}=o,d=(0,i.Cm)(e,c,l);if(!d)return;const{maxId:m}=s;if(b((()=>{(0,Z.t9)("markMessageListRead",{serverTimeOffset:n,chat:d,threadId:l,maxId:m})})),l!==u._f)return;c===a.aw&&(e={...e,serviceNotifications:e.serviceNotifications.map((e=>e.isUnread&&e.id<=m?{...e,isUnread:!1}:e))});const h=(0,i.Cb)(e,c,l),g=(0,i.It)(e,c,l);if(!h||!g||!d.unreadCount)return e;const p=function(e,t,s){let n=0;for(let a=0,o=e.length;a=t&&e[a]<=s&&n++,!(e[a]>=s));a++);return n}(h,g,m);return p?(0,r.a4)(e,c,{lastReadInboxMessageId:m,unreadCount:Math.max(0,d.unreadCount-p)}):e})),(0,n.Q6)("markMessagesRead",((e,t,s)=>{const n=(0,i.jr)(e);if(!n)return;const{messageIds:a}=s;(0,Z.t9)("markMessagesRead",{chat:n,messageIds:a})})),(0,n.Q6)("loadWebPagePreview",((e,t,s)=>{const{text:a}=s;!async function(e){const t=await(0,Z.t9)("fetchWebPagePreview",{message:e});(0,n.R3)({...(0,n.Rd)(),webPagePreview:t})}(a)})),(0,n.Q6)("clearWebPagePreview",(e=>{if(e.webPagePreview)return{...e,webPagePreview:void 0}})),(0,n.Q6)("sendPollVote",((e,t,s)=>{const{chatId:n,messageId:a,options:o}=s,r=(0,i.Z1)(e,n);r&&(0,Z.t9)("sendPollVote",{chat:r,messageId:a,options:o})})),(0,n.Q6)("loadPollOptionResults",((e,t,s)=>{const{chat:a,messageId:o,option:i,offset:c,limit:l,shouldResetVoters:d}=s;!async function(e,t,s,a,o,i){const c=await(0,Z.t9)("loadPollOptionResults",{chat:e,messageId:t,option:s,offset:a,limit:o});if(!c)return;let l=(0,n.Rd)();l=(0,r.Sh)(l,(0,g.ee)(c.users,"id"));const{voters:d}=l.pollResults;(0,n.R3)({...l,pollResults:{...l.pollResults,voters:{...d,[s]:(0,g.Tw)([...!i&&d&&d[s]?d[s]:[],...c&&c.users.map((e=>e.id))])},offsets:{...l.pollResults.offsets?l.pollResults.offsets:{},[s]:c.nextOffset||""}}})}(a,o,i,c,l,d)})),(0,n.Q6)("forwardMessages",((e,t,s)=>{const{fromChatId:a,messageIds:o,toChatId:r}=e.forwardMessages,c=a?(0,i.Z1)(e,a):void 0,d=r?(0,i.Z1)(e,r):void 0,u=a&&o?o.sort(((e,t)=>e-t)).map((t=>(0,i.hj)(e,a,t))).filter(Boolean):void 0;if(!c||!d||!u)return;const{isSilent:m,scheduledAt:h}=s,g=u.filter((e=>!(0,l.jM)(e)));g.length&&(0,Z.t9)("forwardMessages",{fromChat:c,toChat:d,messages:g,serverTimeOffset:(0,n.Rd)().serverTimeOffset,isSilent:m,scheduledAt:h}),u.filter((e=>(0,l.jM)(e))).forEach((e=>{const{text:t,entities:s}=e.content.text||{},{sticker:n,poll:a}=e.content;E({chat:d,text:t,entities:s,sticker:n,poll:a,isSilent:m,scheduledAt:h})})),(0,n.R3)({...(0,n.Rd)(),forwardMessages:{}})})),(0,n.Q6)("loadScheduledHistory",((e,t,s)=>{const{chatId:a}=s,o=(0,i.Z1)(e,a);o&&async function(e){const t=await(0,Z.t9)("fetchScheduledHistory",{chat:e});if(!t)return;const{messages:s}=t,a=(0,g.ee)(s,"id"),o=Object.keys(a).map(Number).sort(((e,t)=>t-e));let i=(0,n.Rd)();i=(0,r.w3)(i,e.id,a),i=(0,r.pf)(i,e.id,u._f,"scheduledIds",o),(0,n.R3)(i)}(o)})),(0,n.Q6)("sendScheduledMessages",((e,t,s)=>{const{chatId:n,id:a}=s,o=(0,i.Z1)(e,n);o&&(0,Z.t9)("sendScheduledMessages",{chat:o,ids:[a]})})),(0,n.Q6)("rescheduleMessage",((e,t,s)=>{const{chatId:n,messageId:a,scheduledAt:o}=s,r=(0,i.Z1)(e,n),c=r&&(0,i.Tm)(e,r.id,a);r&&c&&(0,Z.t9)("rescheduleMessage",{chat:r,message:c,scheduledAt:o})})),(0,n.Q6)("requestThreadInfoUpdate",((e,t,s)=>{const{chatId:n,threadId:a}=s,o=(0,i.Cm)(e,n,a);o&&(0,Z.t9)("requestThreadInfoUpdate",{chat:o,threadId:a})})),(0,n.Q6)("loadPinnedMessages",((e,t,s)=>{const{chatId:a}=s,o=(0,i.Z1)(e,a);o&&async function(e){const t=await(0,Z.t9)("fetchPinnedMessages",{chat:e});if(!t)return;const{messages:s,chats:a,users:o}=t,i=(0,g.ee)(s,"id"),c=Object.keys(i).map(Number).sort(((e,t)=>t-e));let l=(0,n.Rd)();l=(0,r.c_)(l,e.id,i),l=(0,r.pf)(l,e.id,u._f,"pinnedIds",c),l=(0,r.Sh)(l,(0,g.ee)(o,"id")),l=(0,r.fZ)(l,(0,g.ee)(a,"id")),(0,n.R3)(l)}(o)}));var k=s(5765);const R=(0,C.P2)((e=>e()),500,!1);async function T(e,t){const s=await(0,Z.t9)("searchGifs",{query:e,offset:t});s&&(0,n.R3)((0,r.rq)((0,n.Rd)(),!t,s.gifs,s.nextOffset))}(0,n.Q6)("loadStickerSets",(e=>{const{hash:t}=e.stickers.added||{};!async function(e){const t=await(0,Z.t9)("fetchStickerSets",{hash:e});t&&(0,n.R3)((0,r.z3)((0,n.Rd)(),"added",t.hash,t.sets))}(t)})),(0,n.Q6)("loadAddedStickers",((e,t)=>{const{setIds:s}=e.stickers.added;s&&s.length&&(async()=>{for(let e=0;e0&&await(0,C.wO)(500)})()})),(0,n.Q6)("loadRecentStickers",(e=>{const{hash:t}=e.stickers.recent||{};!async function(e){const t=await(0,Z.t9)("fetchRecentStickers",{hash:e});if(!t)return;const s=(0,n.Rd)();(0,n.R3)({...s,stickers:{...s.stickers,recent:t}})}(t)})),(0,n.Q6)("loadFavoriteStickers",(e=>{const{hash:t}=e.stickers.favorite||{};!async function(e){const t=await(0,Z.t9)("fetchFavoriteStickers",{hash:e});if(!t)return;const s=(0,n.Rd)();(0,n.R3)({...s,stickers:{...s.stickers,favorite:t}})}(t)})),(0,n.Q6)("loadGreetingStickers",(e=>{const{hash:t}=e.stickers.greeting||{};(async()=>{const e=await(0,Z.t9)("fetchStickersForEmoji",{emoji:"👋⭐️",hash:t});if(!e)return;const s=(0,n.Rd)();(0,n.R3)({...s,stickers:{...s.stickers,greeting:{hash:e.hash,stickers:e.stickers.filter((e=>"👋"===e.emoji))}}})})()})),(0,n.Q6)("loadFeaturedStickers",(e=>{const{hash:t}=e.stickers.featured||{};!async function(e){const t=await(0,Z.t9)("fetchFeaturedStickers",{hash:e});t&&(0,n.R3)((0,r.z3)((0,n.Rd)(),"featured",t.hash,t.sets))}(t)})),(0,n.Q6)("loadStickers",((e,t,s)=>{const{stickerSetId:a,stickerSetShortName:o}=s;let{stickerSetAccessHash:c}=s;if(!c&&!o){const t=(0,i.Ny)(e,a);if(!t)return;c=t.accessHash}!async function(e,t,s){const a=await(0,Z.t9)("fetchStickers",{stickerSetShortName:s,stickerSetId:e,accessHash:t});if(!a)return;const{set:o,stickers:i,packs:c}=a;let l=(0,n.Rd)();l=(0,r.Rg)(l,o.id,{...o,stickers:i,packs:c});const d=l.stickers.forEmoji.emoji;d&&c[d]&&(l=(0,r.vy)(l)),(0,n.R3)(l)}(a,c,o)})),(0,n.Q6)("loadAnimatedEmojis",(()=>{!async function(){const e=await(0,Z.t9)("fetchAnimatedEmojis");if(!e)return;const{set:t,stickers:s}=e;(0,n.R3)((0,r.g_)((0,n.Rd)(),{...t,stickers:s}))}()})),(0,n.Q6)("loadSavedGifs",(e=>{const{hash:t}=e.gifs.saved;!async function(e){const t=await(0,Z.t9)("fetchSavedGifs",{hash:e});if(!t)return;const s=(0,n.Rd)();(0,n.R3)({...s,gifs:{...s.gifs,saved:t}})}(t)})),(0,n.Q6)("faveSticker",((e,t,s)=>{const{sticker:n}=s;n&&(0,Z.t9)("faveSticker",{sticker:n})})),(0,n.Q6)("unfaveSticker",((e,t,s)=>{const{sticker:a}=s;a&&function(e){const t=(0,n.Rd)();(0,n.R3)({...t,stickers:{...t.stickers,favorite:{...t.stickers.favorite,stickers:t.stickers.favorite.stickers.filter((({id:t})=>t!==e.id))}}}),(0,Z.t9)("faveSticker",{sticker:e,unfave:!0})}(a)})),(0,n.Q6)("toggleStickerSet",((e,t,s)=>{const{stickerSetId:n}=s,a=(0,i.Ny)(e,n);if(!a)return;const{accessHash:o,installedDate:r}=a;(0,Z.t9)(r?"uninstallStickerSet":"installStickerSet",{stickerSetId:n,accessHash:o})})),(0,n.Q6)("loadEmojiKeywords",((e,t,s)=>{var a;const{language:o}=s;let r=e.emojiKeywords[o];null!==(a=r)&&void 0!==a&&a.isLoading||((0,n.R3)({...e,emojiKeywords:{...e.emojiKeywords,[o]:{...r,isLoading:!0}}}),(async()=>{var t;const s=await(0,Z.t9)("fetchEmojiKeywords",{language:o,fromVersion:r?r.version:0});e=(0,n.Rd)(),r=e.emojiKeywords[o],s?(0,n.R3)({...e,emojiKeywords:{...e.emojiKeywords,[o]:{isLoading:!1,version:s.version,keywords:{...null===(t=r)||void 0===t?void 0:t.keywords,...s.keywords}}}}):(0,n.R3)({...e,emojiKeywords:{...e.emojiKeywords,[o]:{...r,isLoading:!1}}})})())})),(0,n.Q6)("setStickerSearchQuery",((e,t,s)=>{const{query:a}=s;a&&R((()=>{!async function(e,t){const s=await(0,Z.t9)("searchStickers",{query:e,hash:void 0});if(!s)return;const a=(0,n.Rd)(),{setsById:o,added:i}=a.stickers,c=s.sets.map((({id:e})=>e));i.setIds&&i.setIds.forEach((t=>{if(!c.includes(t)){const{title:s}=o[t]||{};s&&(0,k.Z)(s,e)&&c.unshift(t)}})),(0,n.R3)((0,r.z3)(a,"search",s.hash,s.sets,c))}(a)}))})),(0,n.Q6)("setGifSearchQuery",((e,t,s)=>{const{query:n}=s;"string"==typeof n&&R((()=>{T(n)}))})),(0,n.Q6)("searchMoreGifs",(e=>{const{query:t,offset:s}=e.gifs.search;"string"==typeof t&&R((()=>{T(t,s)}))})),(0,n.Q6)("loadStickersForEmoji",((e,t,s)=>{const{emoji:a}=s,{hash:o}=e.stickers.forEmoji;R((()=>{!async function(e,t){let s=(0,n.Rd)();(0,n.R3)({...s,stickers:{...s.stickers,forEmoji:{...s.stickers.forEmoji,emoji:e}}});const a=await(0,Z.t9)("fetchStickersForEmoji",{emoji:e,hash:t});s=(0,n.Rd)(),a&&s.stickers.forEmoji.emoji===e&&(s=(0,r.IM)(s,e,a.stickers,a.hash),(0,n.R3)(s))}(a,o)}))})),(0,n.Q6)("clearStickersForEmoji",(e=>({...e,stickers:{...e.stickers,forEmoji:{}}}))),(0,n.Q6)("openStickerSetShortName",((e,t,s)=>{const{stickerSetShortName:n}=s;return{...e,openedStickerSetShortName:n}}));var N=s(790);const B=(0,C.P2)((e=>e()),500,!1);async function x(e="",t,s,o,c,l){let d;if(o){const n=await(0,Z.t9)("searchMessagesLocal",{chatOrUser:o,query:e,type:t,limit:a.Hk,offsetId:s,minDate:l,maxDate:c});if(n){const{messages:e,users:t,totalCount:s,nextOffsetId:a}=n;d={messages:e,users:t,chats:[],totalCount:s,nextRate:a}}}else d=await(0,Z.t9)("searchMessagesGlobal",{query:e,offsetRate:s,limit:a.Hk,type:t,maxDate:c,minDate:l});let u=(0,n.Rd)();const m=(0,i.JX)(u);if(!d||""!==e&&e!==m)return void(0,n.R3)((0,r.xv)(u,{messages:!1}));const{messages:h,users:p,chats:f,totalCount:I,nextRate:v}=d;f.length&&(u=(0,r.fZ)(u,(0,g.ee)(f,"id"))),p.length&&(u=(0,r.Sh)(u,(0,g.ee)(p,"id"))),h.length&&(u=(0,r.m6)(u,h)),u=(0,r.px)(u,h,I,t,v),(0,n.R3)(u)}(0,n.Q6)("setGlobalSearchQuery",((e,t,s)=>{const{chatId:a}=e.globalSearch,{query:o}=s;o&&!a&&B((()=>{!async function(e){const t=await(0,Z.t9)("searchChats",{query:e});let s=(0,n.Rd)();const a=(0,i.JX)(s);if(!t||!a||e!==a)return void(0,n.R3)((0,r.xv)(s,{chats:!1}));const{localChats:o,localUsers:c,globalChats:l,globalUsers:d}=t;(o.length||l.length)&&(s=(0,r.fZ)(s,(0,g.ee)([...o,...l],"id"))),(c.length||d.length)&&(s=(0,r.Sh)(s,(0,g.ee)([...c,...d],"id"))),s=(0,r.xv)(s,{chats:!1}),s=(0,r.No)(s,{localResults:{chatIds:o.map((({id:e})=>e)),userIds:c.map((({id:e})=>e))},globalResults:{...s.globalSearch.globalResults,chatIds:l.map((({id:e})=>e)),userIds:d.map((({id:e})=>e))}}),(0,n.R3)(s)}(o)}))})),(0,n.Q6)("setGlobalSearchDate",((e,t,s)=>{const{date:a}=s,o=a?(0,N.IS)(a):a,c=(0,r.No)(e,{date:a,query:"",resultsByType:{...e.globalSearch.resultsByType,text:{totalCount:void 0,foundIds:[],nextOffsetId:0}}});(0,n.R3)(c);const{chatId:l}=e.globalSearch;x("","text",void 0,l?(0,i.Z1)(e,l):void 0,o,a)})),(0,n.Q6)("searchMessagesGlobal",((e,t,s)=>{var n;const{query:a,resultsByType:o,chatId:r,date:c}=e.globalSearch,l=c?(0,N.IS)(c):c,{type:d}=s;x(a,d,null==o||null===(n=o[d])||void 0===n?void 0:n.nextOffsetId,r?(0,i.Z1)(e,r):void 0,l,c)})),(0,n.Q6)("searchTextMessagesLocal",(e=>{const{chatId:t,threadId:s}=(0,i.Bt)(e)||{},o=t?(0,i.Z1)(e,t):void 0,c=(0,i.n5)(e);if(!o||!c||!s)return;const{query:l,results:d}=c,m=null==d?void 0:d.nextOffsetId;let h;if(s!==u._f){const n=(0,i.tZ)(e,t,s);h=null==n?void 0:n.topMessageId}!async function(e,t,s,o,c){const l=await(0,Z.t9)("searchMessagesLocal",{chatOrUser:e,type:"text",query:o,topMessageId:s,limit:a.pn,offsetId:c});if(!l)return;const{messages:d,users:u,totalCount:m,nextOffsetId:h}=l,p=(0,g.ee)(d,"id"),f=Object.keys(p).map(Number);let I=(0,n.Rd)();const v=(0,i.n5)(I);!v||o&&o!==v.query||(I=(0,r.c_)(I,e.id,p),I=(0,r.Sh)(I,(0,g.ee)(u,"id")),I=(0,r.dx)(I,e.id,t,f,m,h),(0,n.R3)(I))}(o,s,h,l,m)})),(0,n.Q6)("searchMediaMessagesLocal",(e=>{const t=(0,i.og)(e),s=t?e.users.byId[t]||e.chats.byId[t]:void 0,o=(0,i.we)(e);if(!s||!o)return;const{currentType:c,resultsByType:l}=o,d=c&&l&&l[c],u=null==d?void 0:d.nextOffsetId;c&&async function(e,t,s){const o=await(0,Z.t9)("searchMessagesLocal",{chatOrUser:e,type:t,limit:a.EN,offsetId:s});if(!o)return;const{messages:c,users:l,totalCount:d,nextOffsetId:u}=o,m=(0,g.ee)(c,"id"),h=Object.keys(m).map(Number);let p=(0,n.Rd)();(0,i.we)(p)&&(p=(0,r.c_)(p,e.id,m),p=(0,r.Sh)(p,(0,g.ee)(l,"id")),p=(0,r.c1)(p,e.id,t,h,d,u),(0,n.R3)(p))}(s,c,u)})),(0,n.Q6)("searchMessagesByDate",((e,t,s)=>{const{timestamp:a}=s,{chatId:o}=(0,i.Bt)(e)||{};if(!o)return;const r=(0,i.Z1)(e,o);r&&async function(e,t){const s=await(0,Z.t9)("findFirstMessageIdAfterDate",{chat:e,timestamp:t});s&&(0,n.uC)().focusMessage({chatId:e.id,messageId:s})}(r,a)})),(0,n.Q6)("checkPublicLink",((e,t,s)=>{const{chatId:a}=(0,i.Bt)(e)||{};if(!a)return;if(e.management.progress===m.wv.InProgress)return;const{username:o}=s;(async()=>{e=(0,r.H9)(e,m.wv.InProgress),e=(0,r.fw)(e,a,{isUsernameAvailable:void 0}),(0,n.R3)(e);const t=await(0,Z.t9)("checkChatUsername",{username:o});e=(0,n.Rd)(),e=(0,r.H9)(e,t?m.wv.Complete:m.wv.Error),e=(0,r.fw)(e,a,{isUsernameAvailable:t}),(0,n.R3)(e)})()})),(0,n.Q6)("updatePublicLink",((e,t,s)=>{const{chatId:a}=(0,i.Bt)(e)||{};let o=a&&(0,i.Z1)(e,a);if(!a||!o)return;const{username:c}=s;(async()=>{if(e=(0,r.H9)(e,m.wv.InProgress),(0,n.R3)(e),(0,l.G9)(o)){if(o=await(0,Z.t9)("migrateChat",o),!o)return;t.openChat({id:o.id})}const s=await(0,Z.t9)("setChatUsername",{chat:o,username:c});e=(0,n.Rd)(),e=(0,r.H9)(e,s?m.wv.Complete:m.wv.Error),e=(0,r.fw)(e,a,{isUsernameAvailable:void 0}),(0,n.R3)(e)})()})),(0,n.Q6)("updatePrivateLink",(e=>{const{chatId:t}=(0,i.Bt)(e)||{},s=t&&(0,i.Z1)(e,t);t&&s&&(0,Z.t9)("updatePrivateLink",{chat:s})}));var L=s(7358);async function A(){const e=await(0,Z.t9)("fetchChats",{limit:a.Ov,archived:!0,withPinned:!0,serverTimeOffset:(0,n.Rd)().serverTimeOffset});if(!e)return;let t=(0,n.Rd)();t=(0,r.eD)(t,(0,g.ee)(e.users,"id")),t=(0,r.GL)(t,(0,g.ee)(e.chats,"id")),t=(0,r.Mg)(t,"archived",e.chatIds),t=(0,r.vv)(t,"archived",e),(0,n.R3)(t)}async function O(){let e=(0,n.Rd)();const{recentlyFoundChatIds:t}=e.globalSearch,{userIds:s}=e.contactList||{};if(!(s&&s.length||t&&t.length))return;const a=[...t||[],...s||[]].map((t=>(0,i.dy)(e,t))).filter(Boolean),o=await(0,Z.t9)("fetchUsers",{users:a});o&&(e=(0,n.Rd)(),e=(0,r.eD)(e,(0,g.ee)(o,"id")),(0,n.R3)(e))}function F(e){return(0,Z.t9)("fetchMessages",{chat:e,threadId:u._f,offsetId:e.lastReadInboxMessageId,addOffset:-(Math.round(a.hT/2)+1),limit:a.hT})}(0,n.Q6)("sync",((e,t)=>{!async function(e){a.eM&&console.log(">>> START SYNC"),await(0,Z.t9)("fetchCurrentUser");const t=await async function(){var e;let t=(0,n.Rd)();const s=await(0,Z.t9)("fetchChats",{limit:a.Ov,withPinned:!0,serverTimeOffset:t.serverTimeOffset,lastLocalServiceMessage:null===(e=(0,i.VF)(t))||void 0===e?void 0:e.message});if(!s)return;t=(0,n.Rd)();const{recentlyFoundChatIds:o}=t.globalSearch,{userIds:c}=t.contactList||{},{currentUserId:d}=t,m=[...o||[],...c||[],...d?[d]:[]],h=m.map((e=>(0,i.dy)(t,e))).filter(Boolean),p=m.map((e=>(0,i.Z1)(t,e))).filter(Boolean),{chatId:f}=(0,i.Bt)(t)||{};if(f){const e=(0,i.Z1)(t,f);if(e&&!m.includes(f)&&p.push(e),(0,l.YC)(f)){const e=(0,i.dy)(t,f);e&&!m.includes(f)&&h.push(e)}}return h.push(...s.users),p.push(...s.chats),t=(0,r.SL)(t,(0,g.ee)(p,"id")),t=(0,r.Mg)(t,"active",s.chatIds),t={...t,chats:{...t.chats}},t=(0,r.vv)(t,"active",s),Object.keys(s.draftsById).forEach((e=>{t=(0,r.pf)(t,e,u._f,"draft",s.draftsById[e])})),Object.keys(s.replyingToById).forEach((e=>{t=(0,r.pf)(t,e,u._f,"replyingToId",s.replyingToById[e])})),(0,n.R3)(t),f&&!t.chats.byId[f]&&(0,n.uC)().openChat({id:void 0}),h}();await async function(e){let t=!1,s=e||[],o=(0,n.Rd)();const{chatId:c,threadId:l}=(0,i.Bt)(o)||{},d=Object.keys(o.messages.byChatId).reduce(((e,t)=>{const s=(0,i.Ms)(o,t,u._f);return s&&(e[t]=s),e}),{});if(c){const e=await F(o.chats.byId[c]);o=(0,n.Rd)();const{chatId:d}=(0,i.Bt)(o)||{},m=l&&(0,i.tZ)(o,c,l);if(e&&d===c){const n=o.messages.byChatId[c],i=c===a.aw?o.serviceNotifications.map((({message:e})=>e)):[],d=[].concat(e.messages,i),h=(0,g.ee)(d,"id"),p=Object.keys(h).map(Number);if(o={...o,messages:{...o.messages,byChatId:{}}},o=(0,r.c_)(o,c,h),o=(0,r.xj)(o,c,u._f,p),o=(0,r.y9)(o,c,u._f,p),l&&m&&m.originChannelId){const{originChannelId:e}=m,t=o.messages.byChatId[e],s=await F(o.chats.byId[e]);if(s){const e=(0,g.ee)(s.messages,"id"),a=Object.keys(e).map(Number);o={...o,messages:{...o.messages,byChatId:{...o.messages.byChatId,[m.originChannelId]:{byId:e,threadsById:{[u._f]:{...null==t?void 0:t.threadsById[u._f],listedIds:a,viewportIds:a,outlyingIds:void 0}}},[c]:{...o.messages.byChatId[c],threadsById:{...o.messages.byChatId[c].threadsById,[l]:{...null==n?void 0:n.threadsById[l],outlyingIds:void 0}}}}}}}}o=(0,r.GL)(o,(0,g.ee)(e.chats,"id")),o=(0,r.j6)(o,c,e.threadInfos),t=!0,s=Array.prototype.concat(s,e.users)}}t||(o={...o,messages:{...o.messages,byChatId:{}}}),Object.keys(d).forEach((e=>{o=(0,r.pf)(o,e,u._f,"draft",d[e])})),e?o=(0,r.s5)(o,(0,g.ee)(s,"id")):s&&(o=(0,r.eD)(o,(0,g.ee)(s,"id"))),(0,n.R3)(o);const{chatId:m,messageId:h}=o.audioPlayer;m&&h&&!(0,i.hj)(o,m,h)&&(0,n.uC)().closeAudioPlayer()}(t),(0,n.R3)({...(0,n.Rd)(),lastSyncTime:Date.now()}),a.eM&&console.log(">>> FINISH SYNC"),e()}(t.afterSync)})),(0,n.Q6)("afterSync",((e,t)=>{!async function(e){a.eM&&console.log(">>> START AFTER-SYNC"),e.loadFavoriteStickers(),await Promise.all([O(),A()]),await(0,Z.t9)("fetchCurrentUser"),(0,L.w)((0,i.A1)((0,n.Rd)())),a.eM&&console.log(">>> FINISH AFTER-SYNC")}(t)}));const U=(0,C.Ds)((e=>e()),500,!1,!0),$=(0,C.P2)((e=>e()),500,!1);function D(e,t,s){return{...e,inlineBots:{...e.inlineBots,byUsername:{...e.inlineBots.byUsername,[t]:s}}}}function Q(e,t){return{...e,inlineBots:{...e.inlineBots,isLoading:t}}}(0,n.Q6)("loadFullUser",((e,t,s)=>{const{userId:n}=s,a=(0,i.dy)(e,n);if(!a)return;const{id:o,accessHash:r}=a;U((()=>(0,Z.t9)("fetchFullUser",{id:o,accessHash:r})))})),(0,n.Q6)("loadUser",((e,t,s)=>{const{userId:a}=s,o=(0,i.dy)(e,a);o&&(async()=>{const t=await(0,Z.t9)("fetchUsers",{users:[o]});t&&(e=(0,n.Rd)(),e=(0,r.eD)(e,(0,g.ee)(t,"id")),(0,n.R3)(e))})()})),(0,n.Q6)("loadTopUsers",(e=>{const{topPeers:{lastRequestedAt:t}}=e;(!t||(0,p.b)(e.serverTimeOffset)-t>60)&&async function(){const e=await(0,Z.t9)("fetchTopUsers");if(!e)return;const{ids:t,users:s}=e;let a=(0,n.Rd)();a=(0,r.Sh)(a,(0,g.ee)(s,"id")),a={...a,topPeers:{...a.topPeers,userIds:t,lastRequestedAt:(0,p.b)(a.serverTimeOffset)}},(0,n.R3)(a)}()})),(0,n.Q6)("loadContactList",(()=>{!async function(){const e=await(0,Z.t9)("fetchContactList");if(!e)return;let t=(0,r.Sh)((0,n.Rd)(),(0,g.ee)(e.users,"id"));t=(0,r.fZ)(t,(0,g.ee)(e.chats,"id"));const s=e=>e.lastName||e.firstName||"",a=new Intl.Collator("en-US"),o=e.users.sort(((e,t)=>a.compare(s(e),s(t)))).filter((e=>!e.isSelf));(0,n.R3)({...t,contactList:{userIds:o.map((e=>e.id))}})}()})),(0,n.Q6)("loadCurrentUser",(()=>{(0,Z.t9)("fetchCurrentUser")})),(0,n.Q6)("loadCommonChats",(e=>{var t;const{chatId:s}=(0,i.Bt)(e)||{},a=s?(0,i.dy)(e,s):void 0;!a||(0,l.cS)(a)||null!==(t=a.commonChats)&&void 0!==t&&t.isFullyLoaded||(async()=>{var t,s;const o=null===(t=a.commonChats)||void 0===t?void 0:t.maxId,i=await(0,Z.t9)("fetchCommonChats",a.id,a.accessHash,o);if(!i)return;const{chats:c,chatIds:l,isFullyLoaded:d}=i;e=(0,n.Rd)(),c.length&&(e=(0,r.fZ)(e,(0,g.ee)(c,"id"))),e=(0,r.Nq)(e,a.id,{commonChats:{maxId:l.length?l[l.length-1]:"0",ids:(0,g.Tw)(((null===(s=a.commonChats)||void 0===s?void 0:s.ids)||[]).concat(l)),isFullyLoaded:d}}),(0,n.R3)(e)})()})),(0,n.Q6)("updateContact",((e,t,s)=>{const{userId:a,isMuted:o,firstName:c,lastName:l}=s;!async function(e,t,s,a){const o=(0,n.Rd)(),c=(0,i.dy)(o,e);if(!c)return;let l;if((0,n.uC)().updateChatMutedState({chatId:e,isMuted:t}),(0,n.R3)((0,r.H9)((0,n.Rd)(),m.wv.InProgress)),c.phoneNumber)l=await(0,Z.t9)("updateContact",{phone:c.phoneNumber,firstName:s,lastName:a});else{const{id:e,accessHash:t}=c;l=await(0,Z.t9)("addContact",{id:e,accessHash:t,phoneNumber:"",firstName:s,lastName:a})}l&&(0,n.R3)((0,r.Nq)((0,n.Rd)(),c.id,{firstName:s,lastName:a})),(0,n.R3)((0,r.H9)((0,n.Rd)(),m.wv.Complete))}(a,o,c,l)})),(0,n.Q6)("deleteUser",((e,t,s)=>{const{userId:a}=s;!async function(e){const t=(0,n.Rd)(),s=(0,i.dy)(t,e);if(!s)return;const{id:a,accessHash:o}=s;await(0,Z.t9)("deleteUser",{id:a,accessHash:o})}(a)})),(0,n.Q6)("loadProfilePhotos",((e,t,s)=>{const{profileId:a}=s,o=(0,l.YC)(a),c=o?(0,i.dy)(e,a):void 0,d=o?void 0:(0,i.Z1)(e,a);(c||d)&&(async()=>{const e=await(0,Z.t9)("fetchProfilePhotos",c,d);if(!e||!e.photos)return;let t=(0,n.Rd)();o?t=(0,r.Nq)(t,a,{photos:e.photos}):(t=(0,r.Sh)(t,(0,g.ee)(e.users,"id")),t=(0,r.a4)(t,a,{photos:e.photos})),(0,n.R3)(t)})()})),(0,n.Q6)("setUserSearchQuery",((e,t,s)=>{const{query:a}=s;a&&$((()=>{!async function(e){const t=await(0,Z.t9)("searchChats",{query:e});let s=(0,n.Rd)();const a=s.userSearch.query;if(!t||!a||e!==a)return void(0,n.R3)((0,r.Q3)(s,!1));const{localUsers:o,globalUsers:i}=t;let c,l;o.length&&(s=(0,r.Sh)(s,(0,g.ee)(o,"id")),c=o.map((({id:e})=>e))),i.length&&(s=(0,r.Sh)(s,(0,g.ee)(i,"id")),l=i.map((({id:e})=>e))),s=(0,r.Q3)(s,!1),s=(0,r.Lm)(s,{localUserIds:c,globalUserIds:l}),(0,n.R3)(s)}(a)}))})),(0,n.Q6)("addContact",((e,t,s)=>{const{userId:n}=s,a=(0,i.dy)(e,n);a&&(0,Z.t9)("addContact",(0,g.ei)(a,["id","accessHash","firstName","lastName","phoneNumber"]))}));const q=(0,C.Ds)((e=>e()),500,!1);async function G(e,t,s,n){await(0,Z.t9)("sendMessage",{chat:e,text:s,replyingTo:n})}(0,n.Q6)("clickInlineButton",((e,t,s)=>{const{button:o}=s;switch(o.type){case"command":t.sendBotCommand({command:o.value});break;case"url":o.value.match(a.FS)||o.value.match(a.g$)?t.openTelegramLink({url:o.value}):t.toggleSafeLinkModal({url:o.value});break;case"callback":{const t=(0,i.jr)(e);if(!t)return;!async function(e,t,s){const a=await(0,Z.t9)("answerCallbackButton",{chatId:e.id,accessHash:e.accessHash,messageId:t,data:s});if(!a)return;const{showDialog:o,showNotification:r,toggleSafeLinkModal:i}=(0,n.uC)(),{message:c,alert:l,url:d}=a;l?o({data:{message:c||"Error"}}):c?r({message:c}):d&&i({url:d})}(t,o.messageId,o.value);break}case"requestPoll":t.openPollModal();break;case"buy":{const s=(0,i.jr)(e),{messageId:n,value:a}=o;if(!s)return;a?t.getReceipt({receiptMessageId:a,chatId:s.id,messageId:n}):(t.getPaymentForm({chat:s,messageId:n}),t.setInvoiceMessageInfo((0,i.hj)(e,s.id,n)),t.openPaymentModal({chatId:s.id,messageId:n}));break}}})),(0,n.Q6)("sendBotCommand",((e,t,s)=>{const{command:n,chatId:a}=s,{currentUserId:o}=e,r=a?(0,i.Z1)(e,a):(0,i.jr)(e),c=(0,i.Bt)(e);if(!o||!r||!c)return;const{threadId:l}=c;t.setReplyingToId({messageId:void 0}),t.clearWebPagePreview({chatId:r.id,threadId:l,value:!1}),G(r,0,n,(0,i.Yy)(e,r.id,l))})),(0,n.Q6)("restartBot",((e,t,s)=>{const{chatId:a}=s,{currentUserId:o}=e,c=(0,i.jr)(e),l=o&&(0,i.IK)(e,a);o&&c&&l&&(async()=>{await(0,Z.t9)("unblockContact",l.id,l.accessHash)&&((0,n.R3)((0,r.rB)((0,n.Rd)(),l.id)),G(c,0,"/start"))})()})),(0,n.Q6)("loadTopInlineBots",(e=>{const{lastRequestedAt:t}=e.topInlineBots;t&&(0,p.b)(e.serverTimeOffset)-t<60||(async()=>{const t=await(0,Z.t9)("fetchTopInlineBots");if(!t)return;const{ids:s,users:a}=t;let o=(0,n.Rd)();o=(0,r.Sh)(o,(0,g.ee)(a,"id")),o={...o,topInlineBots:{...o.topInlineBots,userIds:s,lastRequestedAt:(0,p.b)(e.serverTimeOffset)}},(0,n.R3)(o)})()})),(0,n.Q6)("queryInlineBot",((e,t,s)=>{const{chatId:a,username:o,query:c,offset:l}=s;(async()=>{let t=e.inlineBots.byUsername[o];if(!1!==t){if(void 0===t){const{user:s,chat:a}=await(0,Z.t9)("fetchInlineBot",{username:o})||{};if(e=(0,n.Rd)(),!s||!a)return void(0,n.R3)(D(e,o,!1));e=(0,r.Sh)(e,{[s.id]:s}),e=(0,r.fZ)(e,{[a.id]:a}),t={id:s.id,query:"",offset:"",switchPm:void 0,canLoadMore:!0,results:[]},e=D(e,o,t),(0,n.R3)(e)}(c!==t.query||t.canLoadMore)&&q((()=>{!async function({username:e,inlineBotData:t,chatId:s,query:a,offset:o}){let r=(0,n.Rd)();const c=(0,i.dy)(r,t.id),l=(0,i.Z1)(r,s);if(!c||!l)return;const d=t.query!==a;r=Q(r,!0),r=D(r,e,{...t,query:a,...d&&{offset:void 0,results:[]}}),(0,n.R3)(r);const u=await(0,Z.t9)("fetchInlineBotResults",{bot:c,chat:l,query:a,offset:d?void 0:o}),m=r.inlineBots.byUsername[e];if(r=Q((0,n.Rd)(),!1),!u||!m||a!==m.query)return void(0,n.R3)(r);const h=new Set((m.results||[]).map((e=>e.id))),g=u.results.filter((e=>!h.has(e.id)));r=D(r,e,{...m,help:u.help,...g.length&&{isGallery:u.isGallery},...u.switchPm&&{switchPm:u.switchPm},canLoadMore:u.results.length>0&&Boolean(u.nextOffset),results:""===m.offset||m.offset===u.nextOffset?u.results:(m.results||[]).concat(g),offset:g.length?u.nextOffset:""}),(0,n.R3)(r)}({username:o,inlineBotData:t,chatId:a,query:c,offset:l})}))}})()})),(0,n.Q6)("sendInlineBotResult",((e,t,s)=>{const{id:n,queryId:a}=s,o=(0,i.Bt)(e);if(!o||!n)return;const{chatId:r,threadId:c}=o,l=(0,i.Z1)(e,r);t.setReplyingToId({messageId:void 0}),t.clearWebPagePreview({chatId:r,threadId:c,value:!1}),(0,Z.t9)("sendInlineBotResult",{chat:l,resultId:n,queryId:a,replyingTo:(0,i.Yy)(e,r,c)})})),(0,n.Q6)("resetInlineBot",((e,t,s)=>{const{username:a}=s;let o=e.inlineBots.byUsername[a];o&&(o={id:o.id,query:"",offset:"",switchPm:void 0,canLoadMore:!0,results:[]},(0,n.R3)(D(e,a,o)))})),(0,n.Q6)("startBot",((e,t,s)=>{const{botId:n,param:a}=s,o=(0,i.dy)(e,n);o&&(async()=>{await(0,Z.t9)("startBot",{bot:o,startParam:a})})()})),s(9667),(0,n.Q6)("loadPasswordInfo",(()=>{(async()=>{const e=await(0,Z.t9)("getPasswordInfo");if(!e)return;let t=(0,n.Rd)();t=(0,r.BI)(t,{hasPassword:e.hasPassword}),t=(0,r.IE)(t,{hint:e.hint}),(0,n.R3)(t)})()})),(0,n.Q6)("checkPassword",((e,t,s)=>{const{currentPassword:a,onSuccess:o}=s;(0,n.R3)((0,r.IE)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await(0,Z.t9)("checkPassword",a);(0,n.R3)((0,r.IE)((0,n.Rd)(),{isLoading:!1})),e&&o()})()})),(0,n.Q6)("clearPassword",((e,t,s)=>{const{currentPassword:a,onSuccess:o}=s;(0,n.R3)((0,r.IE)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await(0,Z.t9)("clearPassword",a);(0,n.R3)((0,r.IE)((0,n.Rd)(),{isLoading:!1})),e&&o()})()})),(0,n.Q6)("updatePassword",((e,t,s)=>{const{currentPassword:a,password:o,hint:i,email:c,onSuccess:l}=s;(0,n.R3)((0,r.IE)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await(0,Z.t9)("updatePassword",a,o,i,c);(0,n.R3)((0,r.IE)((0,n.Rd)(),{isLoading:!1})),e&&l()})()})),(0,n.Q6)("updateRecoveryEmail",((e,t,s)=>{const{currentPassword:a,email:o,onSuccess:i}=s;(0,n.R3)((0,r.IE)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await(0,Z.t9)("updateRecoveryEmail",a,o);(0,n.R3)((0,r.IE)((0,n.Rd)(),{isLoading:!1,waitingEmailCodeLength:void 0})),e&&i()})()})),(0,n.Q6)("provideTwoFaEmailCode",((e,t,s)=>{const{code:n}=s;(0,Z.t9)("provideRecoveryEmailCode",n)})),(0,n.Q6)("clearTwoFaError",(e=>(0,r.IE)(e,{error:void 0}))),(0,n.Q6)("validateRequestedInfo",((e,t,s)=>{const{requestInfo:a,saveInfo:o}=s,c=(0,i.gx)(e),l=c&&(0,i.Z1)(e,c),d=(0,i.Mz)(e);l&&d&&async function(e,t,s,a){const o=await(0,Z.t9)("validateRequestedInfo",{chat:e,messageId:t,requestInfo:s,shouldSave:a});if(!o)return;const{id:i,shippingOptions:c}=o;if(!i)return;let l=(0,r.vT)((0,n.Rd)(),i);c?(l=(0,r.TM)(l,c),l=(0,r.Q$)(l,m.KB.Shipping)):l=(0,r.Q$)(l,m.KB.PaymentInfo),(0,n.R3)(l)}(l,d,a,o)})),(0,n.Q6)("getPaymentForm",((e,t,s)=>{const{chat:a,messageId:o}=s;a&&o&&async function(e,t){const s=await(0,Z.t9)("getPaymentForm",{chat:e,messageId:t});if(!s)return;let a=(0,r._7)((0,n.Rd)(),s),o=m.KB.PaymentInfo;a.payment.invoice&&(a.payment.invoice.shippingAddressRequested||a.payment.invoice.nameRequested||a.payment.invoice.phoneRequested||a.payment.invoice.emailRequested)&&(o=m.KB.ShippingInfo),a=(0,r.Q$)(a,o),(0,n.R3)(a)}(a,o)})),(0,n.Q6)("getReceipt",((e,t,s)=>{const{receiptMessageId:a,chatId:o,messageId:c}=s,l=o&&(0,i.Z1)(e,o);c&&a&&l&&async function(e,t,s){const a=await(0,Z.t9)("getReceipt",e,s);if(!a)return;let o=(0,n.Rd)();const c=(0,i.hj)(o,e.id,t);o=(0,r.Dq)(o,a,c),(0,n.R3)(o)}(l,c,a)})),(0,n.Q6)("clearPaymentError",(e=>{(0,n.R3)({...e,payment:{...e.payment,error:void 0}})})),(0,n.Q6)("clearReceipt",(e=>{(0,n.R3)({...e,payment:{...e.payment,receipt:void 0}})})),(0,n.Q6)("sendCredentialsInfo",((e,t,s)=>{const a=(0,i.$$)(e);if(!a)return;const{credentials:o}=s,{data:c}=o;!async function(e,t){const s=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}),a=await fetch(`https://api.stripe.com/v1/tokens${s}`,{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:`Bearer ${t}`}}),o=await a.json();if(o.error){const e=(0,l.Ow)(o.error),t=(0,n.Rd)();return void(0,n.R3)({...t,payment:{...t.payment,error:{...e}}})}let i=(0,r.QH)((0,n.Rd)(),{type:o.type,id:o.id});i=(0,r.Q$)(i,m.KB.Checkout),(0,n.R3)(i)}(c,a)})),(0,n.Q6)("sendPaymentForm",((e,t,s)=>{const{shippingOptionId:a,saveCredentials:o}=s,c=(0,i.gx)(e),l=c&&(0,i.Z1)(e,c),d=(0,i.Mz)(e),u=(0,i.eh)(e),m=(0,i.sp)(e),h=(0,i.$$)(e),g=(0,i.i3)(e);l&&d&&h&&u&&async function(e,t,s,a,o,i){if(await(0,Z.t9)("sendPaymentForm",{chat:e,messageId:t,formId:s,credentials:a,requestedInfoId:o,shippingOptionId:i})){const e=(0,r.bp)((0,n.Rd)());(0,n.R3)((0,r.WY)(e))}}(l,d,u,{save:o,data:g},m,a)})),(0,n.Q6)("setPaymentStep",((e,t,s={})=>(0,r.Q$)(e,s.step||m.KB.ShippingInfo))),(0,n.Q6)("setInvoiceMessageInfo",((e,t,s)=>(0,r.nA)(e,s))),s(4907);var j=s(8406);const H=(0,C.P2)((e=>e()),500,!0);(0,n.Q6)("apiUpdate",((e,t,s)=>{switch(s["@type"]){case"updateChat":{s.noTopChatsRequest||(0,i.N)(e,s.id)||t.loadTopChats();const a=(0,r.a4)(e,s.id,s.chat,s.newProfilePhoto);(0,n.R3)(a),H((()=>(0,L.w)((0,i.A1)((0,n.Rd)())))),s.chat.id&&(0,j.Vr)({chatId:s.chat.id,lastReadInboxMessageId:s.chat.lastReadInboxMessageId});break}case"updateChatJoin":{const a=(0,i.Ek)(e,s.id);if(!a)break;e=(0,r.B1)(e,a,[s.id]),e=(0,r.a4)(e,s.id,{isNotJoined:!1}),(0,n.R3)(e);const o=(0,i.Z1)(e,s.id);o&&t.requestChatUpdate({chatId:o.id});break}case"updateChatLeave":(0,n.R3)((0,r.Dd)(e,s.id));break;case"updateChatInbox":(0,n.R3)((0,r.a4)(e,s.id,s.chat)),H((()=>(0,L.w)((0,i.A1)((0,n.Rd)()))));break;case"updateChatTypingStatus":{const{id:t,typingStatus:a}=s;(0,n.R3)((0,r.a4)(e,t,{typingStatus:a})),setTimeout((()=>{const e=(0,n.Rd)(),s=(0,i.Z1)(e,t);s&&a&&s.typingStatus&&s.typingStatus.timestamp===a.timestamp&&(0,n.R3)((0,r.a4)(e,t,{typingStatus:void 0}))}),6e3);break}case"newMessage":{const{message:a}=s,{chatId:o,threadId:c,type:l}=(0,i.Bt)(e)||{};if(a.senderId===e.currentUserId&&!a.isFromScheduled)return;const d=(0,i.Z1)(e,s.chatId);if(!d)return;"thread"===l&&c===u._f&&s.chatId===o?setTimeout((()=>{t.requestChatUpdate({chatId:s.chatId})}),1500):(0,n.R3)((0,r.a4)(e,s.chatId,{unreadCount:d.unreadCount?d.unreadCount+1:1,...s.message.hasUnreadMention&&{unreadMentionsCount:d.unreadMentionsCount?d.unreadMentionsCount+1:1}})),(0,L.w)((0,i.A1)((0,n.Rd)())),(0,j.zP)({chat:d,message:a});break}case"updateCommonBoxMessages":case"updateChannelMessages":{const{ids:t,messageUpdate:a}=s;if(!1!==a.hasUnreadMention)return;t.forEach((t=>{const n="channelId"in s?s.channelId:(0,i.X5)(e,t),a=(0,i.Z1)(e,n);null!=a&&a.unreadMentionsCount&&(e=(0,r.a4)(e,n,{unreadMentionsCount:a.unreadMentionsCount-1}))})),(0,n.R3)(e);break}case"updateChatFullInfo":{const{fullInfo:t}=s,a=e.chats.byId[s.id];if(!a)return;(0,n.R3)((0,r.a4)(e,s.id,{fullInfo:{...a.fullInfo,...t}}));break}case"updatePinnedChatIds":{const{ids:t,folderId:o}=s,r=o===a.WS?"archived":"active";e={...e,chats:{...e.chats,orderedPinnedIds:{...e.chats.orderedPinnedIds,[r]:t.length?t:void 0}}},(0,n.R3)(e);break}case"updateChatPinned":{const{id:t,isPinned:o}=s,r=(0,i.Ek)(e,t);if(r){const{[r]:s}=e.chats.orderedPinnedIds;let n=s||[];if(o){if(!n.includes(t)){if("active"===r&&n.length>=a.EG){const t=e.chats.listIds.active;n=n.filter((e=>t&&t.includes(e)))}n=[t,...n]}}else n=n.filter((e=>e!==t));e={...e,chats:{...e.chats,orderedPinnedIds:{...e.chats.orderedPinnedIds,[r]:n.length?n:void 0}}}}(0,n.R3)(e);break}case"updateChatListType":{const{id:t,folderId:a}=s;(0,n.R3)((0,r.Pi)(e,t,a));break}case"updateChatFolder":{const{id:t,folder:a}=s,{byId:o,orderedIds:r}=e.chatFolders,i=a?{...o,[t]:a}:(0,g.ei)(o,Object.keys(o).map(Number).filter((e=>e!==t))),c=a?r&&r.includes(t)?r:[...r||[],t]:r?r.filter((e=>e!==t)):void 0;(0,n.R3)({...e,chatFolders:{...e.chatFolders,byId:i,orderedIds:c}});break}case"updateChatFoldersOrder":{const{orderedIds:t}=s;(0,n.R3)({...e,chatFolders:{...e.chatFolders,orderedIds:t}});break}case"updateRecommendedChatFolders":{const{folders:t}=s;(0,n.R3)({...e,chatFolders:{...e.chatFolders,recommended:t}});break}case"updateChatMembers":{var o;const t=e.chats.byId[s.id],{replacedMembers:a,addedMember:i,deletedMemberId:c}=s;if(!t)return;let l=!1,d=null!==(o=t.fullInfo)&&void 0!==o&&o.members?[...t.fullInfo.members]:[];if(a)d=a,l=!0;else if(i)d.length&&d.some((e=>e.userId===i.userId))||(d.push(i),l=!0);else if(d.length&&c){const e=d.findIndex((e=>e.userId===c));e>-1&&(d.slice(e,1),l=!0)}if(l){const a=d.filter((({isOwner:e,isAdmin:t})=>e||t));(0,n.R3)((0,r.a4)(e,s.id,{membersCount:d.length,fullInfo:{...t.fullInfo,members:d,adminMembers:a}}))}break}case"deleteProfilePhotos":{const{chatId:t,ids:a}=s,o=e.chats.byId[t];null!=o&&o.photos&&(0,n.R3)((0,r.a4)(e,t,{photos:o.photos.filter((e=>!a.includes(e.id)))}));break}case"draftMessage":{const{chatId:t,formattedText:a,date:o,replyingToId:i}=s;e.chats.byId[t]&&(e=(0,r.pf)(e,t,u._f,"draft",a),e=(0,r.pf)(e,t,u._f,"replyingToId",i),e=(0,r.a4)(e,t,{draftDate:o}),(0,n.R3)(e));break}case"showInvite":{const{data:e}=s;t.showDialog({data:e});break}}}));const _=350;function V(e,t,s,n,a=!1){const o=a?(0,i.Tm)(e,t,s):(0,i.hj)(e,t,s);if(o&&n.content){const{photo:e,video:t,sticker:s,document:a}=(0,l.qp)(o);e&&n.content.photo?(n.content.photo.blobUrl=e.blobUrl,n.content.photo.thumbnail=e.thumbnail):t&&n.content.video?n.content.video.blobUrl=t.blobUrl:s&&n.content.sticker?n.content.sticker.isPreloadedGlobally=s.isPreloadedGlobally:a&&n.content.document&&(n.content.document.previewBlobUrl=a.previewBlobUrl)}return a?(0,r.P4)(e,t,s,n):(0,r.cY)(e,t,s,n)}function z(e,t,s,n){const{chatId:a}=s,{threadInfo:o}=(0,i.Db)(e,a,s)||{};if(!o&&s.replyToMessageId){const o=(0,i.hj)(e,a,s.replyToMessageId);o?e=(0,r.lG)(e,o,a,s.id,n):t.loadMessage({chatId:a,messageId:s.replyToMessageId,threadUpdate:{isDeleting:n,lastMessageId:s.id}})}return e}function W(e,t,s){const{id:n,chatId:a}=s,{threadInfo:o,firstMessageId:c}=(0,i.Db)(e,a,s)||{},d=(0,i.Z1)(e,a),m=(null==d?void 0:d.unreadCount)&&!(0,i.gb)(e,a,u._f);if(e=z(e,t,s),o&&(!c&&(0,l.CI)(s)||(e=(0,r.xj)(e,a,o.threadId,[n]),(0,i.b9)(e,a,o.threadId)&&(e=(0,r.$S)(e,a,o.threadId,n),c||(e=(0,r.pf)(e,a,o.threadId,"firstMessageId",s.id)))),e=(0,r.pf)(e,a,o.threadId,"threadInfo",{...o,lastMessageId:s.id,messagesCount:o.messagesCount+1})),m)return e;if(e=(0,r.xj)(e,a,u._f,[n]),(0,i.b9)(e,a,u._f)){const t=(0,i.It)(e,a,u._f),s=(0,r.$S)(e,a,u._f,n),o=(0,i.Cb)(s,a,u._f);t&&!o.includes(t)||(e=s)}return e}function Y(e,t,s,n=!1){var a;const{chats:o}=e,i=null===(a=o.byId[t])||void 0===a?void 0:a.lastMessage;return!i||n||i.id===s.id||i.id===s.previousLocalId||s.id>i.id?(0,r.a4)(e,t,{lastMessage:s}):e}function X(e,t){const s=(0,i.Zw)(e,t),n=(0,i.gb)(e,t,u._f);if(!s||!n)return;let a=n.length;for(;a--;){const e=s[n[a]];if(!e.isDeleting)return e}}function K(e,t,s,a){if(e){t.forEach((t=>{const s=X(a=(0,r.cY)(a,e,t,{isDeleting:!0}),e);s&&(a=Y(a,e,s,!0))})),(0,n.R3)(a),s.requestChatUpdate({chatId:e});const o=[];return t.forEach((t=>{const n=(0,i.hj)(a,e,t);if(!n)return;a=z(a,s,n,!0);const{threadInfo:r}=(0,i.Db)(a,e,n)||{};r&&o.push(r.threadId)})),(0,n.R3)(a),void setTimeout((()=>{(0,n.R3)((0,r.K4)((0,n.Rd)(),e,t)),(0,g.Tw)(o).forEach((t=>{s.requestThreadInfoUpdate({chatId:e,threadId:t})}))}),_)}const o=[];t.forEach((e=>{const t=(0,i.X5)(a,e);if(t){o.push(t);const s=X(a=(0,r.cY)(a,t,e,{isDeleting:!0}),t);s&&(a=Y(a,t,s,!0)),setTimeout((()=>{(0,n.R3)((0,r.K4)((0,n.Rd)(),t,[e]))}),_)}})),(0,n.R3)(a),(0,g.Tw)(o).forEach((e=>{s.requestChatUpdate({chatId:e})}))}(0,n.Q6)("apiUpdate",((e,t,s)=>{switch(s["@type"]){case"newMessage":{const{chatId:o,id:c,message:d,shouldForceReply:m}=s;e=W(e=V(e,o,c,d),t,d),d.threadInfo&&(e=(0,r.Xg)(e,d.threadInfo.chatId,d.threadInfo.threadId,d.threadInfo)),(0,n.R3)(e);const h=(0,i.hj)(e,o,c);if((0,i.hg)(e,o,d)){var a;if(d.isOutgoing&&(null===(a=d.content)||void 0===a||!a.action)){const s=(0,i.Bt)(e);s&&t.focusMessage({chatId:o,threadId:s.threadId,messageId:d.id,noHighlight:!0,isResizingContainer:!0})}const{threadInfo:s}=(0,i.Db)(e,o,d)||{};s&&t.requestThreadInfoUpdate({chatId:o,threadId:s.threadId}),(0,l.CI)(d)||setTimeout((()=>{let e=(0,n.Rd)();m&&(e=(0,r.pf)(e,o,u._f,"replyingToId",c)),(0,n.R3)(Y(e,o,h))}),_)}else(0,n.R3)(Y((0,n.Rd)(),o,h));(0,i.N)(e,o)||t.loadTopChats();break}case"newScheduledMessage":{const{chatId:t,id:a,message:o}=s;e=V(e,t,a,o,!0);const c=(0,i.qy)(e,t)||[];e=(0,r.pf)(e,t,u._f,"scheduledIds",(0,g.Tw)([...c,a])),(0,n.R3)(e);break}case"updateMessage":{var o,c;const{chatId:a,id:l,message:d}=s;if(!(0,i.hj)(e,a,l))return;e=V(e,a,l,d);const m=(0,i.hj)(e,a,l);d.threadInfo&&(e=(0,r.Xg)(e,d.threadInfo.chatId,d.threadInfo.threadId,d.threadInfo)),e=Y(e,a,m),(0,n.R3)(e);const h=(0,i.Z1)(e,a);h&&!d.isOutgoing&&(null===(o=h.lastMessage)||void 0===o?void 0:o.id)===d.id&&(0,i.xo)(e,h)&&(0,i.hg)(e,a,d)&&(0,i.b9)(e,a,(null===(c=d.threadInfo)||void 0===c?void 0:c.threadId)||u._f)&&t.focusLastMessage();break}case"updateScheduledMessage":{const{chatId:t,id:a,message:o}=s;if(!(0,i.Tm)(e,t,a))return;e=V(e,t,a,o,!0);const c=Object.keys((0,i.Fn)(e,t)||{}).map(Number).sort(((e,t)=>t-e));e=(0,r.pf)(e,t,u._f,"scheduledIds",c),(0,n.R3)(e);break}case"updateMessageSendSucceeded":{const{chatId:a,localId:o,message:c}=s;e=W(e,t,c);const l=(0,i.hj)(e,a,o);e=(0,r.K4)(e,a,[o]),c.isScheduled&&(e=(0,r.bV)(e,a,[o])),e=(0,r.cY)(e,a,c.id,{...l,...c,previousLocalId:o});const d=(0,i.hj)(e,a,c.id);e=Y(e,a,d);const u=(0,i.Db)(e,a,c);null!=u&&u.threadInfo&&(t.markMessageListRead({maxId:c.id}),e=(0,r.pf)(e,a,u.threadInfo.threadId,"threadInfo",{...u.threadInfo,lastMessageId:c.id,lastReadInboxMessageId:c.id})),(0,n.R3)(e);break}case"updateScheduledMessageSendSucceeded":{const{chatId:t,localId:a,message:o}=s,c=(0,i.qy)(e,t)||[];e=(0,r.pf)(e,t,u._f,"scheduledIds",[...c,o.id]);const l=(0,i.Tm)(e,t,a);e=(0,r.bV)(e,t,[a]),e=(0,r.P4)(e,t,o.id,{...l,...o,previousLocalId:a}),(0,n.R3)(e);break}case"updatePinnedIds":{const{chatId:t,isPinned:a,messageIds:o}=s,c=(0,i.KB)(e,t)||[],l=a?[...c,...o].sort(((e,t)=>t-e)):c.filter((e=>!o.includes(e)));(0,n.R3)((0,r.pf)(e,t,u._f,"pinnedIds",l));break}case"updateThreadInfo":{const{chatId:t,threadId:a,threadInfo:o,firstMessageId:c}=s,l={...(0,i.tZ)(e,t,a),...o};if(!l.threadId)return;e=(0,r.Xg)(e,t,a,l),c&&(e=(0,r.pf)(e,t,a,"firstMessageId",c)),(0,n.R3)(e);break}case"resetMessages":{const{id:a}=s,o=(0,i.Zw)(e,a);o&&!(0,l.YC)(a)&&(e=(0,r.K4)(e,a,Object.keys(o).map(Number)),(0,n.R3)(e),t.loadFullChat({chatId:a,force:!0}));break}case"deleteMessages":{const{ids:n,chatId:a}=s;K(a,n,t,e);break}case"deleteScheduledMessages":{const{ids:t,chatId:a}=s;!function(e,t,s,a){e&&(t.forEach((t=>{a=(0,r.P4)(a,e,t,{isDeleting:!0})})),(0,n.R3)(a),setTimeout((()=>{a=(0,r.bV)((0,n.Rd)(),e,t);const s=(0,i.Fn)(a,e);a=(0,r.pf)(a,e,u._f,"scheduledIds",Object.keys(s||{}).map(Number)),(0,n.R3)(a)}),_))}(a,t,0,e);break}case"deleteHistory":{const{chatId:n}=s,a=e.messages.byChatId[n];a?K(n,Object.keys(a.byId).map(Number),t,e):t.requestChatUpdate({chatId:n});break}case"updateCommonBoxMessages":{const{ids:t,messageUpdate:a}=s;t.forEach((t=>{const s=(0,i.X5)(e,t);s&&(e=(0,r.cY)(e,s,t,a))})),(0,n.R3)(e);break}case"updateChannelMessages":{const{channelId:t,ids:a,messageUpdate:o}=s;a.forEach((s=>{e=(0,r.cY)(e,t,s,o)})),(0,n.R3)(e);break}case"updateMessagePoll":{const{pollId:t,pollUpdate:a}=s,o=(0,i.ZB)(e,t);if(null!=o&&o.content.poll){const t={...o.content.poll,...a},{results:s}=t.results||{};if(s&&!s.some((e=>e.isChosen))){const{results:e}=o.content.poll.results,n=e&&e.filter((e=>e.isChosen));n&&n.forEach((e=>{const n=s.findIndex((t=>t.option===e.option));n>=0&&(t.results.results[n].isChosen=!0)}))}(0,n.R3)((0,r.cY)(e,o.chatId,o.id,{content:{...o.content,poll:t}}))}break}case"updateMessagePollVote":{const{pollId:t,userId:a,options:o}=s,c=(0,i.ZB)(e,t);if(!c||!c.content.poll||!c.content.poll.results)break;const{poll:l}=c.content,{recentVoterIds:d,totalVoters:u,results:m}=l.results,h=d?[...d]:[],g=u?u+1:1,p=m?[...m]:[];h.push(a),o.forEach((t=>{const s=p.find((e=>e.option===t)),n=p.findIndex((e=>e.option===t)),o=s?{...s}:{option:t,votersCount:0};o.votersCount+=1,a===e.currentUserId&&(o.isChosen=!0),n?p[n]=o:p.push(o)})),(0,n.R3)((0,r.cY)(e,c.chatId,c.id,{content:{...c.content,poll:{...l,results:{...l.results,recentVoterIds:h,totalVoters:g,results:p}}}}));break}case"updateServiceNotification":{const{message:n}=s;(0,i.UW)(e)&&t.createServiceNotification({message:n});break}}}));const J=(0,C.P2)((function(){let e=(0,n.Rd)();ee.forEach((([t,s])=>{e=(0,r.Nq)(e,t,{status:s})})),(0,n.R3)(e),ee=[]}),3e3,!0);let ee=[];(0,n.Q6)("apiUpdate",((e,t,s)=>{switch(s["@type"]){case"deleteUser":return(0,r.h8)(e,s.id);case"updateUser":return(0,r.Nq)(e,s.id,s.user);case"updateUserStatus":return n=s.userId,a=s.status,ee.push([n,a]),void J();case"updateUserFullInfo":{const{id:t,fullInfo:n}=s,a=e.users.byId[t];if(!a)return;return(0,r.Nq)(e,t,{fullInfo:{...a.fullInfo,...n}})}}var n,a})),(0,n.Q6)("apiUpdate",((e,t,s)=>{switch(s["@type"]){case"updateStickerSet":return(0,r.Rg)(e,s.id,s.stickerSet)}})),(0,n.Q6)("apiUpdate",((e,t,s)=>{switch(s["@type"]){case"updatePeerBlocked":return s.isBlocked?(0,r.O4)((0,n.Rd)(),s.id):(0,r.rB)((0,n.Rd)(),s.id);case"updateResetContactList":(0,n.R3)({...(0,n.Rd)(),contactList:{userIds:[]}});break;case"updateFavoriteStickers":t.loadFavoriteStickers();break;case"updatePrivacy":e.settings.privacy[s.key]=s.rules}})),(0,n.Q6)("apiUpdate",((e,t,s)=>{switch(s["@type"]){case"updateNotifySettings":return(0,r.HN)(e,s.peerType,s.isSilent,s.shouldShowPreviews);case"updateNotifyExceptions":{const{chatId:t,isMuted:a,isSilent:o,shouldShowPreviews:i}=s;e.chats.byId[t]&&(e=(0,r.a4)(e,t,{isMuted:a})),(0,n.R3)((0,r.aK)(e,t,{isMuted:a,isSilent:o,shouldShowPreviews:i}));break}}})),(0,n.Q6)("apiUpdate",((e,t,s)=>{switch(s["@type"]){case"updateTwoFaStateWaitCode":return{...e,twoFaSettings:{...e.twoFaSettings,isLoading:!1,waitingEmailCodeLength:s.length}};case"updateTwoFaError":return{...e,twoFaSettings:{...e.twoFaSettings,error:s.message}}}}));var te=s(4446);(0,n.Q6)("apiUpdate",((e,t,s)=>{switch(s["@type"]){case"updateGroupCall":return"discarded"===s.call.connectionState?e.groupCalls.activeGroupCallId?void t.leaveGroupCall({shouldRemove:!0}):(0,te.dc)(e,s.call.id):(0,te.AH)(e,s.call.id,(0,g.CE)(s.call,["connectionState"]),void 0,s.call.participantsCount);case"updateGroupCallChatId":{const t=(0,i.Z1)(e,s.chatId);return t&&(e=(0,r.a4)(e,s.chatId,{fullInfo:{...t.fullInfo,groupCallId:s.call.id}})),e}case"updateGroupCallParticipants":{const{groupCallId:t,participants:a,nextOffset:o}=s,{currentUserId:r}=e;return e=(0,n.Rd)(),a.forEach((s=>{s.id&&(e=(0,te.B6)(e,t,s.id,s,!!o||r===s.id))})),o&&(e=(0,te.AH)(e,t,{nextOffset:o})),e}}}));var se=s(8674),ne=s(6752),ae=s(1279),oe=s(1212),re=s(5332);function ie(e){(0,o.d4)((()=>(0,C.Gq)(e)),[e])}var ce=s(9290);const le=document.querySelector('meta[name="viewport"]'),de=(null==le?void 0:le.getAttribute("content"))||"";function ue(e){e.preventDefault()}var me=s(3551),he=s(6590),ge=s(3989),pe=s(3455),fe=s(706),Ie=s(2255);function ve(){const[e,t]=(0,o.eJ)(window.navigator.onLine);return(0,o.d4)((()=>{function e(){t(window.navigator.onLine)}return window.addEventListener("online",e),window.addEventListener("offline",e),()=>{window.removeEventListener("offline",e),window.removeEventListener("online",e)}}),[]),e}var ye=s(9107),Pe=s(6917),Ze=s(3106),Ce=s(8964),we=s(231),be=s(9589),Me=s(9187),Se=s(3321);const Ee=[0,1,2],ke=(0,o.X$)((0,n.c$)((e=>{const{query:t,fetchingStatus:s,chatId:n,date:a}=e.globalSearch,{currentUserId:o}=e,{byId:r}=e.chats,{animationLevel:c}=e.settings.byKey;return{searchQuery:t,isLoading:!!s&&Boolean(s.chats||s.messages),currentUserId:o,chatsById:r,globalSearchChatId:n,searchDate:a,theme:(0,i.Pu)(e),animationLevel:c}}),((e,t)=>(0,g.ei)(t,["openChat","openTipsChat","setGlobalSearchDate","setGlobalSearchChatId","setSettingOption"])))((({content:e,contactsFilter:t,onSearchQuery:s,onSelectSettings:n,onSelectContacts:r,onSelectArchived:i,setGlobalSearchChatId:c,onReset:d,searchQuery:u,isLoading:g,shouldSkipTransition:p,currentUserId:f,globalSearchChatId:I,searchDate:v,theme:y,animationLevel:P,chatsById:Z,openChat:C,openTipsChat:w,setGlobalSearchDate:b,setSettingOption:M})=>{const S=(0,ye.Z)(),E=e===m.du.ChatList,k=(0,o.Ye)((()=>v?(0,N.xH)(new Date(1e3*v)):void 0),[v]),R=(0,o.Ye)((()=>E&&Z?Object.values(Z).reduce(((e,t)=>(0,l.pE)(t)&&t.unreadCount?e+1:e),0):0),[E,Z]),T="web.telegram.org"===window.location.hostname,B=(0,o.Ye)((()=>({onTrigger:e,isOpen:t})=>o.ZP.createElement(we.Z,{round:!0,ripple:E&&!h.wB,size:"smaller",color:"translucent",className:t?"active":"",onClick:E?e:()=>d(),ariaLabel:E?S("AccDescrOpenMenu2"):"Return to chat list"},o.ZP.createElement("div",{className:(0,ne.Z)("animated-menu-icon",!E&&"state-back",p&&"no-animation")}))),[E,S,d,p]),x=(0,o.I4)((()=>{u||s("")}),[u,s]),L=(0,o.I4)((()=>{C({id:f,shouldReplaceHistory:!0})}),[f,C]),A=(0,o.I4)((e=>{e.stopPropagation();const t="light"===y?"dark":"light";M({theme:t}),M({shouldUseSystemTheme:!1}),(0,Pe.Z)(t,P===a.zy)}),[P,M,y]),O=(0,o.I4)((e=>{e.stopPropagation();const t=0===P?2:0;Ee.forEach(((e,s)=>{document.body.classList.toggle(`animation-level-${s}`,t===s)})),M({animationLevel:t})}),[P,M]),F=Boolean(I)||e===m.du.GlobalSearch||e===m.du.Contacts,U=e===m.du.Contacts?S("SearchFriends"):S("Search");return o.ZP.createElement("div",{className:"LeftMainHeader"},o.ZP.createElement("div",{id:"LeftMainHeader",className:"left-header"},o.ZP.createElement(Ze.Z,{trigger:B,footer:`${a.iC} alpha ${a.Ji}`},o.ZP.createElement(Ce.Z,{icon:"saved-messages",onClick:L},S("SavedMessages")),o.ZP.createElement(Ce.Z,{icon:"archive",onClick:i},o.ZP.createElement("span",{className:"menu-item-name"},S("ArchivedChats")),R>0&&o.ZP.createElement("div",{className:"archived-badge"},R)),o.ZP.createElement(Ce.Z,{icon:"user",onClick:r},S("Contacts")),o.ZP.createElement(Ce.Z,{icon:"settings",onClick:n},S("Settings")),o.ZP.createElement(Ce.Z,{icon:"darkmode",onClick:A},o.ZP.createElement("span",{className:"menu-item-name"},S("lng_menu_night_mode")),o.ZP.createElement(Se.Z,{id:"darkmode",label:S("dark"===y?"lng_settings_disable_night_theme":"lng_settings_enable_night_theme"),checked:"dark"===y,noAnimation:!0})),o.ZP.createElement(Ce.Z,{icon:"animations",onClick:O},o.ZP.createElement("span",{className:"menu-item-name capitalize"},S("Appearance.Animations").toLowerCase()),o.ZP.createElement(Se.Z,{id:"animations",label:"Toggle Animations",checked:P>0})),o.ZP.createElement(Ce.Z,{icon:"help",onClick:()=>{w({langCode:S.code})}},S("TelegramFeatures")),o.ZP.createElement(Ce.Z,{icon:"bug",href:a.mU},"Report Bug"),T&&o.ZP.createElement(o.ZP.Fragment,null,o.ZP.createElement(Ce.Z,{icon:"char-K",href:"https://web.telegram.org/k/",onClick:()=>{localStorage.setItem("kz_version",JSON.stringify("K")),(0,he.Wv)()}},"Switch to K Version"),o.ZP.createElement(Ce.Z,{icon:"char-W",href:"https://web.telegram.org/?legacy=1",onClick:he.Wv},"Switch to Old Version"))),o.ZP.createElement(be.Z,{inputId:"telegram-search-input",parentContainerClassName:"LeftSearch",className:I||v?"with-picker-item":"",value:t||u,focused:F,isLoading:g,placeholder:U,autoComplete:"off",canClose:Boolean(I||v),onChange:s,onReset:d,onFocus:x},k&&o.ZP.createElement(Me.Z,{icon:"calendar",title:k,canClose:!0,isMinimized:Boolean(I),className:"search-date",onClick:b,clickArg:{date:void 0}}),I&&o.ZP.createElement(Me.Z,{chatOrUserId:I,onClick:c,canClose:!0,clickArg:{id:void 0}}))))})));var Re=s(9204);const Te=(0,o.X$)((()=>{const e=(0,ye.Z)();return o.ZP.createElement("div",{id:"ConnectionState",dir:e.isRtl?"rtl":void 0},o.ZP.createElement(Re.Z,{color:"black"}),o.ZP.createElement("div",{className:"state-text"},e("WaitingForNetwork")))}));var Ne=s(1174),Be=s(6071),xe=s(3133),Le=s(1080);const Ae=(0,o.X$)((0,n.c$)((e=>{const{chats:{byId:t},users:{byId:s},chatFolders:{byId:n,orderedIds:a,activeChatFolder:o},currentUserId:r,lastSyncTime:c,shouldSkipHistoryAnimations:l}=e;return{chatsById:t,usersById:s,chatFoldersById:n,orderedFolderIds:a,lastSyncTime:c,notifySettings:(0,i.dZ)(e),notifyExceptions:(0,i.NJ)(e),activeChatFolder:o,currentUserId:r,shouldSkipHistoryAnimations:l}}),((e,t)=>(0,g.ei)(t,["loadChatFolders","setActiveChatFolder","openChat"])))((({chatsById:e,usersById:t,chatFoldersById:s,notifySettings:n,notifyExceptions:a,orderedFolderIds:r,activeChatFolder:i,currentUserId:c,lastSyncTime:d,shouldSkipHistoryAnimations:u,foldersDispatch:m,onScreenSelect:p,loadChatFolders:f,setActiveChatFolder:I,openChat:v})=>{const y=(0,o.sO)(null),P=(0,ye.Z)();(0,o.d4)((()=>{d&&f()}),[d,f]);const Z=(0,o.Ye)((()=>r?r.map((e=>s[e]||{})).filter(Boolean):void 0),[s,r]),C=((s,r,i)=>{const c=(0,Be.Z)(3e3,!0),[d,u]=(0,o.eJ)(),[m,h,p]=(0,fe.Z)();return(0,se.ZP)(h,p),(0,ce.Z)((()=>{m||c((()=>{u((()=>{if(!Z||!Z.length)return;const s=Object.keys(e),o=Z.map((o=>{const{unreadDialogsCount:r,hasActiveDialogs:i}=(0,l.Fu)(e,t,o,s,n,a)||{};return{id:o.id,badgeCount:r,isBadgeActive:i}}));return(0,g.ee)(o,"id")})())}))}),i.concat([m])),d})(0,0,[Z,e,t,n,a]),w=(0,o.Ye)((()=>{if(Z&&Z.length)return[{title:"en"===P.code?"All":P("FilterAllChats")},...Z.map((e=>({title:e.title,...null==C?void 0:C[e.id]})))]}),[Z,C,P]),b=(0,o.I4)((e=>{I(e)}),[I]);(0,o.d4)((()=>{w&&w.length&&i>=w.length&&I(0)}),[i,w,I]),(0,o.d4)((()=>{if(y.current&&h.$b&&w&&w.length)return(0,Ne.s)(y.current,{selectorToPreventScroll:".chat-list",onSwipe:(e,t)=>t===Ne.e.Left?(I(Math.min(i+1,w.length-1)),!0):t===Ne.e.Right&&(I(Math.max(0,i-1)),!0)})}),[i,w,I]);const M=(0,o.sO)();M.current=0!==i,(0,o.d4)((()=>M.current?(0,ge.Z)((()=>{M.current&&I(0)})):void 0),[i,I]),(0,he.ZP)(0!==i,(()=>I(0))),(0,o.d4)((()=>{const e=e=>{if(e.ctrlKey&&e.shiftKey&&e.code.startsWith("Digit")&&w){const[,t]=e.code.match(/Digit(\d)/)||[];if(!t)return;if("0"===t)return void v({id:c,shouldReplaceHistory:!0});const s=Number(t)-1;if(s>w.length-1)return;I(s),e.preventDefault()}};return document.addEventListener("keydown",e,!0),()=>{document.removeEventListener("keydown",e,!0)}}));const{shouldRender:S,transitionClassNames:E}=(0,oe.Z)(!r,void 0,!0);function k(e){const t=Object.values(s).find((({title:e})=>e===w[i].title));return t&&0!==i?o.ZP.createElement(Le.Z,{folderType:"folder",folderId:t.id,isActive:e,onScreenSelect:p,foldersDispatch:m}):o.ZP.createElement(Le.Z,{folderType:"all",isActive:e,foldersDispatch:m,onScreenSelect:p})}return o.ZP.createElement("div",{className:"ChatFolders"},null!=w&&w.length?o.ZP.createElement(xe.Z,{tabs:w,activeTab:i,onSwitchTab:b}):S?o.ZP.createElement("div",{className:(0,ne.Z)("tabs-placeholder",E)}):void 0,o.ZP.createElement(Ie.Z,{ref:y,name:u?"none":P.isRtl?"slide-reversed":"slide",activeKey:i,renderCount:w?w.length:void 0},k))})));var Oe=s(9203),Fe=s(8778),Ue=s(4288);const $e=(0,o.X$)((e=>{const t=(0,Fe.Z)(Oe.gl.Extra,"LeftSearch");return t?o.ZP.createElement(t,e):o.ZP.createElement(Ue.Z,null)})),De=(0,o.X$)((e=>{const t=(0,Fe.Z)(Oe.gl.Extra,"ContactList");return t?o.ZP.createElement(t,e):o.ZP.createElement(Ue.Z,null)}));var Qe=s(2328);let qe;const Ge=(0,o.X$)((({isShown:e,onNewPrivateChat:t,onNewChannel:s,onNewGroup:n})=>{const[a,r]=(0,o.eJ)(!1);(0,o.d4)((()=>{e||r(!1)}),[e]);const i=(0,ye.Z)(),c=(0,ne.Z)("NewChatButton",e&&"revealed",a&&"menu-is-open"),l=(0,o.I4)((()=>{qe&&(clearTimeout(qe),qe=void 0)}),[]),d=(0,o.I4)((()=>{qe&&(clearTimeout(qe),qe=void 0),qe=window.setTimeout((()=>{r(!1)}),750)}),[]);return o.ZP.createElement("div",{className:c,onMouseEnter:l,onMouseLeave:d},o.ZP.createElement(we.Z,{round:!0,color:"primary",className:a?"active":"",onClick:()=>{r(!a)},ariaLabel:i(a?"Close":"NewMessageTitle"),tabIndex:-1},o.ZP.createElement("i",{className:"icon-new-chat-filled"}),o.ZP.createElement("i",{className:"icon-close"})),o.ZP.createElement(Qe.Z,{isOpen:a,positionX:"right",positionY:"bottom",autoClose:!0,onClose:()=>{r(!1)}},o.ZP.createElement(Ce.Z,{icon:"channel",onClick:s},i("NewChannel")),o.ZP.createElement(Ce.Z,{icon:"group",onClick:n},i("NewGroup")),o.ZP.createElement(Ce.Z,{icon:"user",onClick:t},i("NewMessageTitle"))))}));var je=s(126);const He=Object.keys(m.du).length/2;let _e;const Ve=(0,n.c$)((e=>(0,g.ei)(e,["connectionState"])))((({content:e,searchQuery:t,searchDate:s,contactsFilter:n,shouldSkipTransition:a,foldersDispatch:r,onSearchQuery:i,onContentChange:c,onScreenSelect:l,onReset:d,connectionState:u})=>{const[g,p]=(0,o.eJ)(h.$b),f=!ve()||"connectionStateConnecting"===u,I=(0,o.sO)(!1),v=(0,o.I4)((()=>{c(m.du.Settings)}),[c]),y=(0,o.I4)((()=>{c(m.du.Contacts)}),[c]),P=(0,o.I4)((()=>{c(m.du.NewChannelStep1)}),[c]),Z=(0,o.I4)((()=>{c(m.du.NewGroupStep1)}),[c]),C=(0,o.I4)((()=>{c(m.du.Archived)}),[c]),w=(0,o.I4)((()=>{e===m.du.ChatList&&(I.current=!0,p(!0))}),[e]),b=(0,o.I4)((()=>{I.current=!1,_e&&(clearTimeout(_e),_e=void 0),_e=window.setTimeout((()=>{I.current||p(!1)}),250)}),[]);(0,o.d4)((()=>{let t;return e!==m.du.ChatList?t=window.setTimeout((()=>{p(!1)}),250):(I.current||h.$b)&&p(!0),()=>{t&&(clearTimeout(t),t=void 0)}}),[e]);const[M,S,E]=function(){const[e,t]=(0,fe.Z)(!1);(0,o.d4)((()=>{const e=window.setTimeout(t,2592e5);return()=>{clearTimeout(e)}}),[t]);const{shouldRender:s,transitionClassNames:n}=(0,oe.Z)(e);return[s,n,()=>{window.location.reload()}]}(),k=(0,ye.Z)();return o.ZP.createElement("div",{id:"LeftColumn-main",onMouseEnter:h.$b?void 0:w,onMouseLeave:h.$b?void 0:b},o.ZP.createElement(ke,{content:e,contactsFilter:n,onSearchQuery:i,onSelectSettings:v,onSelectContacts:y,onSelectArchived:C,onReset:d,shouldSkipTransition:a}),o.ZP.createElement(je.Z,{isOpen:f,isCustom:!0,className:"connection-state-wrapper opacity-transition slow"},(()=>o.ZP.createElement(Te,null))),o.ZP.createElement(Ie.Z,{name:a?"none":"zoom-fade",renderCount:He,activeKey:e,shouldCleanup:!0,cleanupExceptionKey:m.du.ChatList,className:f?"pull-down":void 0},(a=>{switch(e){case m.du.ChatList:return o.ZP.createElement(Ae,{onScreenSelect:l,foldersDispatch:r});case m.du.GlobalSearch:return o.ZP.createElement($e,{searchQuery:t,searchDate:s,isActive:a,onReset:d});case m.du.Contacts:return o.ZP.createElement(De,{filter:n,isActive:a,onReset:d});default:return}})),M&&o.ZP.createElement(we.Z,{fluid:!0,pill:!0,className:(0,ne.Z)("btn-update",S),onClick:E},k("lng_update_telegram")),o.ZP.createElement(Ge,{isShown:g,onNewPrivateChat:y,onNewChannel:P,onNewGroup:Z}))})),ze=(0,o.X$)((e=>{const t=(0,Fe.Z)(Oe.gl.Extra,"Settings");return t?o.ZP.createElement(t,e):o.ZP.createElement(Ue.Z,null)})),We=(0,o.X$)((e=>{const t=(0,Fe.Z)(Oe.gl.Extra,"NewChat");return t?o.ZP.createElement(t,e):o.ZP.createElement(Ue.Z,null)})),Ye=(0,o.X$)((e=>{const t=(0,Fe.Z)(Oe.gl.Extra,"ArchivedChats");return t?o.ZP.createElement(t,e):o.ZP.createElement(Ue.Z,null)}));var Xe;!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"}(Xe||(Xe={}));const Ke=Object.keys(Xe).length/2,Je=(0,o.X$)((0,n.c$)((e=>{const{globalSearch:{query:t,date:s},chatFolders:{activeChatFolder:n},shouldSkipHistoryAnimations:a,leftColumnWidth:o}=e;return{searchQuery:t,searchDate:s,activeChatFolder:n,shouldSkipHistoryAnimations:a,leftColumnWidth:o}}),((e,t)=>(0,g.ei)(t,["setGlobalSearchQuery","setGlobalSearchChatId","resetChatCreation","setGlobalSearchDate","loadPasswordInfo","clearTwoFaError","setLeftColumnWidth","resetLeftColumnWidth"])))((({searchQuery:e,searchDate:t,activeChatFolder:s,shouldSkipHistoryAnimations:n,leftColumnWidth:a,setGlobalSearchQuery:r,setGlobalSearchChatId:i,resetChatCreation:c,setGlobalSearchDate:l,loadPasswordInfo:d,clearTwoFaError:u,setLeftColumnWidth:g,resetLeftColumnWidth:p})=>{const f=(0,o.sO)(null),[I,v]=(0,o.eJ)(m.du.ChatList),[y,P]=(0,o.eJ)(m.MT.Main),[Z,C]=(0,o.eJ)(""),[w,b]=(0,pe.ZP)(),[M,S]=(0,o.eJ)(0);let E=Xe.Main;switch(I){case m.du.Archived:E=Xe.Archived;break;case m.du.Settings:E=Xe.Settings;break;case m.du.NewChannelStep1:case m.du.NewChannelStep2:E=Xe.NewChannel;break;case m.du.NewGroupStep1:case m.du.NewGroupStep2:E=Xe.NewGroup}const k=(0,o.I4)((e=>{if(I!==m.du.NewGroupStep2||e)if(I!==m.du.NewChannelStep2||e){if(I===m.du.NewGroupStep1){const e=document.getElementById("new-group-picker-search");e&&e.blur()}if(I===m.du.Settings)switch(y){case m.MT.EditProfile:case m.MT.Folders:case m.MT.General:case m.MT.Notifications:case m.MT.DataStorage:case m.MT.Privacy:case m.MT.Language:return void P(m.MT.Main);case m.MT.GeneralChatBackground:return void P(m.MT.General);case m.MT.GeneralChatBackgroundColor:return void P(m.MT.GeneralChatBackground);case m.MT.PrivacyPhoneNumber:case m.MT.PrivacyLastSeen:case m.MT.PrivacyProfilePhoto:case m.MT.PrivacyForwarding:case m.MT.PrivacyGroupChats:case m.MT.PrivacyActiveSessions:case m.MT.PrivacyBlockedUsers:case m.MT.TwoFaDisabled:case m.MT.TwoFaEnabled:case m.MT.TwoFaCongratulations:return void P(m.MT.Privacy);case m.MT.PrivacyPhoneNumberAllowedContacts:case m.MT.PrivacyPhoneNumberDeniedContacts:return void P(m.MT.PrivacyPhoneNumber);case m.MT.PrivacyLastSeenAllowedContacts:case m.MT.PrivacyLastSeenDeniedContacts:return void P(m.MT.PrivacyLastSeen);case m.MT.PrivacyProfilePhotoAllowedContacts:case m.MT.PrivacyProfilePhotoDeniedContacts:return void P(m.MT.PrivacyProfilePhoto);case m.MT.PrivacyForwardingAllowedContacts:case m.MT.PrivacyForwardingDeniedContacts:return void P(m.MT.PrivacyForwarding);case m.MT.PrivacyGroupChatsAllowedContacts:case m.MT.PrivacyGroupChatsDeniedContacts:return void P(m.MT.PrivacyGroupChats);case m.MT.TwoFaNewPassword:return void P(m.MT.TwoFaDisabled);case m.MT.TwoFaNewPasswordConfirm:return void P(m.MT.TwoFaNewPassword);case m.MT.TwoFaNewPasswordHint:return void P(m.MT.TwoFaNewPasswordConfirm);case m.MT.TwoFaNewPasswordEmail:return void P(m.MT.TwoFaNewPasswordHint);case m.MT.TwoFaNewPasswordEmailCode:return void P(m.MT.TwoFaNewPasswordEmail);case m.MT.TwoFaChangePasswordCurrent:case m.MT.TwoFaTurnOff:case m.MT.TwoFaRecoveryEmailCurrentPassword:return void P(m.MT.TwoFaEnabled);case m.MT.TwoFaChangePasswordNew:return void P(m.MT.TwoFaChangePasswordCurrent);case m.MT.TwoFaChangePasswordConfirm:return void P(m.MT.TwoFaChangePasswordNew);case m.MT.TwoFaChangePasswordHint:return void P(m.MT.TwoFaChangePasswordConfirm);case m.MT.TwoFaRecoveryEmail:return void P(m.MT.TwoFaRecoveryEmailCurrentPassword);case m.MT.TwoFaRecoveryEmailCode:return void P(m.MT.TwoFaRecoveryEmail);case m.MT.FoldersCreateFolder:case m.MT.FoldersEditFolder:return void P(m.MT.Folders);case m.MT.FoldersIncludedChatsFromChatList:case m.MT.FoldersExcludedChatsFromChatList:return void P(m.MT.FoldersEditFolderFromChatList);case m.MT.FoldersEditFolderFromChatList:return v(m.du.ChatList),void P(m.MT.Main)}I!==m.du.ChatList||0!==s?(v(m.du.ChatList),C(""),r({query:""}),l({date:void 0}),i({id:void 0}),c(),setTimeout((()=>{S(Date.now())}),250)):v(m.du.GlobalSearch)}else v(m.du.NewChannelStep1);else v(m.du.NewGroupStep1)}),[I,s,y,r,l,i,c]),R=(0,o.I4)((t=>{I!==m.du.Contacts?(v(m.du.GlobalSearch),t!==e&&r({query:t})):C(t)}),[I,e,r]);(0,o.d4)((()=>I!==m.du.ChatList||0===s?(0,ge.Z)((()=>k())):void 0),[s,I,k]),(0,o.d4)((()=>{u(),y===m.MT.Privacy&&d()}),[u,d,y]);const{initResize:T,resetResize:N,handleMouseUp:B}=((e,t,s,n)=>{const[a,r,i]=(0,fe.Z)(),[c,l]=(0,o.eJ)(),[d,u]=(0,o.eJ)();(0,o.d4)((()=>{e.current&&n&&(e.current.style.width=`${n}px`)}),[e,n]);const m=()=>{document.body.classList.remove("no-selection","cursor-ew-resize")};return(0,o.d4)((()=>{if(!a)return;const s=t=>{const s=Math.ceil(d+t.clientX-c);e.current.style.width=`${s}px`},n=()=>{m(),document.removeEventListener("mousemove",s,!1),document.removeEventListener("mouseup",n,!1),document.removeEventListener("blur",n,!1),t(e.current.offsetWidth),i()};document.addEventListener("mousemove",s,!1),document.addEventListener("mouseup",n,!1),document.addEventListener("blur",n,!1)}),[d,c,e,t,a,i]),{initResize:t=>{document.body.classList.add("no-selection","cursor-ew-resize"),l(t.clientX),u(e.current.offsetWidth),r()},resetResize:t=>{t.preventDefault(),e.current.style.width="",s()},handleMouseUp:m}})(f,g,p,a),x=e=>{v(m.du.Settings),P(e)};return o.ZP.createElement("div",{id:"LeftColumn",ref:f},o.ZP.createElement(Ie.Z,{name:n?"none":h.s0,renderCount:Ke,activeKey:E,shouldCleanup:!0,cleanupExceptionKey:Xe.Main},(s=>{switch(E){case Xe.Archived:return o.ZP.createElement(Ye,{isActive:s,onReset:k,onContentChange:v});case Xe.Settings:return o.ZP.createElement(ze,{isActive:s,currentScreen:y,foldersState:w,foldersDispatch:b,onScreenSelect:x,onReset:k,shouldSkipTransition:n});case Xe.NewChannel:return o.ZP.createElement(We,{key:M,isActive:s,isChannel:!0,content:I,onContentChange:v,onReset:k});case Xe.NewGroup:return o.ZP.createElement(We,{key:M,isActive:s,content:I,onContentChange:v,onReset:k});default:return o.ZP.createElement(Ve,{content:I,searchQuery:e,searchDate:t,contactsFilter:Z,foldersDispatch:b,onContentChange:v,onSearchQuery:R,onScreenSelect:x,onReset:k,shouldSkipTransition:n})}})),o.ZP.createElement("div",{className:"resize-handle",onMouseDown:T,onMouseUp:B,onDoubleClick:N}))})));var et=s(2420),tt=s(9524),st=s(1394),nt=s(3858);const at=()=>{const[e,t]=(0,o.eJ)(nt.Z.get());return(0,o.d4)((()=>{const e=(0,C.P2)((()=>{t(nt.Z.get())}),250,!1);return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[]),e};var ot=s(2678);const rt=728;var it=s(5780),ct=s(3570),lt=s(5790),dt=s(8360),ut=s(2155),mt=s(6058),ht=s(8799);const gt=(0,o.X$)((e=>{const{isOpen:t}=e,s=(0,Fe.Z)(Oe.gl.Extra,"HeaderMenuContainer",!t);return s?o.ZP.createElement(s,e):void 0})),pt=(0,o.X$)((0,n.c$)(((e,{chatId:t,threadId:s,messageListType:n})=>{var a;const o=(0,i.Z1)(e,t),r=Boolean(o&&(0,l.eA)(o));if(null!=o&&o.isRestricted||(0,i.CA)(e))return{noMenu:!0};const c=(0,i.IK)(e,t),d=(0,i.FM)(e,t),m="thread"===n&&s===u._f,g="thread"===n&&s!==u._f,p=(0,i.Jf)(e),f=Boolean(c&&(0,i.s4)(e,c.id)),I=!f&&Boolean((0,i.pk)(e,t)),v=Boolean(m&&o&&(r||(0,l.ZV)(o))&&o.isNotJoined);return{noMenu:!1,isChannel:r,isRightColumnShown:p,canStartBot:I,canRestartBot:f,canSubscribe:v,canSearch:m||g,canMute:m&&!d&&!v,canLeave:m&&!v,canEnterVoiceChat:h.Bi&&o&&o.isCallActive,canCreateVoiceChat:h.Bi&&o&&!o.isCallActive&&((null===(a=o.adminRights)||void 0===a?void 0:a.manageCall)||o.isCreator&&(0,l.G9)(o))}}),((e,t)=>(0,g.ei)(t,["joinChannel","sendBotCommand","openLocalTextSearch","restartBot"])))((({chatId:e,threadId:t,noMenu:s,isChannel:n,canStartBot:a,canRestartBot:r,canSubscribe:i,canSearch:c,canMute:l,canLeave:d,canEnterVoiceChat:u,canCreateVoiceChat:m,isRightColumnShown:g,canExpandActions:p,joinChannel:f,sendBotCommand:I,openLocalTextSearch:v,restartBot:y})=>{const P=(0,o.sO)(null),[Z,C]=(0,o.eJ)(!1),[w,b]=(0,o.eJ)(void 0),M=(0,o.I4)((()=>{C(!0);const e=P.current.getBoundingClientRect();b({x:e.right,y:e.bottom})}),[]),S=(0,o.I4)((()=>{C(!1)}),[]),E=(0,o.I4)((()=>{b(void 0)}),[]),k=(0,o.I4)((()=>{f({chatId:e})}),[f,e]),R=(0,o.I4)((()=>{I({command:"/start"})}),[I]),T=(0,o.I4)((()=>{y({chatId:e})}),[e,y]),N=(0,o.I4)((()=>{v(),h.wB?document.querySelector("#MobileSearch input").focus():setTimeout((()=>{const e=document.querySelector(".RightHeader .SearchInput input");e&&e.focus()}),400)}),[v]),B=(0,ye.Z)();return o.ZP.createElement("div",{className:"HeaderActions"},!h.wB&&p&&i&&o.ZP.createElement(we.Z,{size:"tiny",ripple:!0,fluid:!0,onClick:k},B(n?"ProfileJoinChannel":"ProfileJoinGroup")),!h.wB&&p&&a&&o.ZP.createElement(we.Z,{size:"tiny",ripple:!0,fluid:!0,onClick:R},B("BotStart")),!h.wB&&p&&r&&o.ZP.createElement(we.Z,{size:"tiny",ripple:!0,fluid:!0,onClick:T},B("BotRestart")),!h.wB&&c&&o.ZP.createElement(we.Z,{round:!0,ripple:g,color:"translucent",size:"smaller",onClick:N,ariaLabel:"Search in this chat"},o.ZP.createElement("i",{className:"icon-search"})),o.ZP.createElement(we.Z,{ref:P,className:Z?"active":"",round:!0,ripple:!h.wB,size:"smaller",color:"translucent",disabled:s,ariaLabel:"More actions",onClick:M},o.ZP.createElement("i",{className:"icon-more"})),w&&o.ZP.createElement(gt,{chatId:e,threadId:t,isOpen:Z,anchor:w,withExtraActions:h.wB||!p,isChannel:n,canStartBot:a,canRestartBot:r,canSubscribe:i,canSearch:c,canMute:l,canLeave:d,canEnterVoiceChat:u,canCreateVoiceChat:m,onSubscribeChannel:k,onSearchClick:N,onClose:S,onCloseAnimationEnd:E}))})));var ft=s(4399),It=s(2340),vt=s(6202),yt=s(862);function Pt(e){var t;const s=e&&(0,l.DH)(e),n=null==e||null===(t=e.content)||void 0===t?void 0:t.sticker,r=s&&n&&!(0,h.on)()&&s.includes("image/webp"),[i,c]=(0,o.eJ)(yt.Hu),d=null==e?void 0:e.id;return(0,o.bt)((()=>{r&&(0,yt.p6)(`b64-${d}`,s).then(c).catch((e=>{a.eM&&console.error(e)}))}),[d,r,s]),r?i:s}var Zt=s(7551),Ct=s(8512);function wt(e,t,s,n,a){return`M${e},${t+a}a${a},${a},0,0,1,\n ${s},0v${n-2*a}a${a},${a},0,0,1,${-s},0Z`}const bt=(0,o.X$)((({count:e,index:t})=>{const s=(0,o.sO)(null),n=(0,o.Ye)((()=>function(e,t){const s=e-t-1,n=function(e){let t=8;return 1===e?t=36:2===e?t=17:3===e?t=11:(4===e||e>3)&&(t=7.5),t}(e),a=function(e,t){let s=36;return 1===e?s=36:2===e?s=17:3===e?s=1===t?12:11:(4===e||e>3)&&(s=7.5),s}(e,s),o=function(e,t){return e<=3?36:t*e+2*(e-1)}(e,n),r=`clipPath${e}`;return{markHeight:a,clipPath:function(e,t,s){let n="";if(3===s)n=wt(0,0,2,t,1)+wt(0,12,2,t+1,1)+wt(0,25,2,t,1);else for(let e=0;e\n \n `}(r,n,e),markTranslateY:function(e,t,s){return 1===s?0:2===s?0===e?0:t+2:3===s?0===e?0:1===e?12:25:(t+2)*e}(s,n,e),trackTranslateY:function(e,t,s,n){return t<=4||e<=1?0:e>=t-2?n-36:(s+4)/2+(e-2)*(s+2)}(s,e,n,o),trackHeight:o,clipPathId:r}}(e,t)),[e,t]);if((0,o.d4)((()=>{if(!s.current)return;const{trackHeight:e,trackTranslateY:t,markHeight:a,markTranslateY:o,clipPathId:r,clipPath:i}=n,c=s.current.firstElementChild;if(null!=s&&s.current){const n=s.current,{style:l}=n;l.height=`${e}px`,l.transform=`translateY(-${t}px)`,l.clipPath=`url("#${r}")`;const d=n.querySelector("svg"),u=n.querySelector("div"),m=n.querySelector("defs");d||c&&(c.innerHTML=` ${i} `),m&&(m.innerHTML=i),u&&(u.style.height=`${a}px`,u.style.transform=`translateY(${o}px)`)}}),[n]),1===e)return o.ZP.createElement("div",{className:"pinned-message-border"},o.ZP.createElement("div",{className:"pinned-message-border-wrapper-1",ref:s}));const{trackHeight:a,trackTranslateY:r,markHeight:i,markTranslateY:c,clipPathId:l}=n;return o.ZP.createElement("div",{className:(0,ne.Z)("pinned-message-border",e>4&&"pinned-message-border-mask")},o.ZP.createElement("div",{className:"pinned-message-border-wrapper",ref:s,style:`clip-path: url("#${l}"); width: 2px;\n height: ${a}px; transform: translateY(-${r}px);`},o.ZP.createElement("span",null),o.ZP.createElement("div",{className:"pinned-message-border-mark",style:`height: ${i}px; transform: translateY(${c}px);`})))})),Mt=(0,o.X$)((({message:e,count:t,index:s,customTitle:n,className:a,onUnpinMessage:r,onClick:i,onAllPinnedClick:c})=>{const d=(0,ye.Z)(),u=Pt(e),m=(0,vt.Z)((0,l.Ti)(e,"pictogram")),h=(0,l.MK)(d,e,Boolean(u)),[g,p,f]=(0,fe.Z)(),I=(0,o.I4)((()=>{f(),r&&r(e.id)}),[f,r,e.id]);return o.ZP.createElement("div",{className:(0,ne.Z)("HeaderPinnedMessage-wrapper",a)},t>1&&o.ZP.createElement(we.Z,{round:!0,size:"smaller",color:"translucent",className:"pin-list-button",ariaLabel:d("EventLogFilterPinnedMessages"),onClick:c},o.ZP.createElement("i",{className:"icon-pin-list"})),r&&o.ZP.createElement(we.Z,{round:!0,size:"smaller",color:"translucent",ariaLabel:d("UnpinMessageAlertTitle"),className:"unpin-button",onClick:p},o.ZP.createElement("i",{className:"icon-close"})),o.ZP.createElement(Zt.Z,{isOpen:g,onClose:f,text:"Would you like to unpin this message?",confirmLabel:"Unpin",confirmHandler:I}),o.ZP.createElement("div",{className:"HeaderPinnedMessage",onClick:i,dir:d.isRtl?"rtl":void 0},o.ZP.createElement(bt,{count:t,index:s}),u&&function(e,t){const{width:s,height:n}=(0,ft.W7)();return o.ZP.createElement("img",{src:t||e,width:s,height:n,alt:""})}(u,m),o.ZP.createElement("div",{className:"message-text"},o.ZP.createElement("div",{className:"title",dir:"auto"},n||`${d("PinnedMessage")} ${s>0?"#"+(t-s):""}`),o.ZP.createElement("p",{dir:"auto"},(0,It.Z)(h))),o.ZP.createElement(Ct.Z,null)))}));var St=s(647),Et=s(396),kt=s(4532),Rt=s(3186),Tt=s(663);function Nt(e,t,s="image/png"){const n=e instanceof Blob?URL.createObjectURL(e):e,a=new Image;return new Promise((o=>{a.onload=()=>{Bt(a,a.width*t,a.height*t,s).then((e=>URL.createObjectURL(e))).then(o).finally((()=>{e instanceof Blob&&URL.revokeObjectURL(n)}))},a.src=n}))}async function Bt(e,t,s,n="image/png"){if(!("createImageBitmap"in window))return xt(e,t,s,void 0,n);try{const a=await window.createImageBitmap(e,{resizeWidth:t,resizeHeight:s,resizeQuality:"high"});if(a.height!==s||a.width!==t)throw new Error("Image bitmap resize not supported!");return await new Promise((e=>{const t=document.createElement("canvas");t.width=a.width,t.height=a.height;const s=t.getContext("bitmaprenderer");s?s.transferFromImageBitmap(a):t.getContext("2d").drawImage(a,0,0),t.toBlob(e,n)}))}catch(a){return xt(e,t,s,void 0,n)}}function xt(e,t,s,n=.5,a="image/png"){const o=document.createElement("canvas"),r=o.getContext("2d"),i=document.createElement("canvas"),c=i.getContext("2d");if(o.width=t,o.height=s,e.width*n>t){const s=1/n;let a={width:Math.floor(e.width*n),height:Math.floor(e.height*n)};for(i.width=a.width,i.height=a.height,c.drawImage(e,0,0,a.width,a.height);a.width*n>t;)a={width:Math.floor(a.width*n),height:Math.floor(a.height*n)},c.drawImage(i,0,0,a.width*s,a.height*s,0,0,a.width,a.height);r.drawImage(i,0,0,a.width,a.height,0,0,o.width,o.height)}else r.drawImage(e,0,0,o.width,o.height);return new Promise((e=>{o.toBlob(e,a)}))}var Lt=s(4524);const At={width:200,height:200},Ot=115,Ft=(e,t,s)=>{const{audio:n,voice:a}=(0,l.qp)(e),r=n?n.title||n.fileName:a?"Voice message":"",i=n&&n.performer||t&&(0,l.OU)(Tt.i0,t),c=s&&(0,l.U)(Tt.i0,s)||"Telegram",d=n&&(0,l.MR)(n)&&(0,l.Ti)(e,"pictogram"),u=t&&(0,l.RT)(t,"big"),m=n&&d||a&&u,h=(0,vt.Z)(m),g=(0,o.Ye)((()=>function(e,t,s){if(!s)return At;if(e){if(!e.thumbnailSizes||0===e.thumbnailSizes.length)return;return e.thumbnailSizes.find((e=>"m"===e.type))||e.thumbnailSizes[0]}return t?ft.vY:void 0}(n,a,h)),[n,h,a]),{result:p}=((e,t,s)=>{const[n,a]=(0,o.eJ)(!1),[r,i]=(0,o.eJ)(),[c,l]=(0,o.eJ)(s);return(0,o.d4)((()=>{a(!0);let e=!1;return function(e,t){if(!e)return Promise.resolve(Lt);if(!t)return function(e,t,s,n="image/png"){const a=e instanceof Blob?URL.createObjectURL(e):e,o=new Image;return new Promise((r=>{o.onload=()=>{Bt(o,t,s,n).then((e=>URL.createObjectURL(e))).then(r).finally((()=>{e instanceof Blob&&URL.revokeObjectURL(a)}))},o.src=a}))}(e,Ot,Ot);const s=Math.min(t.width,t.height);return s{e||(a(!1),l(t))}),(t=>{e||(a(!1),i(t))})),()=>{e=!0}}),t),{isLoading:n,error:r,result:c}})(0,[h,g],Lt);return(0,o.Ye)((()=>(0,kt.Of)({title:r,artist:i,album:c,artwork:[{src:p}]})),[c,i,r,p])};var Ut=s(8051);const $t=(0,n.c$)(((e,{message:t})=>{const s=(0,i.Ur)(e,t),n=(0,i.Z1)(e,t.chatId),{volume:a,playbackRate:o,isMuted:r}=e.audioPlayer;return{sender:s,chat:n,volume:a,playbackRate:o,isMuted:r}}),((e,t)=>(0,g.ei)(t,["focusMessage","closeAudioPlayer","setAudioPlayerVolume","setAudioPlayerPlaybackRate","setAudioPlayerMuted"])))((({message:e,className:t,noUi:s,sender:n,chat:a,volume:r,playbackRate:i,isMuted:c,setAudioPlayerVolume:d,setAudioPlayerPlaybackRate:u,setAudioPlayerMuted:m,focusMessage:g,closeAudioPlayer:p})=>{const f=(0,ye.Z)(),{audio:I,voice:v,video:y}=(0,l.qp)(e),P=Boolean(v||y),Z=n?(0,l.OU)(f,n):void 0,C=St.UV((0,l.Ti)(e,"inline")),w=Ft(e,n,a),{playPause:b,stop:M,isPlaying:S,requestNextTrack:E,requestPreviousTrack:k,isFirst:R,isLast:T,setVolume:N,toggleMuted:B,setPlaybackRate:x}=(0,Rt.Z)((0,Et.An)(e),(0,l.XV)(e),P?"voice":"audio",C,void 0,w,void 0,!0,void 0,void 0,(0,l.CI)(e),!0),L=P&&S;(0,o.d4)((()=>{if(L)return nt.Z.disableRefresh(),()=>{nt.Z.enableRefresh()}}),[L]);const A=(0,o.I4)((()=>{g({chatId:e.chatId,messageId:e.id})}),[g,e.chatId,e.id]),O=(0,o.I4)((()=>{S&&b(),p(),(0,kt.Ay)(),M()}),[p,S,b,M]),F=(0,o.I4)((e=>{d({volume:e/100}),m({isMuted:!1}),N(e/100)}),[m,d,N]),U=(0,o.I4)((()=>{h.$b&&!h.cj||(B(),m({isMuted:!c}))}),[c,m,B]),$=(0,o.I4)((()=>{1===i?(x(1.8),u({playbackRate:1.8})):(x(1),u({playbackRate:1}))}),[i,u,x]),D=(0,o.Ye)((()=>0===r||c?"icon-muted":r<.3?"icon-volume-1":r<.6?"icon-volume-2":"icon-volume-3"),[r,c]);if(!s)return o.ZP.createElement("div",{className:(0,ne.Z)("AudioPlayer",t),dir:f.isRtl?"rtl":void 0},o.ZP.createElement(we.Z,{round:!0,ripple:!h.wB,color:"translucent",size:"smaller",className:"player-button",disabled:R(),onClick:k,ariaLabel:"Previous track"},o.ZP.createElement("i",{className:"icon-skip-previous"})),o.ZP.createElement(we.Z,{round:!0,ripple:!h.wB,color:"translucent",size:"smaller",className:(0,ne.Z)("toggle-play","player-button",S?"pause":"play"),onClick:b,ariaLabel:S?"Pause audio":"Play audio"},o.ZP.createElement("i",{className:"icon-play"}),o.ZP.createElement("i",{className:"icon-pause"})),o.ZP.createElement(we.Z,{round:!0,ripple:!h.wB,color:"translucent",size:"smaller",className:"player-button",disabled:T(),onClick:E,ariaLabel:"Next track"},o.ZP.createElement("i",{className:"icon-skip-next"})),o.ZP.createElement("div",{className:"AudioPlayer-content",onClick:A},I?function(e){const{title:t,performer:s,fileName:n}=e;return o.ZP.createElement(o.ZP.Fragment,null,o.ZP.createElement("div",{className:"title",dir:"auto"},(0,It.Z)(t||n)),s&&o.ZP.createElement("div",{className:"subtitle",dir:"auto"},(0,It.Z)(s)))}(I):function(e,t){return o.ZP.createElement(o.ZP.Fragment,null,o.ZP.createElement("div",{className:"title",dir:"auto"},t&&(0,It.Z)(t)),o.ZP.createElement("div",{className:"subtitle",dir:"auto"},e))}(f("AttachAudio"),Z),o.ZP.createElement(Ct.Z,null)),o.ZP.createElement(we.Z,{round:!0,className:"player-button volume-button",color:"translucent",size:"smaller",ariaLabel:"Volume",withClickPropagation:!0},o.ZP.createElement("i",{className:D,onClick:U}),!h.cj&&o.ZP.createElement(o.ZP.Fragment,null,o.ZP.createElement("div",{className:"volume-slider-spacer"}),o.ZP.createElement("div",{className:"volume-slider"},o.ZP.createElement(Ut.Z,{value:c?0:100*r,onChange:F})))),P&&o.ZP.createElement(we.Z,{round:!0,className:(0,ne.Z)("playback-button",1!==i&&"applied"),color:"translucent",size:"smaller",ariaLabel:"Playback Rate",ripple:!h.wB,onClick:$},o.ZP.createElement("span",{className:"playback-button-inner"},"2Х")),o.ZP.createElement(we.Z,{round:!0,className:"player-close",color:"translucent",size:"smaller",onClick:O,ariaLabel:"Close player"},o.ZP.createElement("i",{className:"icon-close"})))}));var Dt=s(2607),Qt=s(172);const qt=(0,o.X$)((0,n.c$)(((e,{chatId:t})=>{const s=(0,i.Z1)(e,t),n=(0,Dt.Bj)(e,t);return{groupCall:n,usersById:e.users.byId,chatsById:e.chats.byId,activeGroupCallId:e.groupCalls.activeGroupCallId,isActive:(n?n.participantsCount>0&&n.isLoaded:s&&s.isCallNotEmpty&&s.isCallActive)&&e.groupCalls.activeGroupCallId!==(null==n?void 0:n.id)}}),((e,t)=>(0,g.ei)(t,["joinGroupCall","subscribeToGroupCallUpdates"])))((({chatId:e,isActive:t,groupCall:s,hasPinnedOffset:n,joinGroupCall:a,subscribeToGroupCallUpdates:r,usersById:i,chatsById:c})=>{const l=(0,ye.Z)(),d=(0,o.I4)((()=>{a({chatId:e})}),[a,e]),u=null==s?void 0:s.participants,m=(0,o.Ye)((()=>u?Object.values(u).filter(((e,t)=>t<3)).map((({id:e,isUser:t})=>{if(t){if(!i[e])return;return{user:i[e]}}if(c[e])return{chat:c[e]}})).filter(Boolean):[]),[c,u,i]);if((0,o.d4)((()=>{if(null!=s&&s.id&&(t||!s.isLoaded))return r({id:s.id,subscribed:!0}),()=>{r({id:s.id,subscribed:!1})}}),[null==s?void 0:s.id,null==s?void 0:s.isLoaded,t,r]),s)return o.ZP.createElement("div",{className:(0,ne.Z)("GroupCallTopPane",n&&"has-pinned-offset",!t&&"is-hidden"),onClick:d},o.ZP.createElement("div",{className:"info"},o.ZP.createElement("span",{className:"title"},l("VoipGroupVoiceChat")),o.ZP.createElement("span",{className:"participants"},l("Participants",s.participantsCount||0,"i"))),o.ZP.createElement("div",{className:"avatars"},m.map((e=>{if(e)return e.user?o.ZP.createElement(Qt.Z,{key:e.user.id,user:e.user}):o.ZP.createElement(Qt.Z,{key:e.chat.id,chat:e.chat})}))),o.ZP.createElement(we.Z,{round:!0,className:"join"},l("VoipChatJoin")))}))),Gt=(0,o.X$)((0,n.c$)(((e,{chatId:t,threadId:s,messageListType:n})=>{const{isLeftColumnShown:a,lastSyncTime:o,shouldSkipHistoryAnimations:r}=e,{byId:c}=e.chats,l=(0,i.Z1)(e,t),{typingStatus:d}=l||{},{chatId:m,messageId:h}=e.audioPlayer,g=m&&h?(0,i.hj)(e,m,h):void 0;let p;if("pinned"===n){const s=(0,i.KB)(e,t);p=null==s?void 0:s.length}else if("scheduled"===n){const s=(0,i.qy)(e,t);p=null==s?void 0:s.length}else if("thread"===n&&s!==u._f){const n=(0,i.tZ)(e,t,s);p=(null==n?void 0:n.messagesCount)||0}const f={typingStatus:d,isLeftColumnShown:a,isRightColumnShown:(0,i.Jf)(e),isSelectModeActive:(0,i.CA)(e),audioMessage:g,chat:l,chatsById:c,messagesCount:p,isChatWithSelf:(0,i.FM)(e,t),isChatWithBot:l&&(0,i.xo)(e,l),lastSyncTime:o,shouldSkipHistoryAnimations:r,currentTransitionKey:Math.max(0,e.messages.messageLists.length-1),connectionState:e.connectionState},I=(0,i.Zw)(e,t);if("thread"!==n||!I)return f;if(Object.assign(f,{messagesById:I}),s!==u._f){const n=(0,i.qS)(e,t,s),a=n?(0,i.hj)(e,t,n):void 0,o=a?(0,i.cv)(e,a):void 0;return{...f,pinnedMessageIds:n,canUnpin:!1,topMessageSender:o}}const v=(0,i.KB)(e,t);if(null!=v&&v.length){const t=I[v[0]],{canUnpin:n}=t&&(0,i._k)(e,t,s)||{};return{...f,pinnedMessageIds:v,canUnpin:n}}return f}),((e,t)=>(0,g.ei)(t,["openChatWithInfo","pinMessage","focusMessage","openChat","openPreviousChat","loadPinnedMessages","toggleLeftColumn","exitMessageSelectMode"])))((({chatId:e,threadId:t,messageListType:s,isReady:r,pinnedMessageIds:c,messagesById:d,canUnpin:m,topMessageSender:g,typingStatus:p,isSelectModeActive:f,isLeftColumnShown:I,isRightColumnShown:v,audioMessage:y,chat:P,chatsById:Z,messagesCount:C,isChatWithSelf:w,isChatWithBot:b,lastSyncTime:M,shouldSkipHistoryAnimations:S,currentTransitionKey:E,connectionState:k,openChatWithInfo:R,pinMessage:T,focusMessage:N,openChat:B,openPreviousChat:x,loadPinnedMessages:L,toggleLeftColumn:A,exitMessageSelectMode:O})=>{const F=(0,ye.Z)(),U=(0,o.sO)(!0),[$,D]=(0,o.eJ)(0),Q=Array.isArray(c)?c[$]:c,q=d&&Q?d[Q]:void 0,G=Array.isArray(c)?c.length:c?1:void 0,j=P&&(0,l.U)(F,P).length,H=g?(0,l.OU)(F,g):void 0;(0,o.d4)((()=>{t===u._f&&M&&r&&L({chatId:e})}),[e,L,M,t,r]),(0,o.d4)((()=>{D(0)}),[c]),(0,lt.Z)(e,Q,q);const{width:_}=at(),V=_<=a.ks,z=h.p7&&I,W=(0,o.sO)(null),Y=(0,o.sO)(!0),X=(0,o.I4)((()=>{R({id:e})}),[R,e]),K=(0,o.I4)((t=>{T({chatId:e,messageId:t,isUnpin:!0})}),[T,e]),J=(0,o.I4)((()=>{if(q){N({chatId:q.chatId,threadId:t,messageId:q.id});const e=(0,ct.Z)(G||1,$+1);D(e)}}),[q,N,t,G,$]),ee=(0,o.I4)((()=>{B({id:e,threadId:u._f,type:"pinned"})}),[B,e]),te=(0,o.I4)((()=>{setTimeout((()=>{U.current=!0}),450)}),[]),se=(0,o.I4)((e=>{if(U.current){if(U.current=!1,h.wB){const e=document.getElementById(a.R2);e&&e.blur()}if(f)return O(),void te();if(t===u._f&&"thread"===s&&0===E)return h.wB||z?(e.stopPropagation(),B({id:void 0})):A(),void te();x(),te()}}),[t,s,E,f,x,z,B,A,O,te]),ae=(0,o.Ye)((()=>{if(V&&Z)return(0,i.A1)((0,n.Rd)())||void 0}),[V,Z]),re=_>=a.ks&&_a.l3&&_30),ie=re||_>a._m&&_{const e=W.current;if(e)return ie&&Pe?void(v||re?(Y.current&&(e.classList.add("tools-stacked","animated"),Y.current=!1),setTimeout((()=>{e.classList.remove("animated")}),350)):(e.classList.remove("tools-stacked"),Y.current=!0)):(e.classList.remove("tools-stacked","animated"),void(Y.current=!0))}),[ie,Pe,re,v]);const Ze=(!ve()||"connectionStateConnecting"===k)&&(h.wB||h.p7&&!z);function Ce(){return Ze?o.ZP.createElement(o.ZP.Fragment,null,be(),o.ZP.createElement("h3",null,F("WaitingForNetwork"))):"thread"===s&&t===u._f?o.ZP.createElement(o.ZP.Fragment,null,(V||E>0)&&be(z,!0),o.ZP.createElement("div",{className:"chat-info-wrapper",onClick:X},(0,l.YC)(e)?o.ZP.createElement(mt.Z,{userId:e,typingStatus:p,withFullInfo:b,withMediaViewer:!0,withUpdatingStatus:!0,noRtl:!0}):o.ZP.createElement(ht.Z,{chatId:e,typingStatus:p,noRtl:!0,withMediaViewer:!0,withFullInfo:!0,withUpdatingStatus:!0}))):"thread"===s?o.ZP.createElement(o.ZP.Fragment,null,be(),o.ZP.createElement("h3",null,F("CommentsCount",C,"i"))):"pinned"===s?o.ZP.createElement(o.ZP.Fragment,null,be(),o.ZP.createElement("h3",null,F("PinnedMessagesCount",C,"i"))):"scheduled"===s?o.ZP.createElement(o.ZP.Fragment,null,be(),o.ZP.createElement("h3",null,w?F("Reminders"):F("messages",C,"i"))):void 0}function be(e=!1,t=!1){return o.ZP.createElement("div",{className:"back-button"},o.ZP.createElement(we.Z,{round:!0,size:"smaller",color:"translucent",onClick:se,ariaLabel:F(e?"Close":"Back")},o.ZP.createElement("div",{className:(0,ne.Z)("animated-close-icon",!e&&"state-back")})),t&&ae&&o.ZP.createElement("div",{className:"unread-count active"},(0,ut.bi)(ae)))}const Me=Boolean(ce&&de);return o.ZP.createElement("div",{className:"MiddleHeader",ref:W},o.ZP.createElement(Ie.Z,{name:S?"none":"slide-fade",activeKey:Ze?1/0:E},Ce),o.ZP.createElement(qt,{hasPinnedOffset:ue&&!!he||ce&&!!de,chatId:e}),ue&&he&&o.ZP.createElement(Mt,{key:e,message:he,count:ge||0,index:$,customTitle:fe,className:(0,ne.Z)(me,Me&&"full-width"),onUnpinMessage:pe?K:void 0,onClick:J,onAllPinnedClick:ee}),o.ZP.createElement("div",{className:"header-tools"},Me&&o.ZP.createElement($t,{key:(0,l.Tp)(de),message:de,className:le}),o.ZP.createElement(pt,{chatId:e,threadId:t,messageListType:s,canExpandActions:!Me})))})));var jt=s(2645),Ht=s(274);function _t(e){return"albumId"in e}function Vt(e,t){let s,n=[],a={originalDate:e[0].date,datetime:Number((0,N.$Y)(1e3*e[0].date)),senderGroups:[n]};const o=[a];return e.forEach(((r,i)=>{r.isInAlbum?s?(s.messages.push(r),r.content.text&&(s.mainMessage=r)):s={albumId:r.groupedId,messages:[r],mainMessage:r}:n.push(r);const c=e[i+1];if(!s||c&&c.groupedId&&c.groupedId===s.albumId||(n.push(s),s=void 0),c){const e=Number((0,N.$Y)(1e3*c.date));a.datetime!==e?(a={originalDate:c.date,datetime:e,senderGroups:[]},o.push(a),n=[],a.senderGroups.push(n)):(c.id===t||r.senderId!==c.senderId||r.isOutgoing!==c.isOutgoing||(0,l.Lo)(r)||(0,l.Lo)(c)||r.forwardInfo&&c.forwardInfo&&(r.forwardInfo.senderUserId!==c.forwardInfo.senderUserId||r.forwardInfo.fromChatId!==c.forwardInfo.fromChatId||r.forwardInfo.hiddenUserName!==c.forwardInfo.hiddenUserName)||r.inlineButtons||c.inlineButtons||c.date-r.date>600)&&(n=[],a.senderGroups.push(n))}})),o}var zt=s(386),Wt=s(2202);var Yt=s(7675),Xt=s(539),Kt=s(3657);const Jt=h.wZ?1e3:350,es=h.wB?300:500;var ts=s(7240),ss=s(935);function ns(e){return"number"==typeof e}function as(e,t){return e?t?238:175:t?238:100}function os(e,t){const s=(0,l.B4)(e),n=(0,l.MF)(e),a=(0,l.O$)(e)||(0,l.F$)(e),o=(0,l.b7)(e),r=Boolean((0,l.F$)(e)),{width:i,height:c}=a?(0,ft.Eh)(a,s,n,r,t):(0,ft.GC)(o,s,n,t),d=as(Boolean((0,l.UD)(e)));let u=1;ie+t),t)}function is(e,t,s){return es?s:e}function cs(e){const t={width:0,height:0};return e.forEach((({dimensions:e,sides:s})=>{2&s&&(t.width=e.width+e.x),4&s&&(t.height=e.height+e.y)})),t}function ls(e,t,s,n){const a=n.messages.map((e=>{const t=os(e);return t.width/t.height})),o=function(e){return e.map((e=>e>1.2?"w":e<.8?"n":"q")).join("")}(a),r=function(e){return e.reduce(((e,t)=>t+e),1)/e.length}(a),i=a.length,c=a.some((e=>e>2)),l=(0,ft.kc)(e,t,!1,s)-(t?2.5:0)*ft.Gw;let d;const u={ratios:a,proportions:o,averageRatio:r,maxWidth:l,minWidth:100,maxHeight:l,spacing:2};return d=i>=5||c?function({ratios:e,averageRatio:t,maxWidth:s,minWidth:n,spacing:a,maxHeight:o=4*s/3}){const r=function(e,t){return e.map((e=>t>1.1?is(e,1,2.75):is(e,.6667,1)))}(e,t),i=e.length,c=new Array(i),l=[],d=e=>{const t=[];let n=0;e.forEach((e=>{t.push(((e,t)=>{const n=rs(r.slice(e,e+t),0);return(s-(t-1)*a)/n})(n,e)),n+=e})),l.push({lineCounts:e,heights:t})};for(let e=1;e!==i;++e){const t=i-e;e<=3&&t<=3&&d([e,t])}for(let e=1;e!==i-1;++e)for(let s=1;s!==i-e;++s){const n=i-e-s;e<=3&&s<=(t<.85?4:3)&&n<=3&&d([e,s,n])}for(let e=1;e!==i-1;++e)for(let t=1;t!==i-e;++t)for(let s=1;s!==i-e-t;++s){const n=i-e-t-s;e<=3&&t<=3&&s<=3&&n<=4&&d([e,t,s,n])}let u,m=0;for(let e=0;e{for(let e=1;e!==r;++e)if(s[e-1]>s[e])return 1.5;return 1})(),h=Math.abs(i-o)*c*d;(!u||h1.4&&t[1]-t[0]<.2?function(e){const{ratios:t,maxWidth:s,spacing:n,maxHeight:a}=e,o=Math.round(Math.min(s/t[0],Math.min(s/t[1],(a-n)/2)));return[{dimensions:{x:0,y:0,width:s,height:o},sides:11},{dimensions:{x:0,y:o+n,width:s,height:o},sides:14}]}(e):"ww"===s||"qq"===s?function(e){const{ratios:t,maxWidth:s,spacing:n,maxHeight:a}=e,o=(s-n)/2,r=Math.round(Math.min(o/t[0],Math.min(o/t[1],a)));return[{dimensions:{x:0,y:0,width:o,height:r},sides:13},{dimensions:{x:o+n,y:0,width:o,height:r},sides:7}]}(e):function(e){const{ratios:t,minWidth:s,maxWidth:n,spacing:a,maxHeight:o}=e,r=Math.round(1.5*s),i=Math.min(Math.round(Math.max(.4*(n-a),(n-a)/t[0]/(1/t[0]+1/t[1]))),n-a-r),c=n-i-a,l=Math.min(o,Math.round(Math.min(c/t[0],i/t[1])));return[{dimensions:{x:0,y:0,width:c,height:l},sides:13},{dimensions:{x:c+a,y:0,width:i,height:l},sides:7}]}(e)}(u):3===i?function(e){const{proportions:t}=e;return"n"===t[0]?function(e){const{maxHeight:t,spacing:s,ratios:n,maxWidth:a,minWidth:o}=e,r=t,i=Math.round(Math.min((t-s)/2,n[1]*(a-s)/(n[2]+n[1]))),c=r-i-s,l=Math.max(o,Math.round(Math.min((a-s)/2,Math.min(i*n[2],c*n[1])))),d=Math.min(Math.round(r*n[0]),a-s-l);return[{dimensions:{x:0,y:0,width:d,height:r},sides:13},{dimensions:{x:d+s,y:0,width:l,height:c},sides:3},{dimensions:{x:d+s,y:c+s,width:l,height:i},sides:6}]}(e):function(e){const{maxWidth:t,ratios:s,maxHeight:n,spacing:a}=e,o=t,r=Math.round(Math.min(o/s[0],.66*(n-a))),i=(t-a)/2,c=Math.min(n-r-a,Math.round(Math.min(i/s[1],i/s[2])));return[{dimensions:{x:0,y:0,width:o,height:r},sides:11},{dimensions:{x:0,y:r+a,width:i,height:c},sides:12},{dimensions:{x:i+a,y:r+a,width:o-i-a,height:c},sides:6}]}(e)}(u):function(e){const{proportions:t}=e;return"w"===t[0]?function({maxWidth:e,ratios:t,spacing:s,maxHeight:n,minWidth:a}){const o=e,r=Math.round(Math.min(o/t[0],.66*(n-s))),i=Math.round((e-2*s)/(t[1]+t[2]+t[3])),c=Math.max(a,Math.round(Math.min(.4*(e-2*s),i*t[1]))),l=Math.round(Math.max(Math.max(a,.33*(e-2*s)),i*t[3])),d=o-c-l-2*s,u=Math.min(n-r-s,i);return[{dimensions:{x:0,y:0,width:o,height:r},sides:11},{dimensions:{x:0,y:r+s,width:c,height:u},sides:12},{dimensions:{x:c+s,y:r+s,width:d,height:u},sides:4},{dimensions:{x:c+s+d+s,y:r+s,width:l,height:u},sides:6}]}(e):function({maxHeight:e,ratios:t,maxWidth:s,spacing:n,minWidth:a}){const o=e,r=Math.round(Math.min(o*t[0],.6*(s-n))),i=Math.round((e-2*n)/(1/t[1]+1/t[2]+1/t[3])),c=Math.round(i/t[1]),l=Math.round(i/t[2]),d=o-c-l-2*n,u=Math.max(a,Math.min(s-r-n,i));return[{dimensions:{x:0,y:0,width:r,height:o},sides:13},{dimensions:{x:r+n,y:0,width:u,height:c},sides:3},{dimensions:{x:r+n,y:c+n,width:u,height:l},sides:2},{dimensions:{x:r+n,y:c+l+2*n,width:u,height:d},sides:6}]}(e)}(u),{layout:d,containerStyle:cs(d)}}let ds;function us(e){return ds||(ds=document.createElement("span"),ds.style.font=h.cj?'400 12px system-ui, -apple-system, BlinkMacSystemFont, "Roboto", "Apple Color Emoji", "Helvetica Neue", sans-serif':'400 12px "Roboto", -apple-system, "Apple Color Emoji", BlinkMacSystemFont, "Helvetica Neue", sans-serif',ds.style.whiteSpace="nowrap",ds.style.position="absolute",ds.style.left="-999px",ds.style.opacity=".01",document.body.appendChild(ds)),ds.innerHTML=e,ds.offsetWidth}function ms(e,t,s,n,a,r){(0,o.bt)((()=>{if(s&&e.current){const t=e.current.closest(".MessageList");(0,Xt.Z)(t,e.current,a?"end":"centerOrTop",20,void 0!==n?1e3:void 0,n,void 0,r)}}),[e,t,s,n,a,r])}var hs=s(8005);const gs=(0,o.X$)((e=>{const{isOpen:t}=e,s=(0,Fe.Z)(Oe.gl.Extra,"ContextMenuContainer",!t);return s?o.ZP.createElement(s,e):void 0})),ps=(0,o.X$)((0,n.c$)(((e,{message:t})=>{const{byId:s}=e.users,n=t.senderId,{targetUserIds:a,targetChatId:o}=t.content.action||{},r=t.replyToMessageId,c=r?(0,i.hj)(e,t.chatId,r):void 0,d=(0,i._X)(e,t),{direction:u,noHighlight:m}=d&&e.focusedMessage||{},h=(0,i.Z1)(e,t.chatId);return{usersById:s,sender:h&&((0,l.eA)(h)||n===t.chatId)?h:n?(0,i.dy)(e,n):void 0,targetChatId:o,targetUserIds:a,targetMessage:c,isFocused:d,...d&&{focusDirection:u,noFocusHighlight:m}}}))((({message:e,observeIntersection:t,isEmbedded:s,appearanceOrder:n=0,isLastInList:a,usersById:r,sender:i,targetUserIds:c,targetMessage:l,targetChatId:d,isFocused:u,focusDirection:m,noFocusHighlight:h})=>{const g=(0,o.sO)(null);(0,Kt._N)(g,t),(0,lt.Z)(e.chatId,e.replyToMessageId,l),ms(g,e.chatId,u,m,h);const p=(0,ye.Z)(),f=n<=0,[I,v]=(0,fe.Z)(f);(0,o.d4)((()=>{f||setTimeout(v,10*n)}),[n,v,f]);const{transitionClassNames:y}=(0,oe.Z)(I,void 0,f,!1),P=(0,o.Ye)((()=>c?c.map((e=>null==r?void 0:r[e])).filter(Boolean):void 0),[c,r]),Z=(0,hs.D)(p,e,i,P,l,d,s?{isEmbedded:!0,asPlain:!0}:void 0),{isContextMenuOpen:C,contextMenuPosition:w,handleBeforeContextMenu:b,handleContextMenu:M,handleContextMenuClose:S,handleContextMenuHide:E}=(0,ts.Z)(g),k=void 0!==w;if(s)return o.ZP.createElement("span",{className:"embedded-action-message"},(0,It.Z)(Z));const R=(0,ne.Z)("ActionMessage message-list-item",u&&!h&&"focused",k&&"has-menu-open",a&&"last-in-list",y);return o.ZP.createElement("div",{ref:g,id:`message${e.id}`,className:R,"data-message-id":e.id,onMouseDown:e=>{(0,zt.q)(e),b(e)},onContextMenu:M},o.ZP.createElement("span",null,Z),w&&o.ZP.createElement(gs,{isOpen:C,anchor:w,message:e,messageListType:"thread",onClose:S,onCloseAnimationEnd:E}))}))),fs=({className:e,message:t,sender:s,title:n,customText:a,observeIntersection:r,onClick:i})=>{const c=(0,o.sO)(null),d=(0,Kt.Op)(c,r),u=(0,vt.Z)(t&&(0,l.Ti)(t,"pictogram"),!d),m=t&&`sticker-reply-thumb${t.id}`,h=Pt(t),g=Boolean(t&&(0,l.Y5)(t)),p=(0,ye.Z)(),f=s&&(0,l.OU)(p,s);return o.ZP.createElement("div",{ref:c,className:(0,ne.Z)("EmbeddedMessage",e),onClick:t?i:void 0},h&&function(e,t,s,n){const{width:a,height:r}=(0,ft.W7)();return o.ZP.createElement("img",{id:e,src:s||t,width:a,height:r,alt:"",className:n?"round":""})}(m,h,u,g),o.ZP.createElement("div",{className:"message-text"},o.ZP.createElement("p",{dir:"auto"},t?(0,l.Lo)(t)?o.ZP.createElement(ps,{message:t,isEmbedded:!0}):(0,It.Z)((0,l.MK)(p,t,Boolean(h))):a||" "),o.ZP.createElement("div",{className:"message-title",dir:"auto"},(0,It.Z)(f||n||" "))))};var Is=s(2535),vs=s(4752),ys=s(8018);const Ps=(0,o.X$)((({message:e,outgoingStatus:t,signature:s,onClick:n})=>{const a=(0,ye.Z)();return o.ZP.createElement("span",{className:"MessageMeta",dir:a.isRtl?"rtl":"ltr",onClick:n},Boolean(e.views)&&o.ZP.createElement(o.ZP.Fragment,null,o.ZP.createElement("span",{className:"message-views"},(0,ut.bi)(e.views)),o.ZP.createElement("i",{className:"icon-channelviews"})),s&&o.ZP.createElement("span",{className:"message-signature"},(0,It.Z)(s)),o.ZP.createElement("span",{className:"message-time"},e.isEdited&&`${a("EditedMessage")} `,(0,N.mr)(1e3*e.date,a)),t&&o.ZP.createElement(ys.Z,{status:t}))}));var Zs=s(692),Cs=s(7799),ws=s(4851);const bs=({message:e,observeIntersection:t,observeIntersectionForPlaying:s,shouldLoop:n,lastSyncTime:r})=>{const i=(0,o.sO)(null),[c,d,u]=(0,fe.Z)(),m=e.content.sticker,{isAnimated:h,stickerSetId:g}=m,p=g===a.n,f=(0,Kt.Op)(i,t),I=(0,Kt.Op)(i,s),v=m.isPreloadedGlobally?`sticker${m.id}`:(0,l.Ti)(e,"inline"),y=Pt(e),P=(0,vt.Z)(v,!f,(0,l.kG)(e,"inline",!0),r),Z=Boolean(P),[C,w]=(0,fe.Z)(Z),b=h?C:Z,M=(0,Zs.Z)(b),{width:S,height:E}=(0,ft.Wr)(m),k=(0,ne.Z)("thumbnail",!y&&"empty"),R=(0,ne.Z)("Sticker media-inner",p&&"inactive");return o.ZP.createElement("div",{ref:i,className:R,onClick:p?void 0:d},!b&&o.ZP.createElement("img",{id:`sticker-thumb-${e.id}`,src:y,width:S,height:E,alt:"",className:k}),!h&&o.ZP.createElement("img",{id:`sticker-${e.id}`,src:P,width:S,height:E,alt:"",className:(0,ne.Z)("full-media",M)}),h&&Z&&o.ZP.createElement(Cs.Z,{key:v,className:(0,ne.Z)("full-media",M),id:v,animationData:P,size:S,play:I,noLoop:!n,onLoad:w}),o.ZP.createElement(ws.Z,{isOpen:c,fromSticker:m,onClose:u}))};var Ms=s(7854),Ss=s(2566),Es=s(5866);function ks(e,t){return(0,Es.Z)((0,l.DH)(e),Boolean(t),h.wB&&!h.vX)}var Rs=s(7204);const Ts={dark:{outgoing:"rgb(135,116,225)",incoming:"rgb(33,33,33)"},light:{outgoing:"rgb(238,255,222)",incoming:"rgb(255,255,255)"}};var Ns=s(9196);const Bs=({id:e,message:t,observeIntersection:s,noAvatars:n,canAutoLoad:a,isInSelectMode:r,isSelected:i,uploadProgress:c,size:d="inline",dimensions:u,nonInteractive:m,shouldAffectAppendix:h,isDownloading:g,theme:p,onClick:f,onCancelUpload:I})=>{const v=(0,o.sO)(null),y=((0,l.O$)(t)||(0,l.F$)(t)).blobUrl,P=(0,Kt.Op)(v,s),[Z,C]=(0,o.eJ)(a),w=Z&&P,{mediaData:b,loadProgress:M}=(0,Ss.Z)((0,l.Ti)(t,d),!w),S=y||b,E=ks(t,S),{loadProgress:k}=(0,Ss.Z)((0,l.Ti)(t,"download"),!g),{isUploading:R,isTransferring:T,transferProgress:N}=(0,l.Sc)(t,c||(g?k:M),w&&!S),B=!1===(0,Rs.Z)(Z),x=(0,Zs.Z)(S),{shouldRender:L,transitionClassNames:A}=(0,oe.Z)(T,void 0,B,"slow"),{shouldRender:O,transitionClassNames:F}=(0,oe.Z)(!S&&!Z),U=(0,o.I4)((()=>{R?I&&I(t):S?f&&f(t.id):C((e=>!e))}),[S,R,t,I,f]),$=(0,l.B4)(t);(0,o.bt)((()=>{if(!h)return;const e=v.current.closest(".message-content");S?function(e,t,s,n,a){return n?Promise.resolve(Ts[a||"light"][t?"outgoing":"incoming"]):async function(e,t){const s=new Image;s.src=e,s.width||await new Promise((e=>{s.onload=e}));const n=document.createElement("canvas"),a=n.getContext("2d");n.width=s.width,n.height=s.height,a.drawImage(s,0,0,s.width,s.height);const o=t?s.width-1:0,r=s.height-1;return`rgba(${Array.from(a.getImageData(o,r,1,1).data).join(",")})`}(e,t)}(S,$,0,i,p).then((t=>{e.style.setProperty("--appendix-bg",t),e.setAttribute("data-has-custom-appendix","")})):e.classList.add("has-appendix-thumb")}),[S,$,h,r,i,p]);const{width:D,height:Q,isSmall:q}=u||os(t,n),G=(0,ne.Z)("media-inner",!R&&!m&&"interactive",q&&"small-image",D===Q&&"square-image"),j=u?`width: ${D}px; height: ${Q}px; left: ${u.x}px; top: ${u.y}px;`:"";return o.ZP.createElement("div",{id:e,ref:v,className:G,style:j,onClick:R?void 0:U},o.ZP.createElement("canvas",{ref:E,className:"thumbnail",style:`width: ${D}px; height: ${Q}px`}),o.ZP.createElement("img",{src:S,className:`full-media ${x}`,width:D,height:Q,alt:""}),L&&!O&&o.ZP.createElement("div",{className:`media-loading ${A}`},o.ZP.createElement(Ns.Z,{progress:N,onClick:R?U:void 0})),O&&o.ZP.createElement("i",{className:(0,ne.Z)("icon-download",F)}),T&&o.ZP.createElement("span",{className:"message-transfer-progress"},Math.round(100*N),"%"))};var xs=s(2019),Ls=s(6898),As=s(4753);function Os(e,t){var s;const n=(0,o.sO)(null===(s=e.current)||void 0===s?void 0:s.paused),a=(0,o.sO)();a.current=t;const r=(0,o.I4)((()=>{e.current&&(n.current=!e.current.paused,n.current&&e.current.pause())}),[e]),i=(0,o.I4)((()=>{e.current&&n.current&&a.current&&document.body.contains(e.current)&&(0,As.Z)(e.current)}),[e]),c=(0,o.I4)((()=>{(0,C.T2)(i)}),[i]);(0,re.Z)(r,c),(0,se.ZP)(r,i)}function Fs(){return(Fs=Object.assign||function(e){for(var t=1;t{var f;const I=(0,o.sO)(null),v=(0,o.sO)(null),y=(0,l.b7)(t)||(0,l.Cg)(t),P=y.blobUrl,Z=(0,Kt.Op)(I,s),[C,w]=(0,o.eJ)(r),b=Boolean(C&&Z&&d),[M,S]=(0,o.eJ)(i),E=(0,vt.Z)((0,l.Ti)(t,"pictogram"),!(Z&&d),(0,l.kG)(t,"pictogram"),d),{transitionClassNames:k}=(0,oe.Z)(Boolean(E),void 0,void 0,"slow"),{mediaData:R,loadProgress:T}=(0,Ss.Z)((0,l.Ti)(t,"inline"),!b,(0,l.kG)(t,"inline"),d),B=P||R,x=Boolean(Z&&B),L=ks(t,E),{loadProgress:A}=(0,Ss.Z)((0,l.Ti)(t,"download"),!p,u.IU.BlobUrl,d),{isBuffered:O,bufferingHandlers:F}=(0,xs.Z)(!r),{isUploading:U,isTransferring:$,transferProgress:D}=(0,l.Sc)(t,c||(p?A:T),b&&!O||p),Q=!1===(0,Rs.Z)(C),{shouldRender:q,transitionClassNames:G}=(0,oe.Z)($,void 0,Q),{shouldRender:j,transitionClassNames:H}=(0,oe.Z)(C&&!M&&!q),[_,V]=(0,o.eJ)(0),z=(0,o.I4)((e=>{V(Math.max(0,e.currentTarget.currentTime-1))}),[]),W=(null===(f=v.current)||void 0===f?void 0:f.duration)||y.duration||0,Y=(0,l.B4)(t),X=(0,l.MF)(t),{width:K,height:J}=m||(0,ft.GC)(y,Y,X,a);Os(v,x),(0,Ls.Z)(v,[x]);const ee=(0,o.I4)((()=>{U?g&&g(t):p?(0,n.uC)().cancelMessageMediaDownload({message:t}):B?B&&!M?(S(!0),v.current.play()):h&&h(t.id):w((e=>!e))}),[U,p,B,M,h,g,t]),te=(0,ne.Z)("media-inner dark",!U&&"interactive"),se=m?`width: ${K}px; height: ${J}px; left: ${m.x}px; top: ${m.y}px;`:"";return o.ZP.createElement("div",{ref:I,id:e,className:te,style:se,onClick:U?void 0:ee},o.ZP.createElement("canvas",{ref:L,className:"thumbnail",style:`width: ${K}px; height: ${J}px;`}),o.ZP.createElement("img",{src:E,className:(0,ne.Z)("thumbnail",k),style:`width: ${K}px; height: ${J}px;`,alt:""}),x&&o.ZP.createElement("video",Fs({ref:v,className:"full-media",width:K,height:J,autoPlay:M,muted:!0,loop:!0,playsInline:!0},F,{onTimeUpdate:z}),o.ZP.createElement("source",{src:B})),j&&o.ZP.createElement("i",{className:(0,ne.Z)("icon-large-play",H)}),q&&o.ZP.createElement("div",{className:(0,ne.Z)("media-loading",G)},o.ZP.createElement(Ns.Z,{progress:D,onClick:ee})),!C&&o.ZP.createElement("i",{className:"icon-download"}),$?o.ZP.createElement("span",{className:"message-transfer-progress"},U||p?`${Math.round(100*D)}%`:"..."):o.ZP.createElement("div",{className:"message-media-duration"},y.isGif?"GIF":(0,N.k9)(Math.max(W-_,0))))};var $s=s(6272);const Ds=(0,n.c$)(((e,{contact:t})=>{const{countryList:{phoneCodes:s}}=e;return{user:(0,i.dy)(e,t.userId),phoneCodeList:s}}),((e,t)=>(0,g.ei)(t,["openUserInfo"])))((({contact:e,user:t,openUserInfo:s,phoneCodeList:n})=>{const{firstName:a,lastName:r,phoneNumber:i,userId:c}=e,l=(0,o.I4)((()=>{s({id:c})}),[s,c]);return o.ZP.createElement("div",{className:(0,ne.Z)("Contact",Boolean(c)&&"interactive"),onClick:c?l:void 0},o.ZP.createElement(Qt.Z,{size:"large",user:t,text:a||r}),o.ZP.createElement("div",{className:"contact-info"},o.ZP.createElement("div",{className:"contact-name"},a," ",r),o.ZP.createElement("div",{className:"contact-phone"},(0,$s.WZ)(n,i))))}));var Qs=s(1218),qs=s(4434),Gs=s(6937);function js(e,t){return t>0?(e/t*100).toFixed():0}const Hs=({answer:e,voteResults:t,totalVoters:s,maxVotersCount:n,correctResults:a,shouldAnimate:r})=>{const i=t&&t.find((t=>t.option===e.option)),c=0===a.length||-1!==a.indexOf(e.option),l=a.length>0&&c||(null==i?void 0:i.isChosen),d=i?js(i.votersCount,s||0):0,[u,m]=(0,o.eJ)(r?0:d),h=(0,o.sO)(null),g=i?js(i.votersCount,n||0):0,p=u{r&&m(d)}),[r,d]),(0,o.d4)((()=>{const e=h.current;if(e&&r){const t=e.firstElementChild,s=p?"":"stroke-dasharray: 100% 200%; stroke-dashoffset: -44";t?t.setAttribute("style",s):e.innerHTML=`\n \n \n `}}),[p,r]),!t||!i)return;const f=`width: ${g}%; transform:scaleX(${p?0:1})`;return o.ZP.createElement("div",{className:"PollOption",dir:"ltr"},o.ZP.createElement("div",{className:"poll-option-share "+("100"===d?"limit-width":"")},d,"%",l&&o.ZP.createElement("span",{className:(0,ne.Z)("poll-option-chosen",!c&&"wrong",r&&"animate")},o.ZP.createElement("i",{className:c?"icon-check":"icon-close"}))),o.ZP.createElement("div",{className:"poll-option-right"},o.ZP.createElement("div",{className:"poll-option-text",dir:"auto"},(0,It.Z)(e.text)),o.ZP.createElement("div",{className:(0,ne.Z)("poll-option-answer",l&&!c&&"wrong")},o.ZP.createElement("div",{className:"poll-option-corner",ref:h}),o.ZP.createElement("div",{className:"poll-option-line",style:f}))))},_s=(0,o.X$)((0,n.c$)(((e,{poll:t})=>{const{recentVoterIds:s}=t.results,{serverTimeOffset:n,users:{byId:a}}=e;return s&&0!==s.length?{recentVoterIds:s,usersById:a,serverTimeOffset:n}:{}}),((e,t)=>(0,g.ei)(t,["loadMessage","openPollResults"])))((({message:e,poll:t,recentVoterIds:s,usersById:n,loadMessage:a,onSendVote:r,openPollResults:i,serverTimeOffset:c})=>{const{id:l,chatId:d}=e,{summary:u,results:m}=t,[h,g]=(0,o.eJ)(!1),[p,f]=(0,o.eJ)([]),[I,v]=(0,o.eJ)(!1),[y,P]=(0,o.eJ)(!1),[Z,C]=(0,o.eJ)(!u.closed&&u.closeDate&&u.closeDate>0?Math.min(u.closeDate-Math.floor(Date.now()/1e3)+c,u.closePeriod):0),w=(0,o.sO)(null),{results:b,totalVoters:M}=m,S=b&&b.some((e=>e.isChosen)),E=!u.closed&&!S,k=!E&&u.isPublic&&Number(m.totalVoters)>0,R=E&&u.multipleChoice,T=b?Math.max(...b.map((e=>e.votersCount))):M,B=b?b.reduce(((e,t)=>(t.isCorrect&&e.push(t.option),e)),[]):[],x=u.answers.map((e=>({label:e.text,value:e.option,hidden:Boolean(u.quiz&&u.closePeriod&&Z<=0)})));(0,o.d4)((()=>{h&&t.results.results&&t.results.results.some((e=>e.isChosen))&&g(!1)}),[h,t.results.results]),(0,o.d4)((()=>{Z>0&&setTimeout((()=>C(Z-1)),1e3);const e=w.current;if(e){const t=12*Math.PI,s=e.lastElementChild,n=e.firstElementChild;if(Z<=5&&e.classList.add("hurry-up"),s&&n){const e=(u.closePeriod-Z)/u.closePeriod*t;n.textContent=(0,N.k9)(Z),s.firstElementChild.setAttribute("stroke-dashoffset",`-${e}`)}else e.innerHTML=`\n ${(0,N.k9)(Z)}\n \n \n `}}),[Z,u.closePeriod]),(0,o.d4)((()=>{u.quiz&&(Z<=0||S&&!u.closed)&&a({chatId:d,messageId:l})}),[d,Z,S,a,l,u.closed,u.quiz]),(0,o.d4)((()=>{let e;return u.quiz&&!u.closed&&u.closePeriod&&u.closePeriod>0&&(e=window.setTimeout((()=>{a({chatId:d,messageId:l})}),1e3*u.closePeriod)),()=>{e&&window.clearTimeout(e)}}),[E,d,a,l,u.closePeriod,u.closed,u.quiz]);const L=(0,o.Ye)((()=>s?s.reduce(((e,t)=>{const s=n[t];return s&&e.push(s),e}),[]):[]),[n,s]),A=(0,o.I4)((e=>{f([e]),g(!0),P(!0),r([e])}),[r]),O=(0,o.I4)((e=>{f(e)}),[]),F=(0,o.I4)((()=>{g(!0),P(!0),r(p)}),[r,p]),U=(0,o.I4)((()=>{i({chatId:d,messageId:l})}),[d,l,i]),$=(0,o.I4)((()=>{v(!0)}),[]),D=(0,o.I4)((()=>{v(!1),P(!1)}),[]);(0,o.d4)((()=>{y&&S&&u.quiz&&m.results&&t.results.solution&&(m.results.find((e=>e.isChosen&&e.isCorrect))||v(!0))}),[S,y,m.results,u.quiz,t.results.solution]);const Q=(0,ye.Z)();return o.ZP.createElement("div",{className:"Poll",dir:Q.isRtl?"auto":"ltr"},I&&t.results.solution&&o.ZP.createElement(Gs.Z,{message:(0,ss.H)(t.results.solution,t.results.solutionEntities),duration:5e3,onDismiss:D,containerId:"#middle-column-portals"}),o.ZP.createElement("div",{className:"poll-question"},(0,It.Z)(u.question,["emoji","br"])),o.ZP.createElement("div",{className:"poll-type"},Q(function(e){return void 0===e.isPublic?" ":e.quiz?e.isPublic?"QuizPoll":"AnonymousQuizPoll":e.closed?"FinalResults":e.isPublic?"PublicPoll":"AnonymousPoll"}(u)),L.length>0&&o.ZP.createElement("div",{className:"poll-recent-voters"},L.map((e=>o.ZP.createElement(Qt.Z,{size:"micro",user:e})))),Z>0&&E&&o.ZP.createElement("div",{ref:w,className:"poll-countdown"}),u.quiz&&t.results.solution&&!E&&o.ZP.createElement(we.Z,{round:!0,size:"tiny",color:"translucent",className:"poll-quiz-help",disabled:I,onClick:$,ariaLabel:"Show Solution"},o.ZP.createElement("i",{className:"icon-lamp"}))),E&&o.ZP.createElement("div",{className:"poll-answers"},R?o.ZP.createElement(Qs.Z,{options:x,onChange:O,disabled:e.isScheduled||h,loadingOptions:h?p:void 0,round:!0}):o.ZP.createElement(qs.Z,{name:`poll-${l}`,options:x,onChange:A,disabled:e.isScheduled||h,loadingOption:h?p[0]:void 0})),!E&&o.ZP.createElement("div",{className:"poll-results"},u.answers.map((function(e){return o.ZP.createElement(Hs,{key:e.option,shouldAnimate:y,answer:e,voteResults:b,totalVoters:M,maxVotersCount:T,correctResults:B})}))),!k&&!R&&o.ZP.createElement("div",{className:"poll-voters-count"},function(e,t,s){return s?e(t?"Answer":"Vote",s,"i"):e(t?"Chat.Quiz.TotalVotesEmpty":"Chat.Poll.TotalVotesResultEmpty")}(Q,u.quiz,m.totalVoters)),R&&o.ZP.createElement(we.Z,{isText:!0,disabled:0===p.length,size:"tiny",onClick:F},Q("PollSubmitVotes")),k&&o.ZP.createElement(we.Z,{isText:!0,size:"tiny",onClick:U},Q("PollViewResults")))})));var Vs=s(8035),zs=s(88);const Ws=(0,o.X$)((({message:e,observeIntersection:t,noAvatars:s,canAutoLoad:n,canAutoPlay:a,inPreview:r,lastSyncTime:i,isDownloading:c=!1,theme:d,onMediaClick:u,onCancelMediaTransfer:m})=>{const h=(0,l.s1)(e);let g=!1;if(null!=h&&h.photo&&!h.video){const{width:t,height:s}=os(e);g=t===s}const p=(0,o.I4)((()=>{u()}),[u]);if(!h)return;const{siteName:f,url:I,displayUrl:v,title:y,description:P,photo:Z,video:C}=h,w=(Z||C)&&u&&!g,b=(0,Vs.Z)(P,170),M=(0,ne.Z)("WebPage",g&&"with-square-photo",!Z&&!C&&!r&&"without-media",C&&"with-video");return o.ZP.createElement("div",{className:M,"data-initial":(f||v)[0],dir:"auto"},Z&&!C&&o.ZP.createElement(Bs,{message:e,observeIntersection:t,noAvatars:s,canAutoLoad:n,size:g?"pictogram":"inline",nonInteractive:!w,onClick:w?p:void 0,onCancelUpload:m,isDownloading:c,theme:d}),o.ZP.createElement("div",{className:"WebPage-text"},o.ZP.createElement(zs.Z,{className:"site-name",url:I,text:f||v}),!r&&y&&o.ZP.createElement("p",{className:"site-title"},(0,It.Z)(y)),b&&o.ZP.createElement("p",{className:"site-description"},(0,It.Z)(b,["emoji","br"]))),!r&&C&&o.ZP.createElement(Us,{message:e,observeIntersection:t,noAvatars:s,canAutoLoad:n,canAutoPlay:a,lastSyncTime:i,onClick:w?p:void 0,onCancelUpload:m,isDownloading:c}))}));var Ys=s(9937);const Xs=(0,o.X$)((({message:e})=>{const t=(0,ye.Z)(),s=(0,l.eO)(e),{title:n,text:a,amount:r,currency:i,isTest:c,photoUrl:d}=s;return o.ZP.createElement("div",{className:"Invoice"},n&&o.ZP.createElement("p",{className:"title"},(0,It.Z)(n)),a&&o.ZP.createElement("p",null,(0,It.Z)(a,["emoji","br"])),o.ZP.createElement("div",{className:"description "+(d?"has-image":"")},d&&o.ZP.createElement("img",{className:"invoice-image",src:d,alt:""}),o.ZP.createElement("p",{className:"description-text"},(0,Ys.x)(r,i,t.code),c&&o.ZP.createElement("span",null,t("PaymentTestInvoice")))))}));function Ks(e){return(0,o.X$)((0,n.c$)(((e,t)=>{const{message:s}=t;return{isInSelectMode:(0,i.CA)(e),isSelected:(0,i.vk)(e,s.id)}}),((e,t)=>(0,g.ei)(t,["toggleMessageSelection"])))((t=>{const{isInSelectMode:s,isSelected:n,message:a,toggleMessageSelection:r,dimensions:i}=t,c=(0,o.I4)((e=>{e.stopPropagation(),r({messageId:a.id,withShift:null==e?void 0:e.shiftKey})}),[r,a]),l=(0,o.Ye)((()=>({...t,isInSelectMode:s,isSelected:n,dimensions:{...t.dimensions,x:0,y:0},onClick:s?void 0:t.onClick})),[t,s,n]);return o.ZP.createElement("div",{className:(0,ne.Z)("album-item-select-wrapper",n&&"is-selected"),style:i?`left: ${i.x}px; top: ${i.y}px;`:"",onClick:s?c:void 0},s&&o.ZP.createElement("div",{className:"message-select-control"},n&&o.ZP.createElement("i",{className:"icon-select"})),o.ZP.createElement(e,l))})))}const Js=Ks(Bs),en=Ks(Us),tn=(0,n.c$)(((e,{album:t})=>{const{chatId:s}=t.mainMessage,n=(0,i.Pu)(e),a=(0,i.xs)(e,s);return{theme:n,uploadsById:e.fileUploads.byMessageLocalId,activeDownloadIds:a}}),((e,t)=>(0,g.ei)(t,["cancelSendingMessage"])))((({album:e,observeIntersection:t,hasCustomAppendix:s,lastSyncTime:a,isOwn:r,albumLayout:c,onMediaClick:d,uploadsById:u,activeDownloadIds:m,theme:h,cancelSendingMessage:g})=>{const p=e.messages.length,f=(0,o.I4)((e=>{g({chatId:e.chatId,messageId:e.id})}),[g]),{width:I,height:v}=c.containerStyle;return o.ZP.createElement("div",{className:"Album",style:`width: ${I}px; height: ${v}px;`},e.messages.map((function(e,g){const{photo:I,video:v}=(0,l.qp)(e),y=u[e.previousLocalId||e.id],P=null==y?void 0:y.progress,{dimensions:Z,sides:C}=c.layout[g],w=(0,i.bH)((0,n.Rd)(),e),b=(0,i.__)((0,n.Rd)(),e);if(I){const n=s&&(r?g===p-1:Boolean(8&C&&4&C));return o.ZP.createElement(Js,{id:`album-media-${e.id}`,message:e,observeIntersection:t,canAutoLoad:w,shouldAffectAppendix:n,uploadProgress:P,dimensions:Z,onClick:d,onCancelUpload:f,isDownloading:m.includes(e.id),theme:h})}if(v)return o.ZP.createElement(en,{id:`album-media-${e.id}`,message:e,observeIntersection:t,canAutoLoad:w,canAutoPlay:b,uploadProgress:P,lastSyncTime:a,dimensions:Z,onClick:d,onCancelUpload:f,isDownloading:m.includes(e.id),theme:h})})))}));function sn(){return(sn=Object.assign||function(e){for(var t=1;t{const i=(0,o.sO)(null),c=(0,o.sO)(null),d=(0,o.sO)(null),m=e.content.video,h=(0,Kt.Op)(i,t),[g,p]=(0,o.eJ)(s),f=Boolean(g&&h&&a),{mediaData:I,loadProgress:v}=(0,Ss.Z)((0,l.Ti)(e,"inline"),!f,(0,l.kG)(e,"inline"),a),{loadProgress:y}=(0,Ss.Z)((0,l.Ti)(e,"download"),!r,u.IU.BlobUrl,a),P=ks(e,I),{isBuffered:Z,bufferingHandlers:w}=(0,xs.Z)(),b=g&&!Z||r,M=!1===(0,Rs.Z)(g),S=(0,Zs.Z)(I),{shouldRender:E,transitionClassNames:k}=(0,oe.Z)(b||!Z,void 0,M),[R,T]=(0,o.eJ)(!1),[B,x]=(0,o.eJ)(0);(0,o.d4)((()=>{if(!R)return;const e=ft.Rj/2,t=2*(e-6)*Math.PI,s=t-B*t,n=d.current,a=c.current,o=a.firstElementChild;o?o.firstElementChild.setAttribute("stroke-dashoffset",s.toString()):a.innerHTML=`\n \n \n `,x(n.currentTime/n.duration)}),[R,B]);const L=Boolean(I&&h),A=()=>{T(!1),x(0),(0,As.Z)(d.current),(0,C.T2)((()=>{c.current.innerHTML=""}))},O=(F=A,()=>{nn&&nn(),nn=F});var F;(0,o.d4)((()=>{d.current&&(L?(0,As.Z)(d.current):d.current.pause())}),[L]),Os(d,L),(0,Ls.Z)(d,[I]);const U=(0,o.I4)((()=>{if(!I)return void p((e=>!e));if(r)return void(0,n.uC)().cancelMessageMediaDownload({message:e});const t=d.current;R?t.paused?((0,As.Z)(t),(0,Et.Es)()):t.pause():(O(),t.pause(),t.currentTime=0,(0,As.Z)(t),(0,Et.Es)(),T(!0))}),[O,R,r,I,e]),$=(0,o.I4)((e=>{const t=e.currentTarget;x(t.currentTime/t.duration)}),[]),D=(0,ne.Z)("full-media",S);return o.ZP.createElement("div",{ref:i,className:"RoundVideo media-inner",onClick:U},o.ZP.createElement("div",{className:"thumbnail-wrapper"},o.ZP.createElement("canvas",{ref:P,className:"thumbnail",style:`width: ${ft.Rj}px; height: ${ft.Rj}px`})),I&&o.ZP.createElement("div",{className:"video-wrapper"},o.ZP.createElement("video",sn({ref:d,className:D,width:ft.Rj,height:ft.Rj,autoPlay:!0,muted:!R,loop:!R,playsInline:!0,onEnded:R?A:void 0},w,{onTimeUpdate:R?$:void 0}),o.ZP.createElement("source",{src:I}))),o.ZP.createElement("div",{className:"progress",ref:c}),E&&o.ZP.createElement("div",{className:`media-loading ${k}`},o.ZP.createElement(Ns.Z,{progress:r?y:v})),!I&&!g&&o.ZP.createElement("i",{className:"icon-download"}),o.ZP.createElement("div",{className:"message-media-duration"},R?(0,N.k9)(d.current.currentTime):(0,N.k9)(m.duration),(!R||d.current.paused)&&o.ZP.createElement("i",{className:"icon-muted"})))},on=({message:e,onClick:t})=>{const s=(0,ye.Z)();return o.ZP.createElement("div",{className:"InlineButtons"},e.inlineButtons.map((e=>o.ZP.createElement("div",{className:"row"},e.map((e=>o.ZP.createElement(we.Z,{size:"tiny",ripple:!0,disabled:"NOT_SUPPORTED"===e.type,onClick:()=>t({button:e})},(0,It.Z)(s(e.text)),"buy"===e.type&&o.ZP.createElement("i",{className:"icon-card"}),"url"===e.type&&!e.value.match(a.FS)&&o.ZP.createElement("i",{className:"icon-arrow-right"}))))))))},rn=(0,o.X$)((0,n.c$)(((e,{message:t})=>{const{threadId:s,chatId:n}=t.threadInfo,a=(0,i.tZ)(e,n,s)||t.threadInfo,{byId:o}=e.users,{byId:r}=e.chats;return{threadInfo:a,usersById:o,chatsById:r}}),((e,t)=>(0,g.ei)(t,["openChat"])))((({disabled:e,threadInfo:t,usersById:s,chatsById:n,openChat:a})=>{const r=(0,ye.Z)(),{threadId:i,chatId:c,messagesCount:d,lastMessageId:u,lastReadInboxMessageId:m,recentReplierIds:h}=t,g=(0,o.I4)((()=>{a({id:c,threadId:i})}),[a,c,i]);if(void 0===d)return;const p=h&&h.map((e=>(0,l.YC)(e)?s[e]:n[e])).filter(Boolean),f=Boolean(m&&u&&m0&&o.ZP.createElement("div",{className:"recent-repliers",dir:r.isRtl?"rtl":"ltr"},p.map((e=>o.ZP.createElement(Qt.Z,{key:e.id,size:"small",user:(0,l.YC)(e.id)?e:void 0,chat:(0,l.YC)(e.id)?void 0:e})))),o.ZP.createElement("div",{className:"label",dir:"auto"},d?r("Comments",d,"i"):r("LeaveAComment")),o.ZP.createElement("i",{className:"icon-next"}))}))),cn="data-is-document-group-hover",ln={__html:''},dn={__html:''};function un(e){const t=hn(e.currentTarget);t&&t.setAttribute(cn,"")}function mn(e){const t=hn(e.currentTarget);t&&t.removeAttribute(cn)}function hn(e){let t=e;do{t=t.nextElementSibling}while(t&&!t.classList.contains("last-in-document-group"));return t}const gn=(0,o.X$)((0,n.c$)(((e,t)=>{const{focusedMessage:s,forwardMessages:n,lastSyncTime:a}=e,{message:o,album:r,withSenderName:c,withAvatar:d,threadId:u,messageListType:m}=t,{id:h,chatId:g,viaBotId:p,replyToChatId:f,replyToMessageId:I,isOutgoing:v}=o,y=(0,i.Z1)(e,g),P=(0,i.FM)(e,g),Z=(0,l.pK)(g),C=y&&(0,l.eA)(y),w=null==y?void 0:y.username,b=!P&&(0,l.Ul)(o),M=c||d||b,S=(0,i.Ur)(e,o),E=(0,i.cv)(e,o),k=p?(0,i.dy)(e,p):void 0,R=u?(0,i.qS)(e,g,u):void 0,T=o.id===R,N=I===R,B=I&&!N?(0,i.hj)(e,Z&&f?f:g,I):void 0,x=B&&(0,i.Ur)(e,B),L=(0,i.uZ)(e,o),A="thread"===m&&(r?r.messages.some((t=>(0,i._X)(e,t))):(0,i._X)(e,o)),{direction:O,noHighlight:F,isResizingContainer:U}=A&&s||{},$=n.messageIds&&n.messageIds.includes(h),{query:D}=(0,i.n5)(e)||{},Q=(0,l._O)(o);let q;q=null!=r&&r.messages?r.messages.every((({id:t})=>(0,i.vk)(e,t))):(0,i.vk)(e,h);const{canReply:G}="thread"===m&&(0,i._k)(e,o,u)||{},j=(0,i.te)(e,o);return{theme:(0,i.Pu)(e),chatUsername:w,forceSenderName:b,sender:M?S:void 0,originSender:E,botSender:k,shouldHideReply:N,isThreadTop:T,replyMessage:B,replyMessageSender:x,isFocused:A,isForwarding:$,isChatWithSelf:P,isRepliesChat:Z,isChannel:C,canReply:G,lastSyncTime:a,highlight:D,isSingleEmoji:Boolean(Q),animatedEmoji:Q?(0,i.zB)(e,Q):void 0,isInSelectMode:(0,i.CA)(e),isSelected:q,isGroupSelected:!!o.groupedId&&!o.isInAlbum&&(0,i.a6)(e,g,o.groupedId),threadId:u,isDownloading:j,isPinnedList:"pinned"===m,canAutoLoadMedia:(0,i.bH)(e,o),canAutoPlayMedia:(0,i.__)(e,o),autoLoadFileMaxSizeMb:e.settings.byKey.autoLoadFileMaxSizeMb,shouldLoopStickers:(0,i.yB)(e),...v&&{outgoingStatus:(0,i.dT)(e,o,"scheduled"===m)},..."number"==typeof L&&{uploadProgress:L},...A&&{focusDirection:O,noFocusHighlight:F,isResizingContainer:U}}}),((e,t)=>(0,g.ei)(t,["toggleMessageSelection","clickInlineButton","disableContextMenuHint"])))((({message:e,chatUsername:t,observeIntersectionForBottom:s,observeIntersectionForMedia:a,observeIntersectionForAnimatedStickers:r,album:i,noAvatars:c,withAvatar:d,withSenderName:g,noComments:p,appearanceOrder:f,isFirstInGroup:I,isLastInGroup:v,isFirstInDocumentGroup:y,isLastInDocumentGroup:P,isLastInList:Z,theme:C,forceSenderName:w,sender:b,originSender:M,botSender:S,isThreadTop:E,shouldHideReply:k,replyMessage:R,replyMessageSender:T,outgoingStatus:N,uploadProgress:B,isFocused:x,focusDirection:L,noFocusHighlight:A,isResizingContainer:O,isForwarding:F,isChatWithSelf:U,isRepliesChat:$,isChannel:D,canReply:Q,lastSyncTime:q,highlight:G,animatedEmoji:j,isInSelectMode:H,isSelected:_,isGroupSelected:V,threadId:z,messageListType:W,isPinnedList:Y,isDownloading:X,canAutoLoadMedia:K,canAutoPlayMedia:J,shouldLoopStickers:ee,autoLoadFileMaxSizeMb:te,toggleMessageSelection:se,clickInlineButton:ae,disableContextMenuHint:re})=>{const ie=(0,o.sO)(null),ce=(0,o.sO)(null),le=(0,ye.Z)();(0,Kt._N)(ce,s);const{isContextMenuOpen:de,contextMenuPosition:ue,handleBeforeContextMenu:me,handleContextMenu:he,handleContextMenuClose:ge,handleContextMenuHide:pe}=(0,ts.Z)(ie,h.$b&&H,!0,h.wZ);(0,o.d4)((()=>{de&&re()}),[de,re]);const Ie=f<=0,[ve,Pe]=(0,fe.Z)(Ie);(0,o.d4)((()=>{Ie||setTimeout(Pe,10*f)}),[f,Pe,Ie]);const{transitionClassNames:Ze}=(0,oe.Z)(ve,void 0,Ie,!1),{id:Ce,chatId:be,threadInfo:Me}=e,Se=(0,l.CI)(e),Ee=(0,l.B4)(e),ke="scheduled"===W||e.isScheduled,Re=(0,l.ss)(e)&&!k,Te=Boolean(Me)&&"thread"===W,{forwardInfo:Be,viaBotId:xe}=e,Le=Be&&(!U||ke)&&!$&&!Be.isLinkedChannelPost,Ae=Boolean(e.groupedId)&&!e.isInAlbum,Oe=Boolean(i)&&i.messages.length>1,{text:Fe,photo:Ue,video:$e,audio:De,voice:Qe,document:qe,sticker:Ge,contact:je,poll:He,webPage:_e,invoice:Ve}=(0,l.qp)(e),ze=(0,l.$D)(e),We=(0,ss.X)(e,G,ns(ze)),Ye=void 0!==ue,Xe=D&&e.adminTitle||Be&&!Le&&Be.adminTitle||void 0,Ke=(0,o.Ye)((()=>Xe?us(Xe):void 0),[Xe]),Je=!(Ye||H||F)&&(!Ae||P),et=D&&!ke,tt=Boolean(Y||Be&&(Be.isChannelPost||U&&!Ee||$)&&Be.fromMessageId),st=Be&&(U||$||!b)?M:b,at=Be?M:b,ot=(0,o.I4)(((e,t)=>{se({messageId:Ce,groupedId:t,...(null==e?void 0:e.shiftKey)&&{withShift:!0},...Oe&&{childMessageIds:i.messages.map((({id:e})=>e))}})}),[se,Ce,Oe,i]),{handleMouseDown:rt,handleClick:it,handleContextMenu:ct,handleDoubleClick:dt,handleContentDoubleClick:ut,isSwiped:mt}=function(e,t,s,a,r,i,c,l){const{setReplyingToId:d}=(0,n.uC)(),[u,m,g]=(0,fe.Z)();return(0,o.d4)((()=>{if(!h.$b||r||!i)return;let e;return(0,Ne.s)(t.current,{selectorToPreventScroll:".MessageList",onSwipe:(t,s)=>s===Ne.e.Left&&(e||(e=Date.now()),m(),!0),onRelease:()=>{e&&(d({messageId:s}),setTimeout(g,Math.max(0,150-(Date.now()-e))),e=void 0)}})}),[t,r,s,d,m,g,i]),{handleMouseDown:r?void 0:function(e){(0,zt.q)(e),l(e)},handleClick:function(t){if(r)e(t);else if(h.wZ){const e=t.target;if(!e.classList.contains("text-content")&&!e.classList.contains("Message"))return;nt.Z.getIsKeyboardVisible()?setTimeout((()=>{c(t)}),350):c(t)}},handleContextMenu:r?void 0:function(t){if(h.wZ){if(t.target.matches("a[href]"))return;t.preventDefault(),e()}else c(t)},handleDoubleClick:r?void 0:function(){d({messageId:s})},handleContentDoubleClick:h.$b?void 0:function(e){e.stopPropagation()},isSwiped:u}}(ot,ie,Ce,0,Boolean(H),Boolean(Q),he,me),{handleAvatarClick:ht,handleSenderClick:gt,handleViaBotClick:pt,handleReplyClick:vt,handleMediaClick:yt,handleAudioPlay:Pt,handleAlbumMediaClick:Zt,handleMetaClick:Ct,handleReadMedia:wt,handleCancelUpload:bt,handleVoteSend:Mt,handleGroupForward:St,handleForward:Et,handleFocus:kt,handleFocusForwarded:Rt,handleDocumentGroupSelectAll:Tt}=function(e,t,s,a,r,i,c,d,h,g,p,f){const{openUserInfo:I,openChat:v,showNotification:y,focusMessage:P,openMediaViewer:Z,openAudioPlayer:C,markMessagesRead:w,cancelSendingMessage:b,sendPollVote:M,openForwardMenu:S,focusMessageInComments:E}=(0,n.uC)(),{id:k,forwardInfo:R,replyToMessageId:T,replyToChatId:N,replyToTopMessageId:B,groupedId:x}=s,L=(0,o.I4)((()=>{g&&((0,l.YC)(g.id)?I({id:g.id}):v({id:g.id}))}),[g,I,v]),A=(0,o.I4)((()=>{p?(0,l.YC)(p.id)?I({id:p.id}):v({id:p.id}):y({message:e("HidAccount")})}),[p,y,e,I,v]),O=(0,o.I4)((()=>{f&&I({id:f.id})}),[f,I]),F=(0,o.I4)((()=>{P({chatId:d&&N?N:a,threadId:r,messageId:T,replyMessageId:d&&N?void 0:k})}),[P,d,N,a,r,T,k]),U=(0,o.I4)((()=>{Z({chatId:a,threadId:r,messageId:k,origin:c?m.bZ.ScheduledInline:m.bZ.Inline})}),[a,r,k,Z,c]),$=(0,o.I4)((()=>{C({chatId:a,messageId:k})}),[a,k,C]),D=(0,o.I4)((e=>{Z({chatId:a,threadId:r,messageId:e,origin:c?m.bZ.ScheduledAlbum:m.bZ.Album})}),[a,r,Z,c]),Q=(0,o.I4)((()=>{w({messageIds:[k]})}),[k,w]),q=(0,o.I4)((()=>{b({chatId:a,messageId:k})}),[b,a,k]),G=(0,o.I4)((e=>{M({chatId:a,messageId:k,options:e})}),[a,k,M]),j=(0,o.I4)((()=>{S({fromChatId:a,groupedId:x})}),[S,a,x]),H=(0,o.I4)((()=>{if(h&&h.messages){const e=h.messages.map((({id:e})=>e));S({fromChatId:a,messageIds:e})}else S({fromChatId:a,messageIds:[k]})}),[h,S,a,k]),_=(0,o.I4)((()=>{P({chatId:a,threadId:u._f,messageId:k})}),[P,a,k]),V=(0,o.I4)((()=>{i?P({chatId:R.fromChatId,groupedId:x,groupedChatId:a}):d&&N?E({chatId:N,threadId:B,messageId:R.fromMessageId}):P({chatId:R.fromChatId,messageId:R.fromMessageId})}),[i,d,N,P,R,x,a,E,B]),z=(0,o.I4)((e=>{e.stopPropagation(),t(e,x)}),[t,x]);return{handleAvatarClick:L,handleSenderClick:A,handleViaBotClick:O,handleReplyClick:F,handleMediaClick:U,handleAudioPlay:$,handleAlbumMediaClick:D,handleMetaClick:z,handleReadMedia:Q,handleCancelUpload:q,handleVoteSend:G,handleGroupForward:j,handleForward:H,handleFocus:_,handleFocusForwarded:V,handleDocumentGroupSelectAll:z}}(le,ot,e,be,z,Ae,Boolean(ke),$,i,st,at,S),Nt=(0,ne.Z)("Message message-list-item",I&&"first-in-group",v&&"last-in-group",y&&"first-in-document-group",P&&"last-in-document-group",Z&&"last-in-list",Ee&&"own",Boolean(e.views)&&"has-views",e.isEdited&&"was-edited",Re&&"has-reply",Ye&&"has-menu-open",x&&!A&&"focused",F&&"is-forwarding",e.isDeleting&&"is-deleting",Ae&&"is-in-document-group",Oe&&"is-album",e.hasUnreadMention&&"has-unread-mention",_&&"is-selected",H&&"is-in-selection-mode",E&&"is-thread-top",Boolean(e.inlineButtons)&&"has-inline-buttons",mt&&"is-swiped",Ze),Bt=function(e,{hasReply:t,customShape:s,isLastInGroup:n,asForwarded:a,hasThread:o,forceSenderName:r,hasComments:i,hasActionButton:c}={}){const{text:d,photo:u,video:m,audio:h,voice:g,document:p,poll:f,webPage:I,contact:v}=(0,l.qp)(e),y=["message-content"],P=u||m,Z=P&&!d,C=Boolean(e.viaBotId);return ns(s)?y.push(`emoji-only emoji-only-${s}`):d&&y.push("text"),c&&y.push("has-action-button"),s&&(y.push("custom-shape"),null!=m&&m.isRound&&y.push("round"),i&&y.push("has-comments")),u||m?y.push("media"):h?y.push("audio"):g?y.push("voice"):p?y.push("document"):v?y.push("contact"):f?y.push("poll"):I&&(y.push("web-page"),(I.photo||I.video)&&y.push("media")),a&&!s&&y.push("is-forwarded"),t&&y.push("is-reply"),o&&y.push("has-replies"),C&&y.push("is-via-bot"),r&&y.push("force-sender-name"),s||(y.push("has-shadow"),P&&i&&y.push("has-background"),(t||a||!Z||C||r)&&y.push("has-solid-background"),!n||!u&&Z||y.push("has-appendix")),y.join(" ")}(e,{hasReply:Re,customShape:ze,isLastInGroup:v,asForwarded:Le,hasThread:Te,forceSenderName:w,hasComments:e.threadInfo&&e.threadInfo.messagesCount>0,hasActionButton:et||tt}),xt=e.threadInfo&&(!Ae||P)&&"thread"===W&&!p,Lt=Bt.includes("has-appendix");(0,lt.Z)($&&e.replyToChatId?e.replyToChatId:be,Re?e.replyToMessageId:void 0,R,e.id),ms(ie,be,x,L,A,O);let At,Ot="",Ft=!1;const Ut=(0,o.Ye)((()=>Oe?ls(Ee,Boolean(Le),Boolean(c),i):void 0),[Oe,Ee,Le,c,i]),$t=Le?28:0;if(Oe||!Ue&&!$e)Ut&&(At=Math.max(as(Boolean(Fe),xt),Ut.containerStyle.width),At-Ut.containerStyle.width>18&&(Ft=!0));else{let t;Ue?t=os(e,c).width:$e&&(t=$e.isRound?ft.Rj:os(e,c).width),t&&(At=Math.max(as(Boolean(Fe),xt),t),At-t>18&&(Ft=!0))}return At&&(Ot=`width: ${At+$t}px`),o.ZP.createElement("div",{ref:ie,id:`message${Ce}`,className:Nt,style:Ke?`--meta-safe-author-width: ${Ke}px`:void 0,"data-message-id":Ce,onMouseDown:rt,onClick:it,onContextMenu:ct,onDoubleClick:dt,onMouseEnter:Ae&&!P?un:void 0,onMouseLeave:Ae&&!P?mn:void 0},o.ZP.createElement("div",{ref:ce,className:"bottom-marker","data-message-id":Ce,"data-last-message-id":i?i.messages[i.messages.length-1].id:void 0,"data-has-unread-mention":e.hasUnreadMention}),!Ae&&o.ZP.createElement("div",{className:"message-select-control"},_&&o.ZP.createElement("i",{className:"icon-select"})),P&&o.ZP.createElement("div",{className:(0,ne.Z)("message-select-control group-select",V&&"is-selected"),onClick:Tt},V&&o.ZP.createElement("i",{className:"icon-select"})),d&&function(){const e=st&&(0,l.YC)(st.id),t=st&&e?st:void 0,s=st&&!e?st:void 0,n=!st&&Be?Be.hiddenUserName:void 0;return o.ZP.createElement(Qt.Z,{size:"small",user:t,chat:s,text:n,lastSyncTime:q,onClick:t||s?ht:void 0})}(),o.ZP.createElement("div",{className:(0,ne.Z)("message-content-wrapper",Bt.includes("text")&&"can-select-text")},o.ZP.createElement("div",{className:Bt,style:Ot,dir:"auto"},Le&&!ze&&(!Ae||y)&&o.ZP.createElement("div",{className:"message-title"},le("ForwardedMessage")),function(){const t=(0,ne.Z)("content-inner",Le&&!ze&&"forwarded-message",Re&&"reply-message",Ft&&"no-media-corners"),s=v&&!We&&!Le&&!Te,n=!_e&&!j&&We,d=(0,ne.Z)("text-content",n&&"with-meta",N&&"with-outgoing-icon");return o.ZP.createElement("div",{className:t,onDoubleClick:ut,dir:"auto"},function(){if(ze&&!xe||!(g&&!Ue&&!$e||Le||xe||w)||Ae&&!y||Re&&ze)return;let t,s;return!at||ze&&xe?null!=Be&&Be.hiddenUserName&&(t=Be.hiddenUserName):(t=(0,l.OU)(le,at),Le||(s=`color-${(0,l.Rs)(at)}`)),o.ZP.createElement("div",{className:"message-title",dir:"ltr"},t?o.ZP.createElement("span",{className:(0,ne.Z)("interactive",s),onClick:gt,dir:"auto"},(0,It.Z)(t)):S?void 0:" ",S&&o.ZP.createElement(o.ZP.Fragment,null,o.ZP.createElement("span",{className:"via"},le("ViaBot")),o.ZP.createElement("span",{className:"interactive",onClick:pt},(0,It.Z)(`@${S.username}`))),null!=Be&&Be.isLinkedChannelPost?o.ZP.createElement("span",{className:"admin-title",dir:"auto"},le("DiscussChannel")):e.adminTitle&&!D?o.ZP.createElement("span",{className:"admin-title",dir:"auto"},e.adminTitle):void 0)}(),Re&&o.ZP.createElement(fs,{message:R,sender:T,observeIntersection:a,onClick:vt}),Ge&&o.ZP.createElement(bs,{message:e,observeIntersection:a,observeIntersectionForPlaying:r,shouldLoop:ee,lastSyncTime:q}),j&&o.ZP.createElement(Ms.Z,{size:"small",sticker:j,observeIntersection:a,lastSyncTime:q,forceLoadPreview:Se}),Oe&&o.ZP.createElement(tn,{album:i,albumLayout:Ut,observeIntersection:a,isOwn:Ee,hasCustomAppendix:s,lastSyncTime:q,onMediaClick:Zt}),!Oe&&Ue&&o.ZP.createElement(Bs,{message:e,observeIntersection:a,noAvatars:c,canAutoLoad:K,uploadProgress:B,shouldAffectAppendix:s,onClick:yt,onCancelUpload:bt,isDownloading:X,theme:C}),!Oe&&$e&&$e.isRound&&o.ZP.createElement(an,{message:e,observeIntersection:a,canAutoLoad:K,lastSyncTime:q,isDownloading:X}),!Oe&&$e&&!$e.isRound&&o.ZP.createElement(Us,{message:e,observeIntersection:a,noAvatars:c,canAutoLoad:K,canAutoPlay:J,uploadProgress:B,lastSyncTime:q,onClick:yt,onCancelUpload:bt,isDownloading:X}),(De||Qe)&&o.ZP.createElement(vs.Z,{theme:C,message:e,origin:m.Cr.Inline,uploadProgress:B,lastSyncTime:q,isSelectable:Ae,isSelected:_,onPlay:Pt,onReadMedia:!Qe||Ee&&!U?void 0:wt,onCancelUpload:bt,isDownloading:X}),qe&&o.ZP.createElement(Is.Z,{message:e,observeIntersection:a,canAutoLoad:K,autoLoadFileMaxSizeMb:te,uploadProgress:B,isSelectable:Ae,isSelected:_,onMediaClick:yt,onCancelUpload:bt,isDownloading:X}),je&&o.ZP.createElement(Ds,{contact:je}),He&&o.ZP.createElement(_s,{message:e,poll:He,onSendVote:Mt}),!j&&We&&o.ZP.createElement("p",{className:d,dir:"auto"},We,n&&o.ZP.createElement(Ps,{message:e,outgoingStatus:N,signature:Xe,onClick:Ct})),_e&&o.ZP.createElement(Ws,{message:e,observeIntersection:a,noAvatars:c,canAutoLoad:K,canAutoPlay:J,lastSyncTime:q,onMediaClick:yt,onCancelMediaTransfer:bt,isDownloading:X,theme:C}),Ve&&o.ZP.createElement(Xs,{message:e}))}(),(!Ae||P)&&!(!_e&&!j&&We)&&o.ZP.createElement(Ps,{message:e,outgoingStatus:N,signature:Xe,onClick:Ct}),Je&&et?o.ZP.createElement(we.Z,{className:"message-action-button",color:"translucent-white",round:!0,size:"tiny",ariaLabel:le("lng_context_forward_msg"),onClick:P?St:Et},o.ZP.createElement("i",{className:"icon-share-filled"})):Je&&tt?o.ZP.createElement(we.Z,{className:"message-action-button",color:"translucent-white",round:!0,size:"tiny",ariaLabel:"Focus message",onClick:Y?kt:Rt},o.ZP.createElement("i",{className:"icon-arrow-right"})):void 0,xt&&o.ZP.createElement(rn,{message:e,disabled:p}),Lt&&o.ZP.createElement("div",{className:"svg-appendix",dangerouslySetInnerHTML:Ee?ln:dn})),e.inlineButtons&&o.ZP.createElement(on,{message:e,onClick:ae})),ue&&o.ZP.createElement(gs,{isOpen:de,anchor:ue,message:e,album:i,chatUsername:t,messageListType:W,onClose:ge,onCloseAnimationEnd:pe}))}))),pn=(0,o.X$)((({messageIds:e,messageGroups:t,isViewportNewest:s,isUnread:r,withUsers:i,noAvatars:c,containerRef:d,anchorIdRef:u,memoUnreadDividerBeforeIdRef:h,memoFirstUnreadIdRef:p,threadId:f,type:I,isActive:v,threadTopMessageId:y,hasLinkedChat:P,isSchedule:Z,noAppearanceAnimation:w,onFabToggle:b,onNotchToggle:M,openHistoryCalendar:S})=>{const{observeIntersectionForMedia:E,observeIntersectionForReading:k,observeIntersectionForAnimatedStickers:R}=function(e,t,s){const{markMessageListRead:a,markMessagesRead:o}=(0,n.uC)(),{observe:r}=(0,Kt.S1)({rootRef:t,throttleMs:Jt,margin:es}),{observe:i,freeze:c,unfreeze:l}=(0,Kt.S1)({rootRef:t,throttleMs:150,noAutoFreeze:!0},(t=>{if("thread"!==e)return;let n=0;const r=[];t.forEach((e=>{const{isIntersecting:t,target:s}=e;if(!t)return;const{dataset:a}=s,o=Number(a.lastMessageId||a.messageId);o>n&&(n=o),a.hasUnreadMention&&r.push(o)})),s.current&&n>=s.current&&a({maxId:n}),r.length&&o({messageIds:r})}));(0,re.Z)(c,l);const{observe:d}=(0,Kt.S1)({rootRef:t,throttleMs:Jt});return{observeIntersectionForMedia:r,observeIntersectionForReading:i,observeIntersectionForAnimatedStickers:d}}(I,d,p),{backwardsTriggerRef:T,forwardsTriggerRef:B,fabTriggerRef:x}=function(e,t,s,r,i,c,l,d){const{loadViewportMessages:u}=(0,n.uC)(),[h,g]=(0,o.Ye)((()=>"thread"===e?[(0,C.Ds)((()=>u({direction:m.Uq.Backwards})),1e3,!0,!1),(0,C.Ds)((()=>u({direction:m.Uq.Forwards})),1e3,!0,!1)]:[]),[u,s]),p=(0,o.sO)(null),f=(0,o.sO)(null),I=(0,o.sO)(null);function v(){if(!d)return;if(!s||!s.length)return c(!1),void l(!1);if(!r)return c(!0),void l(!0);const{offsetHeight:e,scrollHeight:n,scrollTop:a}=t.current,o=Math.round(n-a-e),u=o<=1;c(i?!u:!(o<=50)),l(!u)}const{observe:y}=(0,Kt.S1)({rootRef:t,margin:a.gZ},(e=>{if(!g||!h)return;if(s[0]>=a.AE)return;const n=e.find((({isIntersecting:e})=>e));if(!n)return;const{target:o}=n;"backwards-trigger"===o.className?((0,Yt.Z)(t.current),h()):"forwards-trigger"===o.className&&((0,Yt.Z)(t.current),g())}));(0,Kt._N)(p,y),(0,Kt._N)(f,y);const{observe:P,freeze:Z,unfreeze:w}=(0,Kt.S1)({rootRef:t,margin:100},v);(0,Kt._N)(I,P);const{observe:b,freeze:M,unfreeze:S}=(0,Kt.S1)({rootRef:t,margin:1},v);return(0,Kt._N)(I,b),(0,ce.Z)((()=>{Z(),M(),setTimeout((()=>{S(),w()}),250)}),[s]),{backwardsTriggerRef:p,forwardsTriggerRef:f,fabTriggerRef:I}}(I,d,e,s,r,b,M,v),L=(0,ye.Z)(),A=o.ZP.createElement("div",{className:(0,ne.Z)("unread-divider","local-action-message"),key:"unread-messages"},o.ZP.createElement("span",null,L("UnreadMessages"))),O=w?0:t.reduce(((e,t)=>e+(0,g.xH)(t.senderGroups).length),0);let F=0;const U=t.map(((e,t,s)=>{const n=e.senderGroups.map(((e,n,a)=>{if(1===e.length&&!_t(e[0])&&(0,l.Lo)(e[0])){const r=e[0],i=n===a.length-1&&t===s.length-1;return(0,g.oA)([r.id===h.current&&A,o.ZP.createElement(ps,{key:r.id,message:r,observeIntersection:k,appearanceOrder:O-++F,isLastInList:i})])}let r;return(0,g.xH)(e.map(((d,m)=>{const p=_t(d)?d.mainMessage:d,v=_t(d)?d:void 0,Z=(0,l.B4)(p),C=_t(d),w=e[m+1];p.previousLocalId&&u.current===`message${p.previousLocalId}`&&(u.current=`message${p.id}`);const b=!C&&p.groupedId?p.groupedId:void 0,M=w&&!_t(w)?w.groupedId:void 0,S={isFirstInGroup:0===m,isLastInGroup:m===e.length-1,isFirstInDocumentGroup:Boolean(b&&b!==r),isLastInDocumentGroup:Boolean(b&&b!==M),isLastInList:m===e.length-1&&n===a.length-1&&t===s.length-1};r=b;const T=(0,l.KK)(p),N="scheduled"!==I?T:`${p.date}_${T}`;return(0,g.oA)([p.id===h.current&&A,o.ZP.createElement(gn,{key:N,message:p,observeIntersectionForBottom:k,observeIntersectionForMedia:E,observeIntersectionForAnimatedStickers:R,album:v,noAvatars:c,withAvatar:S.isLastInGroup&&i&&!Z&&!(p.id===y),withSenderName:S.isFirstInGroup&&i&&!Z,threadId:f,messageListType:I,noComments:!1===P,appearanceOrder:O-++F,isFirstInGroup:S.isFirstInGroup,isLastInGroup:S.isLastInGroup,isFirstInDocumentGroup:S.isFirstInDocumentGroup,isLastInDocumentGroup:S.isLastInDocumentGroup,isLastInList:S.isLastInList}),p.id===y&&o.ZP.createElement("div",{className:"local-action-message",key:"discussion-started"},o.ZP.createElement("span",null,L("DiscussionStarted")))])})))}));return o.ZP.createElement("div",{className:"message-date-group",key:e.datetime,onMouseDown:zt.q,teactFastList:!0},o.ZP.createElement("div",{className:(0,ne.Z)("sticky-date",!Z&&"interactive"),key:"date-header",onMouseDown:zt.q,onClick:Z?void 0:()=>S({selectedAt:e.datetime})},o.ZP.createElement("span",{dir:"auto"},Z&&e.originalDate===a.t4&&L("MessageScheduledUntilOnline"),Z&&e.originalDate!==a.t4&&L("MessageScheduledOn",(0,N.j1)(L,e.datetime,void 0,!0)),!Z&&(0,N.j1)(L,e.datetime))),(0,g.xH)(n))}));return o.ZP.createElement("div",{className:"messages-container",teactFastList:!0},o.ZP.createElement("div",{ref:T,key:"backwards-trigger",className:"backwards-trigger"}),(0,g.xH)(U),o.ZP.createElement("div",{ref:B,key:"forwards-trigger",className:"forwards-trigger"}),o.ZP.createElement("div",{ref:x,key:"fab-trigger",className:"fab-trigger"}))}));var fn=s(3547);const In=(0,o.X$)((0,n.c$)(((e,{userId:t})=>{const{stickers:s}=e.stickers.greeting,n=(0,l.db)(t)+(0,l.db)(e.currentUserId),a=null!=s&&s.length?s[n%s.length]:void 0,o=(0,i.Z1)(e,t);return o?{sticker:a,lastUnreadMessageId:o.lastMessage&&o.lastMessage.id!==o.lastReadInboxMessageId?o.lastMessage.id:void 0,connectionState:e.connectionState}:{}}),((e,t)=>(0,g.ei)(t,["loadGreetingStickers","sendMessage","markMessageListRead"])))((({sticker:e,connectionState:t,lastUnreadMessageId:s,loadGreetingStickers:n,sendMessage:a,markMessageListRead:r})=>{const i=(0,ye.Z)(),c=(0,o.sO)(null),{observe:l}=(0,Kt.S1)({rootRef:c,debounceMs:200});(0,o.d4)((()=>{e||"connectionStateReady"!==t||n()}),[t,n,e]),(0,o.d4)((()=>{"connectionStateReady"===t&&s&&r({maxId:s})}),[t,r,s]);const d=(0,o.I4)((e=>{e={...e,isPreloadedGlobally:!0},a({sticker:e})}),[a]);return o.ZP.createElement("div",{className:"ContactGreeting",ref:c},o.ZP.createElement("div",{className:"wrapper"},o.ZP.createElement("p",{className:"title",dir:"auto"},i("Conversation.EmptyPlaceholder")),o.ZP.createElement("p",{className:"description",dir:"auto"},i("Conversation.GreetingText")),o.ZP.createElement("div",{className:"sticker"},e&&o.ZP.createElement(fn.Z,{sticker:e,onClick:d,clickArg:e,observeIntersection:l,size:160,className:"large"}))))}))),vn=(0,o.X$)((({isChatWithSelf:e,type:t,isGroupChatJustCreated:s})=>{const n=(0,ye.Z)();return"scheduled"===t?function(e){return o.ZP.createElement("div",{className:"empty"},o.ZP.createElement("span",null,e("ScheduledMessages.EmptyPlaceholder")))}(n):e?function(e){return o.ZP.createElement("div",{className:"NoMessages"},o.ZP.createElement("div",{className:"wrapper"},o.ZP.createElement("i",{className:"icon icon-cloud-download"}),o.ZP.createElement("h3",{className:"title"},e("Conversation.CloudStorageInfo.Title")),o.ZP.createElement("ul",{className:"description"},o.ZP.createElement("li",null,e("Conversation.ClousStorageInfo.Description1")),o.ZP.createElement("li",null,e("Conversation.ClousStorageInfo.Description2")),o.ZP.createElement("li",null,e("Conversation.ClousStorageInfo.Description3")),o.ZP.createElement("li",null,e("Conversation.ClousStorageInfo.Description4")))))}(n):s?function(e){return o.ZP.createElement("div",{className:"NoMessages"},o.ZP.createElement("div",{className:"wrapper",dir:e.isRtl?"rtl":void 0},o.ZP.createElement("h3",{className:"title"},e("EmptyGroupInfo.Title")),o.ZP.createElement("p",{className:"description"},e("EmptyGroupInfo.Subtitle")),o.ZP.createElement("ul",{className:"list-checkmarks"},o.ZP.createElement("li",null,e("EmptyGroupInfo.Line1")),o.ZP.createElement("li",null,e("EmptyGroupInfo.Line2")),o.ZP.createElement("li",null,e("EmptyGroupInfo.Line3")),o.ZP.createElement("li",null,e("EmptyGroupInfo.Line4")))))}(n):o.ZP.createElement("div",{className:"empty"},o.ZP.createElement("span",null,n("NoMessages")))})),yn=(0,C.Ds)((e=>e()),200,!1),Pn=(0,o.X$)((0,n.c$)(((e,{chatId:t,threadId:s,type:n})=>{const a=(0,i.Z1)(e,t);if(!a)return{};const o=(0,i.$W)(e,t,s,n),r="scheduled"===n?(0,i.Fn)(e,t):(0,i.Zw)(e,t),c=(0,i.qS)(e,t,s);if(s!==u._f&&!(r&&c&&r[c]))return{};const{isRestricted:d,restrictionReason:m,lastMessage:h}=a,g=(0,i.G$)(e,t),p=s===u._f&&!o&&!a.unreadCount&&!g&&h&&!h.groupedId,f=(0,i.IK)(e,t);let I;return(0,i.pk)(e,t)&&(I=f.fullInfo?f.fullInfo.botDescription||"NoMessages":"Updating bot info..."),{isChatLoaded:!0,isRestricted:d,restrictionReason:m,isChannelChat:(0,l.eA)(a),isGroupChat:(0,l.Bf)(a),isCreator:a.isCreator,isChatWithSelf:(0,i.FM)(e,t),isRepliesChat:(0,l.pK)(t),isBot:Boolean(f),messageIds:o,messagesById:r,firstUnreadId:(0,i.It)(e,t,s),isViewportNewest:"thread"!==n||(0,i.b9)(e,t,s),threadFirstMessageId:(0,i.yZ)(e,t,s),focusingId:g,isSelectModeActive:(0,i.CA)(e),botDescription:I,threadTopMessageId:c,hasLinkedChat:a.fullInfo&&"linkedChatId"in a.fullInfo?Boolean(a.fullInfo.linkedChatId):void 0,...p&&{lastMessage:h}}}),((e,t)=>(0,g.ei)(t,["loadViewportMessages","setScrollOffset","openHistoryCalendar"])))((({chatId:e,threadId:t,type:s,hasTools:r,onFabToggle:c,onNotchToggle:d,isChatLoaded:u,isChannelChat:h,isGroupChat:p,canPost:f,isReady:I,isActive:v,isChatWithSelf:y,isRepliesChat:P,isCreator:Z,isBot:w,messageIds:b,messagesById:M,firstUnreadId:S,isViewportNewest:E,threadFirstMessageId:k,isRestricted:R,restrictionReason:T,focusingId:N,isSelectModeActive:B,loadViewportMessages:x,setScrollOffset:L,lastMessage:A,botDescription:O,threadTopMessageId:F,hasLinkedChat:U,openHistoryCalendar:$})=>{var D,Q,q,G,j,H;const _=(0,o.sO)(null),V=(0,o.sO)("thread"===s&&(0,i.Vt)((0,n.Rd)(),e,t)||0),z=(0,o.sO)(),W=(0,o.sO)(),Y=(0,o.sO)(),X=(0,o.sO)(),K=(0,o.sO)(),J=(0,o.sO)(),ee=(0,o.sO)(!1),te=(0,o.sO)(Boolean(A)),[ae,oe]=(0,o.eJ)(),re=Boolean(b);(0,ce.Z)((()=>{re&&(0,C.R3)((()=>{te.current=!1}))}),[re]),(0,ce.Z)((()=>{X.current=S}),[S]),(0,ce.Z)((()=>{re&&(K.current=X.current)}),[re]),(0,ce.Z)((()=>{J.current=N}),[N]);const ie=(0,o.Ye)((()=>{if(!b||!M)return;const e=!F||b[0]&&k!==b[0]?b:[F,...b];if(!e.length)return;const t=e.map((e=>M[e])).filter(Boolean);return Vt((0,g.Xo)(t,["date","id"]),K.current)}),[b,M,k,F]),le=(0,o.Ye)((()=>{if("thread"===s)return(0,C.Ds)((()=>x({direction:m.Uq.Around})),1e3,!0,!1)}),[x,b]),{isScrolled:de,updateStickyDates:ue}=function(){const[e,t]=(0,fe.Z)(!1),s=(0,Wt.Z)(1e3,!1);return{isScrolled:e,updateStickyDates:(0,o.I4)(((e,n)=>{t(),document.body.classList.contains("is-scrolling-messages")||(0,C.T2)((()=>{document.body.classList.add("is-scrolling-messages")})),s((()=>{(0,C.T2)((()=>{const t=document.querySelector(".stuck");t&&t.classList.remove("stuck");const s=function(e,t){const s=e.querySelectorAll(".sticky-date"),n=e.scrollTop;return Array.from(s).find((e=>{const{offsetTop:s,offsetHeight:a}=e,o=s-n;return-a<=o&&o<=(t?60:10)}))}(e,n);s&&s.classList.add("stuck"),document.body.classList.remove("is-scrolling-messages")}))}))}),[t,s])}}(),me=(0,o.I4)((()=>{if(ee.current)return void(ee.current=!1);const n=_.current;J.current||ue(n,r),yn((()=>{(0,C.T2)((()=>{n.parentElement&&(V.current=n.scrollHeight-n.scrollTop,"thread"===s&&L({chatId:e,threadId:t,scrollOffset:V.current}))}))}))}),[ue,r,s,L,e,t]);(0,o.d4)((()=>{if(!("ResizeObserver"in window))return;const e=new ResizeObserver((([e])=>{e.target.offsetParent&&oe(e.contentRect.height)}));return e.observe(_.current),()=>{e.disconnect()}}),[]);const{height:he}=at();(0,o.d4)((()=>{I&&(_.current.dataset.normalHeight=String(_.current.offsetHeight))}),[he,I,f]),(0,o.d4)((()=>{if(!le||!u||R||N)return;if(b&&b[b.length-1]>=a.AE)return;const e=_.current;(!b||b.length{if(!b||!Y.current||!I)return;const e=Y.current.filter((e=>b.includes(Number(e.dataset.messageId)))),t=e[1]||e[0];t&&(z.current=t.id,W.current=t.getBoundingClientRect().top)}),[b,E,ae,r,I]),(0,jt.Z)((([e,t,s])=>{const n=_.current;if(Y.current=Array.from(n.querySelectorAll(".message-list-item")),!n.offsetParent)return;const o=E&&b&&b.length{n.parentElement&&n.parentElement.classList.remove("force-messages-scroll")}),1e3));const i=b&&e&&b[b.length-1]!==e[e.length-1],c=(null==b?void 0:b[0])!==(null==e?void 0:e[0])&&(null==b?void 0:b.length)===a.hT/2+1,l=i&&!c,d=b&&J.current===b[b.length-1],{scrollTop:u,scrollHeight:m,offsetHeight:h}=n,g=V.current,p=Y.current[Y.current.length-1];let f=g-(s||h);l&&(f-=p?p.offsetHeight:0);const I=E&&t&&f<=20;let v;if(l&&I&&!d&&(p&&(0,C.T2)((()=>{(0,Xt.Z)(n,p,"end",20)})),v=m-h,V.current=Math.max(Math.ceil(m-v),h),!o))return;const y=void 0!==s&&s!==ae,P=z.current&&document.getElementById(z.current),Z=!P&&K.current&&n.querySelector(".unread-divider");if(I&&y){if((0,Xt.N)())return;v=m-h}else v=P?u+(P.getBoundingClientRect().top-(W.current||0)):Z?Math.min(Z.offsetTop-(r?60:10),m-g):m-g;(0,Yt.Z)(n,Math.ceil(v)),J.current||(ee.current=!0,(0,C.T2)((()=>{ee.current=!1}))),V.current=Math.max(Math.ceil(m-v),h)}),[b,E,ae,r]),(0,Ht.Z)((([e])=>{void 0!==e&&(0,se.YW)(200+a.fK)}),[B]);const ge=(0,ye.Z)(),pe=Boolean(e&&(0,l.YC)(e)),Ie=Boolean(!pe&&!h||y||P),ve=Boolean(!Ie||h),Pe=(0,l.YC)(e)&&!y&&!w&&(!ie&&!A&&b&&(!Y.current||0===Y.current.length)||1===(null==b?void 0:b.length)&&"contactSignUp"===(null==M||null===(D=M[b[0]])||void 0===D||null===(Q=D.content.action)||void 0===Q?void 0:Q.type)||"contactSignUp"===(null==A||null===(q=A.content)||void 0===q||null===(G=q.action)||void 0===G?void 0:G.type)),Ze=p&&Z&&1===(null==b?void 0:b.length)&&"chatCreate"===(null==M||null===(j=M[b[0]])||void 0===j||null===(H=j.content.action)||void 0===H?void 0:H.type),Ce=(0,ne.Z)("MessageList custom-scroll",ve&&"no-avatars",!f&&"no-composer","pinned"===s&&"type-pinned",B&&"select-mode-active",de&&"scrolled",!I&&"is-animating");return o.ZP.createElement("div",{ref:_,className:Ce,onScroll:me,onMouseDown:zt.q},R?o.ZP.createElement("div",{className:"empty"},o.ZP.createElement("span",null,T?T.text:"This is a private "+(h?"channel":"chat"))):O?o.ZP.createElement("div",{className:"empty"},o.ZP.createElement("span",null,(0,It.Z)(ge(O),["br","emoji","links"]))):Pe?o.ZP.createElement(In,{userId:e}):!b||ie&&!Ze?b&&ie||A?o.ZP.createElement(pn,{messageIds:b||[A.id],messageGroups:ie||Vt([A]),isViewportNewest:Boolean(E),isUnread:Boolean(S),withUsers:Ie,noAvatars:ve,containerRef:_,anchorIdRef:z,memoUnreadDividerBeforeIdRef:K,memoFirstUnreadIdRef:X,threadId:t,type:s,isActive:v,threadTopMessageId:F,hasLinkedChat:U,isSchedule:!!ie&&"scheduled"===s,noAppearanceAnimation:!ie||!te.current,onFabToggle:c,onNotchToggle:d,openHistoryCalendar:$}):o.ZP.createElement(Ue.Z,{color:"white"}):o.ZP.createElement(vn,{chatId:e,type:s,isChatWithSelf:y,isGroupChatJustCreated:Ze}))}))),Zn=(0,o.X$)((0,n.c$)((e=>{const t=(0,i.Bt)(e);if(!t)return{};const{chatId:s,threadId:n,type:a}=t,o=(0,i.Z1)(e,s);return{messageListType:a,unreadCount:o&&n===u._f&&"thread"===a?o.unreadCount:void 0}}),((e,t)=>(0,g.ei)(t,["focusNextReply"])))((({isShown:e,canPost:t,messageListType:s,unreadCount:n,withExtraShift:a,focusNextReply:r})=>{const i=(0,ye.Z)(),c=(0,o.sO)(null),l=(0,o.I4)((()=>{if(e)if("thread"===s)r();else{const e=c.current.parentElement.querySelector(".MessageList"),t=e.querySelectorAll(".message-list-item"),s=t[t.length-1];if(!s)return;(0,Xt.Z)(e,s,"end",20)}}),[e,s,r]),d=(0,ne.Z)("ScrollDownButton",e&&"revealed",!t&&"no-composer",a&&"with-extra-shift");return o.ZP.createElement("div",{ref:c,className:d},o.ZP.createElement("div",{className:"ScrollDownButton-inner"},o.ZP.createElement(we.Z,{color:"secondary",round:!0,onClick:l,ariaLabel:i("AccDescrPageDown")},o.ZP.createElement("i",{className:"icon-arrow-down"})),Boolean(n)&&o.ZP.createElement("div",{className:"unread-count"},(0,ut.bi)(n))))})));var Cn=s(5723);const wn=1280,bn=/\.[^/.]+$/;async function Mn(e,t,s,n){const o=URL.createObjectURL(t),{type:r,size:i}=t;let c,l;if(a.oG.has(r))if(s){const t=await(0,st.pt)(o),{width:s,height:a}=t;if(s>wn||a>wn||"image/jpeg"!==r){const t=await Nt(o,wn/Math.max(s,a),"image/jpeg");return URL.revokeObjectURL(o),Mn(e,await(0,st.gm)(t),!0,n)}"image/jpeg"===r&&(e=e.replace(bn,".jpg")),c={width:s,height:a}}else l=o;else if(a.wG.has(r)){const{videoWidth:e,videoHeight:t,duration:s}=await(0,st.jj)(o);c={width:e,height:t,duration:s},l=await(0,st.ud)(o)}return{blobUrl:o,filename:e,mimeType:r,size:i,quick:c,previewBlobUrl:l,...n}}var Sn=s(6391);let En;function kn(e){En.focus(),e.focus()}h.cj&&(En=document.createElement("input"),En.classList.add("for-ios-autocapitalization-fix"),document.body.appendChild(En));const Rn={encoderPath:s.p+"c0155344d336103c2b6a0b28cc510750.js",reuseWorker:!0},Tn={type:"audio/ogg"};let Nn,Bn,xn;async function Ln(){return Nn||(Nn=s.e(161).then(s.t.bind(s,1161,23)),Bn=(await Nn).default,xn=new Bn(Rn)),Nn}async function An(e){await async function(){await Ln(),await xn.start()}();const t=Date.now();let s;const n=[],a=[];xn.ondataavailable=e=>{n.push(e)};const o=function(t,s){const n=t.sourceNode,o=n.context.createAnalyser();o.fftSize=64,n.connect(o);const r=o.frequencyBinCount,i=new Uint8Array(r);let c=!1;return function t(){if(c)return;o.getByteFrequencyData(i);const s=i.reduce(((e,t)=>e+t),0)/r/255;(t=>{a.push(255*t),e(t)})(s<.1?0:s),requestAnimationFrame(t)}(),()=>{c=!0}}(xn);return{stop:()=>new Promise(((e,r)=>{xn.onstop=()=>{e({blob:new Blob(n,Tn),duration:Math.round(((s||Date.now())-t)/1e3),waveform:a})},xn.onerror=r;const i=Math.max(0,t+1e3-Date.now());setTimeout((()=>{xn.stop(),o()}),i)})),pause:()=>{const e=Math.max(0,t+1e3-Date.now());setTimeout((()=>{xn.pause(),s=Date.now(),o()}),e)}}}const On=["image/png","image/jpeg","image/gif"];function Fn(e){const{text:t,entities:s}=e||{};if(!t)return"";const n=(0,ss.H)(t,s,void 0,void 0,!0);return Array.isArray(n)?n.join(""):n}let Un,$n;var Dn=s(4784),Qn=s(2400),qn=s(8353),Gn=s(2365);const jn=document.createElement("div"),Hn=/^@([a-z0-9_]{1,32})[\u00A0\u0020]+(.*)/i,_n=/^@([a-z0-9_]{1,32})[\u00A0\u0020]+\n{2,}/i;const Vn=(0,C.P2)((e=>e()),500,!0),zn=/^[\w@]{1,32}\s?/i,Wn=(0,o.X$)((e=>{const{isOpen:t}=e,s=(0,Fe.Z)(Oe.gl.Extra,"DeleteMessageModal",!t);return s?o.ZP.createElement(s,e):void 0}));function Yn(){return(Yn=Object.assign||function(e){for(var t=1;t{const s=(0,o.sO)(!1),n=(0,o.I4)((()=>{if(s.current=!0,Kn)return Kn=!1,void e();Xn&&(clearTimeout(Xn),Xn=void 0),Xn=window.setTimeout((()=>{s.current&&e()}),200)}),[e]),a=(0,o.I4)((()=>{s.current=!1}),[]);return o.ZP.createElement(we.Z,Yn({},t,{onMouseEnter:h.$b?void 0:n,onMouseLeave:h.$b?void 0:a,onClick:h.$b?e:void 0}))})),ea=(0,o.X$)((e=>{const{isOpen:t}=e,s=(0,Fe.Z)(Oe.gl.Extra,"AttachMenu",!t);return s?o.ZP.createElement(s,e):void 0})),ta=(0,o.X$)((e=>{const{isOpen:t}=e,s=(0,Fe.Z)(Oe.gl.Extra,"SymbolMenu",!t);return s?o.ZP.createElement(s,e):void 0})),sa=(0,o.X$)((e=>{const{isOpen:t}=e,s=(0,Fe.Z)(Oe.gl.Extra,"InlineBotTooltip",!t);return s?o.ZP.createElement(s,e):void 0})),na=(0,o.X$)((e=>{const{isOpen:t}=e,s=(0,Fe.Z)(Oe.gl.Extra,"MentionTooltip",!t);return s?o.ZP.createElement(s,e):void 0})),aa=(0,o.X$)((e=>{const{isOpen:t}=e,s=(0,Fe.Z)(Oe.gl.Extra,"CustomSendMenu",!t);return s?o.ZP.createElement(s,e):void 0})),oa=e=>{const{isOpen:t}=e,s=(0,Fe.Z)(Oe.gl.Extra,"StickerTooltip",!t);return s?o.ZP.createElement(s,e):void 0};var ra=s(9830);const ia=(0,o.X$)((e=>{const{isOpen:t}=e,s=(0,Fe.Z)(Oe.gl.Extra,"BotCommandTooltip",!t);return s?o.ZP.createElement(s,e):void 0}));var ca=s(6503);const la=(0,o.X$)((0,n.c$)(((e,{messageId:t})=>{const{chatId:s}=(0,i.Bt)(e)||{};return s?{message:(0,i.hj)(e,s,t)}:{}}),((e,t)=>(0,g.ei)(t,["clickInlineButton"])))((({isOpen:e,message:t,onClose:s,clickInlineButton:n})=>{const[a,r]=(0,ca.Z)(e,s),{isKeyboardSingleUse:i}=t||{},[c,l,d]=(0,fe.Z)(!0),u=()=>{d(),s()};if((0,o.d4)((()=>{l()}),[l,t]),t&&t.keyboardButtons)return o.ZP.createElement(Qe.Z,{isOpen:e||c,autoClose:i,positionX:"right",positionY:"bottom",onClose:u,className:"BotKeyboardMenu",onCloseAnimationEnd:u,onMouseEnter:h.$b?void 0:a,onMouseLeave:h.$b?void 0:r},o.ZP.createElement("div",{className:"content"},t.keyboardButtons.map((e=>o.ZP.createElement("div",{className:"row"},e.map((e=>o.ZP.createElement(we.Z,{ripple:!0,disabled:"NOT_SUPPORTED"===e.type,onClick:()=>n({button:e})},e.text))))))))})));var da=s(3616),ua=s(7891);const ma=(0,o.X$)((0,n.c$)((e=>{const{chatId:t,threadId:s,type:n}=(0,i.Bt)(e)||{};if(!t||!s||!n)return{};const{currentUserId:a,forwardMessages:{fromChatId:o,toChatId:r,messageIds:c}}=e,d=(0,i.Yy)(e,t,s),u="scheduled"===n?(0,i.wU)(e,t):(0,i._$)(e,t,s),m=e.settings.byKey.animationLevel>=1,h=r===t;let g,p;if(d?g=(0,i.hj)(e,t,d):u?g=(0,i.kK)(e,t,s,n):h&&1===c.length&&(g=(0,i.hj)(e,o,c[0])),d&&g){const{forwardInfo:s}=g,n=t===a;s&&(s.isChannelPost||n)&&(p=(0,i.cv)(e,g)),p||(p=(0,i.Ur)(e,g))}else h&&(p=(0,l.YC)(o)?(0,i.dy)(e,o):(0,i.Z1)(e,o));return{replyingToId:d,editingId:u,message:g,sender:p,shouldAnimate:m,forwardedMessagesCount:h?c.length:void 0}}),((e,t)=>(0,g.ei)(t,["setReplyingToId","setEditingId","focusMessage","exitForwardMode"])))((({replyingToId:e,editingId:t,message:s,sender:n,shouldAnimate:a,forwardedMessagesCount:r,setReplyingToId:i,setEditingId:c,focusMessage:l,exitForwardMode:d})=>{const u=Boolean((e||t)&&s||n&&r),m=(0,ua.Z)([r],r?300:void 0),{shouldRender:h,transitionClassNames:g}=(0,oe.Z)(m&&u,void 0,!a,void 0,!a),p=(0,o.I4)((()=>{e?i({messageId:void 0}):t?c({messageId:void 0}):r&&d()}),[e,t,r,i,c,d]);(0,o.d4)((()=>u?(0,ge.Z)(p):void 0),[u,p]);const f=(0,o.I4)((()=>{l({chatId:s.chatId,messageId:s.id})}),[l,s]),I=(0,ne.Z)("ComposerEmbeddedMessage",g),v=r&&r>1?`${r} forwarded messages`:void 0;if(h)return o.ZP.createElement("div",{className:I},o.ZP.createElement("div",null,o.ZP.createElement(we.Z,{round:!0,faded:!0,color:"translucent",ariaLabel:"Cancel replying",onClick:p},o.ZP.createElement("i",{className:"icon-close"})),o.ZP.createElement(fs,{className:"inside-input",message:s,sender:n,customText:v,title:t?"Edit Message":void 0,onClick:f})))}))),ha=(0,o.X$)((e=>{const{attachments:t}=e,s=(0,Fe.Z)(Oe.gl.Extra,"AttachmentModal",!t.length);return s?o.ZP.createElement(s,e):void 0})),ga=(0,o.X$)((e=>{const{isOpen:t}=e,s=(0,Fe.Z)(Oe.gl.Extra,"BotCommandMenu",!t);return s?o.ZP.createElement(s,e):void 0})),pa=(0,o.X$)((e=>{const{isOpen:t}=e,s=(0,Fe.Z)(Oe.gl.Extra,"PollModal",!t);return s?o.ZP.createElement(s,e):void 0})),fa=(0,o.X$)((e=>{const{isOpen:t}=e,s=(0,Fe.Z)(Oe.gl.Extra,"DropArea",!t);return s?o.ZP.createElement(s,e):void 0})),Ia=new RegExp(a.FM,"i"),va=(0,o.X$)((0,n.c$)(((e,{chatId:t,threadId:s})=>{const n=(0,i.tV)(e,t,s);return{theme:(0,i.Pu)(e),webPagePreview:e.webPagePreview,noWebPage:n}}),((e,t)=>(0,g.ei)(t,["loadWebPagePreview","clearWebPagePreview","toggleMessageWebPage"])))((({chatId:e,threadId:t,messageText:s,disabled:n,webPagePreview:a,noWebPage:r,theme:i,loadWebPagePreview:c,clearWebPagePreview:l,toggleMessageWebPage:d})=>{const m=(0,o.Ye)((()=>{const{text:e,entities:t}=(0,f.Z)(s),n=t&&t.find((({type:e})=>e===u.Vv.TextUrl));if(n)return n.url;const a=e.match(Ia);return a?a[0]:void 0}),[s]);(0,o.d4)((()=>{m?c({text:m}):(l(),d({chatId:e,threadId:t}))}),[e,d,l,m,c,t]),(0,ce.Z)((()=>{l(),d({chatId:e,threadId:t})}),[e]);const h=Boolean(a&&s.length&&!r&&!n),{shouldRender:g,transitionClassNames:p}=(0,oe.Z)(h),I=(0,dt.Z)(a,!0);if(!g||!I)return;const{photo:v,...y}=I,P={content:{webPage:y}};return o.ZP.createElement("div",{className:(0,ne.Z)("WebPagePreview",p)},o.ZP.createElement("div",null,o.ZP.createElement(we.Z,{round:!0,faded:!0,color:"translucent",ariaLabel:"Clear Webpage Preview",onClick:()=>{d({chatId:e,threadId:t,noWebPage:!0})}},o.ZP.createElement("i",{className:"icon-close"})),o.ZP.createElement(Ws,{message:P,inPreview:!0,theme:i})))})));var ya=s(2898);const Pa=(0,o.X$)((e=>{const{isOpen:t}=e,s=(0,Fe.Z)(Oe.gl.Extra,"CalendarModal",!t);return s?o.ZP.createElement(s,e):void 0}));var Za;!function(e){e.Send="send",e.Record="record",e.Edit="edit"}(Za||(Za={}));const Ca=(0,o.X$)((0,n.c$)(((e,{chatId:t,threadId:s,messageListType:n})=>{var o,r;const c=(0,i.Z1)(e,t),d=c&&(0,i.Dg)(e,c),m=t!==a.FV?(0,i.IK)(e,t):void 0,h=Boolean(m),g=(0,i.FM)(e,t),p=h&&(0,i.FT)(e,t),f=(0,i.qy)(e,t),{language:I,shouldSuggestStickers:v}=e.settings.byKey,y=e.emojiKeywords[a.pR],P=I!==a.pR?e.emojiKeywords[I]:void 0,Z=p?p.id:void 0,C=Z?(0,i.hj)(e,t,Z):void 0;return{editingMessage:(0,i.kK)(e,t,s,n),connectionState:e.connectionState,draft:(0,i.Ms)(e,t,s),chat:c,isChatWithBot:h,isChatWithSelf:g,canScheduleUntilOnline:!g&&!h&&c&&d&&(0,l.YC)(t)&&d.status&&Boolean(d.status.wasOnline),isRightColumnShown:(0,i.Jf)(e),isSelectModeActive:(0,i.CA)(e),withScheduledButton:s===u._f&&"thread"===n&&Boolean(null==f?void 0:f.length),shouldSchedule:"scheduled"===n,botKeyboardMessageId:Z,botKeyboardPlaceholder:null==C?void 0:C.keyboardPlaceholder,isForwarding:t===e.forwardMessages.toChatId,isPollModalOpen:e.isPollModalOpen,stickersForEmoji:e.stickers.forEmoji.stickers,groupChatMembers:null==c||null===(o=c.fullInfo)||void 0===o?void 0:o.members,topInlineBotIds:null===(r=e.topInlineBots)||void 0===r?void 0:r.userIds,currentUserId:e.currentUserId,usersById:e.users.byId,lastSyncTime:e.lastSyncTime,contentToBeScheduled:e.messages.contentToBeScheduled,shouldSuggestStickers:v,recentEmojis:e.recentEmojis,baseEmojiKeywords:null==y?void 0:y.keywords,emojiKeywords:null==P?void 0:P.keywords,serverTimeOffset:e.serverTimeOffset,inlineBots:e.inlineBots.byUsername,isInlineBotLoading:e.inlineBots.isLoading,chatBotCommands:c&&c.fullInfo&&c.fullInfo.botCommands,botCommands:m&&m.fullInfo?m.fullInfo.botCommands||!1:void 0}}),((e,t)=>(0,g.ei)(t,["sendMessage","editMessage","saveDraft","clearDraft","showDialog","setStickerSearchQuery","setGifSearchQuery","forwardMessages","openPollModal","closePollModal","loadScheduledHistory","openChat","addRecentEmoji","sendInlineBotResult"])))((({dropAreaState:e,shouldSchedule:t,canScheduleUntilOnline:s,isReady:r,onDropHide:i,editingMessage:c,chatId:d,threadId:m,messageListType:g,draft:I,chat:v,connectionState:y,isChatWithBot:P,isChatWithSelf:Z,isRightColumnShown:w,isSelectModeActive:b,isForwarding:M,isPollModalOpen:S,botKeyboardMessageId:E,botKeyboardPlaceholder:k,withScheduledButton:R,stickersForEmoji:T,groupChatMembers:B,topInlineBotIds:x,currentUserId:L,usersById:A,lastSyncTime:O,contentToBeScheduled:F,shouldSuggestStickers:U,baseEmojiKeywords:$,emojiKeywords:D,serverTimeOffset:Q,recentEmojis:q,inlineBots:G,isInlineBotLoading:j,botCommands:H,chatBotCommands:_,sendMessage:V,editMessage:z,saveDraft:W,clearDraft:Y,showDialog:X,setStickerSearchQuery:K,setGifSearchQuery:J,forwardMessages:ee,openPollModal:te,closePollModal:se,loadScheduledHistory:ae,openChat:oe,addRecentEmoji:ce,sendInlineBotResult:le})=>{const de=(0,ye.Z)(),ue=(0,o.sO)(null),[me,he]=(0,o.eJ)(""),pe=(0,o.sO)(),Ie=(0,Rs.Z)(e),[ve,Pe,Ze]=(0,fe.Z)(),[Ce,be]=(0,o.eJ)(),{width:Me}=nt.Z.get(),Se=(0,o.sO)(me);(0,o.d4)((()=>{Se.current=me}),[me]),(0,o.d4)((()=>{pe.current=void 0}),[d]),(0,o.d4)((()=>{d&&O&&m===u._f&&r&&ae({chatId:d})}),[r,d,ae,O,m]),(0,o.bt)((()=>{ue.current&&(ue.current.innerHTML='')}),[]),(0,o.d4)((()=>{F&&(be(F),Pe())}),[F,Pe]);const[Ee,ke]=(0,o.eJ)([]),[Te,Ne,Be]=(0,fe.Z)(),[xe,Le,Ae]=(0,fe.Z)(),[Oe,Fe,Ue]=(0,fe.Z)(),[$e,De,Qe]=(0,fe.Z)(),[qe,Ge,je]=(0,fe.Z)(),[He,_e]=(0,fe.Z)(),[Ve,ze,We]=(0,fe.Z)(),{startRecordingVoice:Ye,stopRecordingVoice:Xe,pauseRecordingVoice:Ke,activeVoiceRecording:Je,currentRecordTime:tt,recordButtonRef:st,startRecordTimeRef:at}=(()=>{const e=(0,o.sO)(null),[t,s]=(0,o.eJ)(),n=(0,o.sO)(),[a,r]=(0,o.eJ)();(0,o.d4)((()=>{h.s$&&h.mh&&Ln()}),[]);const i=(0,o.I4)((async()=>{try{const{stop:t,pause:a}=await An((t=>{e.current&&(n.current&&Date.now()%4==0&&(e.current.style.boxShadow=`0 0 0 ${50*(t||0)}px rgba(0,0,0,.15)`),r(Date.now()))}));n.current=Date.now(),r(Date.now()),s({stop:t,pause:a})}catch(e){console.error(e)}}),[]),c=(0,o.I4)((()=>{if(t){e.current&&(e.current.style.boxShadow="none");try{return t.pause()}catch(e){return void console.error(e)}}}),[t]),l=(0,o.I4)((()=>{if(t){s(void 0),n.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(0,o.d4)((()=>t?(0,ge.Z)(l):void 0),[t,l]),{startRecordingVoice:i,pauseRecordingVoice:c,stopRecordingVoice:l,activeVoiceRecording:t,currentRecordTime:a,recordButtonRef:e,startRecordTimeRef:n}})(),ot=c?Za.Edit:!h.mh||Je||me&&!Ee.length||M?Za.Send:Za.Record,rt=!t,{isMentionTooltipOpen:it,closeMentionTooltip:ct,insertMention:lt,mentionFilteredUsers:dt}=(0,Gn.Z)(!Ee.length,me,he,void 0,B,x,L,A),{isOpen:ut,id:mt,isGallery:ht,switchPm:gt,results:pt,closeTooltip:ft,help:vt,loadMore:yt}=function(e,t,s,a){const[r,i,c]=(0,fe.Z)(),l=function(e){return jn.innerHTML=e.replace(/
/g,"\n"),jn.innerText}(s),{queryInlineBot:d,resetInlineBot:u}=(0,n.uC)(),{username:m,query:h,canShowHelp:g}=function(e){const t=e.match(Hn);return t?{username:t[1],query:t[2],canShowHelp:""===t[2]&&!e.match(_n)}:{username:"",query:"",canShowHelp:!1}}(l),p=m.toLowerCase(),f=(0,Rs.Z)(h),I=(0,Rs.Z)(m),v=null==a?void 0:a[p],{id:y,switchPm:P,offset:Z,results:C,isGallery:w,help:b}=v||{};(0,o.d4)((()=>{f!==h&&c()}),[f,h,c]),(0,o.d4)((()=>{e&&p&&t&&d({chatId:t,username:p,query:h})}),[h,e,d,t,p]);const M=(0,o.I4)((()=>{d({chatId:t,username:p,query:h,offset:Z})}),[Z,t,h,d,p]);return(0,o.d4)((()=>{e&&y&&(P||null!=C&&C.length)?i():c()}),[y,e,i,C,P,c]),I!==m&&u({username:I}),{isOpen:r,closeTooltip:c,loadMore:M,username:m,id:y,isGallery:w,switchPm:P,results:C,help:g&&b?`@${m} ${b}`:void 0}}(Boolean(!Ee.length&&O),d,me,G),{isOpen:Pt,close:Zt,filteredBotCommands:Ct}=function(e,t,s,n){const[a,r,i]=(0,fe.Z)(),[c,l]=(0,o.eJ)(),d=(0,o.I4)((e=>{s||n?Vn((()=>{const t=(s||n||[]).filter((({command:t})=>!e||t.includes(e)));l(t&&t.length?t:void 0)})):l(void 0)}),[s,n]);return(0,o.d4)((()=>{if(e&&t.length)if(t.startsWith("/")){const e=(0,Qn._)(t.substr(1)).match(zn);d(e?e[0]:"")}else i();else i()}),[d,t,e,i]),(0,o.d4)((()=>{c&&c.length?r():i()}),[c,r,i]),{isOpen:a,close:i,filteredBotCommands:c}}(Boolean(H&&H.length||_&&_.length),me,H,_),{isContextMenuOpen:wt,handleContextMenu:bt,handleContextMenuClose:Mt,handleContextMenuHide:St}=(0,ts.Z)(st,!(ot===Za.Send&&rt)),Et=(0,o.Ye)((()=>(0,l.H5)(v,P)),[v,P]),kt=v&&(0,l.Nl)(v),Rt=(0,l.Hd)(v),{isStickerTooltipOpen:Tt,closeStickerTooltip:Nt}=function(e,t,s,a=!1){const r=(0,o.Ye)((()=>(0,Qn._)(t).trim()),[t]),{loadStickersForEmoji:i,clearStickersForEmoji:c}=(0,n.uC)(),l=h.op&&1===(0,Dn.Z)(r)||!h.op&&Boolean(t.match(/^]*?>$/g)),d=Boolean(s)&&l;return(0,o.d4)((()=>{a||(e&&l?i({emoji:r}):!d&&l||c())}),[t,l,c,i,e,a]),{isStickerTooltipOpen:d,closeStickerTooltip:c}}(Boolean(U&&Et.canSendStickers&&!Ee.length),me,T,!r),{isEmojiTooltipOpen:Bt,closeEmojiTooltip:xt,filteredEmojis:Lt,insertEmoji:At}=(0,qn.Z)(Boolean(U&&Et.canSendStickers&&!Ee.length),me,q,void 0,he,$,D,!r),Ot=(0,o.I4)(((e,t=a.R2)=>{const s=window.getSelection(),n=document.getElementById(t),o=(0,It.Z)(e,["escape_html","emoji_html","br_html"]).join("").replace(/\u200b+/g,"​");if(s.rangeCount){const e=s.getRangeAt(0);if((0,Sn.R)(e,t))return function(e){const t=window.getSelection();if(null!=t&&t.getRangeAt&&t.rangeCount){const s=t.getRangeAt(0);s.deleteContents();const n=s.createContextualFragment(e),a=n.lastChild;s.insertNode(n),a?(s.setStartAfter(a),s.setEndAfter(a)):s.collapse(!1),t.removeAllRanges(),t.addRange(s)}}(o),void n.dispatchEvent(new Event("input",{bubbles:!0}))}he(`${Se.current}${o}`),requestAnimationFrame((()=>{(0,Cn.Z)(n)}))}),[]),Ft=(0,o.I4)((()=>{const e=window.getSelection();if(e.rangeCount){const t=e.getRangeAt(0);if((0,Sn.R)(t,a.R2))return void document.execCommand("delete",!1)}he(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 s=t.lastChild;if(s.lastChild)for(;s.lastChild;)s=s.lastChild;const n=s.textContent.length,a=document.createRange(),o=window.getSelection();a.setStart(s,n),a.setEnd(s,n),o.removeAllRanges(),o.addRange(a),document.execCommand("delete",!1);const r=t.innerHTML;return document.body.removeChild(t),r}(Se.current))}),[]),Ut=(0,o.I4)(((e=!1)=>{e||he(""),ke([]),Nt(),Ze(),be(void 0),ct(),xt(),h.wB?setTimeout((()=>Qe()),350):Qe()}),[Nt,Ze,ct,xt,Qe]),$t=(0,o.sO)();$t.current=Xe,(0,o.d4)((()=>()=>{$t.current(),Ut()}),[d,Ut,$t]);const Dt=((e,t,s,n,r,i)=>((0,o.d4)((()=>{s?(t(Fn(s.content.text)),requestAnimationFrame((()=>{const e=document.getElementById(a.R2);(0,Cn.Z)(e,!0)}))):t("")}),[s,t]),(0,o.I4)((()=>{const{text:t,entities:a}=(0,f.Z)(e.current);s&&(t||(0,l.u8)(s)?(i({messageId:s.id,text:t,entities:a}),n()):r())}),[i,s,e,r,n])))(Se,he,c,Ut,Ge,z);((e,t,s,n,r,i,c,l,d)=>{const u=(0,o.I4)(((e,t)=>{r.current.length&&!c?l({chatId:e,threadId:t,draft:(0,f.Z)(r.current)}):d({chatId:e,threadId:t})}),[d,c,r,l]),m=(0,o.Ye)((()=>(0,C.Ds)((e=>e()),a.r_,!1)),[t]),g=(0,Rs.Z)(t),p=(0,Rs.Z)(s);(0,o.d4)((()=>(Un=t,$n=s,()=>{Un=void 0,$n=void 0,u(t,s)})),[t,s,u]),(0,o.d4)((()=>{t===g&&s===p||e&&(i(Fn(e)),h.$b||requestAnimationFrame((()=>{const e=document.getElementById(a.R2);(0,Cn.Z)(e,!0)})))}),[t,s,e,i,u,g,p]);const I=(0,Rs.Z)(n);(0,o.d4)((()=>{t&&s&&g===t&&p===s&&I!==n&&(n.length?m((()=>{Un===t&&$n===s&&u(t,s)})):u(t,s))}),[t,n,g,I,p,m,s,u]);const v=(0,o.I4)((()=>{t&&s&&u(t,s)}),[t,s,u]);(0,re.Z)(v),ie(v)})(I,d,m,me,Se,he,c,W,Y),((e,t,s)=>{(0,o.d4)((()=>{async function n(n){if(!n.clipboardData)return;const o=document.activeElement;if(o&&![a.R2,a.nY].includes(o.id))return;const{items:r}=n.clipboardData,i=Array.from(r).find((e=>On.includes(e.type)&&"file"===e.kind)),c=i&&i.getAsFile(),l=n.clipboardData.getData("text").substring(0,4096);if(n.preventDefault(),c||l){if(c&&!s){const e=await Mn(c.name,c,!0);t((t=>[...t,e]))}l&&e(l,null==o?void 0:o.id)}}return document.addEventListener("paste",n,!1),()=>{document.removeEventListener("paste",n,!1)}}),[e,s,t])})(Ot,ke,c);const Qt=(0,o.I4)((async(e,t)=>{ke(await Promise.all(e.map((e=>Mn(e.name,e,t)))))}),[]),qt=(0,o.I4)((async(e,t)=>{ke([...Ee,...await Promise.all(e.map((e=>Mn(e.name,e,t))))])}),[Ee]),Gt=(0,o.I4)((()=>{ke([])}),[]),jt=(0,o.I4)((async(e=!1,t)=>{if("connectionStateReady"!==y)return;let s=Ee;if(Je){const e=await Xe();if(e){const{blob:t,duration:n,waveform:a}=e;s=[await Mn("wonderful-voice-message.ogg",t,!1,{voice:{duration:n,waveform:a}})]}}const{text:n,entities:o}=(0,f.Z)(Se.current);if(!s.length&&!n&&!M)return;const r=s.length?1024:4096;if((null==n?void 0:n.length)>r){const e=n.length-r;return void X({data:{message:"MESSAGE_TOO_LONG_PLEASE_REMOVE_CHARACTERS",textParams:{"{EXTRA_CHARS_COUNT}":e,"{PLURAL_S}":e>1?"s":""},hasErrorKey:!0}})}const i=document.getElementById(a.R2);if(s.length||n){if(Rt&&!kt){const e=(0,p.b)(Q),t=pe.current&&Math.floor(e-pe.current),s=Rt.nextSendDate&&Rt.nextSendDate>e;if(t&&t{Ut()}))}),[y,Ee,Je,M,Y,d,Q,Ut,Xe,X,Rt,kt,V,ee,de]),Ht=(0,o.I4)((()=>{Qe(),Le()}),[Qe,Le]),_t=(0,o.I4)((()=>{Ae(),De()}),[Ae,De]),Vt=(0,o.I4)(((e,s=!1)=>{e={...e,isPreloadedGlobally:!0},t?(be({sticker:e}),Pe()):(V({sticker:e}),requestAnimationFrame((()=>{Ut(s)})))}),[t,Pe,V,Ut]),zt=(0,o.I4)((e=>{t?(be({gif:e}),Pe()):(V({gif:e}),requestAnimationFrame((()=>{Ut(!0)})))}),[t,Pe,V,Ut]),Wt=(0,o.I4)((e=>{if("connectionStateReady"!==y)return;le({id:e.id,queryId:e.queryId});const t=document.getElementById(a.R2);h.cj&&t===document.activeElement&&kn(t),Y({chatId:d,localOnly:!0}),requestAnimationFrame((()=>{Ut()}))}),[d,Y,y,Ut,le]),Yt=(0,o.I4)((()=>{Y({chatId:d,localOnly:!0}),requestAnimationFrame((()=>{Ut()}))}),[d,Y,Ut]),Xt=(0,o.I4)((e=>{t?(be({poll:e}),se(),Pe()):(V({poll:e}),se())}),[se,Pe,V,t]),Kt=(0,o.I4)((()=>{t?(be({isSilent:!0}),Pe()):jt(!0)}),[jt,Pe,t]),Jt=(0,o.I4)(((e,t=!1)=>{const{isSilent:s,...n}=Ce||{},a=Math.round(Math.max(e.getTime(),Date.now()+6e4)/1e3)+(t?0:Q);Ce&&0!==Object.keys(n).length?(V({...Ce,scheduledAt:a}),requestAnimationFrame((()=>{Ut()}))):jt(!!s,a),Ze()}),[Ze,jt,Ut,Ce,V,Q]),es=(0,o.I4)((()=>{Jt(new Date(1e3*a.t4),!0)}),[Jt]),ss=(0,o.I4)((()=>{Ze(),be(void 0)}),[Ze]),ns=(0,o.I4)((e=>{"stickers"===e?(K({query:""}),J({query:void 0})):(J({query:""}),K({query:void 0}))}),[K,J]),as=(0,o.I4)((()=>{const e=document.getElementById(a.R2);h.wB&&e===document.activeElement?(e.blur(),setTimeout((()=>{Ae(),De()}),100)):De()}),[De,Ae]),os=(0,o.I4)((()=>{oe({id:d,threadId:m,type:"scheduled"})}),[oe,d,m]);(0,o.d4)((()=>{w&&h.wB&&Qe()}),[w,Qe]),(0,o.d4)((()=>{r&&(b?ze():setTimeout((()=>{We()}),200))}),[b,We,ze,r]);const rs=(0,o.I4)((()=>{switch(ot){case Za.Send:t?(Je&&Ke(),Pe()):jt();break;case Za.Record:Ye();break;case Za.Edit:Dt()}}),[ot,t,Ye,Dt,Je,Pe,Ke,jt]),is=ot===Za.Record&&!Et.canAttachMedia,cs=(0,Rs.Z)(c,!0),ls=c||cs,ds=new Date;ds.setSeconds(0),ds.setMilliseconds(0);const us=new Date;us.setFullYear(us.getFullYear()+1);let ms="SendMessage";switch(ot){case Za.Edit:ms="Save edited message";break;case Za.Record:ms=is?"Conversation.DefaultRestrictedMedia":"AccDescrVoiceMessage"}const hs=(0,ne.Z)("Composer",!b&&"shown",Ve&&"hover-disabled"),gs=(0,ne.Z)("mobile-symbol-menu-button",!r&&"not-ready",He?$e&&"menu-opened":$e&&"is-loading"),ps=ot===Za.Edit?Dt:t?Pe:jt;return o.ZP.createElement("div",{className:hs},Et.canAttachMedia&&r&&o.ZP.createElement(ya.Z,{containerId:"#middle-column-portals"},o.ZP.createElement(fa,{isOpen:e!==et.t.None,withQuick:[e,Ie].includes(et.t.QuickFile),onHide:i,onFileSelect:Qt})),o.ZP.createElement(ha,{attachments:Ee,caption:Ee.length?me:"",groupChatMembers:B,currentUserId:L,usersById:A,recentEmojis:q,isReady:r,onCaptionUpdate:he,baseEmojiKeywords:$,emojiKeywords:D,addRecentEmoji:ce,onSend:t?Pe:jt,onFileAppend:qt,onClear:Gt}),o.ZP.createElement(pa,{isOpen:Boolean(S),onClear:se,onSend:Xt}),ls&&o.ZP.createElement(Wn,{isOpen:qe,isSchedule:"scheduled"===g,onClose:je,message:ls}),o.ZP.createElement(na,{isOpen:it,onClose:ct,onInsertUserName:lt,filteredUsers:dt,usersById:A}),o.ZP.createElement(sa,{isOpen:ut,botId:mt,allowedAttachmentOptions:Et,isGallery:ht,inlineBotResults:pt,switchPm:gt,onSelectResult:Wt,loadMore:yt,onClose:ft}),o.ZP.createElement(ia,{isOpen:Pt,withUsername:Boolean(_),botCommands:Ct,onClick:Yt,onClose:Zt}),o.ZP.createElement("div",{id:"message-compose"},o.ZP.createElement("div",{className:"svg-appendix",ref:ue}),o.ZP.createElement(ma,null),o.ZP.createElement(va,{chatId:d,threadId:m,messageText:Ee.length?"":me,disabled:!Et.canAttachEmbedLinks}),o.ZP.createElement("div",{className:"message-input-wrapper"},P&&!1!==H&&!Je&&!c&&o.ZP.createElement(Jn,{className:(0,ne.Z)("bot-commands",xe&&"activated"),round:!0,disabled:void 0===H,color:"translucent",onActivate:Ht,ariaLabel:"Open bot command keyboard"},o.ZP.createElement("i",{className:"icon-bot-commands-filled"})),h.wB?o.ZP.createElement(we.Z,{className:gs,round:!0,color:"translucent",onClick:$e?Qe:as,ariaLabel:"Choose emoji, sticker or GIF"},o.ZP.createElement("i",{className:"icon-smile"}),o.ZP.createElement("i",{className:"icon-keyboard"}),$e&&!He&&o.ZP.createElement(Re.Z,{color:"gray"})):o.ZP.createElement(Jn,{className:$e?"activated":"",round:!0,color:"translucent",onActivate:_t,ariaLabel:"Choose emoji, sticker or GIF"},o.ZP.createElement("i",{className:"icon-smile"})),o.ZP.createElement(da.Z,{id:"message-input-text",html:Ee.length?"":me,placeholder:Je&&Me<=600?"":k||de("Message"),forcedPlaceholder:vt,shouldSetFocus:!Ee.length,shouldSuppressFocus:h.wB&&$e,shouldSuppressTextFormatter:Bt||it||ut,onUpdate:he,onSend:ps,onSuppressedFocus:Qe}),j&&Boolean(mt)&&o.ZP.createElement(Re.Z,{color:"gray"}),R&&o.ZP.createElement(we.Z,{round:!0,faded:!0,className:"scheduled-button",color:"translucent",onClick:os,ariaLabel:"Open scheduled messages"},o.ZP.createElement("i",{className:"icon-schedule"})),E&&!Je&&!c&&o.ZP.createElement(Jn,{className:Te?"activated":"",round:!0,color:"translucent",onActivate:Ne,ariaLabel:"Open bot command keyboard"},o.ZP.createElement("i",{className:"icon-bot-command"})),!Je&&!c&&o.ZP.createElement(Jn,{className:Oe?"activated":"",round:!0,color:"translucent",onActivate:Fe,ariaLabel:"Add an attachment"},o.ZP.createElement("i",{className:"icon-attach"})),Je&&tt&&o.ZP.createElement("span",{className:"recording-state"},(0,N.rM)(tt-at.current)),o.ZP.createElement(oa,{isOpen:Tt,onStickerSelect:Vt}),o.ZP.createElement(ra.Z,{isOpen:Bt,emojis:Lt,onClose:xt,onEmojiSelect:At,addRecentEmoji:ce}),o.ZP.createElement(ea,{isOpen:Oe,allowedAttachmentOptions:Et,onFileSelect:Qt,onPollCreate:te,onClose:Ue}),E&&o.ZP.createElement(la,{messageId:E,isOpen:Te,onClose:Be}),H&&o.ZP.createElement(ga,{isOpen:xe,botCommands:H,onClose:Ae}),o.ZP.createElement(ta,{isOpen:$e,allowedAttachmentOptions:Et,onLoad:_e,onClose:Qe,onEmojiSelect:Ot,onStickerSelect:Vt,onGifSelect:zt,onRemoveSymbol:Ft,onSearchOpen:ns,addRecentEmoji:ce}))),Je&&o.ZP.createElement(we.Z,{round:!0,color:"danger",className:"cancel",onClick:Xe,ariaLabel:"Cancel voice recording"},o.ZP.createElement("i",{className:"icon-delete"})),o.ZP.createElement(we.Z,{ref:st,round:!0,color:"secondary",className:(0,ne.Z)(ot,!r&&"not-ready",Je&&"recording"),disabled:is,ariaLabel:de(ms),onClick:rs,onContextMenu:ot===Za.Send&&rt?bt:void 0},o.ZP.createElement("i",{className:"icon-send"}),o.ZP.createElement("i",{className:"icon-microphone-alt"}),o.ZP.createElement("i",{className:"icon-check"})),rt&&o.ZP.createElement(aa,{isOpen:wt,onSilentSend:Z?void 0:Kt,onScheduleSend:t?void 0:Pe,onClose:Mt,onCloseAnimationEnd:St}),o.ZP.createElement(Pa,{isOpen:ve,withTimePicker:!0,selectedAt:ds.getTime(),maxAt:(0,N._F)(us),isFutureMode:!0,secondButtonLabel:s?de("Schedule.SendWhenOnline"):void 0,onClose:ss,onSubmit:Jt,onSecondButtonClick:s?es:void 0}))}))),wa=(0,o.X$)((e=>{const{isActive:t}=e,s=(0,Fe.Z)(Oe.gl.Extra,"MobileSearch",!t,!0);return s?o.ZP.createElement(s,e):void 0})),ba=(0,o.X$)((e=>{const{isActive:t}=e,s=(0,Fe.Z)(Oe.gl.Extra,"MessageSelectToolbar",!t);return s?o.ZP.createElement(s,e):void 0})),Ma=(0,o.X$)((e=>{const{isOpen:t}=e,s=(0,Fe.Z)(Oe.gl.Extra,"UnpinAllMessagesModal",!t);return s?o.ZP.createElement(s,e):void 0})),Sa=(0,o.X$)((e=>{const{isOpen:t}=e,s=(0,Fe.Z)(Oe.gl.Extra,"PaymentModal",!t);return s?o.ZP.createElement(s,e):void 0})),Ea=(0,o.X$)((e=>{const{isOpen:t}=e,s=(0,Fe.Z)(Oe.gl.Extra,"ReceiptModal",!t);return s?o.ZP.createElement(s,e):void 0})),ka=h.wB?450+a.fK:void 0;function Ra(e){return"file"===e.kind&&e.type&&a.oG.has(e.type)}const Ta=(0,o.X$)((0,n.c$)((e=>{const t=(0,i.Pu)(e),{isBlurred:s,background:n,backgroundColor:a,patternColor:o}=e.settings.themes[t]||{},{messageLists:r}=e.messages,c=(0,i.Bt)(e),{isLeftColumnShown:d,chats:{listIds:m}}=e,g={theme:t,customBackground:n,backgroundColor:a,patternColor:o,isLeftColumnShown:d,isRightColumnShown:(0,i.Jf)(e),isBackgroundBlurred:s,isMobileSearchActive:Boolean(h.wB&&(0,i.n5)(e)),isSelectModeActive:(0,i.CA)(e),isPaymentModalOpen:e.payment.isPaymentModalOpen,isReceiptModalOpen:Boolean(e.payment.receipt),animationLevel:e.settings.byKey.animationLevel,currentTransitionKey:Math.max(0,e.messages.messageLists.length-1)};if(!c||!m.active)return g;const{chatId:p,threadId:f,type:I}=c,v=(0,i.Z1)(e,p),y=(0,i.KB)(e,p),{chatId:P,messageId:Z}=e.audioPlayer,C=v&&(0,l.Qm)(v,f),w=(0,i.pk)(e,p),b="pinned"===I,M="scheduled"===I;return{...g,chatId:p,threadId:f,messageListType:I,isPrivate:(0,l.YC)(p),canPost:!b&&(!v||C)&&!w,isPinnedMessageList:b,isScheduledMessageList:M,currentUserBannedRights:null==v?void 0:v.currentUserBannedRights,defaultBannedRights:null==v?void 0:v.defaultBannedRights,hasPinnedOrAudioMessage:f!==u._f||Boolean(null==y?void 0:y.length)||Boolean(P&&Z),pinnedMessagesCount:y?y.length:0,shouldSkipHistoryAnimations:e.shouldSkipHistoryAnimations,messageLists:r}}),((e,t)=>(0,g.ei)(t,["openChat","unpinAllMessages","loadUser","closeLocalTextSearch","exitMessageSelectMode","closePaymentModal","clearReceipt"])))((({chatId:e,threadId:t,messageListType:s,isPrivate:n,isPinnedMessageList:r,messageLists:i,canPost:c,currentUserBannedRights:d,defaultBannedRights:u,hasPinnedOrAudioMessage:m,pinnedMessagesCount:g,customBackground:p,theme:f,backgroundColor:I,patternColor:v,isLeftColumnShown:y,isRightColumnShown:P,isBackgroundBlurred:Z,isMobileSearchActive:C,isSelectModeActive:w,isPaymentModalOpen:b,isReceiptModalOpen:M,animationLevel:S,shouldSkipHistoryAnimations:E,currentTransitionKey:k,openChat:R,unpinAllMessages:T,loadUser:N,closeLocalTextSearch:B,exitMessageSelectMode:x,closePaymentModal:L,clearReceipt:A})=>{const{width:O}=at(),F=(0,ye.Z)(),[U,$]=(0,o.eJ)(et.t.None),[D,Q]=(0,o.eJ)(),[q,G]=(0,o.eJ)(),[j,H]=(0,o.eJ)(!1),[_,V]=(0,o.eJ)(!h.wB||S===a.oB),z=m&&(Oa._m&&O=a.ks&&Oe?(0,ge.Z)((()=>{R({id:void 0})})):void 0),[e,R]),(0,o.d4)((()=>{$(et.t.None),Q(void 0),G(void 0)}),[e]),(0,o.d4)((()=>{S===a.oB&&V(!0)}),[S]),(0,o.d4)((()=>{const{visualViewport:e}=window;if(!e)return;const t=()=>{window.visualViewport.height!==document.documentElement.clientHeight?document.body.classList.add("keyboard-visible"):document.body.classList.remove("keyboard-visible")};return e.addEventListener("resize",t),()=>{e.removeEventListener("resize",t)}}),[]),(0,o.d4)((()=>{n&&N({userId:e})}),[e,n,N]);const te=(0,o.I4)((e=>{if(h.$b)return;const{items:t}=e.dataTransfer||{},s=t&&Array.from(t).filter((e=>"text/uri-list"!==e.type)).every(Ra);$(s?et.t.QuickFile:et.t.Document)}),[]),se=(0,o.I4)((()=>{$(et.t.None)}),[]),ae=(0,o.I4)((()=>{H(!0)}),[]),oe=(0,o.I4)((()=>{H(!1)}),[]),re=(0,o.I4)((()=>{T({chatId:e}),oe(),R({id:e})}),[T,R,oe,e]),ie=(0,o.I4)((()=>{R({id:e})}),[R,e]),ce=((e,t)=>{const[s,n]=(0,o.eJ)(t);return(0,o.d4)((()=>{t&&(t.startsWith("#")?n(t):tt.fetch(a.fo,e,tt.Type.Blob).then((e=>{const t=URL.createObjectURL(e);(0,st.pt)(t).then((()=>{n(`url(${t})`)}))})))}),[t,e]),t?s:void 0})(f,p),le=(0,ne.Z)(J&&"has-header-tools",p&&"custom-bg-image",I&&"custom-bg-color",p&&Z&&"blurred",h.aZ?"mask-image-disabled":"mask-image-enabled"),de=(0,ne.Z)("messaging-disabled",!w&&"shown"),ue=(0,l.q8)(F,d,u),{composerHiddenScale:me,toolbarHiddenScale:pe,composerTranslateX:fe,toolbarTranslateX:ve,unpinHiddenScale:Pe,toolbarForUnpinHiddenScale:Ze}=(0,o.Ye)((()=>function(e,t){const s=e<=a.l3?16:32,n=function(e){if(e>a._m){const t=Math.min(Math.max(.25*e,288),424),s=Math.min(.25*e,424);return Math.min(e-t-s,rt)}if(e>a.ks){const t=Math.min(Math.max(.4*e,288),424);return Math.min(e-t,rt)}return e>rt?rt:e}(e),o=e<=a.l3?54:64,r=t?n-s-o:n-s,i=e>a.l3?Math.min(n-s,512):n-s,c=i/r,l=r/i;return{composerHiddenScale:c,toolbarHiddenScale:l,composerTranslateX:t?o/2*l:0,toolbarTranslateX:t?o/2*-1*c:0,unpinHiddenScale:i/258,toolbarForUnpinHiddenScale:258/i}}(O,K)),[K,O]),Ce=(0,ne.Z)("middle-column-footer",!K&&"no-composer",K&&q&&!w&&"with-notch");(0,he.ZP)(W&&Y,(()=>{R({id:void 0},!0)}),void 0,void 0,void 0,i?i.map(it.q):[]),(0,he.ZP)(C,B),(0,he.ZP)(w,x);const be=Boolean(!r&&!K&&ue);return o.ZP.createElement("div",{id:"MiddleColumn",className:le,onTransitionEnd:t=>{"transform"===t.propertyName&&t.target===t.currentTarget&&V(Boolean(e))},style:`\n --composer-hidden-scale: ${me};\n --toolbar-hidden-scale: ${pe};\n --unpin-hidden-scale: ${Pe};\n --toolbar-unpin-hidden-scale: ${Ze};\n --composer-translate-x: ${fe}px;\n --toolbar-translate-x: ${ve}px;\n --pattern-color: ${v};\n --theme-background-color:\n ${I||("dark"===f?a.It:a.p3)};\n `,onClick:h.p7&&y?ie:void 0},o.ZP.createElement("div",{id:"middle-column-bg",style:ce?`--custom-background: ${ce}`:void 0}),o.ZP.createElement("div",{id:"middle-column-portals"}),W&&Y&&o.ZP.createElement(o.ZP.Fragment,null,o.ZP.createElement("div",{className:"messages-layout",onDragEnter:K?te:void 0},o.ZP.createElement(Gt,{chatId:W,threadId:Y,messageListType:X,isReady:_}),o.ZP.createElement(Ie.Z,{name:E?"none":S===a.zy?"slide":"fade",activeKey:k,shouldCleanup:!0},(e=>o.ZP.createElement(o.ZP.Fragment,null,o.ZP.createElement(Pn,{key:`${W}-${Y}-${X}`,chatId:W,threadId:Y,type:X,canPost:K,hasTools:J,onFabToggle:Q,onNotchToggle:G,isReady:_,isActive:e}),o.ZP.createElement("div",{className:Ce},K&&o.ZP.createElement(Ca,{chatId:W,threadId:Y,messageListType:X,dropAreaState:U,onDropHide:se,isReady:_}),r&&o.ZP.createElement("div",{className:"unpin-button-container",dir:F.isRtl?"rtl":void 0},o.ZP.createElement(we.Z,{size:"tiny",fluid:!0,color:"secondary",className:"unpin-all-button",onClick:ae},o.ZP.createElement("i",{className:"icon-unpin"}),o.ZP.createElement("span",null,F("Chat.Pinned.UnpinAll",g,"i")))),be&&o.ZP.createElement("div",{className:de},o.ZP.createElement("div",{className:"messaging-disabled-inner"},o.ZP.createElement("span",null,ue))),o.ZP.createElement(ba,{messageListType:X,isActive:w,canPost:K}),o.ZP.createElement(Sa,{isOpen:Boolean(b),onClose:L}),o.ZP.createElement(Ea,{isOpen:Boolean(M),onClose:A}))))),o.ZP.createElement(Zn,{isShown:ee,canPost:K,withExtraShift:be||w||r})),h.wB&&o.ZP.createElement(wa,{isActive:Boolean(C)})),e&&o.ZP.createElement(Ma,{isOpen:j,chatId:e,pinnedMessagesCount:g,onClose:oe,onUnpin:re}))}))),Na=(0,C.Ds)((e=>e()),200,!1);var Ba;!function(e){e[e.Profile=0]="Profile",e[e.MemberList=1]="MemberList",e[e.SharedMedia=2]="SharedMedia",e[e.Search=3]="Search",e[e.Management=4]="Management",e[e.ManageInitial=5]="ManageInitial",e[e.ManageChannelSubscribers=6]="ManageChannelSubscribers",e[e.ManageChatAdministrators=7]="ManageChatAdministrators",e[e.ManageChatPrivacyType=8]="ManageChatPrivacyType",e[e.ManageDiscussion=9]="ManageDiscussion",e[e.ManageGroupPermissions=10]="ManageGroupPermissions",e[e.ManageGroupRemovedUsers=11]="ManageGroupRemovedUsers",e[e.ManageGroupUserPermissionsCreate=12]="ManageGroupUserPermissionsCreate",e[e.ManageGroupUserPermissions=13]="ManageGroupUserPermissions",e[e.ManageGroupRecentActions=14]="ManageGroupRecentActions",e[e.ManageGroupAdminRights=15]="ManageGroupAdminRights",e[e.ManageGroupMembers=16]="ManageGroupMembers",e[e.StickerSearch=17]="StickerSearch",e[e.GifSearch=18]="GifSearch",e[e.PollResults=19]="PollResults",e[e.AddingMembers=20]="AddingMembers"}(Ba||(Ba={}));const xa=(0,o.X$)((0,n.c$)(((e,{chatId:t,isProfile:s,isManagement:n})=>{const{query:a}=(0,i.n5)(e)||{},{query:o}=(0,i.y5)(e)||{},{query:r}=(0,i.yN)(e)||{},c=t?(0,i.Z1)(e,t):void 0,d=c&&(0,l.eA)(c),u=s&&t&&(0,l.YC)(t)?(0,i.dy)(e,t):void 0,m=u&&(0,l.kw)(u);return{canManage:Boolean(!n&&s&&!m&&c&&!(0,i.FM)(e,c.id)&&((0,l.YC)(c.id)||((0,l.Nl)(c)||c.isCreator)&&!c.isNotJoined)),canAddContact:m,isChannel:d,userId:null==u?void 0:u.id,messageSearchQuery:a,stickerSearchQuery:o,gifSearchQuery:r}}),((e,t)=>(0,g.ei)(t,["setLocalTextSearchQuery","setStickerSearchQuery","setGifSearchQuery","searchTextMessagesLocal","toggleManagement","openHistoryCalendar","addContact"])))((({isColumnOpen:e,isProfile:t,isSearch:s,isManagement:n,isStickerSearch:a,isGifSearch:r,isPollResults:i,isAddingChatMembers:c,profileState:l,managementScreen:d,canAddContact:u,userId:g,canManage:p,isChannel:f,onClose:I,messageSearchQuery:v,stickerSearchQuery:y,gifSearchQuery:P,setLocalTextSearchQuery:Z,setStickerSearchQuery:C,setGifSearchQuery:w,searchTextMessagesLocal:b,toggleManagement:M,openHistoryCalendar:S,shouldSkipAnimation:E,addContact:k})=>{var R;const T=(0,o.sO)(null),B=(0,o.I4)((e=>{Z({query:e}),e.length&&Na(b)}),[b,Z]),x=(0,o.I4)((e=>{C({query:e})}),[C]),L=(0,o.I4)((e=>{w({query:e})}),[w]),A=(0,o.I4)((()=>{k({userId:g})}),[k,g]),[O,F]=(0,o.eJ)(!e);(0,o.d4)((()=>{setTimeout((()=>{F(!e)}),300)}),[e]);const U=(0,ye.Z)(),$=t?l===m.vi.Profile?Ba.Profile:l===m.vi.SharedMedia?Ba.SharedMedia:l===m.vi.MemberList?Ba.MemberList:-1:s?Ba.Search:i?Ba.PollResults:a?Ba.StickerSearch:r?Ba.GifSearch:c?Ba.AddingMembers:n?d===m.u1.Initial?Ba.ManageInitial:d===m.u1.ChatPrivacyType?Ba.ManageChatPrivacyType:d===m.u1.Discussion?Ba.ManageDiscussion:d===m.u1.ChannelSubscribers?Ba.ManageChannelSubscribers:d===m.u1.GroupPermissions?Ba.ManageGroupPermissions:d===m.u1.ChatAdministrators?Ba.ManageChatAdministrators:d===m.u1.GroupRemovedUsers?Ba.ManageGroupRemovedUsers:d===m.u1.GroupUserPermissionsCreate?Ba.ManageGroupUserPermissionsCreate:d===m.u1.GroupUserPermissions?Ba.ManageGroupUserPermissions:d===m.u1.GroupRecentActions?Ba.ManageGroupRecentActions:d===m.u1.ChatAdminRights?Ba.ManageGroupAdminRights:d===m.u1.GroupMembers?Ba.ManageGroupMembers:void 0:void 0,D=null!==(R=(0,dt.Z)($,!0))&&void 0!==R?R:-1;function Q(){if(-1!==D)switch(D){case Ba.PollResults:return o.ZP.createElement("h3",null,U("PollResults"));case Ba.Search:return o.ZP.createElement(o.ZP.Fragment,null,o.ZP.createElement(be.Z,{parentContainerClassName:"RightSearch",value:v,onChange:B}),o.ZP.createElement(we.Z,{round:!0,size:"smaller",color:"translucent",onClick:()=>S({selectedAt:(0,N._F)(Date.now())}),ariaLabel:"Search messages by date"},o.ZP.createElement("i",{className:"icon-calendar"})));case Ba.AddingMembers:return o.ZP.createElement("h3",null,U("GroupAddMembers"));case Ba.ManageInitial:return o.ZP.createElement("h3",null,U("Edit"));case Ba.ManageChatPrivacyType:return o.ZP.createElement("h3",null,U(f?"ChannelTypeHeader":"GroupTypeHeader"));case Ba.ManageDiscussion:return o.ZP.createElement("h3",null,U("Discussion"));case Ba.ManageChatAdministrators:return o.ZP.createElement("h3",null,U("ChannelAdministrators"));case Ba.ManageGroupRecentActions:return o.ZP.createElement("h3",null,U("Group.Info.AdminLog"));case Ba.ManageGroupAdminRights:return o.ZP.createElement("h3",null,U("EditAdminRights"));case Ba.ManageGroupPermissions:return o.ZP.createElement("h3",null,U("ChannelPermissions"));case Ba.ManageGroupRemovedUsers:return o.ZP.createElement("h3",null,U("ChannelBlockedUsers"));case Ba.ManageGroupUserPermissionsCreate:return o.ZP.createElement("h3",null,U("ChannelAddException"));case Ba.ManageGroupUserPermissions:return o.ZP.createElement("h3",null,U("UserRestrictions"));case Ba.StickerSearch:return o.ZP.createElement(be.Z,{value:y,placeholder:U("SearchStickersHint"),autoFocusSearch:!0,onChange:x});case Ba.GifSearch:return o.ZP.createElement(be.Z,{value:P,placeholder:U("SearchGifsTitle"),autoFocusSearch:!0,onChange:L});case Ba.SharedMedia:return o.ZP.createElement("h3",null,U("SharedMedia"));case Ba.ManageChannelSubscribers:return o.ZP.createElement("h3",null,U("ChannelSubscribers"));case Ba.MemberList:case Ba.ManageGroupMembers:return o.ZP.createElement("h3",null,U("GroupMembers"));default:return o.ZP.createElement(o.ZP.Fragment,null,o.ZP.createElement("h3",null,"Profile"),o.ZP.createElement("section",{className:"tools"},u&&o.ZP.createElement(we.Z,{round:!0,color:"translucent",size:"smaller",ariaLabel:U("AddContact"),onClick:A},o.ZP.createElement("i",{className:"icon-add-user"})),p&&o.ZP.createElement(we.Z,{round:!0,color:"translucent",size:"smaller",ariaLabel:U("Edit"),onClick:M},o.ZP.createElement("i",{className:"icon-edit"}))))}}const q=h.wB||$===Ba.SharedMedia||$===Ba.MemberList||$===Ba.AddingMembers||n,G=(0,ne.Z)("animated-close-icon",q&&"state-back",(O||E)&&"no-transition");return o.ZP.createElement("div",{className:"RightHeader"},o.ZP.createElement(we.Z,{className:"close-button",round:!0,color:"translucent",size:"smaller",onClick:I,ariaLabel:U(q?"Common.Back":"Common.Close")},o.ZP.createElement("div",{ref:T,className:G})),o.ZP.createElement(Ie.Z,{name:O||E?"none":"slide-fade",activeKey:D},Q))})));var La=s(91),Aa=s(7407);function Oa(e,t,s,n){const[o,r]=(0,Aa.Z)(s?t:void 0,n,void 0,a.Vk);return[o,r,!(!o||!n||o[0]===n[0])]}function Fa(e,t,s,n,r,i){const c=(0,o.sO)();(0,ce.Z)((()=>{t===e&&r&&i&&(c.current=(0,l.R5)(r,i,e).reverse())}),[r,i,t,e]);const[d,u]=(0,Aa.Z)(n?s:void 0,c.current,void 0,"media"===e?a.EN:a.pn);return[d,u,!(!d||!c.current||d[0]===c.current[0])]}const Ua=(0,C.P2)((e=>e()),250,!1);let $a=!1;var Da=s(1273),Qa=s(1876),qa=s(787),Ga=s(180),ja=s(3709),Ha=s(5418),_a=s(7262),Va=s(1151),za=s(2275);const Wa=[{type:"media",title:"SharedMediaTab2"},{type:"documents",title:"SharedFilesTab2"},{type:"links",title:"SharedLinksTab2"},{type:"audio",title:"SharedMusicTab2"},{type:"voice",title:"SharedVoiceTab2"}];function Ya(e){return[`.shared-media-transition > div:only-child > .${e}-list > .scroll-item`,`.shared-media-transition > div.active > .${e}-list > .scroll-item`].join(", ")}const Xa=(0,o.X$)((0,n.c$)(((e,{chatId:t,userId:s})=>{var n,a;const o=(0,i.Z1)(e,t),r=(0,i.Zw)(e,s||t),{currentType:c,resultsByType:d}=(0,i.we)(e)||{},{foundIds:u}=d&&c&&d[c]||{},{byId:m}=e.users,{byId:h}=e.chats,g=o&&(0,l.Bf)(o),p=o&&(0,l.eA)(o),f=g||p&&(0,l.Nl)(o),I=null==o||null===(n=o.fullInfo)||void 0===n?void 0:n.members,v=f&&o&&o.fullInfo&&!o.fullInfo.canViewMembers,y=f&&o&&((0,l.VE)(o,"inviteUsers")||o.isCreator),P=f&&o&&((0,l.VE)(o,"banUsers")||o.isCreator),Z=(0,i.xs)(e,t);let C,w,b;return s?w=s:(0,l.YC)(t)&&(w=t),w&&(b=(0,i.dy)(e,w),C=b&&!b.isSelf&&!(0,l.cS)(b)),{theme:(0,i.Pu)(e),isChannel:p,resolvedUserId:w,chatMessages:r,foundIds:u,mediaSearchType:c,hasCommonChatsTab:C,hasMembersTab:f,areMembersHidden:v,canAddMembers:y,canDeleteMembers:P,currentUserId:e.currentUserId,isRightColumnShown:(0,i.Jf)(e),isRestricted:null==o?void 0:o.isRestricted,lastSyncTime:e.lastSyncTime,serverTimeOffset:e.serverTimeOffset,activeDownloadIds:Z,usersById:m,chatsById:h,...f&&I&&{members:I},...C&&b&&{commonChatIds:null===(a=b.commonChats)||void 0===a?void 0:a.ids}}}),((e,t)=>(0,g.ei)(t,["setLocalMediaSearchType","loadMoreMembers","searchMediaMessagesLocal","openMediaViewer","openAudioPlayer","openUserInfo","focusMessage","loadProfilePhotos","setNewChatMembersDialogState","loadCommonChats","openChat"])))((({chatId:e,profileState:t,onProfileStateChange:s,theme:n,isChannel:r,resolvedUserId:i,currentUserId:c,chatMessages:d,foundIds:g,mediaSearchType:p,hasCommonChatsTab:f,hasMembersTab:I,areMembersHidden:v,canAddMembers:y,canDeleteMembers:P,commonChatIds:Z,members:C,usersById:w,chatsById:b,isRightColumnShown:M,isRestricted:S,lastSyncTime:E,activeDownloadIds:k,serverTimeOffset:R,setLocalMediaSearchType:T,loadMoreMembers:N,loadCommonChats:B,openChat:x,searchMediaMessagesLocal:L,openMediaViewer:A,openAudioPlayer:O,openUserInfo:F,focusMessage:U,loadProfilePhotos:$,setNewChatMembersDialogState:D})=>{const Q=(0,o.sO)(null),q=(0,o.sO)(null),G=(0,ye.Z)(),[j,H]=(0,o.eJ)(0),[_,V]=(0,o.eJ)(),z=(0,o.Ye)((()=>[...I?[{type:"members",title:r?"ChannelSubscribers":"GroupMembers"}]:[],...Wa,...f?[{type:"commonChats",title:"SharedGroupsTab2"}]:[]]),[f,I,r]),W=z[j].type,[Y,X,K,J]=function(e,t,s,n,a,r,i,c,d,u,m,h,g,p,f=0){const I="members"!==a&&r?r:a,v=(0,o.Ye)((()=>{if(i&&d)return(0,l.Z0)(i.map((({userId:e})=>e)),d,void 0,f)}),[i,f,d]),y=(0,o.Ye)((()=>{if(c&&u)return(0,l.ih)(c,u,!0)}),[u,c]),[P,Z,C]=Oa(0,t,p,v),[w,b,M]=Oa(0,s,p,y),[S,E,k]=Fa("media",I,n,p,m,h),[R,T,N]=Fa("documents",I,n,p,m,h),[B,x,L]=Fa("links",I,n,p,m,h),[A,O,F]=Fa("audio",I,n,p,m,h),[U,$,D]=Fa("voice",I,n,p,m,h);let Q,q,G=!1;switch(I){case"members":Q=P,q=Z,G=C;break;case"commonChats":Q=w,q=b,G=M;break;case"media":Q=S,q=E,G=k;break;case"documents":Q=R,q=T,G=N;break;case"links":Q=B,q=x,G=L;break;case"audio":Q=A,q=O,G=F;break;case"voice":Q=U,q=$,G=D}return[I,Q,q,G]}(0,N,B,L,W,p,C,Z,w,b,d,g,0,E,R),ee=z.findIndex((({type:e})=>e===Y)),{handleScroll:te}=function(e,t,s,n){(0,Ht.Z)((([s])=>{if(s&&s!==t){const s=e.current,a=s.querySelector(".TabList");s.scrollTop{$a=!1}),350))}}),[t,n]),(0,Ht.Z)((([t])=>{if(s!==m.vi.Profile||s===t)return;const a=e.current;a&&a.querySelector(".TabList")&&($a=!0,(0,Xt.Z)(a,a.firstElementChild,"start",void 0,2*a.offsetHeight),setTimeout((()=>{$a=!1}),350),n(s))}),[s]);const a=(0,o.I4)((()=>{const s=e.current;if(!s)return;const a=s.querySelector(".TabList");if(!a)return;let o=m.vi.Profile;s.scrollTop>=a.offsetTop&&(o="members"===t?m.vi.MemberList:m.vi.SharedMedia),n(o)}),[e,n,t]);return(0,o.d4)((()=>{$a||a()}),[a,t]),{handleScroll:(0,o.I4)((()=>{$a||Ua(a)}),[a])}}(Q,W,t,s),{applyTransitionFix:se,releaseTransitionFix:ne}=function(e,t=".Transition.shared-media-transition"){return(0,o.d4)((()=>{function s(){const s=e.current,n=s.querySelector(t),a=s.querySelector(".TabList");n&&a&&(n.style.minHeight=s.offsetHeight-a.offsetHeight+"px")}return s(),window.addEventListener("resize",s,!1),()=>{window.removeEventListener("resize",s,!1)}}),[e,t]),{applyTransitionFix:(0,o.I4)((()=>{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:(0,o.I4)((()=>{const t=e.current;t.style.overflowY="scroll",t.style.marginRight="0"}),[e])}}(Q),[ae,oe]=(()=>{const[e,t]=(0,o.eJ)(!1);return[e,(0,o.I4)((()=>{t((e=>!e))}),[])]})(),re=(0,o.I4)((()=>{ne(),oe()}),[ne,oe]),ie=(0,o.I4)((()=>{D(m.WB.InProgress)}),[D]);(0,o.d4)((()=>{T({mediaType:W})}),[T,W]);const ce=i||e;(0,o.d4)((()=>{E&&$({profileId:ce})}),[$,ce,E]);const le=(0,o.I4)((e=>{A({chatId:ce,threadId:u._f,messageId:e,origin:m.bZ.SharedMedia})}),[ce,A]),de=(0,o.I4)((e=>{O({chatId:ce,messageId:e})}),[ce,O]),ue=(0,o.I4)((e=>{F({id:e})}),[F]),me=(0,o.I4)((e=>{U({chatId:ce,messageId:e})}),[ce,U]),he=(0,o.I4)((()=>{V(void 0)}),[]);let ge;(0,o.d4)((()=>{if(q.current&&h.$b)return(0,Ne.s)(q.current,{selectorToPreventScroll:".Profile",onSwipe:(e,t)=>t===Ne.e.Left?(H(Math.min(j+1,z.length-1)),!0):t===Ne.e.Right&&(H(Math.max(0,j-1)),!0)})}),[j,z.length]);const pe="members"===Y||!I&&"media"===Y;pe?ge=M?0:1e3:X||(ge=a.Y);const fe=(0,ua.Z)([e,Y],ge);function ve(){if(!X||!fe||!d){const e=pe&&X&&!fe;return o.ZP.createElement("div",{className:"content empty-list"},!e&&o.ZP.createElement(Re.Z,null))}if(!X.length){let e;switch(Y){case"members":e=v?"You have no access to group members list.":"No members found";break;case"commonChats":e=G("NoGroupsInCommon");break;case"documents":e=G("lng_media_file_empty");break;case"links":e=G("lng_media_link_empty");break;case"audio":e=G("lng_media_song_empty");break;case"voice":e=G("lng_media_audio_empty");break;default:e=G("SharedMedia.EmptyTitle")}return o.ZP.createElement("div",{className:"content empty-list"},o.ZP.createElement(_a.Z,{text:e}))}return o.ZP.createElement("div",{className:`content ${Y}-list`,dir:G.isRtl&&"media"===Y?"rtl":void 0,teactFastList:!0},"media"===Y?X.map((e=>d[e]&&o.ZP.createElement(ja.Z,{key:e,message:d[e],onClick:le}))):"documents"===Y?X.map((e=>d[e]&&o.ZP.createElement(Is.Z,{key:e,message:d[e],withDate:!0,smaller:!0,className:"scroll-item",onDateClick:me,isDownloading:k.includes(e)}))):"links"===Y?X.map((e=>d[e]&&o.ZP.createElement(Ha.Z,{key:e,message:d[e],onMessageClick:me}))):"audio"===Y?X.map((e=>d[e]&&o.ZP.createElement(vs.Z,{key:e,theme:n,message:d[e],origin:m.Cr.SharedMedia,date:d[e].date,lastSyncTime:E,className:"scroll-item",onPlay:de,onDateClick:me,isDownloading:k.includes(e)}))):"voice"===Y?X.map((e=>d[e]&&o.ZP.createElement(vs.Z,{key:e,theme:n,message:d[e],senderTitle:(0,La.F)(G,d[e],b,w),origin:m.Cr.SharedMedia,date:d[e].date,lastSyncTime:E,className:"scroll-item",onPlay:de,onDateClick:me,isDownloading:k.includes(e)}))):"members"===Y?X.map(((e,t)=>{return o.ZP.createElement(Qa.Z,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item small-icon",onClick:()=>ue(e),contextActions:(s=e,s!==c&&P?[{title:G("lng_context_remove_from_group"),icon:"stop",handler:()=>{V(s)}}]:void 0)},o.ZP.createElement(mt.Z,{userId:e,forceShowSelf:!0}));var s})):"commonChats"===Y?X.map(((e,t)=>o.ZP.createElement(Qa.Z,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item small-icon",onClick:()=>x({id:e})},o.ZP.createElement(ht.Z,{chatId:e})))):void 0)}return o.ZP.createElement(Da.Z,{ref:Q,className:"Profile custom-scroll",itemSelector:Ya(Y),items:fe?X:void 0,cacheBuster:ae,sensitiveArea:a.qU,preloadBackwards:fe?"members"===Y?a.Vk:a.EN:0,noScrollRestoreOnTop:!0,noFastList:!0,onLoadMore:K,onScroll:te},!J&&function(e,t){return o.ZP.createElement("div",{className:"profile-info"},o.ZP.createElement(qa.Z,{userId:t||e}),o.ZP.createElement(Ga.Z,{chatOrUserId:t||e}))}(e,i),!S&&o.ZP.createElement("div",{className:"shared-media"},o.ZP.createElement(Ie.Z,{ref:q,name:G.isRtl?"slide-reversed":"slide",activeKey:ee,renderCount:z.length,shouldRestoreHeight:!0,className:"shared-media-transition",onStart:se,onStop:re},ve),o.ZP.createElement(xe.Z,{big:!0,activeTab:j,tabs:z,onSwitchTab:H})),y&&o.ZP.createElement(Va.Z,{isShown:"members"===Y,onClick:ie,ariaLabel:G("lng_channel_add_users")},o.ZP.createElement("i",{className:"icon-add-user-filled"})),P&&o.ZP.createElement(za.Z,{isOpen:Boolean(_),userId:_,onClose:he}))}))),Ka=(0,o.X$)((e=>{const t=(0,Fe.Z)(Oe.gl.Extra,"RightSearch");return t?o.ZP.createElement(t,e):o.ZP.createElement(Ue.Z,null)})),Ja=(0,o.X$)((e=>{const t=(0,Fe.Z)(Oe.gl.Extra,"Management");return t?o.ZP.createElement(t,e):o.ZP.createElement(Ue.Z,null)})),eo=(0,o.X$)((()=>{const e=(0,Fe.Z)(Oe.gl.Extra,"StickerSearch");return e?o.ZP.createElement(e,null):o.ZP.createElement(Ue.Z,null)})),to=(0,o.X$)((()=>{const e=(0,Fe.Z)(Oe.gl.Extra,"GifSearch");return e?o.ZP.createElement(e,null):o.ZP.createElement(Ue.Z,null)})),so=(0,o.X$)((()=>{const e=(0,Fe.Z)(Oe.gl.Extra,"PollResults");return e?o.ZP.createElement(e,null):o.ZP.createElement(Ue.Z,null)}));var no=s(1820);const ao=(0,o.X$)((0,n.c$)(((e,{chatId:t})=>{var s;const n=(0,i.Z1)(e,t),{userIds:a}=e.contactList||{},{byId:o}=e.users,{byId:r}=e.chats,{currentUserId:c,newChatMembersProgress:d,connectionState:u}=e,h=n&&(0,l.eA)(n),{query:g,fetchingStatus:p,globalUserIds:f,localUserIds:I}=e.userSearch;return{isChannel:h,members:null==n||null===(s=n.fullInfo)||void 0===s?void 0:s.members,currentUserId:c,usersById:o,chatsById:r,localContactIds:a,searchQuery:g,isSearching:p,isLoading:d===m.WB.Loading,globalUserIds:f,localUserIds:I,connectionState:u}}),((e,t)=>(0,g.ei)(t,["loadContactList","setUserSearchQuery"])))((({isChannel:e,connectionState:t,members:s,onNextStep:n,currentUserId:a,usersById:r,chatsById:i,localContactIds:c,isLoading:d,searchQuery:u,isSearching:m,localUserIds:h,globalUserIds:p,setUserSearchQuery:f,onClose:I,isActive:v,loadContactList:y})=>{const P=(0,ye.Z)(),[Z,C]=(0,o.eJ)([]),w=(0,Rs.Z)(Z)===Z;(0,o.d4)((()=>{v&&"connectionStateReady"===t&&y()}),[t,v,y]),(0,he.ZP)(v,I);const b=(0,o.Ye)((()=>s?s.map((e=>e.userId)):[]),[s]),M=(0,o.I4)((e=>{f({query:e})}),[f]),S=(0,o.Ye)((()=>{const t=c?(0,l.ih)(c.filter((e=>e!==a)),i):[];if(!u)return t.filter((e=>!b.includes(e)));const s=t.filter((e=>{const t=r[e];if(!t)return!1;const s=(0,l.Js)(t);return s&&(0,k.Z)(s,u)}));return(0,l.ih)((0,g.Tw)([...s,...h||[],...p||[]]).filter((t=>{const s=r[t];return!b.includes(t)&&(!s||!(0,l.cS)(s)||!e&&s.canBeInvitedToGroup)})),i)}),[c,i,u,h,p,a,r,b,e]),E=(0,o.I4)((()=>{Z.length&&(f({query:""}),n(Z))}),[Z,f,n]);return o.ZP.createElement("div",{className:"AddChatMembers"},o.ZP.createElement("div",{className:"AddChatMembers-inner"},o.ZP.createElement(no.Z,{itemIds:S,selectedIds:Z,filterValue:u,filterPlaceholder:P("lng_channel_add_users"),searchInputId:"new-members-picker-search",isLoading:m,onSelectedIdsChange:C,onFilterChange:M,noScrollRestore:w}),o.ZP.createElement(Va.Z,{isShown:Boolean(Z.length),disabled:d,ariaLabel:P("lng_channel_add_users"),onClick:E},d?o.ZP.createElement(Re.Z,{color:"white"}):o.ZP.createElement("i",{className:"icon-arrow-right"}))))}))),oo=Object.keys(m.qt).length/2,ro=Object.keys(m.u1).length/2;function io(){const e=document.querySelector(".RightHeader .SearchInput input");e&&e.blur()}const co=(0,o.X$)((0,n.c$)((e=>{const{chatId:t,threadId:s}=(0,i.Bt)(e)||{},n=(0,i.g4)(e);return{contentKey:(0,i.Wq)(e),chatId:t,threadId:s,currentProfileUserId:e.users.selectedId,isChatSelected:Boolean(t&&n),shouldSkipHistoryAnimations:e.shouldSkipHistoryAnimations}}),((e,t)=>(0,g.ei)(t,["openUserInfo","toggleChatInfo","toggleManagement","closeLocalTextSearch","setStickerSearchQuery","setGifSearchQuery","closePollResults","addChatMembers","setNewChatMembersDialogState"])))((({contentKey:e,chatId:t,threadId:s,currentProfileUserId:n,isChatSelected:r,toggleChatInfo:i,toggleManagement:c,openUserInfo:l,closeLocalTextSearch:d,setStickerSearchQuery:u,setGifSearchQuery:h,closePollResults:g,addChatMembers:p,setNewChatMembersDialogState:f,shouldSkipHistoryAnimations:I})=>{var v;const{width:y}=at(),[P,Z]=(0,o.eJ)(m.vi.Profile),[C,w]=(0,o.eJ)(m.u1.Initial),[b,M]=(0,o.eJ)(),[S,E]=(0,o.eJ)(),k=P!==m.vi.Profile,R=void 0!==e,T=e===m.qt.ChatInfo||e===m.qt.UserInfo,N=e===m.qt.Search,B=e===m.qt.Management,x=e===m.qt.StickerSearch,L=e===m.qt.GifSearch,A=e===m.qt.PollResults,O=e===m.qt.AddingMembers,F=y<=a._m,[U,$]=(0,o.eJ)(!R),D=null!==(v=(0,dt.Z)(e,!0,!r))&&void 0!==v?v:-1,Q=(0,o.I4)(((t=!0)=>{switch(e){case m.qt.AddingMembers:f(m.WB.Closed);break;case m.qt.ChatInfo:if(k&&t){Z(m.vi.Profile);break}i(void 0,!0);break;case m.qt.UserInfo:if(k&&t){Z(m.vi.Profile);break}l({id:void 0},!0);break;case m.qt.Management:switch(C){case m.u1.Initial:c();break;case m.u1.ChatPrivacyType:case m.u1.Discussion:case m.u1.GroupPermissions:case m.u1.GroupType:case m.u1.ChatAdministrators:case m.u1.ChannelSubscribers:case m.u1.GroupMembers:w(m.u1.Initial);break;case m.u1.GroupUserPermissionsCreate:case m.u1.GroupRemovedUsers:case m.u1.GroupUserPermissions:w(m.u1.GroupPermissions),M(void 0),E(void 0);break;case m.u1.ChatAdminRights:case m.u1.GroupRecentActions:w(m.u1.ChatAdministrators)}break;case m.qt.Search:io(),d();break;case m.qt.StickerSearch:io(),u({query:void 0});break;case m.qt.GifSearch:io(),h({query:void 0});break;case m.qt.PollResults:g()}}),[e,k,i,l,g,f,C,c,d,u,h]),q=(0,o.I4)(((e,t)=>{M(e),E(t)}),[]),G=(0,o.I4)((e=>{p({chatId:t,memberIds:e})}),[p,t]);function j(e){if(-1!==D)switch(D){case m.qt.AddingMembers:return o.ZP.createElement(ao,{chatId:t,onNextStep:G,isActive:R&&e,onClose:Q});case m.qt.ChatInfo:case m.qt.UserInfo:return o.ZP.createElement(Xa,{key:n||t,chatId:t,userId:n,profileState:P,onProfileStateChange:Z});case m.qt.Search:return o.ZP.createElement(Ka,{chatId:t,threadId:s,onClose:Q,isActive:R&&e});case m.qt.Management:return o.ZP.createElement(Ja,{chatId:t,currentScreen:C,isPromotedByCurrentUser:S,selectedChatMemberId:b,onScreenSelect:w,onChatMemberSelect:q,isActive:R&&e,onClose:Q});case m.qt.StickerSearch:return o.ZP.createElement(eo,{onClose:Q,isActive:R&&e});case m.qt.GifSearch:return o.ZP.createElement(to,{onClose:Q,isActive:R&&e});case m.qt.PollResults:return o.ZP.createElement(so,{onClose:Q,isActive:R&&e})}}return(0,o.d4)((()=>R?(0,ge.Z)(Q):void 0),[R,Q]),(0,o.d4)((()=>{setTimeout((()=>{$(!R)}),300)}),[R]),(0,o.d4)((()=>{R&&F&&Q()}),[F]),(0,jt.Z)((([s,n])=>{(s===m.qt.ChatInfo&&e===m.qt.UserInfo||s===m.qt.UserInfo&&e===m.qt.ChatInfo||n!==t)&&(Z(m.vi.Profile),w(m.u1.Initial))}),[e,t]),(0,he.ZP)(r&&(e===m.qt.ChatInfo||e===m.qt.UserInfo||e===m.qt.Management||e===m.qt.AddingMembers),(()=>Q(!1)),i),o.ZP.createElement("div",{id:"RightColumn-wrapper",className:r?void 0:"is-hidden"},F&&o.ZP.createElement("div",{className:"overlay-backdrop",onClick:Q}),o.ZP.createElement("div",{id:"RightColumn"},o.ZP.createElement(xa,{chatId:t,isColumnOpen:R,isProfile:T,isSearch:N,isManagement:B,isStickerSearch:x,isGifSearch:L,isPollResults:A,isAddingChatMembers:O,profileState:P,managementScreen:C,onClose:Q,shouldSkipAnimation:U||I}),o.ZP.createElement(Ie.Z,{name:U||I?"none":"zoom-fade",renderCount:oo+ro,activeKey:B?oo+C:D,shouldCleanup:!0,cleanupExceptionKey:m.qt.ChatInfo},j)))}))),lo=(0,o.X$)((({isOpen:e})=>{const t=(0,Fe.Z)(Oe.gl.Extra,"MediaViewer",!e);return t?o.ZP.createElement(t,null):void 0}));function uo(e,t){const s=document.createElement("a");s.href=e,s.download=t;try{s.click()}catch(e){console.error(e)}}const mo=new Set,ho=(0,o.X$)((0,n.c$)((e=>({activeDownloads:e.activeDownloads.byChatId,messages:e.messages.byChatId})),((e,t)=>(0,g.ei)(t,["cancelMessageMediaDownload"])))((({activeDownloads:e,messages:t,cancelMessageMediaDownload:s})=>{(0,o.d4)((()=>{Object.entries(e).forEach((([e,n])=>{n.map((s=>t[Number(e)].byId[s])).forEach((e=>{const t=(0,l.Ti)(e,"download");if(t){if(!mo.has(t)){const n=St.UV(t);if(n)return mo.delete(t),uo(n,(0,l.w6)(e)),void s({message:e});St.he(t,u.IU.BlobUrl,!0).then((n=>{mo.delete(t),n&&uo(n,(0,l.w6)(e)),s({message:e})})),mo.add(t)}}else s({message:e})}))}))}),[s,t,e])}))),go=(0,o.X$)((({isOpen:e})=>{const t=(0,Fe.Z)(Oe.gl.Extra,"Notifications",!e);return t?o.ZP.createElement(t,null):void 0})),po=(0,o.X$)((({isOpen:e})=>{const t=(0,Fe.Z)(Oe.gl.Extra,"Dialogs",!e);return t?o.ZP.createElement(t,null):void 0})),fo=(0,o.X$)((e=>{const{isOpen:t}=e,s=(0,Fe.Z)(Oe.gl.Extra,"ForwardPicker",!t);return s?o.ZP.createElement(s,e):void 0})),Io=(0,o.X$)((e=>{const{url:t}=e,s=(0,Fe.Z)(Oe.gl.Extra,"SafeLinkModal",!t);return s?o.ZP.createElement(s,e):void 0})),vo=(0,o.X$)((e=>{const{isOpen:t}=e,s=(0,Fe.Z)(Oe.gl.Extra,"HistoryCalendar",!t);return s?o.ZP.createElement(s,e):void 0})),yo=(0,o.X$)((e=>{const{groupCallId:t}=e,s=(0,Fe.Z)(Oe.gl.Calls,"GroupCall",!t);return s?o.ZP.createElement(s,e):void 0})),Po=(0,o.X$)((e=>{const{groupCallId:t}=e,s=(0,Fe.Z)(Oe.gl.Calls,"ActiveCallHeader",!t);return s?o.ZP.createElement(s,null):void 0}));let Zo,Co=!1;function wo(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")}))}function bo(e){document.title!==e&&(document.title=e)}const Mo=(0,o.X$)((0,n.c$)((e=>{const{settings:{byKey:{animationLevel:t,language:s,wasTimeFormatSetManually:n}}}=e,{chatId:a,messageId:o}=e.audioPlayer,r=a&&o?(0,i.hj)(e,a,o):void 0;return{lastSyncTime:e.lastSyncTime,isLeftColumnShown:e.isLeftColumnShown,isRightColumnShown:(0,i.Jf)(e),isMediaViewerOpen:(0,i.zQ)(e),isForwardModalOpen:(0,i.Ev)(e),hasNotifications:Boolean(e.notifications.length),hasDialogs:Boolean(e.dialogs.length),audioMessage:r,safeLinkModalUrl:e.safeLinkModalUrl,isHistoryCalendarOpen:Boolean(e.historyCalendarSelectedAt),shouldSkipHistoryAnimations:e.shouldSkipHistoryAnimations,openedStickerSetShortName:e.openedStickerSetShortName,isServiceChatReady:(0,i.UW)(e),activeGroupCallId:e.groupCalls.activeGroupCallId,animationLevel:t,language:s,wasTimeFormatSetManually:n}}),((e,t)=>(0,g.ei)(t,["loadAnimatedEmojis","loadNotificationSettings","loadNotificationExceptions","updateIsOnline","loadTopInlineBots","loadEmojiKeywords","openStickerSetShortName","loadCountryList","ensureTimeFormat","checkVersionNotification"])))((({lastSyncTime:e,isLeftColumnShown:t,isRightColumnShown:s,isMediaViewerOpen:r,isForwardModalOpen:c,hasNotifications:l,hasDialogs:d,audioMessage:u,activeGroupCallId:m,safeLinkModalUrl:g,isHistoryCalendarOpen:p,shouldSkipHistoryAnimations:f,openedStickerSetShortName:I,isServiceChatReady:v,animationLevel:y,language:P,wasTimeFormatSetManually:Z,loadAnimatedEmojis:w,loadNotificationSettings:b,loadNotificationExceptions:M,updateIsOnline:S,loadTopInlineBots:E,loadEmojiKeywords:k,loadCountryList:R,ensureTimeFormat:T,openStickerSetShortName:N,checkVersionNotification:B})=>{a.eM&&!Co&&(Co=!0,console.log(">>> RENDER MAIN")),(0,o.d4)((()=>{e&&(S(!0),w(),b(),M(),E(),k({language:a.pR}),P!==a.pR&&k({language:P}),R({langCode:P}))}),[e,w,M,b,S,E,k,R,P]),(0,o.d4)((()=>{e&&v&&B()}),[e,v,B]),(0,o.d4)((()=>{e&&!Z&&T()}),[e,Z,T]),(0,o.d4)((()=>{e&&he.Oy.startsWith("#?tgaddr=")&&(0,me.o)(decodeURIComponent(he.Oy.substr("#?tgaddr=".length)))}),[e]);const{transitionClassNames:x}=(0,oe.Z)(!t,void 0,!0,void 0,f),{transitionClassNames:L}=(0,oe.Z)(s,void 0,!0,void 0,f),A=(0,ne.Z)(x.replace(/([\w-]+)/g,"middle-column-$1"),L.replace(/([\w-]+)/g,"right-column-$1"),f&&"history-animation-disabled");(0,ce.Z)((([e])=>{if(void 0===e||0===y)return;const t=(0,se.YW)();(0,ae.L)(document.getElementById("MiddleColumn"),t)}),[t]),(0,ce.Z)((([e])=>{if(void 0===e||0===y)return;(0,C.T2)((()=>{document.body.classList.add("animating-right-column")}));const t=(0,se.YW)();(0,ae.L)(document.getElementById("RightColumn"),(()=>{t(),(0,C.T2)((()=>{document.body.classList.remove("animating-right-column")}))}))}),[s]);const O=(0,o.I4)((()=>{S(!1);const e=(0,i.A1)((0,n.Rd)());let t=0;clearInterval(Zo),Zo=window.setInterval((()=>{if(document.title.includes(a.ou))wo(!1);else{if(t%2==0){const t=(0,i.A1)((0,n.Rd)())-e;t>0&&(bo(`${t} notification${t>1?"s":""}`),wo(!0))}else bo(a.Ti),wo(!1);t++}}),1e3)}),[S]),F=(0,o.I4)((()=>{S(!0),clearInterval(Zo),Zo=void 0,document.title.includes(a.ou)||bo(a.Ti),wo(!1)}),[S]),U=(0,o.I4)((()=>{N({stickerSetShortName:void 0})}),[N]);function $(e){e.preventDefault(),e.stopPropagation()}return(0,re.Z)(O,F),ie(O),function(e=!1){(0,o.d4)((()=>{if(h.$b){if(!e)return null==le||le.setAttribute("content",de),h.cj&&!h.fl&&document.addEventListener("gesturestart",ue),()=>{null==le||le.setAttribute("content","width=device-width, initial-scale=1, shrink-to-fit=no"),h.cj&&!h.fl&&document.removeEventListener("gesturestart",ue)};null==le||le.setAttribute("content","width=device-width, initial-scale=1, shrink-to-fit=no, viewport-fit=cover")}}),[e])}(r),o.ZP.createElement("div",{id:"Main",className:A,onDrop:$,onDragOver:$},o.ZP.createElement(Je,null),o.ZP.createElement(Ta,null),o.ZP.createElement(co,null),o.ZP.createElement(lo,{isOpen:r}),o.ZP.createElement(fo,{isOpen:c}),o.ZP.createElement(go,{isOpen:l}),o.ZP.createElement(po,{isOpen:d}),u&&o.ZP.createElement($t,{key:u.id,message:u,noUi:!0}),o.ZP.createElement(Io,{url:g}),o.ZP.createElement(vo,{isOpen:p}),o.ZP.createElement(ws.Z,{isOpen:Boolean(I),onClose:U,stickerSetShortName:I}),m&&o.ZP.createElement(o.ZP.Fragment,null,o.ZP.createElement(yo,{groupCallId:m}),o.ZP.createElement(Po,{groupCallId:m})),o.ZP.createElement(ho,null))})));a.eM&&console.log(">>> FINISH LOAD MAIN BUNDLE"),(0,n.Rd)().connectionState||(0,n.uC)().initApi()},4524:(e,t,s)=>{e.exports=s.p+"telegram-logo-filled.67469f6dc5e301e8e0bd..svg"}}]); -//# sourceMappingURL=211.1fd3812a4d5830a98eb6.js.map \ No newline at end of file diff --git a/dist/211.1fd3812a4d5830a98eb6.js.map b/dist/211.1fd3812a4d5830a98eb6.js.map deleted file mode 100644 index 9222e048c..000000000 --- a/dist/211.1fd3812a4d5830a98eb6.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"211.1fd3812a4d5830a98eb6.js","mappings":"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","sources":["webpack://telegram-t/./src/modules/actions/ui/localSearch.ts","webpack://telegram-t/./src/modules/actions/ui/chats.ts","webpack://telegram-t/./src/modules/actions/ui/messages.ts","webpack://telegram-t/./src/versionNotification.txt","webpack://telegram-t/./src/modules/actions/ui/globalSearch.ts","webpack://telegram-t/./src/modules/actions/ui/stickerSearch.ts","webpack://telegram-t/./src/modules/actions/ui/users.ts","webpack://telegram-t/./src/modules/actions/ui/misc.ts","webpack://telegram-t/./src/modules/actions/ui/payments.ts","webpack://telegram-t/./src/modules/actions/api/messages.ts","webpack://telegram-t/./src/modules/actions/api/symbols.ts","webpack://telegram-t/./src/modules/actions/api/globalSearch.ts","webpack://telegram-t/./src/modules/actions/api/localSearch.ts","webpack://telegram-t/./src/modules/actions/api/management.ts","webpack://telegram-t/./src/modules/actions/api/sync.ts","webpack://telegram-t/./src/modules/actions/api/users.ts","webpack://telegram-t/./src/modules/reducers/bots.ts","webpack://telegram-t/./src/modules/actions/api/bots.ts","webpack://telegram-t/./src/modules/actions/api/twoFaSettings.ts","webpack://telegram-t/./src/modules/actions/api/payments.ts","webpack://telegram-t/./src/util/requestQuery.ts","webpack://telegram-t/./src/modules/actions/apiUpdaters/chats.ts","webpack://telegram-t/./src/modules/actions/apiUpdaters/messages.ts","webpack://telegram-t/./src/modules/actions/apiUpdaters/users.ts","webpack://telegram-t/./src/modules/actions/apiUpdaters/symbols.ts","webpack://telegram-t/./src/modules/actions/apiUpdaters/misc.ts","webpack://telegram-t/./src/modules/actions/apiUpdaters/settings.ts","webpack://telegram-t/./src/modules/actions/apiUpdaters/twoFaSettings.ts","webpack://telegram-t/./src/modules/actions/apiUpdaters/calls.ts","webpack://telegram-t/./src/hooks/useBeforeUnload.ts","webpack://telegram-t/./src/hooks/usePreventPinchZoomGesture.ts","webpack://telegram-t/./src/hooks/useBrowserOnline.ts","webpack://telegram-t/./src/components/left/main/LeftMainHeader.tsx","webpack://telegram-t/./src/components/left/ConnectionState.tsx","webpack://telegram-t/./src/components/left/main/ChatFolders.tsx","webpack://telegram-t/./src/hooks/useThrottledMemo.ts","webpack://telegram-t/./src/components/left/search/LeftSearch.async.tsx","webpack://telegram-t/./src/components/left/main/ContactList.async.tsx","webpack://telegram-t/./src/components/left/NewChatButton.tsx","webpack://telegram-t/./src/components/left/main/LeftMain.tsx","webpack://telegram-t/./src/components/left/settings/Settings.async.tsx","webpack://telegram-t/./src/components/left/newChat/NewChat.async.tsx","webpack://telegram-t/./src/components/left/ArchivedChats.async.tsx","webpack://telegram-t/./src/components/left/LeftColumn.tsx","webpack://telegram-t/./src/hooks/useResize.ts","webpack://telegram-t/./src/hooks/useWindowSize.ts","webpack://telegram-t/./src/components/middle/helpers/calculateMiddleFooterTransforms.ts","webpack://telegram-t/./src/components/middle/HeaderMenuContainer.async.tsx","webpack://telegram-t/./src/components/middle/HeaderActions.tsx","webpack://telegram-t/./src/hooks/useWebpThumbnail.ts","webpack://telegram-t/./src/components/middle/PinnedMessageNavigation.tsx","webpack://telegram-t/./src/components/middle/HeaderPinnedMessage.tsx","webpack://telegram-t/./src/util/imageResize.ts","webpack://telegram-t/./src/hooks/useMessageMediaMetadata.ts","webpack://telegram-t/./src/hooks/useAsync.ts","webpack://telegram-t/./src/components/middle/AudioPlayer.tsx","webpack://telegram-t/./src/components/calls/group/GroupCallTopPane.tsx","webpack://telegram-t/./src/components/middle/MiddleHeader.tsx","webpack://telegram-t/./src/components/middle/helpers/groupMessages.ts","webpack://telegram-t/./src/components/middle/hooks/useMessageObservers.ts","webpack://telegram-t/./src/components/middle/message/helpers/buildContentClassName.ts","webpack://telegram-t/./src/components/middle/message/helpers/mediaDimensions.ts","webpack://telegram-t/./src/components/middle/message/helpers/calculateAlbumLayout.ts","webpack://telegram-t/./src/components/middle/message/helpers/calculateAuthorWidth.ts","webpack://telegram-t/./src/components/middle/message/hooks/useFocusMessage.ts","webpack://telegram-t/./src/components/middle/message/ContextMenuContainer.async.tsx","webpack://telegram-t/./src/components/middle/ActionMessage.tsx","webpack://telegram-t/./src/components/common/EmbeddedMessage.tsx","webpack://telegram-t/./src/components/middle/message/MessageMeta.tsx","webpack://telegram-t/./src/components/middle/message/Sticker.tsx","webpack://telegram-t/./src/components/middle/message/hooks/useBlurredMediaThumbRef.ts","webpack://telegram-t/./src/components/middle/message/helpers/getCustomAppendixBg.ts","webpack://telegram-t/./src/components/middle/message/Photo.tsx","webpack://telegram-t/./src/components/middle/message/hooks/useVideoAutoPause.ts","webpack://telegram-t/./src/components/middle/message/Video.tsx","webpack://telegram-t/./src/components/middle/message/Contact.tsx","webpack://telegram-t/./src/components/middle/message/PollOption.tsx","webpack://telegram-t/./src/components/middle/message/Poll.tsx","webpack://telegram-t/./src/components/middle/message/WebPage.tsx","webpack://telegram-t/./src/components/middle/message/Invoice.tsx","webpack://telegram-t/./src/components/middle/message/hocs/withSelectControl.tsx","webpack://telegram-t/./src/components/middle/message/Album.tsx","webpack://telegram-t/./src/components/middle/message/RoundVideo.tsx","webpack://telegram-t/./src/components/middle/message/InlineButtons.tsx","webpack://telegram-t/./src/components/middle/message/CommentButton.tsx","webpack://telegram-t/./src/components/middle/message/Message.tsx","webpack://telegram-t/./src/components/middle/message/hooks/useOuterHandlers.ts","webpack://telegram-t/./src/components/middle/message/hooks/useInnerHandlers.ts","webpack://telegram-t/./src/components/middle/MessageListContent.tsx","webpack://telegram-t/./src/components/middle/hooks/useScrollHooks.ts","webpack://telegram-t/./src/components/middle/ContactGreeting.tsx","webpack://telegram-t/./src/components/middle/NoMessages.tsx","webpack://telegram-t/./src/components/middle/MessageList.tsx","webpack://telegram-t/./src/components/middle/hooks/useStickyDates.ts","webpack://telegram-t/./src/components/middle/ScrollDownButton.tsx","webpack://telegram-t/./src/components/middle/composer/helpers/buildAttachment.ts","webpack://telegram-t/./src/components/middle/composer/helpers/applyIosAutoCapitalizationFix.ts","webpack://telegram-t/./node_modules/opus-recorder/dist/encoderWorker.min.js","webpack://telegram-t/./src/util/voiceRecording.ts","webpack://telegram-t/./src/components/middle/composer/hooks/useVoiceRecording.ts","webpack://telegram-t/./src/components/middle/composer/hooks/useClipboardPaste.ts","webpack://telegram-t/./src/components/middle/composer/helpers/getMessageTextAsHtml.ts","webpack://telegram-t/./src/components/middle/composer/hooks/useDraft.ts","webpack://telegram-t/./src/components/middle/composer/hooks/useInlineBotTooltip.ts","webpack://telegram-t/./src/components/middle/composer/hooks/useBotCommandTooltip.ts","webpack://telegram-t/./src/components/common/DeleteMessageModal.async.tsx","webpack://telegram-t/./src/components/ui/ResponsiveHoverButton.tsx","webpack://telegram-t/./src/components/middle/composer/AttachMenu.async.tsx","webpack://telegram-t/./src/components/middle/composer/SymbolMenu.async.tsx","webpack://telegram-t/./src/components/middle/composer/InlineBotTooltip.async.tsx","webpack://telegram-t/./src/components/middle/composer/MentionTooltip.async.tsx","webpack://telegram-t/./src/components/middle/composer/CustomSendMenu.async.tsx","webpack://telegram-t/./src/components/middle/composer/StickerTooltip.async.tsx","webpack://telegram-t/./src/components/middle/composer/BotCommandTooltip.async.tsx","webpack://telegram-t/./src/components/middle/composer/BotKeyboardMenu.tsx","webpack://telegram-t/./src/components/middle/composer/ComposerEmbeddedMessage.tsx","webpack://telegram-t/./src/components/middle/composer/AttachmentModal.async.tsx","webpack://telegram-t/./src/components/middle/composer/BotCommandMenu.async.tsx","webpack://telegram-t/./src/components/middle/composer/PollModal.async.tsx","webpack://telegram-t/./src/components/middle/composer/DropArea.async.tsx","webpack://telegram-t/./src/components/middle/composer/WebPagePreview.tsx","webpack://telegram-t/./src/components/common/CalendarModal.async.tsx","webpack://telegram-t/./src/components/middle/composer/Composer.tsx","webpack://telegram-t/./src/components/middle/composer/hooks/useStickerTooltip.ts","webpack://telegram-t/./src/util/insertHtmlInSelection.ts","webpack://telegram-t/./src/util/deleteLastCharacterOutsideSelection.ts","webpack://telegram-t/./src/components/middle/composer/hooks/useEditing.ts","webpack://telegram-t/./src/components/middle/MobileSearch.async.tsx","webpack://telegram-t/./src/components/middle/MessageSelectToolbar.async.tsx","webpack://telegram-t/./src/components/common/UnpinAllMessagesModal.async.tsx","webpack://telegram-t/./src/components/payment/PaymentModal.async.tsx","webpack://telegram-t/./src/components/payment/ReceiptModal.async.tsx","webpack://telegram-t/./src/components/middle/MiddleColumn.tsx","webpack://telegram-t/./src/hooks/useCustomBackground.ts","webpack://telegram-t/./src/components/right/RightHeader.tsx","webpack://telegram-t/./src/components/right/hooks/useProfileViewportIds.ts","webpack://telegram-t/./src/components/right/hooks/useProfileState.ts","webpack://telegram-t/./src/components/right/Profile.tsx","webpack://telegram-t/./src/components/right/hooks/useTransitionFixes.ts","webpack://telegram-t/./src/hooks/useCacheBuster.ts","webpack://telegram-t/./src/components/right/RightSearch.async.tsx","webpack://telegram-t/./src/components/right/management/Management.async.tsx","webpack://telegram-t/./src/components/right/StickerSearch.async.tsx","webpack://telegram-t/./src/components/right/GifSearch.async.tsx","webpack://telegram-t/./src/components/right/PollResults.async.tsx","webpack://telegram-t/./src/components/right/AddChatMembers.tsx","webpack://telegram-t/./src/components/right/RightColumn.tsx","webpack://telegram-t/./src/components/mediaViewer/MediaViewer.async.tsx","webpack://telegram-t/./src/util/download.ts","webpack://telegram-t/./src/components/main/DownloadManager.tsx","webpack://telegram-t/./src/components/main/Notifications.async.tsx","webpack://telegram-t/./src/components/main/Dialogs.async.tsx","webpack://telegram-t/./src/components/main/ForwardPicker.async.tsx","webpack://telegram-t/./src/components/main/SafeLinkModal.async.tsx","webpack://telegram-t/./src/components/main/HistoryCalendar.async.tsx","webpack://telegram-t/./src/components/calls/group/GroupCall.async.tsx","webpack://telegram-t/./src/components/calls/ActiveCallHeader.async.tsx","webpack://telegram-t/./src/components/main/Main.tsx","webpack://telegram-t/./src/bundles/main.ts"],"sourcesContent":["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';\nimport { GlobalState } from '../../../global/types';\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', closeLocalTextSearch);\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\nexport function closeLocalTextSearch(global: GlobalState): GlobalState {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return global;\n }\n\n global = updateLocalTextSearch(global, chatId, threadId, false);\n global = replaceLocalTextSearchResults(global, chatId, threadId, undefined);\n return global;\n}\n","import { addReducer, setGlobal } from '../../../lib/teact/teactn';\n\nimport {\n exitMessageSelectMode, replaceThreadParam, updateCurrentMessageList,\n} from '../../reducers';\nimport { selectCurrentMessageList } from '../../selectors';\nimport { closeLocalTextSearch } from './localSearch';\n\naddReducer('openChat', (global, actions, payload) => {\n const {\n id, threadId = -1, type = 'thread', shouldReplaceHistory = false,\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 = replaceThreadParam(global, id, threadId, 'replyStack', []);\n global = exitMessageSelectMode(global);\n global = closeLocalTextSearch(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\n return updateCurrentMessageList(global, id, threadId, type, shouldReplaceHistory);\n});\n\naddReducer('openPreviousChat', (global) => {\n return updateCurrentMessageList(global, undefined);\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\naddReducer('setNewChatMembersDialogState', (global, actions, payload) => {\n return {\n ...global,\n newChatMembersProgress: payload,\n };\n});\n\naddReducer('openNextChat', (global, actions, payload) => {\n const { targetIndexDelta, orderedIds } = payload;\n\n const { chatId } = selectCurrentMessageList(global) || {};\n\n if (!chatId) {\n actions.openChat({ id: orderedIds[0] });\n return;\n }\n\n const position = orderedIds.indexOf(chatId);\n\n if (position === -1) {\n return;\n }\n const nextId = orderedIds[position + targetIndexDelta];\n\n actions.openChat({ id: nextId, shouldReplaceHistory: true });\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiMessage, MAIN_THREAD_ID } from '../../../api/types';\nimport { FocusDirection } from '../../../types';\n\nimport {\n ANIMATION_END_DELAY,\n APP_VERSION,\n FAST_SMOOTH_MAX_DURATION,\n SERVICE_NOTIFICATIONS_USER_ID,\n} from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\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 selectIsViewportNewest,\n selectReplyingToId,\n selectReplyStack,\n} from '../../selectors';\nimport { findLast } from '../../../util/iteratees';\nimport { getServerTime } from '../../../util/serverTime';\n\n// @ts-ignore\nimport versionNotification from '../../../versionNotification.txt';\nimport parseMessageInput from '../../../util/parseMessageInput';\n\nconst FOCUS_DURATION = 1500;\nconst FOCUS_NO_HIGHLIGHT_DURATION = FAST_SMOOTH_MAX_DURATION + ANIMATION_END_DELAY;\nconst POLL_RESULT_OPEN_DELAY_MS = 450;\nconst SERVICE_NOTIFICATIONS_MAX_AMOUNT = 1e3;\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('replyToNextMessage', (global, actions, payload) => {\n const { targetIndexDelta } = payload;\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return;\n }\n\n const chatMessages = selectChatMessages(global, chatId);\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (!chatMessages || !viewportIds) {\n return;\n }\n\n const replyingToId = selectReplyingToId(global, chatId, threadId);\n const isLatest = selectIsViewportNewest(global, chatId, threadId);\n\n let messageId: number | undefined;\n\n if (!isLatest || !replyingToId) {\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n\n messageId = chat?.lastMessage?.id;\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n\n messageId = threadInfo?.lastMessageId;\n }\n } else {\n const chatMessageKeys = Object.keys(chatMessages);\n const indexOfCurrent = chatMessageKeys.indexOf(replyingToId.toString());\n const newIndex = indexOfCurrent + targetIndexDelta;\n messageId = newIndex <= chatMessageKeys.length + 1 && newIndex >= 0\n ? Number(chatMessageKeys[newIndex])\n : undefined;\n }\n actions.setReplyingToId({ messageId });\n actions.focusMessage({\n chatId, threadId, messageId,\n });\n});\n\naddReducer('openMediaViewer', (global, actions, payload) => {\n const {\n chatId, threadId, messageId, avatarOwnerId, profilePhotoIndex, origin,\n } = payload!;\n\n return {\n ...global,\n mediaViewer: {\n chatId,\n threadId,\n messageId,\n avatarOwnerId,\n profilePhotoIndex,\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, origin, volume, playbackRate, isMuted,\n } = payload!;\n\n return {\n ...global,\n audioPlayer: {\n chatId,\n threadId,\n messageId,\n origin: origin ?? global.audioPlayer.origin,\n volume: volume ?? global.audioPlayer.volume,\n playbackRate: playbackRate || global.audioPlayer.playbackRate,\n isMuted: isMuted || global.audioPlayer.isMuted,\n },\n };\n});\n\naddReducer('setAudioPlayerVolume', (global, actions, payload) => {\n const {\n volume,\n } = payload!;\n\n return {\n ...global,\n audioPlayer: {\n ...global.audioPlayer,\n volume,\n },\n };\n});\n\naddReducer('setAudioPlayerPlaybackRate', (global, actions, payload) => {\n const {\n playbackRate,\n } = payload!;\n\n return {\n ...global,\n audioPlayer: {\n ...global.audioPlayer,\n playbackRate,\n },\n };\n});\n\naddReducer('setAudioPlayerMuted', (global, actions, payload) => {\n const {\n isMuted,\n } = payload!;\n\n return {\n ...global,\n audioPlayer: {\n ...global.audioPlayer,\n isMuted,\n },\n };\n});\n\naddReducer('setAudioPlayerOrigin', (global, actions, payload) => {\n const {\n origin,\n } = payload!;\n\n return {\n ...global,\n audioPlayer: {\n ...global.audioPlayer,\n origin,\n },\n };\n});\n\naddReducer('closeAudioPlayer', (global) => {\n return {\n ...global,\n audioPlayer: {\n volume: global.audioPlayer.volume,\n playbackRate: global.audioPlayer.playbackRate,\n isMuted: global.audioPlayer.isMuted,\n },\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?.lastMessage?.id;\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n\n lastMessageId = threadInfo?.lastMessageId;\n }\n\n if (!lastMessageId) {\n return;\n }\n\n actions.focusMessage({\n chatId, threadId, messageId: lastMessageId, noHighlight: true,\n });\n});\n\naddReducer('focusNextReply', (global, actions) => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n const { chatId, threadId } = currentMessageList;\n\n const replyStack = selectReplyStack(global, chatId, threadId);\n\n if (!replyStack || replyStack.length === 0) {\n actions.focusLastMessage();\n } else {\n const messageId = replyStack.pop();\n\n global = replaceThreadParam(global, chatId, threadId, 'replyStack', [...replyStack]);\n\n setGlobal(global);\n\n actions.focusMessage({\n chatId,\n threadId,\n messageId,\n });\n }\n\n return undefined;\n});\n\naddReducer('focusMessage', (global, actions, payload) => {\n const {\n chatId, threadId = MAIN_THREAD_ID, messageListType = 'thread', noHighlight, groupedId, groupedChatId,\n replyMessageId, isResizingContainer,\n } = payload!;\n\n let { messageId } = payload!;\n\n if (groupedId !== undefined) {\n const ids = selectForwardedMessageIdsByGroupId(global, groupedChatId, groupedId);\n if (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 }, noHighlight ? FOCUS_NO_HIGHLIGHT_DURATION : FOCUS_DURATION);\n\n global = updateFocusedMessage(global, chatId, messageId, noHighlight, isResizingContainer);\n global = updateFocusDirection(global, undefined);\n\n if (replyMessageId) {\n const replyStack = selectReplyStack(global, chatId, threadId) || [];\n global = replaceThreadParam(global, chatId, threadId, 'replyStack', [...replyStack, replyMessageId]);\n }\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 actions.exitMessageSelectMode();\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('cancelMessageMediaDownload', (global, actions, payload) => {\n const { message } = payload!;\n\n const byChatId = global.activeDownloads.byChatId[message.chatId];\n if (!byChatId || !byChatId.length) return;\n\n setGlobal({\n ...global,\n activeDownloads: {\n byChatId: {\n ...global.activeDownloads.byChatId,\n [message.chatId]: byChatId.filter((id) => id !== message.id),\n },\n },\n });\n});\n\naddReducer('downloadMessageMedia', (global, actions, payload) => {\n const { message } = payload!;\n if (!message) return;\n\n setGlobal({\n ...global,\n activeDownloads: {\n byChatId: {\n ...global.activeDownloads.byChatId,\n [message.chatId]: [...(global.activeDownloads.byChatId[message.chatId] || []), message.id],\n },\n },\n });\n});\n\naddReducer('downloadSelectedMessages', (global, actions) => {\n if (!global.selectedMessages) {\n return;\n }\n\n const { chatId, messageIds } = global.selectedMessages;\n const { threadId } = selectCurrentMessageList(global) || {};\n\n const chatMessages = selectChatMessages(global, chatId);\n if (!chatMessages || !threadId) return;\n const messages = messageIds.map((id) => chatMessages[id])\n .filter((message) => selectAllowedMessageActions(global, message, threadId).canDownload);\n messages.forEach((message) => actions.downloadMessageMedia({ message }));\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;\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n\n global = toggleMessageSelection(\n global, chatId, threadId, messageListType, messageId, groupedId, childMessageIds, withShift,\n );\n\n setGlobal(global);\n\n if (global.shouldShowContextMenuHint) {\n actions.disableContextMenuHint();\n actions.showNotification({\n // eslint-disable-next-line max-len\n message: `To **edit** or **reply**, close this menu. Then ${IS_TOUCH_ENV ? 'long tap' : 'right click'} on a message.`,\n });\n }\n});\n\naddReducer('disableContextMenuHint', (global) => {\n if (!global.shouldShowContextMenuHint) {\n return undefined;\n }\n\n return {\n ...global,\n shouldShowContextMenuHint: false,\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\naddReducer('checkVersionNotification', (global, actions) => {\n const currentVersion = APP_VERSION.split('.').slice(0, 2).join('.');\n const { serviceNotifications } = global;\n\n if (serviceNotifications.find(({ version }) => version === currentVersion)) {\n return;\n }\n\n const message: Omit = {\n chatId: SERVICE_NOTIFICATIONS_USER_ID,\n date: getServerTime(global.serverTimeOffset),\n content: {\n text: parseMessageInput(versionNotification),\n },\n isOutgoing: false,\n };\n\n actions.createServiceNotification({\n message,\n version: currentVersion,\n });\n});\n\naddReducer('createServiceNotification', (global, actions, payload) => {\n const { message, version } = payload;\n const { serviceNotifications } = global;\n const serviceChat = selectChat(global, SERVICE_NOTIFICATIONS_USER_ID)!;\n\n const maxId = Math.max(\n serviceChat.lastMessage?.id || 0,\n ...serviceNotifications.map(({ id }) => id),\n );\n const fractionalPart = (serviceNotifications.length + 1) / SERVICE_NOTIFICATIONS_MAX_AMOUNT;\n // The fractional ID is made of the largest integer ID and an incremented fractional part\n const id = Math.floor(maxId) + fractionalPart;\n\n message.id = id;\n\n const serviceNotification = {\n id,\n message,\n version,\n isUnread: true,\n };\n\n setGlobal({\n ...global,\n serviceNotifications: [\n ...serviceNotifications.slice(-SERVICE_NOTIFICATIONS_MAX_AMOUNT),\n serviceNotification,\n ],\n });\n\n actions.apiUpdate({\n '@type': 'newMessage',\n id: message.id,\n chatId: message.chatId,\n message,\n });\n});\n","export default \"**Telegram Web Z was updated to version alpha 1.23**\\n\\n👏 **Harder**\\n· An early version of **Video Chats** is available in all groups.\\n\\n🤩 **Better**\\n· Various UI improvements.\\n\\n🚀 **Faster**\\n· Optimized the rendering engine.\\n. Optimized rendering the chat list.\\n· Fixed memory leaks in large audio playlists.\\n\\n💪 **Stronger**\\n· Fixed videos pausing during playback.\\n· Fixed missing sounds when notifications are disabled.\\n· Fixed page refresh when listening to voice messages.\\n· Fixed incorrect track order in audio playlists.\\n· Fixed opening links without `https://` formatting.\\n· Fixed scroll jumps in new chats.\\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\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, updateUserSearch } 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\naddReducer('setUserSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n return updateUserSearch(global, {\n globalUserIds: undefined,\n localUserIds: undefined,\n fetchingStatus: Boolean(query),\n query,\n });\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\nimport { ApiError } from '../../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TABLET_COLUMN_LAYOUT } from '../../../util/environment';\nimport getReadableErrorText from '../../../util/getReadableErrorText';\nimport { selectCurrentMessageList } from '../../selectors';\nimport generateIdFor from '../../../util/generateIdFor';\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('setLeftColumnWidth', (global, actions, payload) => {\n const leftColumnWidth = payload;\n\n return {\n ...global,\n leftColumnWidth,\n };\n});\n\naddReducer('resetLeftColumnWidth', (global) => {\n return {\n ...global,\n leftColumnWidth: undefined,\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('openChat', (global) => {\n if (!IS_SINGLE_COLUMN_LAYOUT && !IS_TABLET_COLUMN_LAYOUT) {\n return undefined;\n }\n\n return {\n ...global,\n isLeftColumnShown: global.messages.messageLists.length === 0,\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 notification.localId = generateIdFor({});\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, actions, payload) => {\n const newNotifications = global.notifications.filter(({ localId }) => localId !== payload.localId);\n\n return {\n ...global,\n notifications: newNotifications,\n };\n});\n\naddReducer('showDialog', (global, actions, payload) => {\n const { data } = payload!;\n\n // Filter out errors that we don't want to show to the user\n if ('message' in data && data.hasErrorKey && !getReadableErrorText(data)) {\n return global;\n }\n\n const newDialogs = [...global.dialogs];\n if ('message' in data) {\n const existingErrorIndex = newDialogs.findIndex((err) => (err as ApiError).message === data.message);\n if (existingErrorIndex !== -1) {\n newDialogs.splice(existingErrorIndex, 1);\n }\n }\n\n newDialogs.push(data);\n\n return {\n ...global,\n dialogs: newDialogs,\n };\n});\n\naddReducer('dismissDialog', (global) => {\n const newDialogs = [...global.dialogs];\n\n newDialogs.pop();\n\n return {\n ...global,\n dialogs: newDialogs,\n };\n});\n\naddReducer('toggleSafeLinkModal', (global, actions, payload) => {\n const { url: safeLinkModalUrl } = payload;\n\n return {\n ...global,\n safeLinkModalUrl,\n };\n});\n\naddReducer('openHistoryCalendar', (global, actions, payload) => {\n const { selectedAt } = payload;\n\n return {\n ...global,\n historyCalendarSelectedAt: selectedAt,\n };\n});\n\naddReducer('closeHistoryCalendar', (global) => {\n return {\n ...global,\n historyCalendarSelectedAt: undefined,\n };\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { clearPayment, closeInvoice } from '../../reducers';\n\naddReducer('openPaymentModal', (global, actions, payload) => {\n const { chatId, messageId } = payload;\n return {\n ...global,\n payment: {\n ...global.payment,\n chatId,\n messageId,\n isPaymentModalOpen: true,\n },\n };\n});\n\naddReducer('closePaymentModal', (global) => {\n const newGlobal = clearPayment(global);\n return closeInvoice(newGlobal);\n});\n\naddReducer('addPaymentError', (global, actions, payload) => {\n const { error } = payload!;\n\n return {\n ...global,\n payment: {\n ...global.payment,\n error,\n },\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, SERVICE_NOTIFICATIONS_USER_ID } from '../../../config';\nimport { IS_IOS } from '../../../util/environment';\nimport { callApi, cancelApiProgress } from '../../../api/gramjs';\nimport {\n areSortedArraysIntersecting, buildCollectionByKey, split, unique,\n} 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 updateChat,\n updateThreadUnreadFromForwardedMessage,\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 selectFirstUnreadId,\n} from '../../selectors';\nimport { debounce, rafPromise } from '../../../util/schedulers';\nimport { isServiceNotificationMessage } from '../../helpers';\n\nconst uploadProgressCallbacks = new Map();\n\nconst runDebouncedForMarkRead = debounce((cb) => cb(), 500, false);\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 {\n chatId, messageId, replyOriginForId, threadUpdate,\n } = payload!;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n (async () => {\n const message = await loadMessage(chat, messageId, replyOriginForId);\n if (message && threadUpdate) {\n const { lastMessageId, isDeleting } = threadUpdate;\n\n setGlobal(updateThreadUnreadFromForwardedMessage(\n getGlobal(),\n message,\n chatId,\n lastMessageId,\n isDeleting,\n ));\n }\n })();\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 { serverTimeOffset } = global;\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, noWebPage: selectNoWebPage(global, chatId, threadId), serverTimeOffset,\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 global = replaceThreadParam(global, chatId, threadId, 'draft', draft);\n global = updateChat(global, chatId, { draftDate: Math.round(Date.now() / 1000) });\n\n return global;\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 global = replaceThreadParam(global, chatId, threadId, 'draft', undefined);\n global = updateChat(global, chatId, { draftDate: undefined });\n\n return global;\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 (async () => {\n const { chatId, shouldDeleteForAll } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const maxId = chat.lastMessage?.id;\n\n await callApi('deleteHistory', { chat, shouldDeleteForAll, maxId });\n\n const activeChat = selectCurrentMessageList(global);\n if (activeChat && activeChat.chatId === chatId) {\n actions.openChat({ id: undefined });\n }\n })();\n});\n\naddReducer('reportMessages', (global, actions, payload) => {\n (async () => {\n const {\n messageIds, reason, description,\n } = 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 const result = await callApi('reportMessages', {\n peer: chat, messageIds, reason, description,\n });\n\n actions.showNotification({\n message: result\n ? 'Thank you! Your report will be reviewed by our team.'\n : 'Error occured while submiting report. Please, try again later.',\n });\n })();\n});\n\naddReducer('markMessageListRead', (global, actions, payload) => {\n const { serverTimeOffset } = global;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n const { chatId, threadId } = currentMessageList;\n const chat = selectThreadOriginChat(global, chatId, threadId);\n if (!chat) {\n return undefined;\n }\n\n const { maxId } = payload!;\n\n runDebouncedForMarkRead(() => {\n void callApi('markMessageListRead', {\n serverTimeOffset, chat, threadId, maxId,\n });\n });\n\n // TODO Support local marking read for threads\n if (threadId !== MAIN_THREAD_ID) {\n return undefined;\n }\n\n if (chatId === SERVICE_NOTIFICATIONS_USER_ID) {\n global = {\n ...global,\n serviceNotifications: global.serviceNotifications.map((notification) => {\n return notification.isUnread && notification.id <= maxId ? { ...notification, isUnread: false } : notification;\n }),\n };\n }\n\n const viewportIds = selectViewportIds(global, chatId, threadId);\n const minId = selectFirstUnreadId(global, chatId, threadId);\n if (!viewportIds || !minId || !chat.unreadCount) {\n return global;\n }\n\n const readCount = countSortedIds(viewportIds!, minId, maxId);\n if (!readCount) {\n return global;\n }\n\n return updateChat(global, chatId, {\n lastReadInboxMessageId: maxId,\n unreadCount: Math.max(0, chat.unreadCount - readCount),\n });\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, action, payload) => {\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) {\n return;\n }\n\n const { isSilent, scheduledAt } = payload;\n\n const realMessages = messages.filter((m) => !isServiceNotificationMessage(m));\n if (realMessages.length) {\n void callApi('forwardMessages', {\n fromChat,\n toChat,\n messages: realMessages,\n serverTimeOffset: getGlobal().serverTimeOffset,\n isSilent,\n scheduledAt,\n });\n }\n\n messages\n .filter((m) => isServiceNotificationMessage(m))\n .forEach((message) => {\n const { text, entities } = message.content.text || {};\n const { sticker, poll } = message.content;\n\n void sendMessage({\n chat: toChat,\n text,\n entities,\n sticker,\n poll,\n isSilent,\n scheduledAt,\n });\n });\n\n setGlobal({\n ...getGlobal(),\n forwardMessages: {},\n });\n});\n\naddReducer('loadScheduledHistory', (global, actions, payload) => {\n const { chatId } = payload;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void loadScheduledHistory(chat);\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,\n } = result;\n\n let global = getGlobal();\n\n const localMessages = chatId === SERVICE_NOTIFICATIONS_USER_ID\n ? global.serviceNotifications.map(({ message }) => message)\n : [];\n const allMessages = ([] as ApiMessage[]).concat(messages, localMessages);\n const byId = buildCollectionByKey(allMessages, 'id');\n const ids = Object.keys(byId).map(Number);\n\n global = addChatMessagesById(global, chatId, byId);\n global = isOutlying\n ? updateOutlyingIds(global, chatId, threadId, ids)\n : updateListedIds(global, chatId, threadId, ids);\n\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = addChats(global, buildCollectionByKey(chats, 'id'));\n global = updateThreadInfos(global, chatId, threadInfos);\n\n let listedIds = selectListedIds(global, chatId, threadId);\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n\n if (isOutlying && listedIds && outlyingIds) {\n if (!outlyingIds.length || 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 undefined;\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 undefined;\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 return result.message;\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 serverTimeOffset?: number;\n isSilent?: boolean;\n scheduledAt?: number;\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 || IS_IOS) {\n await rafPromise();\n }\n\n const global = getGlobal();\n params.serverTimeOffset = global.serverTimeOffset;\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\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 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]: unique([\n ...(!shouldResetVoters && voters && voters[option] ? voters[option] : []),\n ...(result && result.users.map((user) => user.id)),\n ]),\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\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) {\n const result = await callApi('fetchScheduledHistory', { chat });\n if (!result) {\n return;\n }\n\n const { 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);\n global = replaceThreadParam(global, chat.id, MAIN_THREAD_ID, 'scheduledIds', ids);\n setGlobal(global);\n}\n\nfunction countSortedIds(ids: number[], from: number, to: number) {\n let count = 0;\n\n for (let i = 0, l = ids.length; i < l; i++) {\n if (ids[i] >= from && ids[i] <= to) {\n count++;\n }\n\n if (ids[i] >= to) {\n break;\n }\n }\n\n return count;\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../api/types';\nimport { LangCode } from '../../../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('loadGreetingStickers', (global) => {\n const { hash } = global.stickers.greeting || {};\n\n (async () => {\n const greeting = await callApi('fetchStickersForEmoji', { emoji: '👋⭐️', hash });\n\n if (!greeting) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal({\n ...newGlobal,\n stickers: {\n ...newGlobal.stickers,\n greeting: {\n hash: greeting.hash,\n stickers: greeting.stickers.filter((sticker) => sticker.emoji === '👋'),\n },\n },\n });\n })();\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, stickerSetShortName } = payload!;\n let { stickerSetAccessHash } = payload!;\n\n if (!stickerSetAccessHash && !stickerSetShortName) {\n const stickerSet = selectStickerSet(global, stickerSetId);\n if (!stickerSet) {\n return;\n }\n\n stickerSetAccessHash = stickerSet.accessHash;\n }\n\n void loadStickers(stickerSetId, stickerSetAccessHash, stickerSetShortName);\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\naddReducer('loadEmojiKeywords', (global, actions, payload: { language: LangCode }) => {\n const { language } = payload;\n\n let currentEmojiKeywords = global.emojiKeywords[language];\n if (currentEmojiKeywords?.isLoading) {\n return;\n }\n\n setGlobal({\n ...global,\n emojiKeywords: {\n ...global.emojiKeywords,\n [language]: {\n ...currentEmojiKeywords,\n isLoading: true,\n },\n },\n });\n\n (async () => {\n const emojiKeywords = await callApi('fetchEmojiKeywords', {\n language,\n fromVersion: currentEmojiKeywords ? currentEmojiKeywords.version : 0,\n });\n\n global = getGlobal();\n currentEmojiKeywords = global.emojiKeywords[language];\n\n if (!emojiKeywords) {\n setGlobal({\n ...global,\n emojiKeywords: {\n ...global.emojiKeywords,\n [language]: {\n ...currentEmojiKeywords,\n isLoading: false,\n },\n },\n });\n\n return;\n }\n\n setGlobal({\n ...global,\n emojiKeywords: {\n ...global.emojiKeywords,\n [language]: {\n isLoading: false,\n version: emojiKeywords.version,\n keywords: {\n ...(currentEmojiKeywords?.keywords),\n ...emojiKeywords.keywords,\n },\n },\n },\n });\n })();\n});\n\nasync function loadStickerSets(hash?: string) {\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?: string) {\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?: string) {\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?: string) {\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, stickerSetShortName?: string) {\n const stickerSet = await callApi(\n 'fetchStickers',\n { stickerSetShortName, stickerSetId, accessHash },\n );\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\naddReducer('openStickerSetShortName', (global, actions, payload) => {\n const { stickerSetShortName } = payload!;\n return {\n ...global,\n openedStickerSetShortName: stickerSetShortName,\n };\n});\n\nasync function searchStickers(query: string, hash?: string) {\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?: string) {\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?: string) {\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?.[type as ApiGlobalMessageSearchType])?.nextOffsetId;\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 });\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 chatIds: localChats.map(({ id }) => id),\n userIds: localUsers.map(({ id }) => id),\n },\n globalResults: {\n ...global.globalSearch.globalResults,\n chatIds: globalChats.map(({ id }) => id),\n userIds: globalUsers.map(({ id }) => id),\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, 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?.nextOffsetId;\n\n let topMessageId: number | undefined;\n if (threadId !== MAIN_THREAD_ID) {\n const threadInfo = selectThreadInfo(global, chatId!, threadId);\n topMessageId = threadInfo?.topMessageId;\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?.nextOffsetId;\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, getGlobal, setGlobal, getDispatch,\n} from '../../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiFormattedText, ApiMessage, ApiUser, MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport {\n CHAT_LIST_LOAD_SLICE, DEBUG, MESSAGE_LIST_SLICE, SERVICE_NOTIFICATIONS_USER_ID,\n} from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { updateAppBadge } from '../../../util/appBadge';\nimport {\n replaceChatListIds,\n replaceChats,\n replaceUsers,\n updateUsers,\n updateChats,\n updateChatListSecondaryInfo,\n updateThreadInfos,\n replaceThreadParam,\n updateListedIds,\n safeReplaceViewportIds,\n addChatMessagesById,\n} from '../../reducers';\nimport {\n selectUser,\n selectChat,\n selectCurrentMessageList,\n selectDraft,\n selectChatMessage,\n selectThreadInfo,\n selectCountNotMutedUnread,\n selectLastServiceNotification,\n} from '../../selectors';\nimport { isUserId } 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 updateAppBadge(selectCountNotMutedUnread(getGlobal()));\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH AFTER-SYNC');\n }\n}\n\nasync function loadAndReplaceChats() {\n let global = getGlobal();\n\n const result = await callApi('fetchChats', {\n limit: CHAT_LIST_LOAD_SLICE,\n withPinned: true,\n serverTimeOffset: global.serverTimeOffset,\n lastLocalServiceMessage: selectLastServiceNotification(global)?.message,\n });\n\n if (!result) {\n return undefined;\n }\n\n 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 (isUserId(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).forEach((chatId) => {\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'draft', result.draftsById[chatId]);\n });\n\n Object.keys(result.replyingToById).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 serverTimeOffset: getGlobal().serverTimeOffset,\n });\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, threadId: currentThreadId } = selectCurrentMessageList(global) || {};\n\n // Memoize drafts\n const draftChatIds = Object.keys(global.messages.byChatId);\n const draftsByChatId = draftChatIds.reduce>((acc, chatId) => {\n const draft = selectDraft(global, chatId, MAIN_THREAD_ID);\n if (draft) {\n acc[chatId] = draft;\n }\n\n return 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 const threadInfo = currentThreadId && selectThreadInfo(global, currentChatId, currentThreadId);\n\n if (result && newCurrentChatId === currentChatId) {\n const currentMessageListInfo = global.messages.byChatId[currentChatId];\n const localMessages = currentChatId === SERVICE_NOTIFICATIONS_USER_ID\n ? global.serviceNotifications.map(({ message }) => message)\n : [];\n const allMessages = ([] as ApiMessage[]).concat(result.messages, localMessages);\n const byId = buildCollectionByKey(allMessages, 'id');\n const listedIds = Object.keys(byId).map(Number);\n\n global = {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {},\n },\n };\n\n global = addChatMessagesById(global, currentChatId, byId);\n global = updateListedIds(global, currentChatId, MAIN_THREAD_ID, listedIds);\n global = safeReplaceViewportIds(global, currentChatId, MAIN_THREAD_ID, listedIds);\n\n if (currentThreadId && threadInfo && threadInfo.originChannelId) {\n const { originChannelId } = threadInfo;\n const currentMessageListInfoOrigin = global.messages.byChatId[originChannelId];\n const resultOrigin = await loadTopMessages(global.chats.byId[originChannelId]);\n if (resultOrigin) {\n const byIdOrigin = buildCollectionByKey(resultOrigin.messages, 'id');\n const listedIdsOrigin = Object.keys(byIdOrigin).map(Number);\n\n global = {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {\n ...global.messages.byChatId,\n [threadInfo.originChannelId]: {\n byId: byIdOrigin,\n threadsById: {\n [MAIN_THREAD_ID]: {\n ...(currentMessageListInfoOrigin?.threadsById[MAIN_THREAD_ID]),\n listedIds: listedIdsOrigin,\n viewportIds: listedIdsOrigin,\n outlyingIds: undefined,\n },\n },\n },\n [currentChatId]: {\n ...global.messages.byChatId[currentChatId],\n threadsById: {\n ...global.messages.byChatId[currentChatId].threadsById,\n [currentThreadId]: {\n ...(currentMessageListInfo?.threadsById[currentThreadId]),\n outlyingIds: undefined,\n },\n },\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).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 const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n if (audioChatId && audioMessageId && !selectChatMessage(global, audioChatId, audioMessageId)) {\n getDispatch().closeAudioPlayer();\n }\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 { ApiUser } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\nimport { debounce, throttle } from '../../../util/schedulers';\nimport { buildCollectionByKey, pick, unique } from '../../../util/iteratees';\nimport { isUserBot, isUserId } from '../../helpers';\nimport { callApi } from '../../../api/gramjs';\nimport { selectChat, selectCurrentMessageList, selectUser } from '../../selectors';\nimport {\n addChats, addUsers, updateChat, updateManagementProgress, updateUser, updateUsers,\n updateUserSearch, updateUserSearchFetchingStatus,\n} from '../../reducers';\nimport { getServerTime } from '../../../util/serverTime';\n\nconst runDebouncedForFetchFullUser = debounce((cb) => cb(), 500, false, true);\nconst TOP_PEERS_REQUEST_COOLDOWN = 60; // 1 min\nconst runThrottledForSearch = throttle((cb) => cb(), 500, false);\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 { topPeers: { lastRequestedAt } } = global;\n\n if (!lastRequestedAt || getServerTime(global.serverTimeOffset) - lastRequestedAt > TOP_PEERS_REQUEST_COOLDOWN) {\n void loadTopUsers();\n }\n});\n\naddReducer('loadContactList', () => {\n void loadContactList();\n});\n\naddReducer('loadCurrentUser', () => {\n void callApi('fetchCurrentUser');\n});\n\naddReducer('loadCommonChats', (global) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n const user = chatId ? selectUser(global, chatId) : undefined;\n if (!user || isUserBot(user) || user.commonChats?.isFullyLoaded) {\n return;\n }\n\n (async () => {\n const maxId = user.commonChats?.maxId;\n const result = await callApi('fetchCommonChats', user.id, user.accessHash!, maxId);\n if (!result) {\n return;\n }\n\n const { chats, chatIds, isFullyLoaded } = result;\n\n global = getGlobal();\n if (chats.length) {\n global = addChats(global, buildCollectionByKey(chats, 'id'));\n }\n global = updateUser(global, user.id, {\n commonChats: {\n maxId: chatIds.length ? chatIds[chatIds.length - 1] : '0',\n ids: unique((user.commonChats?.ids || []).concat(chatIds)),\n isFullyLoaded,\n },\n });\n setGlobal(global);\n })();\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() {\n const result = await callApi('fetchTopUsers');\n if (!result) {\n return;\n }\n\n const { 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 userIds: ids,\n lastRequestedAt: getServerTime(global.serverTimeOffset),\n },\n };\n setGlobal(global);\n}\n\nasync function loadContactList() {\n const contactList = await callApi('fetchContactList');\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 userIds: sortedUsers.map((user) => user.id),\n },\n });\n}\n\nasync function updateContact(\n userId: string,\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 let result;\n if (user.phoneNumber) {\n result = await callApi('updateContact', { phone: user.phoneNumber, firstName, lastName });\n } else {\n const { id, accessHash } = user;\n result = await callApi('addContact', {\n id,\n accessHash,\n phoneNumber: '',\n firstName,\n lastName,\n });\n }\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: string) {\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\naddReducer('loadProfilePhotos', (global, actions, payload) => {\n const { profileId } = payload!;\n const isPrivate = isUserId(profileId);\n const user = isPrivate ? selectUser(global, profileId) : undefined;\n const chat = !isPrivate ? selectChat(global, profileId) : undefined;\n\n if (!user && !chat) {\n return;\n }\n\n (async () => {\n const result = await callApi('fetchProfilePhotos', user, chat);\n if (!result || !result.photos) {\n return;\n }\n\n let newGlobal = getGlobal();\n if (isPrivate) {\n newGlobal = updateUser(newGlobal, profileId, { photos: result.photos });\n } else {\n newGlobal = addUsers(newGlobal, buildCollectionByKey(result.users!, 'id'));\n newGlobal = updateChat(newGlobal, profileId, { photos: result.photos });\n }\n\n setGlobal(newGlobal);\n })();\n});\n\naddReducer('setUserSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n if (!query) return;\n\n void runThrottledForSearch(() => {\n searchUsers(query);\n });\n});\n\naddReducer('addContact', (global, actions, payload) => {\n const { userId } = payload!;\n const user = selectUser(global, userId);\n if (!user) {\n return;\n }\n\n void callApi('addContact', pick(user, ['id', 'accessHash', 'firstName', 'lastName', 'phoneNumber']));\n});\n\nasync function searchUsers(query: string) {\n const result = await callApi('searchChats', { query });\n\n let global = getGlobal();\n const currentSearchQuery = global.userSearch.query;\n\n if (!result || !currentSearchQuery || (query !== currentSearchQuery)) {\n setGlobal(updateUserSearchFetchingStatus(global, false));\n return;\n }\n\n const { localUsers, globalUsers } = result;\n\n let localUserIds;\n let globalUserIds;\n if (localUsers.length) {\n global = addUsers(global, buildCollectionByKey(localUsers, 'id'));\n localUserIds = localUsers.map(({ id }) => id);\n }\n if (globalUsers.length) {\n global = addUsers(global, buildCollectionByKey(globalUsers, 'id'));\n globalUserIds = globalUsers.map(({ id }) => id);\n }\n\n global = updateUserSearchFetchingStatus(global, false);\n global = updateUserSearch(global, { localUserIds, globalUserIds });\n\n setGlobal(global);\n}\n","import { GlobalState } from '../../global/types';\nimport { InlineBotSettings } from '../../types';\n\nexport function replaceInlineBotSettings(\n global: GlobalState, username: string, inlineBotSettings: InlineBotSettings | false,\n): GlobalState {\n return {\n ...global,\n inlineBots: {\n ...global.inlineBots,\n byUsername: {\n ...global.inlineBots.byUsername,\n [username]: inlineBotSettings,\n },\n },\n };\n}\n\nexport function replaceInlineBotsIsLoading(global: GlobalState, isLoading: boolean): GlobalState {\n return {\n ...global,\n inlineBots: {\n ...global.inlineBots,\n isLoading,\n },\n };\n}\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { ApiChat } from '../../../api/types';\nimport { InlineBotSettings } from '../../../types';\n\nimport {\n RE_TG_LINK, RE_TME_LINK,\n} from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport {\n selectChat, selectChatBot, selectChatMessage, selectCurrentChat, selectCurrentMessageList,\n selectReplyingToId, selectUser,\n} from '../../selectors';\nimport { addChats, addUsers, removeBlockedContact } from '../../reducers';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { debounce } from '../../../util/schedulers';\nimport { replaceInlineBotSettings, replaceInlineBotsIsLoading } from '../../reducers/bots';\nimport { getServerTime } from '../../../util/serverTime';\n\nconst TOP_PEERS_REQUEST_COOLDOWN = 60; // 1 min\nconst runDebouncedForSearch = debounce((cb) => cb(), 500, false);\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_LINK) || button.value.match(RE_TG_LINK)) {\n actions.openTelegramLink({ url: button.value });\n } else {\n actions.toggleSafeLinkModal({ url: 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({ chat, messageId });\n actions.setInvoiceMessageInfo(selectChatMessage(global, chat.id, messageId));\n actions.openPaymentModal({ chatId: chat.id, messageId });\n }\n break;\n }\n }\n});\n\naddReducer('sendBotCommand', (global, actions, payload) => {\n const { command, chatId } = payload;\n const { currentUserId } = global;\n const chat = chatId ? selectChat(global, chatId) : selectCurrentChat(global);\n const currentMessageList = selectCurrentMessageList(global);\n\n if (!currentUserId || !chat || !currentMessageList) {\n return;\n }\n\n const { threadId } = currentMessageList;\n actions.setReplyingToId({ messageId: undefined });\n actions.clearWebPagePreview({ chatId: chat.id, threadId, value: false });\n\n void sendBotCommand(chat, currentUserId, command, selectReplyingToId(global, chat.id, threadId));\n});\n\naddReducer('restartBot', (global, actions, payload) => {\n const { chatId } = payload;\n const { currentUserId } = global;\n const chat = selectCurrentChat(global);\n const bot = currentUserId && selectChatBot(global, chatId);\n if (!currentUserId || !chat || !bot) {\n return;\n }\n\n (async () => {\n const result = await callApi('unblockContact', bot.id, bot.accessHash);\n if (!result) {\n return;\n }\n\n setGlobal(removeBlockedContact(getGlobal(), bot.id));\n void sendBotCommand(chat, currentUserId, '/start');\n })();\n});\n\naddReducer('loadTopInlineBots', (global) => {\n const { lastRequestedAt } = global.topInlineBots;\n\n if (lastRequestedAt && getServerTime(global.serverTimeOffset) - lastRequestedAt < TOP_PEERS_REQUEST_COOLDOWN) {\n return;\n }\n\n (async () => {\n const result = await callApi('fetchTopInlineBots');\n if (!result) {\n return;\n }\n\n const { ids, users } = result;\n\n let newGlobal = getGlobal();\n newGlobal = addUsers(newGlobal, buildCollectionByKey(users, 'id'));\n newGlobal = {\n ...newGlobal,\n topInlineBots: {\n ...newGlobal.topInlineBots,\n userIds: ids,\n lastRequestedAt: getServerTime(global.serverTimeOffset),\n },\n };\n setGlobal(newGlobal);\n })();\n});\n\naddReducer('queryInlineBot', ((global, actions, payload) => {\n const {\n chatId, username, query, offset,\n } = payload;\n\n (async () => {\n let inlineBotData = global.inlineBots.byUsername[username];\n\n if (inlineBotData === false) {\n return;\n }\n\n if (inlineBotData === undefined) {\n const { user: inlineBot, chat } = await callApi('fetchInlineBot', { username }) || {};\n global = getGlobal();\n if (!inlineBot || !chat) {\n setGlobal(replaceInlineBotSettings(global, username, false));\n return;\n }\n\n global = addUsers(global, { [inlineBot.id]: inlineBot });\n global = addChats(global, { [chat.id]: chat });\n inlineBotData = {\n id: inlineBot.id,\n query: '',\n offset: '',\n switchPm: undefined,\n canLoadMore: true,\n results: [],\n };\n\n global = replaceInlineBotSettings(global, username, inlineBotData);\n setGlobal(global);\n }\n\n if (query === inlineBotData.query && !inlineBotData.canLoadMore) {\n return;\n }\n\n void runDebouncedForSearch(() => {\n searchInlineBot({\n username,\n inlineBotData: inlineBotData as InlineBotSettings,\n chatId,\n query,\n offset,\n });\n });\n })();\n}));\n\naddReducer('sendInlineBotResult', (global, actions, payload) => {\n const { id, queryId } = payload;\n const currentMessageList = selectCurrentMessageList(global);\n\n if (!currentMessageList || !id) {\n return;\n }\n\n const { chatId, threadId } = currentMessageList;\n\n const chat = selectChat(global, chatId)!;\n\n actions.setReplyingToId({ messageId: undefined });\n actions.clearWebPagePreview({ chatId, threadId, value: false });\n\n void callApi('sendInlineBotResult', {\n chat,\n resultId: id,\n queryId,\n replyingTo: selectReplyingToId(global, chatId, threadId),\n });\n});\n\naddReducer('resetInlineBot', (global, actions, payload) => {\n const { username } = payload;\n\n let inlineBotData = global.inlineBots.byUsername[username];\n\n if (!inlineBotData) {\n return;\n }\n\n inlineBotData = {\n id: inlineBotData.id,\n query: '',\n offset: '',\n switchPm: undefined,\n canLoadMore: true,\n results: [],\n };\n\n setGlobal(replaceInlineBotSettings(global, username, inlineBotData));\n});\n\naddReducer('startBot', (global, actions, payload) => {\n const { botId, param } = payload;\n\n const bot = selectUser(global, botId);\n if (!bot) {\n return;\n }\n\n (async () => {\n await callApi('startBot', {\n bot,\n startParam: param,\n });\n })();\n});\n\nasync function searchInlineBot({\n username,\n inlineBotData,\n chatId,\n query,\n offset,\n}: {\n username: string;\n inlineBotData: InlineBotSettings;\n chatId: string;\n query: string;\n offset?: string;\n}) {\n let global = getGlobal();\n const bot = selectUser(global, inlineBotData.id);\n const chat = selectChat(global, chatId);\n if (!bot || !chat) {\n return;\n }\n\n const shouldReplaceSettings = inlineBotData.query !== query;\n global = replaceInlineBotsIsLoading(global, true);\n global = replaceInlineBotSettings(global, username, {\n ...inlineBotData,\n query,\n ...(shouldReplaceSettings && { offset: undefined, results: [] }),\n });\n setGlobal(global);\n\n const result = await callApi('fetchInlineBotResults', {\n bot,\n chat,\n query,\n offset: shouldReplaceSettings ? undefined : offset,\n });\n\n const newInlineBotData = global.inlineBots.byUsername[username];\n global = replaceInlineBotsIsLoading(getGlobal(), false);\n if (!result || !newInlineBotData || query !== newInlineBotData.query) {\n setGlobal(global);\n return;\n }\n\n const currentIds = new Set((newInlineBotData.results || []).map((data) => data.id));\n const newResults = result.results.filter((data) => !currentIds.has(data.id));\n\n global = replaceInlineBotSettings(global, username, {\n ...newInlineBotData,\n help: result.help,\n ...(newResults.length && { isGallery: result.isGallery }),\n ...(result.switchPm && { switchPm: result.switchPm }),\n canLoadMore: result.results.length > 0 && Boolean(result.nextOffset),\n results: newInlineBotData.offset === '' || newInlineBotData.offset === result.nextOffset\n ? result.results\n : (newInlineBotData.results || []).concat(newResults),\n offset: newResults.length ? result.nextOffset : '',\n });\n\n setGlobal(global);\n}\n\nasync function sendBotCommand(chat: ApiChat, currentUserId: string, command: string, replyingTo?: number) {\n await callApi('sendMessage', {\n chat,\n text: command,\n replyingTo,\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) {\n return;\n }\n\n const { showDialog, showNotification, toggleSafeLinkModal } = getDispatch();\n const { message, alert: isError, url } = result;\n\n if (isError) {\n showDialog({ data: { message: message || 'Error' } });\n } else if (message) {\n showNotification({ message });\n } else if (url) {\n toggleSafeLinkModal({ url });\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';\nimport { ApiChat } from '../../../api/types';\n\nimport {\n selectPaymentMessageId,\n selectPaymentRequestId,\n selectProviderPublishableKey,\n selectStripeCredentials,\n selectChatMessage,\n selectPaymentChatId,\n selectChat,\n selectPaymentFormId,\n} from '../../selectors';\nimport { callApi } from '../../../api/gramjs';\nimport { getStripeError } from '../../helpers';\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 chatId = selectPaymentChatId(global);\n const chat = chatId && selectChat(global, chatId);\n const messageId = selectPaymentMessageId(global);\n if (!chat || !messageId) {\n return;\n }\n void validateRequestedInfo(chat, messageId, requestInfo, saveInfo);\n});\n\nasync function validateRequestedInfo(chat: ApiChat, messageId: number, requestInfo: any, shouldSave?: true) {\n const result = await callApi('validateRequestedInfo', {\n chat, messageId, requestInfo, shouldSave,\n });\n if (!result) {\n return;\n }\n\n const { id, shippingOptions } = result;\n if (!id) {\n return;\n }\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 { chat, messageId } = payload;\n if (!chat || !messageId) {\n return;\n }\n void getPaymentForm(chat, messageId);\n});\n\nasync function getPaymentForm(chat: ApiChat, messageId: number) {\n const result = await callApi('getPaymentForm', { chat, 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 const chat = chatId && selectChat(global, chatId);\n if (!messageId || !receiptMessageId || !chat) {\n return;\n }\n\n void getReceipt(chat, messageId, receiptMessageId);\n});\n\nasync function getReceipt(chat: ApiChat, messageId: number, receiptMessageId: number) {\n const result = await callApi('getReceipt', chat, receiptMessageId);\n if (!result) {\n return;\n }\n\n let global = getGlobal();\n const message = selectChatMessage(global, chat.id, 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 void sendStripeCredentials(data, publishableKey);\n});\n\naddReducer('sendPaymentForm', (global, actions, payload) => {\n const { shippingOptionId, saveCredentials } = payload;\n const chatId = selectPaymentChatId(global);\n const chat = chatId && selectChat(global, chatId);\n const messageId = selectPaymentMessageId(global);\n const formId = selectPaymentFormId(global);\n const requestInfoId = selectPaymentRequestId(global);\n const publishableKey = selectProviderPublishableKey(global);\n const stripeCredentials = selectStripeCredentials(global);\n if (!chat || !messageId || !publishableKey || !formId) {\n return;\n }\n\n void sendPaymentForm(chat, messageId, formId, {\n save: saveCredentials,\n data: stripeCredentials,\n }, requestInfoId, shippingOptionId);\n});\n\nasync function sendStripeCredentials(\n data: {\n cardNumber: string;\n cardholder?: string;\n expiryMonth: string;\n expiryYear: string;\n cvv: string;\n country: string;\n zip: string;\n },\n publishableKey: string,\n) {\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 chat: ApiChat,\n messageId: number,\n formId: string,\n credentials: any,\n requestedInfoId?: string,\n shippingOptionId?: string,\n) {\n const result = await callApi('sendPaymentForm', {\n chat, messageId, formId, 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, MAIN_THREAD_ID } from '../../../api/types';\n\nimport { ARCHIVED_FOLDER_ID, MAX_ACTIVE_PINNED_CHATS } from '../../../config';\nimport { pick } from '../../../util/iteratees';\nimport { closeMessageNotifications, notifyAboutNewMessage } from '../../../util/notifications';\nimport { updateAppBadge } from '../../../util/appBadge';\nimport {\n updateChat,\n updateChatListIds,\n updateChatListType,\n replaceThreadParam,\n leaveChat,\n} from '../../reducers';\nimport {\n selectChat,\n selectCommonBoxChatId,\n selectIsChatListed,\n selectChatListType,\n selectCurrentMessageList,\n selectCountNotMutedUnread,\n} from '../../selectors';\nimport { throttle } from '../../../util/schedulers';\n\nconst TYPING_STATUS_CLEAR_DELAY = 6000; // 6 seconds\n// Enough to animate and mark as read in Message List\nconst CURRENT_CHAT_UNREAD_DELAY = 1500;\n\nconst runThrottledForUpdateAppBadge = throttle((cb) => cb(), 500, true);\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'updateChat': {\n if (!update.noTopChatsRequest && !selectIsChatListed(global, update.id)) {\n // Chat can appear in dialogs list.\n actions.loadTopChats();\n }\n\n const newGlobal = updateChat(global, update.id, update.chat, update.newProfilePhoto);\n setGlobal(newGlobal);\n\n runThrottledForUpdateAppBadge(() => updateAppBadge(selectCountNotMutedUnread(getGlobal())));\n\n if (update.chat.id) {\n closeMessageNotifications({\n chatId: update.chat.id,\n lastReadInboxMessageId: update.chat.lastReadInboxMessageId,\n });\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 setGlobal(leaveChat(global, update.id));\n\n break;\n }\n\n case 'updateChatInbox': {\n setGlobal(updateChat(global, update.id, update.chat));\n\n runThrottledForUpdateAppBadge(() => updateAppBadge(selectCountNotMutedUnread(getGlobal())));\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, threadId, type: messageListType } = 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 const isActiveChat = (\n messageListType === 'thread'\n && threadId === MAIN_THREAD_ID\n && update.chatId === currentChatId\n );\n\n if (isActiveChat) {\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 updateAppBadge(selectCountNotMutedUnread(getGlobal()));\n notifyAboutNewMessage({\n chat,\n message,\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?.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?.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 case 'deleteProfilePhotos': {\n const { chatId, ids } = update;\n const chat = global.chats.byId[chatId];\n\n if (chat?.photos) {\n setGlobal(updateChat(global, chatId, {\n photos: chat.photos.filter((photo) => !ids.includes(photo.id)),\n }));\n }\n break;\n }\n\n case 'draftMessage': {\n const {\n chatId, formattedText, date, replyingToId,\n } = update;\n const chat = global.chats.byId[chatId];\n\n if (chat) {\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'draft', formattedText);\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'replyingToId', replyingToId);\n global = updateChat(global, chatId, { draftDate: date });\n\n setGlobal(global);\n }\n break;\n }\n\n case 'showInvite': {\n const { data } = update;\n\n actions.showDialog({ data });\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 updateThreadUnreadFromForwardedMessage,\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 selectViewportIds,\n selectFirstUnreadId,\n selectChat,\n selectIsChatWithBot,\n selectIsServiceChatReady,\n} from '../../selectors';\nimport { getMessageContent, isUserId, isMessageLocal } from '../../helpers';\n\nconst ANIMATION_DELAY = 350;\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'newMessage': {\n const {\n chatId, id, message, shouldForceReply,\n } = update;\n global = updateWithLocalMedia(global, chatId, id, message);\n global = updateListedAndViewportIds(global, actions, 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?.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 isResizingContainer: 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 (!isMessageLocal(message as ApiMessage)) {\n setTimeout(() => {\n let delayedGlobal = getGlobal();\n if (shouldForceReply) {\n delayedGlobal = replaceThreadParam(delayedGlobal, chatId, MAIN_THREAD_ID, 'replyingToId', id);\n }\n setGlobal(updateChatLastMessage(delayedGlobal, 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 // Scroll down if bot message height is changed with an updated inline keyboard.\n // A drawback: this will scroll down even if the previous scroll was not at bottom.\n const chat = selectChat(global, chatId);\n if (\n chat\n && !message.isOutgoing\n && chat.lastMessage?.id === message.id\n && selectIsChatWithBot(global, chat)\n && isMessageInCurrentMessageList(global, chatId, message as ApiMessage)\n && selectIsViewportNewest(global, chatId, message.threadInfo?.threadId || MAIN_THREAD_ID)\n ) {\n actions.focusLastMessage();\n }\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, actions, 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 const thread = selectThreadByMessage(global, chatId, message);\n // For some reason Telegram requires to manually mark outgoing thread messages read\n if (thread?.threadInfo) {\n actions.markMessageListRead({ maxId: message.id });\n\n global = replaceThreadParam(global, chatId, thread.threadInfo.threadId, 'threadInfo', {\n ...thread.threadInfo,\n lastMessageId: message.id,\n lastReadInboxMessageId: message.id,\n });\n }\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].sort((a, b) => b - a)\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 {\n chatId, threadId, threadInfo, firstMessageId,\n } = 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\n if (firstMessageId) {\n global = replaceThreadParam(global, chatId, threadId, 'firstMessageId', firstMessageId);\n }\n\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 && !isUserId(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 chatMessages = global.messages.byChatId[chatId];\n if (chatMessages) {\n const ids = Object.keys(chatMessages.byId).map(Number);\n deleteMessages(chatId, ids, actions, global);\n } else {\n actions.requestChatUpdate({ chatId });\n }\n\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?.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 case 'updateServiceNotification': {\n const { message } = update;\n\n if (selectIsServiceChatReady(global)) {\n actions.createServiceNotification({ message });\n }\n\n break;\n }\n }\n});\n\nfunction updateWithLocalMedia(\n global: GlobalState, chatId: string, 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 updateThreadUnread(global: GlobalState, actions: GlobalActions, message: ApiMessage, isDeleting?: boolean) {\n const { chatId } = message;\n\n const { threadInfo } = selectThreadByMessage(global, chatId, message) || {};\n\n if (!threadInfo && message.replyToMessageId) {\n const originMessage = selectChatMessage(global, chatId, message.replyToMessageId);\n if (originMessage) {\n global = updateThreadUnreadFromForwardedMessage(global, originMessage, chatId, message.id, isDeleting);\n } else {\n actions.loadMessage({\n chatId,\n messageId: message.replyToMessageId,\n threadUpdate: {\n isDeleting,\n lastMessageId: message.id,\n },\n });\n }\n }\n\n return global;\n}\n\nfunction updateListedAndViewportIds(global: GlobalState, actions: GlobalActions, message: ApiMessage) {\n const { id, chatId } = message;\n\n const { threadInfo, firstMessageId } = selectThreadByMessage(global, chatId, message) || {};\n\n const chat = selectChat(global, chatId);\n const isUnreadChatNotLoaded = chat?.unreadCount && !selectListedIds(global, chatId, MAIN_THREAD_ID);\n\n global = updateThreadUnread(global, actions, message);\n\n if (threadInfo) {\n if (firstMessageId || !isMessageLocal(message)) {\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 }\n\n global = replaceThreadParam(global, chatId, threadInfo.threadId, 'threadInfo', {\n ...threadInfo,\n lastMessageId: message.id,\n messagesCount: threadInfo.messagesCount + 1,\n });\n }\n\n if (isUnreadChatNotLoaded) {\n return global;\n }\n\n global = updateListedIds(global, chatId, MAIN_THREAD_ID, [id]);\n\n if (selectIsViewportNewest(global, chatId, MAIN_THREAD_ID)) {\n // Always keep the first unread message in the viewport list\n const firstUnreadId = selectFirstUnreadId(global, chatId, MAIN_THREAD_ID);\n const newGlobal = addViewportId(global, chatId, MAIN_THREAD_ID, id);\n const newViewportIds = selectViewportIds(newGlobal, chatId, MAIN_THREAD_ID);\n\n if (!firstUnreadId || newViewportIds!.includes(firstUnreadId)) {\n global = newGlobal;\n }\n }\n\n return global;\n}\n\nfunction updateChatLastMessage(\n global: GlobalState,\n chatId: string,\n message: ApiMessage,\n force = false,\n) {\n const { chats } = global;\n const currentLastMessage = 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: string) {\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: string | 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 global = updateThreadUnread(global, actions, message, true);\n\n const { threadInfo } = selectThreadByMessage(global, chatId, message) || {};\n if (threadInfo) {\n threadIdsToUpdate.push(threadInfo.threadId);\n }\n });\n\n setGlobal(global);\n\n setTimeout(() => {\n setGlobal(deleteChatMessages(getGlobal(), chatId, ids));\n\n unique(threadIdsToUpdate).forEach((threadId) => {\n actions.requestThreadInfoUpdate({ chatId, threadId });\n });\n }, ANIMATION_DELAY);\n\n return;\n }\n\n // Common box update\n\n const chatsIdsToUpdate: string[] = [];\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: string | 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 '../../../util/schedulers';\n\nconst STATUS_UPDATE_THROTTLE = 3000;\n\nconst flushStatusUpdatesThrottled = throttle(flushStatusUpdates, STATUS_UPDATE_THROTTLE, true);\n\nlet pendingStatusUpdates: [string, ApiUserStatus][] = [];\n\nfunction scheduleStatusUpdate(userId: string, 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 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, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\nimport { GlobalState } from '../../../global/types';\nimport { addNotifyException, updateChat, 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.shouldShowPreviews);\n }\n\n case 'updateNotifyExceptions': {\n const {\n chatId, isMuted, isSilent, shouldShowPreviews,\n } = update;\n const chat = global.chats.byId[chatId];\n\n if (chat) {\n global = updateChat(global, chatId, { isMuted });\n }\n\n setGlobal(addNotifyException(global, chatId, { isMuted, isSilent, shouldShowPreviews }));\n break;\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 { addReducer, getGlobal } from '../../../lib/teact/teactn';\nimport { ApiUpdate } from '../../../api/types';\nimport { removeGroupCall, updateGroupCall, updateGroupCallParticipant } from '../../reducers/calls';\nimport { omit } from '../../../util/iteratees';\nimport { selectChat } from '../../selectors';\nimport { updateChat } from '../../reducers';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'updateGroupCall': {\n if (update.call.connectionState === 'discarded') {\n if (global.groupCalls.activeGroupCallId) {\n actions.leaveGroupCall({ shouldRemove: true });\n return undefined;\n } else {\n return removeGroupCall(global, update.call.id);\n }\n }\n\n return updateGroupCall(global,\n update.call.id,\n omit(update.call, ['connectionState']),\n undefined,\n update.call.participantsCount);\n }\n case 'updateGroupCallChatId': {\n const chat = selectChat(global, update.chatId);\n if (chat) {\n global = updateChat(global, update.chatId, {\n fullInfo: {\n ...chat.fullInfo,\n groupCallId: update.call.id,\n },\n });\n }\n return global;\n }\n case 'updateGroupCallParticipants': {\n const { groupCallId, participants, nextOffset } = update;\n const { currentUserId } = global;\n\n // `secret-sauce` should disconnect if the participant is us but from another device\n global = getGlobal();\n participants.forEach((participant) => {\n if (participant.id) {\n global = updateGroupCallParticipant(global, groupCallId, participant.id, participant,\n !!nextOffset || currentUserId === participant.id);\n }\n });\n if (nextOffset) {\n global = updateGroupCall(global, groupCallId, {\n nextOffset,\n });\n }\n return global;\n }\n }\n\n return undefined;\n});\n","import { useEffect } from '../lib/teact/teact';\n\nimport { onBeforeUnload } from '../util/schedulers';\n\nexport default function useBeforeUnload(callback: AnyToVoidFunction) {\n useEffect(() => {\n return onBeforeUnload(callback);\n }, [callback]);\n}\n","import { useEffect } from '../lib/teact/teact';\nimport { IS_IOS, IS_PWA, IS_TOUCH_ENV } from '../util/environment';\n\nconst metaViewport = document.querySelector('meta[name=\"viewport\"]');\nconst defaultViewportContent = metaViewport?.getAttribute('content') || '';\nconst allowedZoomViewportContent = 'width=device-width, initial-scale=1, shrink-to-fit=no, viewport-fit=cover';\n\nexport default function usePreventPinchZoomGesture(isDisabled = false) {\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n return undefined;\n }\n\n if (isDisabled) {\n // Clean viewport content from values values that disable the ability to zoom a webpage\n // https://web.dev/meta-viewport/\n metaViewport?.setAttribute('content', allowedZoomViewportContent);\n return undefined;\n }\n\n metaViewport?.setAttribute('content', defaultViewportContent);\n\n // Since iOS 10 `user-scaleable=no` is disabled in Safari for iOS,\n // this is only applicable for the browser and does not apply to the PWA mode.\n // https://newbedev.com/how-do-you-disable-viewport-zooming-on-mobile-safari\n if (IS_IOS && !IS_PWA) {\n document.addEventListener('gesturestart', preventEvent);\n }\n\n return () => {\n metaViewport?.setAttribute('content', 'width=device-width, initial-scale=1, shrink-to-fit=no');\n if (IS_IOS && !IS_PWA) {\n document.removeEventListener('gesturestart', preventEvent);\n }\n };\n }, [isDisabled]);\n}\n\nfunction preventEvent(e: Event) {\n e.preventDefault();\n}\n","import { useEffect, useState } from '../lib/teact/teact';\n\nexport default function useBrowserOnline() {\n const [isOnline, setIsOnline] = useState(window.navigator.onLine);\n\n useEffect(() => {\n function handleChange() {\n setIsOnline(window.navigator.onLine);\n }\n\n window.addEventListener('online', handleChange);\n window.addEventListener('offline', handleChange);\n\n return () => {\n window.removeEventListener('offline', handleChange);\n window.removeEventListener('online', handleChange);\n };\n }, []);\n\n return isOnline;\n}\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 ANIMATION_LEVEL_MAX, APP_NAME, APP_VERSION, FEEDBACK_URL,\n} from '../../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport { isChatArchived } from '../../../modules/helpers';\nimport { formatDateToString } from '../../../util/dateFormat';\nimport { selectTheme } from '../../../modules/selectors';\nimport switchTheme from '../../../util/switchTheme';\nimport useLang from '../../../hooks/useLang';\nimport { disableHistoryBack } from '../../../hooks/useHistoryBack';\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 shouldSkipTransition?: boolean;\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?: string;\n globalSearchChatId?: string;\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 PRODUCTION_HOSTNAME = 'web.telegram.org';\nconst LEGACY_VERSION_URL = 'https://web.telegram.org/?legacy=1';\nconst WEBK_VERSION_URL = 'https://web.telegram.org/k/';\nconst PERMANENT_VERSION_KEY = 'kz_version';\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 shouldSkipTransition,\n currentUserId,\n globalSearchChatId,\n searchDate,\n theme,\n animationLevel,\n chatsById,\n openChat,\n openTipsChat,\n setGlobalSearchDate,\n setSettingOption,\n}) => {\n const lang = useLang();\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 withOtherVersions = window.location.hostname === PRODUCTION_HOSTNAME;\n\n const MainButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n onReset()}\n ariaLabel={hasMenu ? lang('AccDescrOpenMenu2') : 'Return to chat list'}\n >\n
\n \n );\n }, [hasMenu, lang, onReset, shouldSkipTransition]);\n\n const handleSearchFocus = useCallback(() => {\n if (!searchQuery) {\n onSearchQuery('');\n }\n }, [searchQuery, onSearchQuery]);\n\n const handleSelectSaved = useCallback(() => {\n openChat({ id: currentUserId, shouldReplaceHistory: true });\n }, [currentUserId, openChat]);\n\n const handleDarkModeToggle = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n const newTheme = theme === 'light' ? 'dark' : 'light';\n\n setSettingOption({ theme: newTheme });\n setSettingOption({ shouldUseSystemTheme: false });\n switchTheme(newTheme, animationLevel === ANIMATION_LEVEL_MAX);\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 handleSwitchToWebK = () => {\n localStorage.setItem(PERMANENT_VERSION_KEY, JSON.stringify('K'));\n disableHistoryBack();\n };\n\n const handleOpenTipsChat = () => {\n openTipsChat({ langCode: lang.code });\n };\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 {lang('lng_menu_night_mode')}\n \n \n \n {lang('Appearance.Animations').toLowerCase()}\n 0}\n />\n \n \n {lang('TelegramFeatures')}\n \n \n Report Bug\n \n {withOtherVersions && (\n <>\n \n Switch to K Version\n \n \n Switch to Old Version\n \n \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 { 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: selectTheme(global),\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, { memo, FC } from '../../lib/teact/teact';\n\nimport { GlobalState } from '../../global/types';\n\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from '../ui/Spinner';\n\nimport './ConnectionState.scss';\n\ntype StateProps = Pick;\n\nconst ConnectionState: FC = () => {\n const lang = useLang();\n\n return (\n
\n \n
{lang('WaitingForNetwork')}
\n
\n );\n};\n\nexport default memo(ConnectionState);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatFolder, ApiUser } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { NotifyException, NotifySettings, SettingsScreens } from '../../../types';\nimport { FolderEditDispatch } from '../../../hooks/reducers/useFoldersReducer';\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 { selectNotifyExceptions, selectNotifySettings } from '../../../modules/selectors';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport useThrottledMemo from '../../../hooks/useThrottledMemo';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\n\nimport Transition from '../../ui/Transition';\nimport TabList from '../../ui/TabList';\nimport ChatList from './ChatList';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n foldersDispatch: FolderEditDispatch;\n};\n\ntype StateProps = {\n chatsById: Record;\n usersById: Record;\n chatFoldersById: Record;\n notifySettings: NotifySettings;\n notifyExceptions?: Record;\n orderedFolderIds?: number[];\n activeChatFolder: number;\n currentUserId?: string;\n lastSyncTime?: number;\n shouldSkipHistoryAnimations?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst INFO_THROTTLE = 3000;\nconst SAVED_MESSAGES_HOTKEY = '0';\n\nconst ChatFolders: FC = ({\n chatsById,\n usersById,\n chatFoldersById,\n notifySettings,\n notifyExceptions,\n orderedFolderIds,\n activeChatFolder,\n currentUserId,\n lastSyncTime,\n shouldSkipHistoryAnimations,\n foldersDispatch,\n onScreenSelect,\n loadChatFolders,\n setActiveChatFolder,\n openChat,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const transitionRef = useRef(null);\n\n const lang = useLang();\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);\n const counters = displayedFolders.map((folder) => {\n const {\n unreadDialogsCount, hasActiveDialogs,\n } = getFolderUnreadDialogs(chatsById, usersById, folder, chatIds, notifySettings, notifyExceptions) || {};\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, notifySettings, notifyExceptions]);\n\n const folderTabs = useMemo(() => {\n if (!displayedFolders || !displayedFolders.length) {\n return undefined;\n }\n\n return [\n { title: lang.code === 'en' ? 'All' : lang('FilterAllChats') },\n ...displayedFolders.map((folder) => ({\n title: folder.title,\n ...(folderCountersById?.[folder.id]),\n })),\n ];\n }, [displayedFolders, folderCountersById, lang]);\n\n const handleSwitchTab = useCallback((index: number) => {\n setActiveChatFolder(index);\n }, [setActiveChatFolder]);\n\n // Prevent `activeTab` pointing at non-existing folder after update\n useEffect(() => {\n if (!folderTabs || !folderTabs.length) {\n return;\n }\n\n if (activeChatFolder >= folderTabs.length) {\n setActiveChatFolder(0);\n }\n }, [activeChatFolder, folderTabs, setActiveChatFolder]);\n\n useEffect(() => {\n if (!transitionRef.current || !IS_TOUCH_ENV || !folderTabs || !folderTabs.length) {\n return undefined;\n }\n\n return captureEvents(transitionRef.current, {\n selectorToPreventScroll: '.chat-list',\n onSwipe: ((e, direction) => {\n if (direction === SwipeDirection.Left) {\n setActiveChatFolder(Math.min(activeChatFolder + 1, folderTabs.length - 1));\n return true;\n } else if (direction === SwipeDirection.Right) {\n setActiveChatFolder(Math.max(0, activeChatFolder - 1));\n return true;\n }\n\n return false;\n }),\n });\n }, [activeChatFolder, folderTabs, setActiveChatFolder]);\n\n const isNotInAllTabRef = useRef();\n isNotInAllTabRef.current = activeChatFolder !== 0;\n useEffect(() => (isNotInAllTabRef.current ? captureEscKeyListener(() => {\n if (isNotInAllTabRef.current) {\n setActiveChatFolder(0);\n }\n }) : undefined), [activeChatFolder, setActiveChatFolder]);\n\n useHistoryBack(activeChatFolder !== 0, () => setActiveChatFolder(0));\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.ctrlKey && e.shiftKey && e.code.startsWith('Digit') && folderTabs) {\n const [, digit] = e.code.match(/Digit(\\d)/) || [];\n if (!digit) return;\n\n if (digit === SAVED_MESSAGES_HOTKEY) {\n openChat({ id: currentUserId, shouldReplaceHistory: true });\n return;\n }\n\n const folder = Number(digit) - 1;\n if (folder > folderTabs.length - 1) return;\n\n setActiveChatFolder(folder);\n e.preventDefault();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown, true);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, true);\n };\n });\n\n const {\n shouldRender: shouldRenderPlaceholder, transitionClassNames,\n } = useShowTransition(!orderedFolderIds, undefined, true);\n\n function renderCurrentTab(isActive: boolean) {\n const activeFolder = Object.values(chatFoldersById)\n .find(({ title }) => title === folderTabs![activeChatFolder].title);\n\n if (!activeFolder || activeChatFolder === 0) {\n return (\n \n );\n }\n\n return (\n \n );\n }\n\n return (\n
\n {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 activeChatFolder,\n },\n currentUserId,\n lastSyncTime,\n shouldSkipHistoryAnimations,\n } = global;\n\n return {\n chatsById,\n usersById,\n chatFoldersById,\n orderedFolderIds,\n lastSyncTime,\n notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\n activeChatFolder,\n currentUserId,\n shouldSkipHistoryAnimations,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadChatFolders',\n 'setActiveChatFolder',\n 'openChat',\n ]),\n)(ChatFolders));\n","import { useState } from '../lib/teact/teact';\n\nimport useThrottle from './useThrottle';\nimport useOnChange from './useOnChange';\nimport useHeavyAnimationCheck from './useHeavyAnimationCheck';\nimport useFlag from './useFlag';\n\nexport default (resolverFn: () => R, ms: number, dependencies: D) => {\n const runThrottled = useThrottle(ms, true);\n const [value, setValue] = useState();\n const [isFrozen, freeze, unfreeze] = useFlag();\n\n useHeavyAnimationCheck(freeze, unfreeze);\n\n useOnChange(() => {\n if (isFrozen) {\n return;\n }\n\n runThrottled(() => {\n setValue(resolverFn());\n });\n }, dependencies.concat([isFrozen]));\n\n return value;\n};\n","import React, { FC, memo } 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 memo(LeftSearchAsync);\n","import React, { FC, memo } 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 memo(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 {lang('NewMessageTitle')}\n \n
\n );\n};\n\nexport default memo(NewChatButton);\n","import React, {\n FC, useState, useRef, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\nimport { LeftColumnContent, SettingsScreens } from '../../../types';\nimport { FolderEditDispatch } from '../../../hooks/reducers/useFoldersReducer';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\nimport useBrowserOnline from '../../../hooks/useBrowserOnline';\nimport useFlag from '../../../hooks/useFlag';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useLang from '../../../hooks/useLang';\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';\nimport ShowTransition from '../../ui/ShowTransition';\nimport Button from '../../ui/Button';\n\nimport './LeftMain.scss';\n\ntype OwnProps = {\n content: LeftColumnContent;\n searchQuery?: string;\n searchDate?: number;\n contactsFilter: string;\n shouldSkipTransition?: boolean;\n foldersDispatch: FolderEditDispatch;\n onSearchQuery: (query: string) => void;\n onContentChange: (content: LeftColumnContent) => void;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = Pick;\n\nconst TRANSITION_RENDER_COUNT = Object.keys(LeftColumnContent).length / 2;\nconst BUTTON_CLOSE_DELAY_MS = 250;\nconst APP_OUTDATED_TIMEOUT = 3 * 24 * 60 * 60 * 1000; // 3 days\n\nlet closeTimeout: number | undefined;\n\nconst LeftMain: FC = ({\n content,\n searchQuery,\n searchDate,\n contactsFilter,\n shouldSkipTransition,\n foldersDispatch,\n onSearchQuery,\n onContentChange,\n onScreenSelect,\n onReset,\n connectionState,\n}) => {\n const [isNewChatButtonShown, setIsNewChatButtonShown] = useState(IS_TOUCH_ENV);\n\n const isBrowserOnline = useBrowserOnline();\n const isConnecting = !isBrowserOnline || connectionState === 'connectionStateConnecting';\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 const [shouldRenderUpdateButton, updateButtonClassNames, handleUpdateClick] = useAppOutdatedCheck();\n\n const lang = useLang();\n\n return (\n \n \n \n {() => }\n \n \n {(isActive) => {\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 {shouldRenderUpdateButton && (\n \n {lang('lng_update_telegram')}\n \n )}\n \n
\n );\n};\n\nfunction useAppOutdatedCheck() {\n const [isAppOutdated, markIsAppOutdated] = useFlag(false);\n\n useEffect(() => {\n const timeout = window.setTimeout(markIsAppOutdated, APP_OUTDATED_TIMEOUT);\n\n return () => {\n clearTimeout(timeout);\n };\n }, [markIsAppOutdated]);\n\n const { shouldRender, transitionClassNames } = useShowTransition(isAppOutdated);\n\n const handleUpdateClick = () => {\n window.location.reload();\n };\n\n return [shouldRender, transitionClassNames, handleUpdateClick] as const;\n}\n\nexport default withGlobal(\n (global): StateProps => pick(global, ['connectionState']),\n)(LeftMain);\n","import React, { FC, memo } 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 memo(SettingsAsync);\n","import React, { FC, memo } 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 memo(NewChatAsync);\n","import React, { FC, memo } 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 memo(ArchivedChatsAsync);\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 { LeftColumnContent, SettingsScreens } from '../../types';\n\nimport { LAYERS_ANIMATION_NAME } from '../../util/environment';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { pick } from '../../util/iteratees';\nimport useFoldersReducer from '../../hooks/reducers/useFoldersReducer';\nimport { useResize } from '../../hooks/useResize';\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 activeChatFolder: number;\n shouldSkipHistoryAnimations?: boolean;\n leftColumnWidth?: number;\n};\n\ntype DispatchProps = Pick;\n\nenum ContentType {\n Main,\n // eslint-disable-next-line @typescript-eslint/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 activeChatFolder,\n shouldSkipHistoryAnimations,\n leftColumnWidth,\n setGlobalSearchQuery,\n setGlobalSearchChatId,\n resetChatCreation,\n setGlobalSearchDate,\n loadPasswordInfo,\n clearTwoFaError,\n setLeftColumnWidth,\n resetLeftColumnWidth,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const resizeRef = useRef(null);\n const [content, setContent] = useState(LeftColumnContent.ChatList);\n const [settingsScreen, setSettingsScreen] = useState(SettingsScreens.Main);\n const [contactsFilter, setContactsFilter] = useState('');\n const [foldersState, foldersDispatch] = useFoldersReducer();\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 (content === LeftColumnContent.NewGroupStep2\n && !forceReturnToChatList\n ) {\n setContent(LeftColumnContent.NewGroupStep1);\n return;\n }\n\n if (content === LeftColumnContent.NewChannelStep2\n && !forceReturnToChatList\n ) {\n setContent(LeftColumnContent.NewChannelStep1);\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.DataStorage:\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\n case SettingsScreens.FoldersIncludedChatsFromChatList:\n case SettingsScreens.FoldersExcludedChatsFromChatList:\n setSettingsScreen(SettingsScreens.FoldersEditFolderFromChatList);\n return;\n\n case SettingsScreens.FoldersEditFolderFromChatList:\n setContent(LeftColumnContent.ChatList);\n setSettingsScreen(SettingsScreens.Main);\n return;\n default:\n break;\n }\n }\n\n if (content === LeftColumnContent.ChatList && activeChatFolder === 0) {\n setContent(LeftColumnContent.GlobalSearch);\n return;\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 }, [\n content, activeChatFolder, settingsScreen, setGlobalSearchQuery, setGlobalSearchDate, setGlobalSearchChatId,\n resetChatCreation,\n ]);\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, searchQuery, setGlobalSearchQuery]);\n\n useEffect(\n () => (content !== LeftColumnContent.ChatList || activeChatFolder === 0\n ? captureEscKeyListener(() => handleReset())\n : undefined),\n [activeChatFolder, content, handleReset],\n );\n\n useEffect(() => {\n clearTwoFaError();\n\n if (settingsScreen === SettingsScreens.Privacy) {\n loadPasswordInfo();\n }\n }, [clearTwoFaError, loadPasswordInfo, settingsScreen]);\n\n const {\n initResize, resetResize, handleMouseUp,\n } = useResize(resizeRef, setLeftColumnWidth, resetLeftColumnWidth, leftColumnWidth);\n\n const handleSettingsScreenSelect = (screen: SettingsScreens) => {\n setContent(LeftColumnContent.Settings);\n setSettingsScreen(screen);\n };\n\n return (\n \n \n {(isActive) => {\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 );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n globalSearch: {\n query,\n date,\n },\n chatFolders: {\n activeChatFolder,\n },\n shouldSkipHistoryAnimations,\n leftColumnWidth,\n } = global;\n return {\n searchQuery: query, searchDate: date, activeChatFolder, shouldSkipHistoryAnimations, leftColumnWidth,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setGlobalSearchQuery', 'setGlobalSearchChatId', 'resetChatCreation', 'setGlobalSearchDate',\n 'loadPasswordInfo', 'clearTwoFaError', 'setLeftColumnWidth', 'resetLeftColumnWidth',\n ]),\n)(LeftColumn));\n","import { RefObject } from 'react';\nimport { useState, useEffect } from '../lib/teact/teact';\nimport useFlag from './useFlag';\n\nexport const useResize = (\n elementRef: RefObject,\n onResize: (width: number) => void,\n onReset: NoneToVoidFunction,\n initialWidth?: number,\n) => {\n const [isActive, markIsActive, unmarkIsActive] = useFlag();\n const [initialMouseX, setInitialMouseX] = useState();\n const [initialElementWidth, setInitialElementWidth] = useState();\n\n useEffect(() => {\n if (!elementRef.current || !initialWidth) {\n return;\n }\n\n elementRef.current.style.width = `${initialWidth}px`;\n }, [elementRef, initialWidth]);\n\n const handleMouseUp = () => {\n document.body.classList.remove('no-selection', 'cursor-ew-resize');\n };\n\n const initResize = (event: React.MouseEvent) => {\n document.body.classList.add('no-selection', 'cursor-ew-resize');\n\n setInitialMouseX(event.clientX);\n setInitialElementWidth(elementRef.current!.offsetWidth);\n markIsActive();\n };\n\n const resetResize = (event: React.MouseEvent) => {\n event.preventDefault();\n elementRef.current!.style.width = '';\n onReset();\n };\n\n useEffect(() => {\n if (!isActive) return;\n\n const handleMouseMove = (event: MouseEvent) => {\n const newWidth = Math.ceil(initialElementWidth + event.clientX - initialMouseX);\n elementRef.current!.style.width = `${newWidth}px`;\n };\n\n const stopDrag = () => {\n handleMouseUp();\n document.removeEventListener('mousemove', handleMouseMove, false);\n document.removeEventListener('mouseup', stopDrag, false);\n document.removeEventListener('blur', stopDrag, false);\n onResize(elementRef.current!.offsetWidth);\n unmarkIsActive();\n };\n\n document.addEventListener('mousemove', handleMouseMove, false);\n document.addEventListener('mouseup', stopDrag, false);\n document.addEventListener('blur', stopDrag, false);\n }, [initialElementWidth, initialMouseX, elementRef, onResize, isActive, unmarkIsActive]);\n\n return { initResize, resetResize, handleMouseUp };\n};\n","import { useEffect, useState } from '../lib/teact/teact';\n\nimport { throttle } from '../util/schedulers';\nimport windowSize from '../util/windowSize';\nimport { ApiDimensions } from '../api/types';\n\nconst THROTTLE = 250;\n\nexport default () => {\n const [size, setSize] = useState(windowSize.get());\n\n useEffect(() => {\n const handleResize = throttle(() => {\n setSize(windowSize.get());\n }, THROTTLE, false);\n\n window.addEventListener('resize', handleResize);\n\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n }, []);\n\n return size;\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 React, { FC, memo } 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 memo(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 { ARE_CALLS_SUPPORTED, IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { pick } from '../../util/iteratees';\nimport { isChatBasicGroup, isChatChannel, isChatSuperGroup } from '../../modules/helpers';\nimport {\n selectChat,\n selectChatBot,\n selectIsUserBlocked,\n selectIsChatBotNotStarted,\n 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: string;\n threadId: number;\n messageListType: MessageListType;\n canExpandActions: boolean;\n}\n\ninterface StateProps {\n noMenu?: boolean;\n isChannel?: boolean;\n isRightColumnShown?: boolean;\n canStartBot?: boolean;\n canRestartBot?: boolean;\n canSubscribe?: boolean;\n canSearch?: boolean;\n canMute?: boolean;\n canLeave?: boolean;\n canEnterVoiceChat?: boolean;\n canCreateVoiceChat?: 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 canRestartBot,\n canSubscribe,\n canSearch,\n canMute,\n canLeave,\n canEnterVoiceChat,\n canCreateVoiceChat,\n isRightColumnShown,\n canExpandActions,\n joinChannel,\n sendBotCommand,\n openLocalTextSearch,\n restartBot,\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 handleRestartBot = useCallback(() => {\n restartBot({ chatId });\n }, [chatId, restartBot]);\n\n const handleSearchClick = useCallback(() => {\n openLocalTextSearch();\n\n if (IS_SINGLE_COLUMN_LAYOUT) {\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_SINGLE_COLUMN_LAYOUT && canExpandActions && canSubscribe && (\n \n {lang(isChannel ? 'ProfileJoinChannel' : 'ProfileJoinGroup')}\n \n )}\n {!IS_SINGLE_COLUMN_LAYOUT && canExpandActions && canStartBot && (\n \n {lang('BotStart')}\n \n )}\n {!IS_SINGLE_COLUMN_LAYOUT && canExpandActions && canRestartBot && (\n \n {lang('BotRestart')}\n \n )}\n {!IS_SINGLE_COLUMN_LAYOUT && canSearch && (\n \n \n \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?.isRestricted || selectIsInSelectMode(global)) {\n return {\n noMenu: true,\n };\n }\n\n const bot = selectChatBot(global, chatId);\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 canRestartBot = Boolean(bot && selectIsUserBlocked(global, bot.id));\n const canStartBot = !canRestartBot && 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 canLeave = isMainThread && !canSubscribe;\n const canEnterVoiceChat = ARE_CALLS_SUPPORTED && chat && chat.isCallActive;\n const canCreateVoiceChat = ARE_CALLS_SUPPORTED && chat && !chat.isCallActive\n && (chat.adminRights?.manageCall || (chat.isCreator && isChatBasicGroup(chat)));\n\n return {\n noMenu: false,\n isChannel,\n isRightColumnShown,\n canStartBot,\n canRestartBot,\n canSubscribe,\n canSearch,\n canMute,\n canLeave,\n canEnterVoiceChat,\n canCreateVoiceChat,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'joinChannel', 'sendBotCommand', 'openLocalTextSearch', 'restartBot',\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 thumbDataUri = message && getMessageMediaThumbDataUri(message);\n const sticker = message?.content?.sticker;\n const shouldDecodeThumbnail = thumbDataUri && sticker && !isWebpSupported() && thumbDataUri.includes('image/webp');\n const [thumbnailDecoded, setThumbnailDecoded] = useState(EMPTY_IMAGE_DATA_URI);\n const messageId = message?.id;\n\n useLayoutEffect(() => {\n if (!shouldDecodeThumbnail) {\n return;\n }\n\n webpToPngBase64(`b64-${messageId}`, thumbDataUri!)\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, thumbDataUri]);\n\n return shouldDecodeThumbnail ? thumbnailDecoded : thumbDataUri;\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?.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 lang = useLang();\n const mediaThumbnail = useWebpThumbnail(message);\n const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'pictogram'));\n\n const text = getMessageSummaryText(lang, 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 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","export function scaleImage(image: string | Blob, ratio: number, outputType: string = 'image/png'): Promise {\n const url = image instanceof Blob ? URL.createObjectURL(image) : image;\n const img = new Image();\n return new Promise((resolve) => {\n img.onload = () => {\n scale(img, img.width * ratio, img.height * ratio, outputType)\n .then((blob) => URL.createObjectURL(blob))\n .then(resolve)\n .finally(() => {\n if (image instanceof Blob) {\n URL.revokeObjectURL(url); // Revoke blob url that we created\n }\n });\n };\n img.src = url;\n });\n}\n\nexport function resizeImage(\n image: string | Blob, width: number, height: number, outputType: string = 'image/png',\n): Promise {\n const url = image instanceof Blob ? URL.createObjectURL(image) : image;\n const img = new Image();\n return new Promise((resolve) => {\n img.onload = () => {\n scale(img, width, height, outputType)\n .then((blob) => URL.createObjectURL(blob))\n .then(resolve)\n .finally(() => {\n if (image instanceof Blob) {\n URL.revokeObjectURL(url); // Revoke blob url that we created\n }\n });\n };\n img.src = url;\n });\n}\n\nasync function scale(\n img: HTMLImageElement, width: number, height: number, outputType: string = 'image/png',\n) {\n // Safari does not have built-in resize method with quality control\n if ('createImageBitmap' in window) {\n try {\n const bitmap = await window.createImageBitmap(img,\n { resizeWidth: width, resizeHeight: height, resizeQuality: 'high' });\n if (bitmap.height !== height || bitmap.width !== width) {\n throw new Error('Image bitmap resize not supported!'); // FF93 added support for options, but not resize\n }\n return await new Promise((res) => {\n const canvas = document.createElement('canvas');\n canvas.width = bitmap.width;\n canvas.height = bitmap.height;\n const ctx = canvas.getContext('bitmaprenderer');\n if (ctx) {\n ctx.transferFromImageBitmap(bitmap);\n } else {\n canvas.getContext('2d')!.drawImage(bitmap, 0, 0);\n }\n canvas.toBlob(res, outputType);\n });\n } catch (e) {\n // Fallback. Firefox below 93 does not recognize `createImageBitmap` with 2 parameters\n return steppedScale(img, width, height, undefined, outputType);\n }\n } else {\n return steppedScale(img, width, height, undefined, outputType);\n }\n}\n\nfunction steppedScale(\n img: HTMLImageElement, width: number, height: number, step: number = 0.5, outputType: string = 'image/png',\n): Promise {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n const oc = document.createElement('canvas');\n const octx = oc.getContext('2d')!;\n\n canvas.width = width;\n canvas.height = height;\n\n if (img.width * step > width) { // For performance avoid unnecessary drawing\n const mul = 1 / step;\n let cur = {\n width: Math.floor(img.width * step),\n height: Math.floor(img.height * step),\n };\n\n oc.width = cur.width;\n oc.height = cur.height;\n\n octx.drawImage(img, 0, 0, cur.width, cur.height);\n\n while (cur.width * step > width) {\n cur = {\n width: Math.floor(cur.width * step),\n height: Math.floor(cur.height * step),\n };\n octx.drawImage(oc, 0, 0, cur.width * mul, cur.height * mul, 0, 0, cur.width, cur.height);\n }\n\n ctx.drawImage(oc, 0, 0, cur.width, cur.height, 0, 0, canvas.width, canvas.height);\n } else {\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n }\n\n return new Promise((resolve) => {\n canvas.toBlob(resolve, outputType);\n });\n}\n","import { useMemo } from '../lib/teact/teact';\n\nimport {\n ApiAudio, ApiChat, ApiMessage, ApiUser, ApiVoice,\n} from '../api/types';\n\nimport useMedia from './useMedia';\nimport { useAsync } from './useAsync';\nimport {\n getAudioHasCover, getChatAvatarHash, getChatTitle, getMessageContent, getMessageMediaHash, getSenderTitle,\n} from '../modules/helpers';\nimport { getTranslation } from '../util/langProvider';\nimport { buildMediaMetadata } from '../util/mediaSession';\nimport { scaleImage, resizeImage } from '../util/imageResize';\nimport { AVATAR_FULL_DIMENSIONS } from '../components/common/helpers/mediaDimensions';\n\n// @ts-ignore\nimport telegramLogoPath from '../assets/telegram-logo-filled.svg';\n\nconst LOGO_DIMENSIONS = { width: 200, height: 200 };\nconst MINIMAL_SIZE = 115; // spec says 100, but on Chrome 93 it's not showing\n\n// TODO Add support for video in future\nexport default (message: ApiMessage, sender?: ApiUser | ApiChat, chat?: ApiChat): MediaMetadata | undefined => {\n const { audio, voice } = getMessageContent(message);\n const title = audio ? (audio.title || audio.fileName) : voice ? 'Voice message' : '';\n const artist = (audio && audio.performer) || (sender && getSenderTitle(getTranslation, sender));\n const album = (chat && getChatTitle(getTranslation, chat)) || 'Telegram';\n\n const audioCoverHash = (audio && getAudioHasCover(audio) && getMessageMediaHash(message, 'pictogram'));\n const avatarHash = sender && getChatAvatarHash(sender, 'big');\n const hash = (audio && audioCoverHash) || (voice && avatarHash);\n const media = useMedia(hash);\n\n const size = useMemo(() => {\n return getCoverSize(audio, voice, media);\n }, [audio, media, voice]);\n const { result: url } = useAsync(() => makeGoodArtwork(media, size), [media, size], telegramLogoPath);\n return useMemo(() => {\n return buildMediaMetadata({\n title,\n artist,\n album,\n artwork: [{ src: url }],\n });\n }, [album, artist, title, url]);\n};\n\nfunction makeGoodArtwork(url?: string, size?: { width: number; height: number }): Promise {\n if (!url) return Promise.resolve(telegramLogoPath);\n if (!size) return resizeImage(url, MINIMAL_SIZE, MINIMAL_SIZE);\n const min = Math.min(size.width, size.height);\n if (min < MINIMAL_SIZE) {\n const ratio = MINIMAL_SIZE / min;\n return scaleImage(url, ratio);\n }\n return Promise.resolve(url);\n}\n\nfunction getCoverSize(audio?: ApiAudio, voice?: ApiVoice, url?: string) {\n if (!url) return LOGO_DIMENSIONS;\n if (audio) {\n if (!audio.thumbnailSizes || audio.thumbnailSizes.length === 0) return undefined;\n const preferred = audio.thumbnailSizes.find((size) => size.type === 'm');\n return preferred || audio.thumbnailSizes[0]; // Sometimes `m` is not present\n }\n\n if (voice) {\n return AVATAR_FULL_DIMENSIONS;\n }\n\n return undefined;\n}\n","import { useEffect, useState } from '../lib/teact/teact';\n\nexport const useAsync = (fn: () => Promise, deps: any[], defaultValue?: T) => {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState();\n const [result, setResult] = useState(defaultValue);\n useEffect(() => {\n setIsLoading(true);\n let wasCancelled = false;\n fn().then((res) => {\n if (wasCancelled) return;\n setIsLoading(false);\n setResult(res);\n }, (err) => {\n if (wasCancelled) return;\n setIsLoading(false);\n setError(err);\n });\n return () => {\n wasCancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps);\n return { isLoading, error, result };\n};\n","import React, {\n FC, useCallback, useEffect, useMemo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { AudioOrigin } from '../../types';\nimport { GlobalActions } from '../../global/types';\nimport {\n ApiAudio, ApiChat, ApiMessage, ApiUser,\n} from '../../api/types';\n\nimport { IS_IOS, IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../util/environment';\n\nimport * as mediaLoader from '../../util/mediaLoader';\nimport {\n getMediaDuration, getMessageContent, getMessageMediaHash, getSenderTitle, isMessageLocal,\n} from '../../modules/helpers';\nimport { selectChat, selectSender } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\nimport { makeTrackId } from '../../util/audioPlayer';\nimport { clearMediaSession } from '../../util/mediaSession';\nimport windowSize from '../../util/windowSize';\nimport useAudioPlayer from '../../hooks/useAudioPlayer';\nimport useLang from '../../hooks/useLang';\nimport useMessageMediaMetadata from '../../hooks/useMessageMediaMetadata';\nimport renderText from '../common/helpers/renderText';\n\nimport RippleEffect from '../ui/RippleEffect';\nimport Button from '../ui/Button';\nimport RangeSlider from '../ui/RangeSlider';\n\nimport './AudioPlayer.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n origin?: AudioOrigin;\n className?: string;\n noUi?: boolean;\n};\n\ntype StateProps = {\n sender?: ApiChat | ApiUser;\n chat?: ApiChat;\n volume: number;\n playbackRate: number;\n isMuted: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst FAST_PLAYBACK_RATE = 1.8;\n\nconst AudioPlayer: FC = ({\n message,\n className,\n noUi,\n sender,\n chat,\n volume,\n playbackRate,\n isMuted,\n setAudioPlayerVolume,\n setAudioPlayerPlaybackRate,\n setAudioPlayerMuted,\n focusMessage,\n closeAudioPlayer,\n}) => {\n const lang = useLang();\n const { audio, voice, video } = getMessageContent(message);\n const isVoice = Boolean(voice || video);\n const senderName = sender ? getSenderTitle(lang, sender) : undefined;\n const mediaData = mediaLoader.getFromMemory(getMessageMediaHash(message, 'inline')!) as (string | undefined);\n const mediaMetadata = useMessageMediaMetadata(message, sender, chat);\n\n const {\n playPause,\n stop,\n isPlaying,\n requestNextTrack,\n requestPreviousTrack,\n isFirst,\n isLast,\n setVolume,\n toggleMuted,\n setPlaybackRate,\n } = useAudioPlayer(\n makeTrackId(message),\n getMediaDuration(message)!,\n isVoice ? 'voice' : 'audio',\n mediaData,\n undefined,\n mediaMetadata,\n undefined,\n true,\n undefined,\n undefined,\n isMessageLocal(message),\n true,\n );\n\n // Prevent refresh by accidentally rotating device when listening to a voice message\n const isVoicePlaying = isVoice && isPlaying;\n useEffect(() => {\n if (!isVoicePlaying) {\n return undefined;\n }\n\n windowSize.disableRefresh();\n\n return () => {\n windowSize.enableRefresh();\n };\n }, [isVoicePlaying]);\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 clearMediaSession();\n stop();\n }, [closeAudioPlayer, isPlaying, playPause, stop]);\n\n const handleVolumeChange = useCallback((value: number) => {\n setAudioPlayerVolume({ volume: value / 100 });\n setAudioPlayerMuted({ isMuted: false });\n\n setVolume(value / 100);\n }, [setAudioPlayerMuted, setAudioPlayerVolume, setVolume]);\n\n const handleVolumeClick = useCallback(() => {\n if (IS_TOUCH_ENV && !IS_IOS) return;\n toggleMuted();\n setAudioPlayerMuted({ isMuted: !isMuted });\n }, [isMuted, setAudioPlayerMuted, toggleMuted]);\n\n const handlePlaybackClick = useCallback(() => {\n if (playbackRate === 1) {\n setPlaybackRate(FAST_PLAYBACK_RATE);\n setAudioPlayerPlaybackRate({ playbackRate: FAST_PLAYBACK_RATE });\n } else {\n setPlaybackRate(1);\n setAudioPlayerPlaybackRate({ playbackRate: 1 });\n }\n }, [playbackRate, setAudioPlayerPlaybackRate, setPlaybackRate]);\n\n const volumeIcon = useMemo(() => {\n if (volume === 0 || isMuted) return 'icon-muted';\n if (volume < 0.3) return 'icon-volume-1';\n if (volume < 0.6) return 'icon-volume-2';\n return 'icon-volume-3';\n }, [volume, isMuted]);\n\n if (noUi) {\n return undefined;\n }\n\n return (\n
\n \n \n \n \n \n \n \n \n \n \n\n
\n {audio ? renderAudio(audio) : renderVoice(lang('AttachAudio'), senderName)}\n \n
\n\n \n \n {!IS_IOS && (\n <>\n
\n
\n \n
\n \n )}\n \n\n {isVoice && (\n \n \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 }): StateProps => {\n const sender = selectSender(global, message);\n const chat = selectChat(global, message.chatId);\n const { volume, playbackRate, isMuted } = global.audioPlayer;\n\n return {\n sender,\n chat,\n volume,\n playbackRate,\n isMuted,\n };\n },\n (setGlobal, actions): DispatchProps => pick(\n actions,\n ['focusMessage', 'closeAudioPlayer', 'setAudioPlayerVolume', 'setAudioPlayerPlaybackRate', 'setAudioPlayerMuted'],\n ),\n)(AudioPlayer);\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 { ApiChat, ApiGroupCall, ApiUser } from '../../../api/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectChatGroupCall } from '../../../modules/selectors/calls';\nimport buildClassName from '../../../util/buildClassName';\nimport { selectChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Avatar from '../../common/Avatar';\n\nimport './GroupCallTopPane.scss';\n\ntype OwnProps = {\n chatId: string;\n hasPinnedOffset: boolean;\n};\n\ntype StateProps = {\n groupCall?: ApiGroupCall;\n isActive: boolean;\n usersById: Record;\n chatsById: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst GroupCallTopPane: FC = ({\n chatId,\n isActive,\n groupCall,\n hasPinnedOffset,\n joinGroupCall,\n subscribeToGroupCallUpdates,\n usersById,\n chatsById,\n}) => {\n const lang = useLang();\n\n const handleJoinGroupCall = useCallback(() => {\n joinGroupCall({\n chatId,\n });\n }, [joinGroupCall, chatId]);\n\n const participants = groupCall?.participants;\n\n const fetchedParticipants = useMemo(() => {\n if (participants) {\n return Object.values(participants).filter((_, i) => i < 3).map(({ id, isUser }) => {\n if (isUser) {\n if (!usersById[id]) {\n return undefined;\n }\n return { user: usersById[id] };\n } else {\n if (!chatsById[id]) {\n return undefined;\n }\n return { chat: chatsById[id] };\n }\n }).filter(Boolean);\n } else return [];\n }, [chatsById, participants, usersById]);\n\n useEffect(() => {\n if (!groupCall?.id) return undefined;\n if (!isActive && groupCall.isLoaded) return undefined;\n\n subscribeToGroupCallUpdates({\n id: groupCall.id,\n subscribed: true,\n });\n\n return () => {\n subscribeToGroupCallUpdates({\n id: groupCall.id,\n subscribed: false,\n });\n };\n }, [groupCall?.id, groupCall?.isLoaded, isActive, subscribeToGroupCallUpdates]);\n\n if (!groupCall) return undefined;\n\n return (\n \n
\n {lang('VoipGroupVoiceChat')}\n {lang('Participants', groupCall.participantsCount || 0, 'i')}\n
\n
\n {fetchedParticipants.map((p) => {\n if (!p) return undefined;\n if (p.user) {\n return ;\n } else {\n return ;\n }\n })}\n
\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }) => {\n const chat = selectChat(global, chatId)!;\n const groupCall = selectChatGroupCall(global, chatId);\n return {\n groupCall,\n usersById: global.users.byId,\n chatsById: global.chats.byId,\n activeGroupCallId: global.groupCalls.activeGroupCallId,\n isActive: ((!groupCall ? (chat && chat.isCallNotEmpty && chat.isCallActive)\n : (groupCall.participantsCount > 0 && groupCall.isLoaded)))\n && (global.groupCalls.activeGroupCallId !== groupCall?.id),\n };\n },\n (setGlobal, actions) => pick(actions, [\n 'joinGroupCall',\n 'subscribeToGroupCallUpdates',\n ]),\n)(GroupCallTopPane));\n","import React, {\n FC, useCallback, useMemo, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\nimport cycleRestrict from '../../util/cycleRestrict';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport {\n ApiMessage,\n ApiChat,\n ApiUser,\n ApiTypingStatus,\n MAIN_THREAD_ID, ApiUpdateConnectionStateType,\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_SINGLE_COLUMN_LAYOUT, IS_TABLET_COLUMN_LAYOUT } from '../../util/environment';\nimport {\n isUserId,\n getMessageKey,\n getChatTitle,\n getSenderTitle,\n} from '../../modules/helpers';\nimport {\n selectChat,\n selectChatMessage,\n selectAllowedMessageActions,\n selectIsRightColumnShown,\n selectThreadTopMessageId,\n selectThreadInfo,\n selectChatMessages,\n selectPinnedIds,\n selectIsChatWithSelf,\n selectForwardedSender,\n selectScheduledIds,\n selectIsInSelectMode,\n selectIsChatWithBot,\n selectCountNotMutedUnread,\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';\nimport useBrowserOnline from '../../hooks/useBrowserOnline';\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';\nimport GroupCallTopPane from '../calls/group/GroupCallTopPane';\n\nimport './MiddleHeader.scss';\n\nconst ANIMATION_DURATION = 350;\nconst BACK_BUTTON_INACTIVE_TIME = 450;\n\ntype OwnProps = {\n chatId: string;\n threadId: number;\n messageListType: MessageListType;\n isReady?: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n pinnedMessageIds?: number[] | number;\n messagesById?: Record;\n canUnpin?: boolean;\n topMessageSender?: ApiChat | ApiUser;\n typingStatus?: ApiTypingStatus;\n isSelectModeActive?: boolean;\n isLeftColumnShown?: boolean;\n isRightColumnShown?: boolean;\n audioMessage?: ApiMessage;\n chatsById?: Record;\n messagesCount?: number;\n isChatWithSelf?: boolean;\n isChatWithBot?: boolean;\n lastSyncTime?: number;\n shouldSkipHistoryAnimations?: boolean;\n currentTransitionKey: number;\n connectionState?: ApiUpdateConnectionStateType;\n};\n\ntype DispatchProps = Pick;\n\nconst MiddleHeader: FC = ({\n chatId,\n threadId,\n messageListType,\n isReady,\n pinnedMessageIds,\n messagesById,\n canUnpin,\n topMessageSender,\n typingStatus,\n isSelectModeActive,\n isLeftColumnShown,\n isRightColumnShown,\n audioMessage,\n chat,\n chatsById,\n messagesCount,\n isChatWithSelf,\n isChatWithBot,\n lastSyncTime,\n shouldSkipHistoryAnimations,\n currentTransitionKey,\n connectionState,\n openChatWithInfo,\n pinMessage,\n focusMessage,\n openChat,\n openPreviousChat,\n loadPinnedMessages,\n toggleLeftColumn,\n exitMessageSelectMode,\n}) => {\n const lang = useLang();\n const isBackButtonActive = useRef(true);\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)\n ? pinnedMessageIds.length : (pinnedMessageIds ? 1 : undefined);\n const chatTitleLength = chat && getChatTitle(lang, chat).length;\n const topMessageTitle = topMessageSender ? getSenderTitle(lang, topMessageSender) : undefined;\n\n useEffect(() => {\n if (threadId === MAIN_THREAD_ID && lastSyncTime && isReady) {\n loadPinnedMessages({ chatId });\n }\n }, [chatId, loadPinnedMessages, lastSyncTime, threadId, isReady]);\n\n // Reset pinned index when switching chats and pinning/unpinning\n useEffect(() => {\n setPinnedMessageIndex(0);\n }, [pinnedMessageIds]);\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 = IS_TABLET_COLUMN_LAYOUT && 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 || 1, 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 setBackButtonActive = useCallback(() => {\n setTimeout(() => {\n isBackButtonActive.current = true;\n }, BACK_BUTTON_INACTIVE_TIME);\n }, []);\n\n const handleBackClick = useCallback((e: React.MouseEvent) => {\n if (!isBackButtonActive.current) return;\n\n // Workaround for missing UI when quickly clicking the Back button\n isBackButtonActive.current = false;\n if (IS_SINGLE_COLUMN_LAYOUT) {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID);\n if (messageInput) {\n messageInput.blur();\n }\n }\n\n if (isSelectModeActive) {\n exitMessageSelectMode();\n setBackButtonActive();\n return;\n }\n\n if (threadId === MAIN_THREAD_ID && messageListType === 'thread' && currentTransitionKey === 0) {\n if (IS_SINGLE_COLUMN_LAYOUT || shouldShowCloseButton) {\n e.stopPropagation(); // Stop propagation to prevent chat re-opening on tablets\n openChat({ id: undefined });\n } else {\n toggleLeftColumn();\n }\n\n setBackButtonActive();\n\n return;\n }\n\n openPreviousChat();\n setBackButtonActive();\n }, [\n threadId, messageListType, currentTransitionKey, isSelectModeActive, openPreviousChat, shouldShowCloseButton,\n openChat, toggleLeftColumn, exitMessageSelectMode, setBackButtonActive,\n ]);\n\n const unreadCount = useMemo(() => {\n if (!isLeftColumnHideable || !chatsById) {\n return undefined;\n }\n\n return selectCountNotMutedUnread(getGlobal()) || undefined;\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(Boolean(pinnedMessage));\n\n const renderingPinnedMessage = useCurrentOrPrev(pinnedMessage, true);\n const renderingPinnedMessagesCount = useCurrentOrPrev(pinnedMessagesCount, true);\n const renderingCanUnpin = useCurrentOrPrev(canUnpin, true);\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 isBrowserOnline = useBrowserOnline();\n const isConnecting = (!isBrowserOnline || connectionState === 'connectionStateConnecting')\n && (IS_SINGLE_COLUMN_LAYOUT || (IS_TABLET_COLUMN_LAYOUT && !shouldShowCloseButton));\n\n function renderInfo() {\n if (isConnecting) {\n return (\n <>\n {renderBackButton()}\n

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

\n \n );\n }\n return (\n messageListType === 'thread' && threadId === MAIN_THREAD_ID ? (\n renderMainThreadInfo()\n ) : messageListType === 'thread' ? (\n <>\n {renderBackButton()}\n

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

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

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

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

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

\n \n ) : undefined\n );\n }\n\n function renderMainThreadInfo() {\n return (\n <>\n {(isLeftColumnHideable || currentTransitionKey > 0) && renderBackButton(shouldShowCloseButton, true)}\n
\n {isUserId(chatId) ? (\n \n ) : (\n \n )}\n
\n \n );\n }\n\n function renderBackButton(asClose = false, withUnreadCount = false) {\n return (\n
\n \n
\n \n {withUnreadCount && unreadCount && (\n
\n {formatIntegerCompact(unreadCount)}\n
\n )}\n
\n );\n }\n\n const isAudioPlayerRendered = Boolean(shouldRenderAudioPlayer && renderingAudioMessage);\n\n return (\n
\n \n {renderInfo}\n \n\n \n\n {shouldRenderPinnedMessage && renderingPinnedMessage && (\n \n )}\n
\n {isAudioPlayerRendered && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, messageListType }): StateProps => {\n const { isLeftColumnShown, lastSyncTime, shouldSkipHistoryAnimations } = 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 let messagesCount: number | undefined;\n if (messageListType === 'pinned') {\n const pinnedIds = selectPinnedIds(global, chatId);\n messagesCount = pinnedIds?.length;\n } else if (messageListType === 'scheduled') {\n const scheduledIds = selectScheduledIds(global, chatId);\n messagesCount = scheduledIds?.length;\n } else if (messageListType === 'thread' && threadId !== MAIN_THREAD_ID) {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n messagesCount = threadInfo?.messagesCount || 0;\n }\n\n const state: StateProps = {\n typingStatus,\n isLeftColumnShown,\n isRightColumnShown: selectIsRightColumnShown(global),\n isSelectModeActive: selectIsInSelectMode(global),\n audioMessage,\n chat,\n chatsById,\n messagesCount,\n isChatWithSelf: selectIsChatWithSelf(global, chatId),\n isChatWithBot: chat && selectIsChatWithBot(global, chat),\n lastSyncTime,\n shouldSkipHistoryAnimations,\n currentTransitionKey: Math.max(0, global.messages.messageLists.length - 1),\n connectionState: global.connectionState,\n };\n\n const messagesById = selectChatMessages(global, chatId);\n if (messageListType !== 'thread' || !messagesById) {\n return state;\n }\n\n Object.assign(state, { messagesById });\n\n if (threadId !== MAIN_THREAD_ID) {\n const pinnedMessageId = selectThreadTopMessageId(global, chatId, threadId);\n const message = pinnedMessageId ? selectChatMessage(global, chatId, pinnedMessageId) : undefined;\n const topMessageSender = message ? selectForwardedSender(global, message) : undefined;\n\n return {\n ...state,\n pinnedMessageIds: pinnedMessageId,\n canUnpin: false,\n topMessageSender,\n };\n }\n\n const pinnedMessageIds = selectPinnedIds(global, chatId);\n if (pinnedMessageIds?.length) {\n const firstPinnedMessage = messagesById[pinnedMessageIds[0]];\n const {\n canUnpin,\n } = (firstPinnedMessage && selectAllowedMessageActions(global, firstPinnedMessage, threadId)) || {};\n\n return {\n ...state,\n pinnedMessageIds,\n canUnpin,\n };\n }\n\n return state;\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChatWithInfo',\n 'pinMessage',\n 'focusMessage',\n 'openChat',\n 'openPreviousChat',\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\nconst GROUP_INTERVAL_SECONDS = 600; // 10 minutes\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 nextMessageDayStartsAt = Number(getDayStart(nextMessage.date * 1000));\n if (currentDateGroup.datetime !== nextMessageDayStartsAt) {\n currentDateGroup = {\n originalDate: nextMessage.date,\n datetime: nextMessageDayStartsAt,\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 || (nextMessage.date - message.date) > GROUP_INTERVAL_SECONDS\n ) {\n currentSenderGroup = [];\n currentDateGroup.senderGroups.push(currentSenderGroup);\n }\n }\n });\n\n return dateGroups;\n}\n","import { RefObject } from 'react';\nimport { getDispatch } from '../../../lib/teact/teactn';\n\nimport { MessageListType } from '../../../global/types';\n\nimport { IS_ANDROID, IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useBackgroundMode from '../../../hooks/useBackgroundMode';\n\nconst INTERSECTION_THROTTLE_FOR_MEDIA = IS_ANDROID ? 1000 : 350;\nconst INTERSECTION_MARGIN_FOR_MEDIA = IS_SINGLE_COLUMN_LAYOUT ? 300 : 500;\nconst INTERSECTION_THROTTLE_FOR_READING = 150;\n\nexport default function useMessageObservers(\n type: MessageListType,\n containerRef: RefObject,\n memoFirstUnreadIdRef: { current: number | undefined },\n) {\n const { markMessageListRead, markMessagesRead } = getDispatch();\n\n const {\n observe: observeIntersectionForMedia,\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 throttleMs: INTERSECTION_THROTTLE_FOR_READING,\n noAutoFreeze: true,\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 useBackgroundMode(freezeForReading, unfreezeForReading);\n\n const { observe: observeIntersectionForAnimatedStickers } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: INTERSECTION_THROTTLE_FOR_MEDIA,\n });\n\n return {\n observeIntersectionForMedia,\n observeIntersectionForReading,\n observeIntersectionForAnimatedStickers,\n };\n}\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 hasActionButton,\n }: {\n hasReply?: boolean;\n customShape?: boolean | number;\n isLastInGroup?: boolean;\n asForwarded?: boolean;\n hasThread?: boolean;\n forceSenderName?: boolean;\n hasComments?: boolean;\n hasActionButton?: 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 isMedia = photo || video;\n const isMediaWithNoText = isMedia && !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 (hasActionButton) {\n classNames.push('has-action-button');\n }\n\n if (customShape) {\n classNames.push('custom-shape');\n if (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 || webPage.video) {\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 (isMedia && hasComments) {\n classNames.push('has-background');\n }\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_COMMENTS = 238;\nconst MIN_MEDIA_WIDTH_WITH_TEXT = 175;\nconst MIN_MEDIA_WIDTH_WITH_TEXT_AND_COMMENTS = 238;\nconst MIN_MEDIA_HEIGHT = 90;\nconst SMALL_IMAGE_THRESHOLD = 12;\n\nexport function getMinMediaWidth(hasText?: boolean, hasCommentButton?: boolean) {\n return hasText\n ? (hasCommentButton ? MIN_MEDIA_WIDTH_WITH_TEXT_AND_COMMENTS : MIN_MEDIA_WIDTH_WITH_TEXT)\n : (hasCommentButton ? MIN_MEDIA_WIDTH_WITH_COMMENTS : MIN_MEDIA_WIDTH);\n}\n\nexport function calculateMediaDimensions(message: ApiMessage, noAvatars?: boolean) {\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, noAvatars)\n : calculateVideoDimensions(video!, isOwn, isForwarded, noAvatars);\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, ApiDimensions } from '../../../../api/types';\n\nimport { getAvailableWidth, REM } from '../../../common/helpers/mediaDimensions';\nimport { calculateMediaDimensions } from './mediaDimensions';\n\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: ApiDimensions;\n};\n\nfunction getRatios(messages: ApiMessage[]) {\n return messages.map(\n (message) => {\n const dimensions = calculateMediaDimensions(message) as ApiDimensions;\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: ApiDimensions = { 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 noAvatars: boolean,\n album: IAlbum,\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 = getAvailableWidth(isOwn, isForwarded, false, noAvatars) - (isForwarded ? 2.5 : 0) * REM;\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\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","import { IS_IOS } from '../../../../util/environment';\n\nlet element: HTMLSpanElement | undefined;\n\nexport default function calculateAuthorWidth(text: string) {\n if (!element) {\n element = document.createElement('span');\n // eslint-disable-next-line max-len\n element.style.font = IS_IOS\n // eslint-disable-next-line max-len\n ? '400 12px system-ui, -apple-system, BlinkMacSystemFont, \"Roboto\", \"Apple Color Emoji\", \"Helvetica Neue\", sans-serif'\n : '400 12px \"Roboto\", -apple-system, \"Apple Color Emoji\", BlinkMacSystemFont, \"Helvetica Neue\", 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 { FocusDirection } from '../../../../types';\n\nimport { useLayoutEffect } from '../../../../lib/teact/teact';\nimport fastSmoothScroll from '../../../../util/fastSmoothScroll';\n\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: string,\n isFocused?: boolean,\n focusDirection?: FocusDirection,\n noFocusHighlight?: boolean,\n isResizingContainer?: 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' : 'centerOrTop',\n FOCUS_MARGIN,\n focusDirection !== undefined ? RELOCATED_FOCUS_OFFSET : undefined,\n focusDirection,\n undefined,\n isResizingContainer,\n );\n }\n }, [elementRef, chatId, isFocused, focusDirection, noFocusHighlight, isResizingContainer]);\n}\n","import React, { FC, memo } 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 memo(ContextMenuContainerAsync);\n","import React, {\n FC, memo, useEffect, useMemo, 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';\nimport { preventMessageInputBlur } from './helpers/preventMessageInputBlur';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n isEmbedded?: boolean;\n appearanceOrder?: number;\n isLastInList?: boolean;\n};\n\ntype StateProps = {\n usersById: Record;\n sender?: ApiUser | ApiChat;\n targetUserIds?: string[];\n targetMessage?: ApiMessage;\n targetChatId?: string;\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 isLastInList,\n usersById,\n sender,\n targetUserIds,\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 const lang = 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 targetUsers = useMemo(() => {\n return targetUserIds\n ? targetUserIds.map((userId) => usersById?.[userId]).filter(Boolean as any)\n : undefined;\n }, [targetUserIds, usersById]);\n\n const content = renderActionMessageText(\n lang,\n message,\n sender,\n targetUsers,\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 const handleMouseDown = (e: React.MouseEvent) => {\n preventMessageInputBlur(e);\n handleBeforeContextMenu(e);\n };\n\n if (isEmbedded) {\n return {renderText(content as string)};\n }\n\n const className = buildClassName(\n 'ActionMessage message-list-item',\n isFocused && !noFocusHighlight && 'focused',\n isContextMenuShown && 'has-menu-open',\n isLastInList && 'last-in-list',\n transitionClassNames,\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 { byId: usersById } = global.users;\n const userId = message.senderId;\n const { targetUserIds, 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 usersById,\n sender,\n targetChatId,\n targetUserIds,\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 getMessageRoundVideo,\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 const isRoundVideo = Boolean(message && getMessageRoundVideo(message));\n\n const lang = useLang();\n\n const senderTitle = sender && getSenderTitle(lang, sender);\n\n return (\n \n {mediaThumbnail && renderPictogram(pictogramId, mediaThumbnail, mediaBlobUrl, isRoundVideo)}\n
\n

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

\n
{renderText(senderTitle || title || NBSP)}
\n
\n \n );\n};\n\nfunction renderPictogram(\n id: string | undefined,\n thumbDataUri: string,\n blobUrl?: string,\n isRoundVideo?: boolean,\n) {\n const { width, height } = getPictogramDimensions();\n\n return (\n \n );\n}\n\nexport default EmbeddedMessage;\n","import React, { FC, memo } 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: (e: React.MouseEvent) => 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, lang)}\n \n {outgoingStatus && (\n \n )}\n \n );\n};\n\nexport default memo(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 buildClassName from '../../../util/buildClassName';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMedia from '../../../hooks/useMedia';\nimport useMediaTransition from '../../../hooks/useMediaTransition';\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 transitionClassNames = useMediaTransition(isMediaReady);\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 && (\n \n )}\n {isAnimated && isMediaLoaded && (\n \n )}\n \n
\n );\n};\n\nexport default Sticker;\n","import { ApiMessage } from '../../../../api/types';\n\nimport { IS_CANVAS_FILTER_SUPPORTED, IS_SINGLE_COLUMN_LAYOUT } from '../../../../util/environment';\nimport { getMessageMediaThumbDataUri } from '../../../../modules/helpers';\nimport useCanvasBlur from '../../../../hooks/useCanvasBlur';\n\nexport default function useBlurredMediaThumbRef(message: ApiMessage, fullMediaData?: string) {\n return useCanvasBlur(\n getMessageMediaThumbDataUri(message),\n Boolean(fullMediaData),\n IS_SINGLE_COLUMN_LAYOUT && !IS_CANVAS_FILTER_SUPPORTED,\n );\n}\n","import { ISettings } from '../../../../types';\n\nconst SELECTED_APPENDIX_COLORS = {\n dark: {\n outgoing: 'rgb(135,116,225)',\n incoming: 'rgb(33,33,33)',\n },\n light: {\n outgoing: 'rgb(238,255,222)',\n incoming: 'rgb(255,255,255)',\n },\n};\n\nexport default function getCustomAppendixBg(\n src: string, isOwn: boolean, inSelectMode?: boolean, isSelected?: boolean, theme?: ISettings['theme'],\n) {\n if (isSelected) {\n return Promise.resolve(SELECTED_APPENDIX_COLORS[theme || 'light'][isOwn ? 'outgoing' : 'incoming']);\n }\n return 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 { ISettings } from '../../../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 useMediaWithLoadProgress from '../../../hooks/useMediaWithLoadProgress';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useBlurredMediaThumbRef from './hooks/useBlurredMediaThumbRef';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useMediaTransition from '../../../hooks/useMediaTransition';\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 noAvatars?: boolean;\n canAutoLoad?: boolean;\n isInSelectMode?: boolean;\n isSelected?: boolean;\n uploadProgress?: number;\n size?: 'inline' | 'pictogram';\n shouldAffectAppendix?: boolean;\n dimensions?: IMediaDimensions & { isSmall?: boolean };\n nonInteractive?: boolean;\n isDownloading: boolean;\n theme: ISettings['theme'];\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 noAvatars,\n canAutoLoad,\n isInSelectMode,\n isSelected,\n uploadProgress,\n size = 'inline',\n dimensions,\n nonInteractive,\n shouldAffectAppendix,\n isDownloading,\n theme,\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 [isLoadAllowed, setIsLoadAllowed] = useState(canAutoLoad);\n const shouldLoad = isLoadAllowed && isIntersecting;\n const {\n mediaData, loadProgress,\n } = useMediaWithLoadProgress(getMessageMediaHash(message, size), !shouldLoad);\n const fullMediaData = localBlobUrl || mediaData;\n const thumbRef = useBlurredMediaThumbRef(message, fullMediaData);\n\n const {\n loadProgress: downloadProgress,\n } = useMediaWithLoadProgress(getMessageMediaHash(message, 'download'), !isDownloading);\n\n const {\n isUploading, isTransferring, transferProgress,\n } = getMediaTransferState(\n message,\n uploadProgress || (isDownloading ? downloadProgress : loadProgress),\n shouldLoad && !fullMediaData,\n );\n const wasLoadDisabled = usePrevious(isLoadAllowed) === false;\n\n const transitionClassNames = useMediaTransition(fullMediaData);\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring, undefined, wasLoadDisabled, 'slow');\n const {\n shouldRender: shouldRenderDownloadButton,\n transitionClassNames: downloadButtonClassNames,\n } = useShowTransition(!fullMediaData && !isLoadAllowed);\n\n const handleClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload(message);\n }\n } else if (!fullMediaData) {\n setIsLoadAllowed((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, theme).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, theme]);\n\n const { width, height, isSmall } = dimensions || calculateMediaDimensions(message, noAvatars);\n\n const className = buildClassName(\n 'media-inner',\n !isUploading && !nonInteractive && 'interactive',\n isSmall && 'small-image',\n width === height && 'square-image',\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 \n \n {shouldRenderSpinner && !shouldRenderDownloadButton && (\n
\n \n
\n )}\n {shouldRenderDownloadButton && }\n {isTransferring && (\n {Math.round(transferProgress * 100)}%\n )}\n \n );\n};\n\nexport default Photo;\n","import { useCallback, useRef } from '../../../../lib/teact/teact';\n\nimport { fastRaf } from '../../../../util/schedulers';\nimport safePlay from '../../../../util/safePlay';\nimport useBackgroundMode from '../../../../hooks/useBackgroundMode';\nimport useHeavyAnimationCheck from '../../../../hooks/useHeavyAnimationCheck';\n\nexport default function useVideoAutoPause(playerRef: { current: HTMLVideoElement | null }, canPlay: boolean) {\n const wasPlaying = useRef(playerRef.current?.paused);\n const canPlayRef = useRef();\n canPlayRef.current = canPlay;\n\n const freezePlaying = useCallback(() => {\n if (!playerRef.current) {\n return;\n }\n\n wasPlaying.current = !playerRef.current.paused;\n\n if (wasPlaying.current) {\n playerRef.current.pause();\n }\n }, [playerRef]);\n\n const unfreezePlaying = useCallback(() => {\n if (\n playerRef.current && wasPlaying.current && canPlayRef.current\n // At this point HTMLVideoElement can be unmounted from the DOM\n && document.body.contains(playerRef.current)\n ) {\n safePlay(playerRef.current);\n }\n }, [playerRef]);\n\n const unfreezePlayingOnRaf = useCallback(() => {\n fastRaf(unfreezePlaying);\n }, [unfreezePlaying]);\n\n useBackgroundMode(freezePlaying, unfreezePlayingOnRaf);\n useHeavyAnimationCheck(freezePlaying, unfreezePlaying);\n}\n","import React, {\n FC, useCallback, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch } from '../../../lib/teact/teactn';\n\nimport { ApiMediaFormat, 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 getMediaTransferState,\n getMessageMediaFormat,\n getMessageMediaHash,\n getMessageVideo,\n getMessageWebPageVideo,\n isForwardedMessage,\n isOwnMessage,\n} from '../../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMediaWithLoadProgress from '../../../hooks/useMediaWithLoadProgress';\nimport useMedia from '../../../hooks/useMedia';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useBuffering from '../../../hooks/useBuffering';\nimport useVideoCleanup from '../../../hooks/useVideoCleanup';\nimport useVideoAutoPause from './hooks/useVideoAutoPause';\nimport useBlurredMediaThumbRef from './hooks/useBlurredMediaThumbRef';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nexport type OwnProps = {\n id?: string;\n message: ApiMessage;\n observeIntersection: ObserveFn;\n noAvatars?: boolean;\n canAutoLoad?: boolean;\n canAutoPlay?: boolean;\n uploadProgress?: number;\n dimensions?: IMediaDimensions;\n lastSyncTime?: number;\n isDownloading: boolean;\n onClick?: (id: number) => void;\n onCancelUpload?: (message: ApiMessage) => void;\n};\n\nconst Video: FC = ({\n id,\n message,\n observeIntersection,\n noAvatars,\n canAutoLoad,\n canAutoPlay,\n uploadProgress,\n lastSyncTime,\n dimensions,\n onClick,\n onCancelUpload,\n isDownloading,\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 = (getMessageVideo(message) || getMessageWebPageVideo(message))!;\n const localBlobUrl = video.blobUrl;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [isLoadAllowed, setIsLoadAllowed] = useState(canAutoLoad);\n const shouldLoad = Boolean(isLoadAllowed && isIntersecting && lastSyncTime);\n const [isPlayAllowed, setIsPlayAllowed] = useState(canAutoPlay);\n\n const previewBlobUrl = useMedia(\n getMessageMediaHash(message, 'pictogram'),\n !(isIntersecting && lastSyncTime),\n getMessageMediaFormat(message, 'pictogram'),\n lastSyncTime,\n );\n const { transitionClassNames: previewClassNames } = useShowTransition(\n Boolean(previewBlobUrl),\n undefined,\n undefined,\n 'slow',\n );\n\n const { mediaData, loadProgress } = useMediaWithLoadProgress(\n getMessageMediaHash(message, 'inline'),\n !shouldLoad,\n getMessageMediaFormat(message, 'inline'),\n lastSyncTime,\n );\n const fullMediaData = localBlobUrl || mediaData;\n const isInline = Boolean(isIntersecting && fullMediaData);\n // Thumbnail is always rendered so we can only disable blur if we have preview\n const thumbRef = useBlurredMediaThumbRef(message, previewBlobUrl);\n\n const { loadProgress: downloadProgress } = useMediaWithLoadProgress(\n getMessageMediaHash(message, 'download'),\n !isDownloading,\n ApiMediaFormat.BlobUrl,\n lastSyncTime,\n );\n\n const { isBuffered, bufferingHandlers } = useBuffering(!canAutoLoad);\n const { isUploading, isTransferring, transferProgress } = getMediaTransferState(\n message,\n uploadProgress || (isDownloading ? downloadProgress : loadProgress),\n (shouldLoad && !isBuffered) || isDownloading,\n );\n const wasLoadDisabled = usePrevious(isLoadAllowed) === false;\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring, undefined, wasLoadDisabled);\n const {\n shouldRender: shouldRenderPlayButton,\n transitionClassNames: playButtonClassNames,\n } = useShowTransition(isLoadAllowed && !isPlayAllowed && !shouldRenderSpinner);\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 duration = (videoRef.current?.duration) || video.duration || 0;\n\n const isOwn = isOwnMessage(message);\n const isForwarded = isForwardedMessage(message);\n const { width, height } = dimensions || calculateVideoDimensions(video, isOwn, isForwarded, noAvatars);\n\n useVideoAutoPause(videoRef, isInline);\n useVideoCleanup(videoRef, [isInline]);\n\n const handleClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload(message);\n }\n } else if (isDownloading) {\n getDispatch().cancelMessageMediaDownload({ message });\n } else if (!fullMediaData) {\n setIsLoadAllowed((isAllowed) => !isAllowed);\n } else if (fullMediaData && !isPlayAllowed) {\n setIsPlayAllowed(true);\n videoRef.current!.play();\n } else if (onClick) {\n onClick(message.id);\n }\n }, [isUploading, isDownloading, fullMediaData, isPlayAllowed, onClick, onCancelUpload, message]);\n\n const className = buildClassName('media-inner dark', !isUploading && 'interactive');\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 \n \n {isInline && (\n \n \n \n )}\n {shouldRenderPlayButton && }\n {shouldRenderSpinner && (\n
\n \n
\n )}\n {!isLoadAllowed && (\n \n )}\n {isTransferring ? (\n \n {(isUploading || isDownloading) ? `${Math.round(transferProgress * 100)}%` : '...'}\n \n ) : (\n
\n {video.isGif ? 'GIF' : formatMediaDuration(Math.max(duration - playProgress, 0))}\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, ApiCountryCode } 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 phoneCodeList: ApiCountryCode[];\n};\n\ntype DispatchProps = Pick;\n\nconst Contact: FC = ({\n contact, user, openUserInfo, phoneCodeList,\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(phoneCodeList, phoneNumber)}
\n
\n \n );\n};\n\nexport default withGlobal(\n (global, { contact }): StateProps => {\n const { countryList: { phoneCodes: phoneCodeList } } = global;\n return {\n user: selectUser(global, contact.userId),\n phoneCodeList,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openUserInfo',\n ]),\n)(Contact);\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?.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, { LangFn } 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 serverTimeOffset: number;\n};\n\ntype DispatchProps = Pick;\n\nconst SOLUTION_CONTAINER_ID = '#middle-column-portals';\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 serverTimeOffset,\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) + serverTimeOffset, 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, ['emoji', 'br'])}
\n
\n {lang(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(lang, 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 ? 'QuizPoll' : 'AnonymousQuizPoll';\n }\n\n if (summary.closed) {\n return 'FinalResults';\n }\n\n return summary.isPublic ? 'PublicPoll' : 'AnonymousPoll';\n}\n\nfunction getReadableVotersCount(lang: LangFn, isQuiz: true | undefined, count?: number) {\n if (!count) {\n return lang(isQuiz ? 'Chat.Quiz.TotalVotesEmpty' : 'Chat.Poll.TotalVotesResultEmpty');\n }\n\n return lang(isQuiz ? 'Answer' : 'Vote', count, 'i');\n}\n\nexport default memo(withGlobal(\n (global, { poll }) => {\n const { recentVoterIds } = poll.results;\n const { serverTimeOffset, users: { byId: usersById } } = global;\n if (!recentVoterIds || recentVoterIds.length === 0) {\n return {};\n }\n\n return {\n recentVoterIds,\n usersById,\n serverTimeOffset,\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';\nimport { ObserveFn } from '../../../hooks/useIntersectionObserver';\nimport { ISettings } from '../../../types';\n\nimport { getMessageWebPage } from '../../../modules/helpers';\nimport { calculateMediaDimensions } from './helpers/mediaDimensions';\nimport renderText from '../../common/helpers/renderText';\nimport trimText from '../../../util/trimText';\nimport buildClassName from '../../../util/buildClassName';\n\nimport SafeLink from '../../common/SafeLink';\nimport Photo from './Photo';\nimport Video from './Video';\n\nimport './WebPage.scss';\n\nconst MAX_TEXT_LENGTH = 170; // symbols\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n noAvatars?: boolean;\n canAutoLoad?: boolean;\n canAutoPlay?: boolean;\n inPreview?: boolean;\n lastSyncTime?: number;\n isDownloading?: boolean;\n theme: ISettings['theme'];\n onMediaClick?: () => void;\n onCancelMediaTransfer?: () => void;\n};\n\nconst WebPage: FC = ({\n message,\n observeIntersection,\n noAvatars,\n canAutoLoad,\n canAutoPlay,\n inPreview,\n lastSyncTime,\n isDownloading = false,\n theme,\n onMediaClick,\n onCancelMediaTransfer,\n}) => {\n const webPage = getMessageWebPage(message);\n\n let isSquarePhoto = false;\n if (webPage?.photo && !webPage.video) {\n const { width, height } = calculateMediaDimensions(message);\n isSquarePhoto = width === height;\n }\n\n const handleMediaClick = useCallback(() => {\n onMediaClick!();\n }, [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 video,\n } = webPage;\n const isMediaInteractive = (photo || video) && onMediaClick && !isSquarePhoto;\n const truncatedDescription = trimText(description, MAX_TEXT_LENGTH);\n\n const className = buildClassName(\n 'WebPage',\n isSquarePhoto && 'with-square-photo',\n !photo && !video && !inPreview && 'without-media',\n video && 'with-video',\n );\n\n return (\n \n {photo && !video && (\n \n )}\n
\n \n {!inPreview && title && (\n

{renderText(title)}

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

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

\n )}\n
\n {!inPreview && video && (\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 { formatCurrency } from '../../../util/formatCurrency';\nimport renderText from '../../common/helpers/renderText';\nimport useLang from '../../../hooks/useLang';\n\nimport './Invoice.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n};\n\nconst Invoice: FC = ({\n message,\n}) => {\n const lang = useLang();\n const invoice = getMessageInvoice(message);\n\n const {\n title,\n text,\n amount,\n currency,\n isTest,\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

\n {formatCurrency(amount, currency, lang.code)}\n {isTest && {lang('PaymentTestInvoice')}}\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(WrappedComponent: FC) {\n const ComponentWithSelectControl: 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?.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 )(ComponentWithSelectControl));\n}\n","import React, { FC, useCallback } from '../../../lib/teact/teact';\n\nimport { GlobalActions, GlobalState } from '../../../global/types';\nimport { ApiMessage } from '../../../api/types';\nimport { IAlbum, ISettings } from '../../../types';\nimport { AlbumRectPart, IAlbumLayout } from './helpers/calculateAlbumLayout';\n\nimport { getMessageContent } from '../../../modules/helpers';\nimport { getGlobal, withGlobal } from '../../../lib/teact/teactn';\nimport { pick } from '../../../util/iteratees';\nimport withSelectControl from './hocs/withSelectControl';\nimport { ObserveFn } from '../../../hooks/useIntersectionObserver';\nimport {\n selectActiveDownloadIds,\n selectCanAutoLoadMedia,\n selectCanAutoPlayMedia,\n selectTheme,\n} from '../../../modules/selectors';\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 hasCustomAppendix?: boolean;\n lastSyncTime?: number;\n isOwn: boolean;\n albumLayout: IAlbumLayout;\n onMediaClick: (messageId: number) => void;\n};\n\ntype StateProps = {\n theme: ISettings['theme'];\n uploadsById: GlobalState['fileUploads']['byMessageLocalId'];\n activeDownloadIds: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst Album: FC = ({\n album,\n observeIntersection,\n hasCustomAppendix,\n lastSyncTime,\n isOwn,\n albumLayout,\n onMediaClick,\n uploadsById,\n activeDownloadIds,\n theme,\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?.progress;\n const { dimensions, sides } = albumLayout.layout[index];\n\n // Ignoring global updates is a known drawback here\n const canAutoLoad = selectCanAutoLoadMedia(getGlobal(), message);\n const canAutoPlay = selectCanAutoPlayMedia(getGlobal(), message);\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, { album }): StateProps => {\n const { chatId } = album.mainMessage;\n const theme = selectTheme(global);\n const activeDownloadIds = selectActiveDownloadIds(global, chatId);\n return {\n theme,\n uploadsById: global.fileUploads.byMessageLocalId,\n activeDownloadIds,\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';\nimport { getDispatch } from '../../../lib/teact/teactn';\n\nimport { ApiMediaFormat, ApiMessage } from '../../../api/types';\n\nimport { ROUND_VIDEO_DIMENSIONS_PX } from '../../common/helpers/mediaDimensions';\nimport { getMessageMediaFormat, getMessageMediaHash } from '../../../modules/helpers';\nimport { formatMediaDuration } from '../../../util/dateFormat';\nimport buildClassName from '../../../util/buildClassName';\nimport { stopCurrentAudio } from '../../../util/audioPlayer';\nimport safePlay from '../../../util/safePlay';\nimport { fastRaf } from '../../../util/schedulers';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMediaWithLoadProgress from '../../../hooks/useMediaWithLoadProgress';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useMediaTransition from '../../../hooks/useMediaTransition';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useBuffering from '../../../hooks/useBuffering';\nimport useVideoCleanup from '../../../hooks/useVideoCleanup';\nimport useVideoAutoPause from './hooks/useVideoAutoPause';\nimport useBlurredMediaThumbRef from './hooks/useBlurredMediaThumbRef';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nimport './RoundVideo.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection: ObserveFn;\n canAutoLoad?: boolean;\n lastSyncTime?: number;\n isDownloading?: boolean;\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 canAutoLoad,\n lastSyncTime,\n isDownloading,\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 [isLoadAllowed, setIsLoadAllowed] = useState(canAutoLoad);\n const shouldLoad = Boolean(isLoadAllowed && isIntersecting && lastSyncTime);\n const { mediaData, loadProgress } = useMediaWithLoadProgress(\n getMessageMediaHash(message, 'inline'),\n !shouldLoad,\n getMessageMediaFormat(message, 'inline'),\n lastSyncTime,\n );\n\n const { loadProgress: downloadProgress } = useMediaWithLoadProgress(\n getMessageMediaHash(message, 'download'),\n !isDownloading,\n ApiMediaFormat.BlobUrl,\n lastSyncTime,\n );\n const thumbRef = useBlurredMediaThumbRef(message, mediaData);\n\n const { isBuffered, bufferingHandlers } = useBuffering();\n const isTransferring = (isLoadAllowed && !isBuffered) || isDownloading;\n const wasLoadDisabled = usePrevious(isLoadAllowed) === false;\n\n const transitionClassNames = useMediaTransition(mediaData);\n const {\n shouldRender: shouldSpinnerRender,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring || !isBuffered, undefined, wasLoadDisabled);\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 svgCenter = ROUND_VIDEO_DIMENSIONS_PX / 2;\n const svgMargin = 6;\n const circumference = (svgCenter - svgMargin) * 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 `;\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 fastRaf(() => {\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 useVideoAutoPause(playerRef, shouldPlay);\n useVideoCleanup(playerRef, [mediaData]);\n\n const handleClick = useCallback(() => {\n if (!mediaData) {\n setIsLoadAllowed((isAllowed) => !isAllowed);\n\n return;\n }\n\n if (isDownloading) {\n getDispatch().cancelMessageMediaDownload({ message });\n return;\n }\n\n const playerEl = playerRef.current!;\n if (isActivated) {\n if (playerEl.paused) {\n safePlay(playerEl);\n stopCurrentAudio();\n } else {\n playerEl.pause();\n }\n } else {\n capturePlaying();\n // Pause is a workaround for iOS Safari – otherwise it stops video after several frames\n playerEl.pause();\n playerEl.currentTime = 0;\n safePlay(playerEl);\n stopCurrentAudio();\n\n setIsActivated(true);\n }\n }, [capturePlaying, isActivated, isDownloading, mediaData, message]);\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
\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 && !isLoadAllowed && (\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 { RE_TME_LINK } from '../../../config';\nimport renderText from '../../common/helpers/renderText';\nimport useLang from '../../../hooks/useLang';\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 const lang = useLang();\n\n return (\n
\n {message.inlineButtons!.map((row) => (\n
\n {row.map((button) => (\n onClick({ button })}\n >\n {renderText(lang(button.text))}\n {button.type === 'buy' && }\n {button.type === 'url' && !button.value!.match(RE_TME_LINK) && }\n \n ))}\n
\n ))}\n
\n );\n};\n\nexport default InlineButtons;\n","import React, {\n FC, memo, useCallback,\n} 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 { isUserId } from '../../../modules/helpers';\nimport { formatIntegerCompact } from '../../../util/textFormat';\nimport buildClassName from '../../../util/buildClassName';\nimport { selectThreadInfo } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\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,\n threadInfo,\n usersById,\n chatsById,\n openChat,\n}) => {\n const lang = useLang();\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 isUserId(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
\n {messagesCount ? lang('Comments', messagesCount, 'i') : lang('LeaveAComment')}\n
\n \n \n );\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 React, {\n FC,\n memo,\n useCallback,\n useEffect,\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} from '../../../api/types';\nimport {\n AudioOrigin, FocusDirection, IAlbum, ISettings,\n} from '../../../types';\n\nimport { IS_ANDROID, IS_TOUCH_ENV } from '../../../util/environment';\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 selectCanAutoLoadMedia,\n selectCanAutoPlayMedia,\n selectShouldLoopStickers,\n selectTheme,\n selectAllowedMessageActions,\n selectIsDownloading,\n} from '../../../modules/selectors';\nimport {\n getMessageContent,\n isOwnMessage,\n isReplyMessage,\n isAnonymousOwnMessage,\n isMessageLocal,\n isUserId,\n isChatWithRepliesBot,\n getMessageCustomShape,\n isChatChannel,\n getMessageSingleEmoji,\n getSenderTitle,\n 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_PX } 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 useLang from '../../../hooks/useLang';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useFlag from '../../../hooks/useFlag';\nimport useFocusMessage from './hooks/useFocusMessage';\nimport useOuterHandlers from './hooks/useOuterHandlers';\nimport useInnerHandlers from './hooks/useInnerHandlers';\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 CommentButton 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 {\n message: ApiMessage;\n observeIntersectionForBottom: ObserveFn;\n observeIntersectionForMedia: ObserveFn;\n observeIntersectionForAnimatedStickers: ObserveFn;\n album?: IAlbum;\n noAvatars?: boolean;\n withAvatar?: boolean;\n withSenderName?: boolean;\n threadId: number;\n messageListType: MessageListType;\n noComments: boolean;\n appearanceOrder: number;\n }\n & MessagePositionProperties;\n\ntype StateProps = {\n theme: ISettings['theme'];\n forceSenderName?: boolean;\n chatUsername?: string;\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 isResizingContainer?: boolean;\n isForwarding?: boolean;\n isChatWithSelf?: boolean;\n isRepliesChat?: boolean;\n isChannel?: boolean;\n canReply?: boolean;\n lastSyncTime?: number;\n highlight?: string;\n isSingleEmoji?: boolean;\n animatedEmoji?: ApiSticker;\n isInSelectMode?: boolean;\n isSelected?: boolean;\n isGroupSelected?: boolean;\n isDownloading: boolean;\n threadId?: number;\n isPinnedList?: boolean;\n canAutoLoadMedia?: boolean;\n canAutoPlayMedia?: boolean;\n shouldLoopStickers?: boolean;\n autoLoadFileMaxSizeMb: number;\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 = { __html: '' };\n// eslint-disable-next-line max-len\nconst APPENDIX_NOT_OWN = { __html: '' };\nconst APPEARANCE_DELAY = 10;\nconst NO_MEDIA_CORNERS_THRESHOLD = 18;\n\nconst Message: FC = ({\n message,\n chatUsername,\n observeIntersectionForBottom,\n observeIntersectionForMedia,\n observeIntersectionForAnimatedStickers,\n album,\n noAvatars,\n withAvatar,\n withSenderName,\n noComments,\n appearanceOrder,\n isFirstInGroup,\n isLastInGroup,\n isFirstInDocumentGroup,\n isLastInDocumentGroup,\n isLastInList,\n theme,\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 isResizingContainer,\n isForwarding,\n isChatWithSelf,\n isRepliesChat,\n isChannel,\n canReply,\n lastSyncTime,\n highlight,\n animatedEmoji,\n isInSelectMode,\n isSelected,\n isGroupSelected,\n threadId,\n messageListType,\n isPinnedList,\n isDownloading,\n canAutoLoadMedia,\n canAutoPlayMedia,\n shouldLoopStickers,\n autoLoadFileMaxSizeMb,\n toggleMessageSelection,\n clickInlineButton,\n disableContextMenuHint,\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\n const lang = useLang();\n\n useOnIntersect(bottomMarkerRef, observeIntersectionForBottom);\n\n const {\n isContextMenuOpen, contextMenuPosition,\n handleBeforeContextMenu, handleContextMenu: onContextMenu,\n handleContextMenuClose, handleContextMenuHide,\n } = useContextMenuHandlers(ref, IS_TOUCH_ENV && isInSelectMode, true, IS_ANDROID);\n\n useEffect(() => {\n if (isContextMenuOpen) {\n disableContextMenuHint();\n }\n }, [isContextMenuOpen, disableContextMenuHint]);\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 { id: messageId, chatId, threadInfo } = message;\n\n const isLocal = isMessageLocal(message);\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 = (\n forwardInfo && (!isChatWithSelf || isScheduled) && !isRepliesChat && !forwardInfo.isLinkedChannelPost\n );\n const isInDocumentGroup = Boolean(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 signature = (\n (isChannel && message.adminTitle) || (forwardInfo && !asForwarded && forwardInfo.adminTitle) || undefined\n );\n const metaSafeAuthorWidth = useMemo(() => {\n return signature ? calculateAuthorWidth(signature) : undefined;\n }, [signature]);\n const canShowActionButton = (\n !(isContextMenuShown || isInSelectMode || isForwarding)\n && (!isInDocumentGroup || isLastInDocumentGroup)\n );\n const canForward = isChannel && !isScheduled;\n const canFocus = Boolean(isPinnedList\n || (forwardInfo\n && (forwardInfo.isChannelPost || (isChatWithSelf && !isOwn) || isRepliesChat)\n && forwardInfo.fromMessageId\n ));\n const avatarPeer = forwardInfo && (isChatWithSelf || isRepliesChat || !sender) ? originSender : sender;\n const senderPeer = forwardInfo ? originSender : sender;\n\n const selectMessage = useCallback((e?: React.MouseEvent, groupedId?: string) => {\n toggleMessageSelection({\n messageId,\n groupedId,\n ...(e?.shiftKey && { withShift: true }),\n ...(isAlbum && { childMessageIds: album!.messages.map(({ id }) => id) }),\n });\n }, [toggleMessageSelection, messageId, isAlbum, album]);\n\n const {\n handleMouseDown,\n handleClick,\n handleContextMenu,\n handleDoubleClick,\n handleContentDoubleClick,\n isSwiped,\n } = useOuterHandlers(\n selectMessage,\n ref,\n messageId,\n isAlbum,\n Boolean(isInSelectMode),\n Boolean(canReply),\n onContextMenu,\n handleBeforeContextMenu,\n );\n\n const {\n handleAvatarClick,\n handleSenderClick,\n handleViaBotClick,\n handleReplyClick,\n handleMediaClick,\n handleAudioPlay,\n handleAlbumMediaClick,\n handleMetaClick,\n handleReadMedia,\n handleCancelUpload,\n handleVoteSend,\n handleGroupForward,\n handleForward,\n handleFocus,\n handleFocusForwarded,\n handleDocumentGroupSelectAll,\n } = useInnerHandlers(\n lang,\n selectMessage,\n message,\n chatId,\n threadId,\n isInDocumentGroup,\n Boolean(isScheduled),\n isRepliesChat,\n album,\n avatarPeer,\n senderPeer,\n botSender,\n );\n\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 isSwiped && 'is-swiped',\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 hasActionButton: canForward || canFocus,\n });\n const withCommentButton = message.threadInfo && (!isInDocumentGroup || isLastInDocumentGroup)\n && messageListType === 'thread' && !noComments;\n const withAppendix = contentClassName.includes('has-appendix');\n\n useEnsureMessage(\n isRepliesChat && message.replyToChatId ? message.replyToChatId : chatId,\n hasReply ? message.replyToMessageId : undefined,\n replyMessage,\n message.id,\n );\n useFocusMessage(ref, chatId, isFocused, focusDirection, noFocusHighlight, isResizingContainer);\n\n let style = '';\n let calculatedWidth;\n let noMediaCorners = false;\n const albumLayout = useMemo(() => {\n return isAlbum ? calculateAlbumLayout(isOwn, Boolean(asForwarded), Boolean(noAvatars), album!) : undefined;\n }, [isAlbum, isOwn, asForwarded, noAvatars, 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, noAvatars).width;\n } else if (video) {\n if (video.isRound) {\n width = ROUND_VIDEO_DIMENSIONS_PX;\n } else {\n width = calculateMediaDimensions(message, noAvatars).width;\n }\n }\n\n if (width) {\n calculatedWidth = Math.max(getMinMediaWidth(Boolean(text), withCommentButton), width);\n if (calculatedWidth - width > NO_MEDIA_CORNERS_THRESHOLD) {\n noMediaCorners = true;\n }\n }\n } else if (albumLayout) {\n calculatedWidth = Math.max(getMinMediaWidth(Boolean(text), withCommentButton), albumLayout.containerStyle.width);\n if (calculatedWidth - albumLayout.containerStyle.width > NO_MEDIA_CORNERS_THRESHOLD) {\n noMediaCorners = true;\n }\n }\n\n if (calculatedWidth) {\n style = `width: ${calculatedWidth + extraPadding}px`;\n }\n\n function renderAvatar() {\n const isAvatarPeerUser = avatarPeer && isUserId(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 noMediaCorners && 'no-media-corners',\n );\n const hasCustomAppendix = isLastInGroup && !textParts && !asForwarded && !hasThread;\n const shouldInlineMeta = !webPage && !animatedEmoji && textParts;\n const textContentClass = buildClassName(\n 'text-content',\n shouldInlineMeta && 'with-meta',\n outgoingStatus && 'with-outgoing-icon',\n );\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 && (\n

\n {textParts}\n {shouldInlineMeta && (\n \n )}\n

\n )}\n {webPage && (\n \n )}\n {invoice && }\n
\n );\n }\n\n function renderSenderName() {\n const shouldRender = !(customShape && !viaBotId) && (\n (withSenderName && !photo && !video) || asForwarded || viaBotId || forceSenderName\n ) && (!isInDocumentGroup || isFirstInDocumentGroup) && !(hasReply && customShape);\n\n if (!shouldRender) {\n return undefined;\n }\n\n let senderTitle;\n let senderColor;\n if (senderPeer && !(customShape && viaBotId)) {\n senderTitle = getSenderTitle(lang, senderPeer);\n\n if (!asForwarded) {\n senderColor = `color-${getUserColorKey(senderPeer)}`;\n }\n } else if (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?.isLinkedChannelPost ? (\n {lang('DiscussChannel')}\n ) : message.adminTitle && !isChannel ? (\n {message.adminTitle}\n ) : undefined}\n
\n );\n }\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 {asForwarded && !customShape && (!isInDocumentGroup || isFirstInDocumentGroup) && (\n
{lang('ForwardedMessage')}
\n )}\n {renderContent()}\n {(!isInDocumentGroup || isLastInDocumentGroup) && !(!webPage && !animatedEmoji && textParts) && (\n \n )}\n {canShowActionButton && canForward ? (\n \n \n \n ) : canShowActionButton && canFocus ? (\n \n \n \n ) : undefined}\n {withCommentButton && }\n {withAppendix && (\n
\n )}\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, replyToChatId, replyToMessageId, isOutgoing,\n } = message;\n\n const chat = selectChat(global, chatId);\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const isRepliesChat = isChatWithRepliesBot(chatId);\n const isChannel = chat && isChatChannel(chat);\n const chatUsername = chat?.username;\n\n const forceSenderName = !isChatWithSelf && isAnonymousOwnMessage(message);\n const canShowSender = withSenderName || withAvatar || forceSenderName;\n const sender = selectSender(global, message);\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, isRepliesChat && replyToChatId ? replyToChatId : 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 {\n direction: focusDirection, noHighlight: noFocusHighlight, isResizingContainer,\n } = (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?.messages) {\n isSelected = album.messages.every(({ id: messageId }) => selectIsMessageSelected(global, messageId));\n } else {\n isSelected = selectIsMessageSelected(global, id);\n }\n\n const { canReply } = (messageListType === 'thread' && selectAllowedMessageActions(global, message, threadId)) || {};\n const isDownloading = selectIsDownloading(global, message);\n\n return {\n theme: selectTheme(global),\n chatUsername,\n forceSenderName,\n sender: canShowSender ? sender : undefined,\n originSender,\n botSender,\n shouldHideReply,\n isThreadTop,\n replyMessage,\n replyMessageSender,\n isFocused,\n isForwarding,\n isChatWithSelf,\n isRepliesChat,\n isChannel,\n canReply,\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 isDownloading,\n isPinnedList: messageListType === 'pinned',\n canAutoLoadMedia: selectCanAutoLoadMedia(global, message),\n canAutoPlayMedia: selectCanAutoPlayMedia(global, message),\n autoLoadFileMaxSizeMb: global.settings.byKey.autoLoadFileMaxSizeMb,\n shouldLoopStickers: selectShouldLoopStickers(global),\n ...(isOutgoing && { outgoingStatus: selectOutgoingStatus(global, message, messageListType === 'scheduled') }),\n ...(typeof uploadProgress === 'number' && { uploadProgress }),\n ...(isFocused && { focusDirection, noFocusHighlight, isResizingContainer }),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'toggleMessageSelection',\n 'clickInlineButton',\n 'disableContextMenuHint',\n ]),\n)(Message));\n","import { RefObject } from 'react';\nimport React, { useEffect } from '../../../../lib/teact/teact';\nimport { getDispatch } from '../../../../lib/teact/teactn';\n\nimport { IS_ANDROID, IS_TOUCH_ENV } from '../../../../util/environment';\nimport windowSize from '../../../../util/windowSize';\nimport { captureEvents, SwipeDirection } from '../../../../util/captureEvents';\nimport useFlag from '../../../../hooks/useFlag';\nimport { preventMessageInputBlur } from '../../helpers/preventMessageInputBlur';\n\nconst ANDROID_KEYBOARD_HIDE_DELAY_MS = 350;\nconst SWIPE_ANIMATION_DURATION = 150;\n\nexport default function useOuterHandlers(\n selectMessage: (e?: React.MouseEvent, groupedId?: string) => void,\n containerRef: RefObject,\n messageId: number,\n isAlbum: boolean,\n isInSelectMode: boolean,\n canReply: boolean,\n onContextMenu: (e: React.MouseEvent) => void,\n handleBeforeContextMenu: (e: React.MouseEvent) => void,\n) {\n const { setReplyingToId } = getDispatch();\n\n const [isSwiped, markSwiped, unmarkSwiped] = useFlag();\n\n function handleMouseDown(e: React.MouseEvent) {\n preventMessageInputBlur(e);\n handleBeforeContextMenu(e);\n }\n\n function handleClick(e: React.MouseEvent) {\n if (isInSelectMode) {\n selectMessage(e);\n } else if (IS_ANDROID) {\n const target = e.target as HTMLDivElement;\n if (!target.classList.contains('text-content') && !target.classList.contains('Message')) {\n return;\n }\n\n if (windowSize.getIsKeyboardVisible()) {\n setTimeout(() => {\n onContextMenu(e);\n }, ANDROID_KEYBOARD_HIDE_DELAY_MS);\n } else {\n onContextMenu(e);\n }\n }\n }\n\n function handleContextMenu(e: React.MouseEvent) {\n if (IS_ANDROID) {\n if ((e.target as HTMLElement).matches('a[href]')) {\n return;\n }\n\n e.preventDefault();\n selectMessage();\n } else {\n onContextMenu(e);\n }\n }\n\n function handleContainerDoubleClick() {\n setReplyingToId({ messageId });\n }\n\n function stopPropagation(e: React.MouseEvent) {\n e.stopPropagation();\n }\n\n useEffect(() => {\n if (!IS_TOUCH_ENV || isInSelectMode || !canReply) {\n return undefined;\n }\n\n let startedAt: number | undefined;\n return captureEvents(containerRef.current!, {\n selectorToPreventScroll: '.MessageList',\n onSwipe: ((e, direction) => {\n if (direction === SwipeDirection.Left) {\n if (!startedAt) {\n startedAt = Date.now();\n }\n\n markSwiped();\n\n return true;\n }\n\n return false;\n }),\n onRelease: () => {\n if (!startedAt) {\n return;\n }\n\n setReplyingToId({ messageId });\n\n setTimeout(unmarkSwiped, Math.max(0, SWIPE_ANIMATION_DURATION - (Date.now() - startedAt)));\n startedAt = undefined;\n },\n });\n }, [containerRef, isInSelectMode, messageId, setReplyingToId, markSwiped, unmarkSwiped, canReply]);\n\n return {\n handleMouseDown: !isInSelectMode ? handleMouseDown : undefined,\n handleClick,\n handleContextMenu: !isInSelectMode ? handleContextMenu : undefined,\n handleDoubleClick: !isInSelectMode ? handleContainerDoubleClick : undefined,\n handleContentDoubleClick: !IS_TOUCH_ENV ? stopPropagation : undefined,\n isSwiped,\n };\n}\n","import React, { useCallback } from '../../../../lib/teact/teact';\nimport { getDispatch } from '../../../../lib/teact/teactn';\n\nimport { isUserId } from '../../../../modules/helpers';\nimport { IAlbum, MediaViewerOrigin } from '../../../../types';\nimport {\n ApiChat, ApiMessage, ApiUser, MAIN_THREAD_ID,\n} from '../../../../api/types';\nimport { LangFn } from '../../../../hooks/useLang';\n\nexport default function useInnerHandlers(\n lang: LangFn,\n selectMessage: (e: React.MouseEvent, groupedId?: string) => void,\n message: ApiMessage,\n chatId: string,\n threadId: number,\n isInDocumentGroup: boolean,\n isScheduled?: boolean,\n isChatWithRepliesBot?: boolean,\n album?: IAlbum,\n avatarPeer?: ApiUser | ApiChat,\n senderPeer?: ApiUser | ApiChat,\n botSender?: ApiUser,\n) {\n const {\n openUserInfo, openChat, showNotification, focusMessage, openMediaViewer, openAudioPlayer,\n markMessagesRead, cancelSendingMessage, sendPollVote, openForwardMenu, focusMessageInComments,\n } = getDispatch();\n\n const {\n id: messageId, forwardInfo, replyToMessageId, replyToChatId, replyToTopMessageId, groupedId,\n } = message;\n\n const handleAvatarClick = useCallback(() => {\n if (!avatarPeer) {\n return;\n }\n\n if (isUserId(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 showNotification({ message: lang('HidAccount') });\n\n return;\n }\n\n if (isUserId(senderPeer.id)) {\n openUserInfo({ id: senderPeer.id });\n } else {\n openChat({ id: senderPeer.id });\n }\n }, [senderPeer, showNotification, lang, 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({\n chatId: isChatWithRepliesBot && replyToChatId ? replyToChatId : chatId,\n threadId,\n messageId: replyToMessageId,\n replyMessageId: isChatWithRepliesBot && replyToChatId ? undefined : messageId,\n });\n }, [focusMessage, isChatWithRepliesBot, replyToChatId, chatId, threadId, replyToMessageId, messageId]);\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 });\n }, [openForwardMenu, chatId, 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, groupedChatId: chatId,\n });\n return;\n }\n\n if (isChatWithRepliesBot && replyToChatId) {\n focusMessageInComments({\n chatId: replyToChatId,\n threadId: replyToTopMessageId,\n messageId: forwardInfo!.fromMessageId,\n });\n } else {\n focusMessage({\n chatId: forwardInfo!.fromChatId, messageId: forwardInfo!.fromMessageId,\n });\n }\n }, [\n isInDocumentGroup, isChatWithRepliesBot, replyToChatId, focusMessage, forwardInfo, groupedId, chatId,\n focusMessageInComments, replyToTopMessageId,\n ]);\n\n const selectWithGroupedId = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n\n selectMessage(e, groupedId);\n }, [selectMessage, groupedId]);\n\n return {\n handleAvatarClick,\n handleSenderClick,\n handleViaBotClick,\n handleReplyClick,\n handleMediaClick,\n handleAudioPlay,\n handleAlbumMediaClick,\n handleMetaClick: selectWithGroupedId,\n handleReadMedia,\n handleCancelUpload,\n handleVoteSend,\n handleGroupForward,\n handleForward,\n handleFocus,\n handleFocusForwarded,\n handleDocumentGroupSelectAll: selectWithGroupedId,\n };\n}\n","import { RefObject } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\nimport { MessageListType } from '../../global/types';\n\nimport { SCHEDULED_WHEN_ONLINE } from '../../config';\nimport buildClassName from '../../util/buildClassName';\nimport { compact, flatten } from '../../util/iteratees';\nimport { formatHumanDate } from '../../util/dateFormat';\nimport { getMessageOriginalId, isActionMessage, isOwnMessage } from '../../modules/helpers';\nimport useLang from '../../hooks/useLang';\nimport { isAlbum, MessageDateGroup } from './helpers/groupMessages';\nimport { preventMessageInputBlur } from './helpers/preventMessageInputBlur';\nimport useScrollHooks from './hooks/useScrollHooks';\nimport useMessageObservers from './hooks/useMessageObservers';\n\nimport Message from './message/Message';\nimport ActionMessage from './ActionMessage';\n\ninterface OwnProps {\n messageIds: number[];\n messageGroups: MessageDateGroup[];\n isViewportNewest: boolean;\n isUnread: boolean;\n withUsers: boolean;\n noAvatars: boolean;\n containerRef: RefObject;\n anchorIdRef: { current: string | undefined };\n memoUnreadDividerBeforeIdRef: { current: number | undefined };\n memoFirstUnreadIdRef: { current: number | undefined };\n threadId: number;\n type: MessageListType;\n isActive: boolean;\n threadTopMessageId: number | undefined;\n hasLinkedChat: boolean | undefined;\n isSchedule: boolean;\n noAppearanceAnimation: boolean;\n onFabToggle: AnyToVoidFunction;\n onNotchToggle: AnyToVoidFunction;\n openHistoryCalendar: Function;\n}\n\nconst UNREAD_DIVIDER_CLASS = 'unread-divider';\n\nconst MessageListContent: FC = ({\n messageIds,\n messageGroups,\n isViewportNewest,\n isUnread,\n withUsers,\n noAvatars,\n containerRef,\n anchorIdRef,\n memoUnreadDividerBeforeIdRef,\n memoFirstUnreadIdRef,\n threadId,\n type,\n isActive,\n threadTopMessageId,\n hasLinkedChat,\n isSchedule,\n noAppearanceAnimation,\n onFabToggle,\n onNotchToggle,\n openHistoryCalendar,\n}) => {\n const {\n observeIntersectionForMedia,\n observeIntersectionForReading,\n observeIntersectionForAnimatedStickers,\n } = useMessageObservers(type, containerRef, memoFirstUnreadIdRef);\n\n const {\n backwardsTriggerRef,\n forwardsTriggerRef,\n fabTriggerRef,\n } = useScrollHooks(\n type,\n containerRef,\n messageIds,\n isViewportNewest,\n isUnread,\n onFabToggle,\n onNotchToggle,\n isActive,\n );\n\n const lang = useLang();\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 const isLastInList = (\n senderGroupIndex === senderGroupsArray.length - 1\n && dateGroupIndex === dateGroupsArray.length - 1\n );\n\n return compact([\n message.id === memoUnreadDividerBeforeIdRef.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 && anchorIdRef.current === `message${message.previousLocalId}`) {\n anchorIdRef.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 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 message.id === memoUnreadDividerBeforeIdRef.current && unreadDivider,\n ,\n message.id === threadTopMessageId && (\n
\n {lang('DiscussionStarted')}\n
\n ),\n ]);\n }));\n });\n\n return (\n \n openHistoryCalendar({ selectedAt: dateGroup.datetime }) : undefined}\n >\n \n {isSchedule && dateGroup.originalDate === SCHEDULED_WHEN_ONLINE && (\n lang('MessageScheduledUntilOnline')\n )}\n {isSchedule && dateGroup.originalDate !== SCHEDULED_WHEN_ONLINE && (\n lang('MessageScheduledOn', formatHumanDate(lang, dateGroup.datetime, undefined, true))\n )}\n {!isSchedule && formatHumanDate(lang, dateGroup.datetime)}\n \n \n {flatten(senderGroups)}\n \n );\n });\n\n return (\n
\n
\n {flatten(dateGroups)}\n \n \n
\n );\n};\n\nexport default memo(MessageListContent);\n","import { RefObject } from 'react';\nimport { getDispatch } from '../../../lib/teact/teactn';\nimport { useMemo, useRef } from '../../../lib/teact/teact';\n\nimport { LoadMoreDirection } from '../../../types';\nimport { MessageListType } from '../../../global/types';\n\nimport { debounce } from '../../../util/schedulers';\nimport { useIntersectionObserver, useOnIntersect } from '../../../hooks/useIntersectionObserver';\nimport { LOCAL_MESSAGE_ID_BASE, MESSAGE_LIST_SENSITIVE_AREA } from '../../../config';\nimport resetScroll from '../../../util/resetScroll';\nimport useOnChange from '../../../hooks/useOnChange';\n\nconst FAB_THRESHOLD = 50;\nconst NOTCH_THRESHOLD = 1; // Notch has zero height so we at least need a 1px margin to intersect\nconst TOOLS_FREEZE_TIMEOUT = 250; // Approximate message sending animation duration\n\nexport default function useScrollHooks(\n type: MessageListType,\n containerRef: RefObject,\n messageIds: number[],\n isViewportNewest: boolean,\n isUnread: boolean,\n onFabToggle: AnyToVoidFunction,\n onNotchToggle: AnyToVoidFunction,\n isActive: boolean,\n) {\n const { loadViewportMessages } = getDispatch();\n\n const [loadMoreBackwards, loadMoreForwards] = useMemo(\n () => (type === 'thread' ? [\n debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Backwards }), 1000, true, false),\n debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Forwards }), 1000, true, false),\n ] : []),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [loadViewportMessages, messageIds],\n );\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 function toggleScrollTools() {\n if (!isActive) return;\n\n if (!messageIds || !messageIds.length) {\n onFabToggle(false);\n onNotchToggle(false);\n return;\n }\n\n if (!isViewportNewest) {\n onFabToggle(true);\n onNotchToggle(true);\n return;\n }\n\n const { offsetHeight, scrollHeight, scrollTop } = containerRef.current!;\n const scrollBottom = Math.round(scrollHeight - scrollTop - offsetHeight);\n const isNearBottom = scrollBottom <= FAB_THRESHOLD;\n const isAtBottom = scrollBottom <= NOTCH_THRESHOLD;\n\n onFabToggle(isUnread ? !isAtBottom : !isNearBottom);\n onNotchToggle(!isAtBottom);\n }\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({\n rootRef: containerRef,\n margin: MESSAGE_LIST_SENSITIVE_AREA,\n }, (entries) => {\n if (!loadMoreForwards || !loadMoreBackwards) {\n return;\n }\n\n // Loading history while sending a message can return the same message and cause ambiguity\n const isFirstMessageLocal = messageIds[0] >= LOCAL_MESSAGE_ID_BASE;\n if (isFirstMessageLocal) {\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') {\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 * 2,\n }, toggleScrollTools);\n\n useOnIntersect(fabTriggerRef, observeIntersectionForFab);\n\n const {\n observe: observeIntersectionForNotch,\n freeze: freezeForNotch,\n unfreeze: unfreezeForNotch,\n } = useIntersectionObserver({\n rootRef: containerRef,\n margin: NOTCH_THRESHOLD,\n }, toggleScrollTools);\n\n useOnIntersect(fabTriggerRef, observeIntersectionForNotch);\n\n // Workaround for FAB and notch flickering with tall incoming message\n useOnChange(() => {\n freezeForFab();\n freezeForNotch();\n\n setTimeout(() => {\n unfreezeForNotch();\n unfreezeForFab();\n }, TOOLS_FREEZE_TIMEOUT);\n }, [messageIds]);\n\n return { backwardsTriggerRef, forwardsTriggerRef, fabTriggerRef };\n}\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiSticker, ApiUpdateConnectionStateType } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport { selectChat } from '../../modules/selectors';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useLang from '../../hooks/useLang';\nimport { getUserIdDividend } from '../../modules/helpers';\n\nimport StickerButton from '../common/StickerButton';\n\nimport './ContactGreeting.scss';\n\ntype OwnProps = {\n userId: string;\n};\n\ntype StateProps = {\n sticker?: ApiSticker;\n lastUnreadMessageId?: number;\n connectionState?: ApiUpdateConnectionStateType;\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_DEBOUNCE_MS = 200;\n\nconst ContactGreeting: FC = ({\n sticker,\n connectionState,\n lastUnreadMessageId,\n loadGreetingStickers,\n sendMessage,\n markMessageListRead,\n}) => {\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({\n rootRef: containerRef,\n debounceMs: INTERSECTION_DEBOUNCE_MS,\n });\n useEffect(() => {\n if (sticker || connectionState !== 'connectionStateReady') {\n return;\n }\n\n loadGreetingStickers();\n }, [connectionState, loadGreetingStickers, sticker]);\n\n useEffect(() => {\n if (connectionState === 'connectionStateReady' && lastUnreadMessageId) {\n markMessageListRead({ maxId: lastUnreadMessageId });\n }\n }, [connectionState, markMessageListRead, lastUnreadMessageId]);\n\n const handleStickerSelect = useCallback((selectedSticker: ApiSticker) => {\n selectedSticker = {\n ...selectedSticker,\n isPreloadedGlobally: true,\n };\n sendMessage({ sticker: selectedSticker });\n }, [sendMessage]);\n\n return (\n
\n
\n

{lang('Conversation.EmptyPlaceholder')}

\n

{lang('Conversation.GreetingText')}

\n\n
\n {sticker && (\n \n )}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { userId }): StateProps => {\n const { stickers } = global.stickers.greeting;\n const dividend = getUserIdDividend(userId) + getUserIdDividend(global.currentUserId!);\n const sticker = stickers?.length ? stickers[dividend % stickers.length] : undefined;\n const chat = selectChat(global, userId);\n if (!chat) {\n return {};\n }\n\n return {\n sticker,\n lastUnreadMessageId: chat.lastMessage && chat.lastMessage.id !== chat.lastReadInboxMessageId\n ? chat.lastMessage.id\n : undefined,\n connectionState: global.connectionState,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadGreetingStickers', 'sendMessage', 'markMessageListRead',\n ]),\n)(ContactGreeting));\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport { MessageListType } from '../../global/types';\n\nimport useLang, { LangFn } from '../../hooks/useLang';\n\nimport './NoMessages.scss';\n\ntype OwnProps = {\n chatId: string;\n isChatWithSelf?: boolean;\n type: MessageListType;\n isGroupChatJustCreated?: boolean;\n};\n\nconst NoMessages: FC = ({\n isChatWithSelf, type, isGroupChatJustCreated,\n}) => {\n const lang = useLang();\n\n if (type === 'scheduled') {\n return renderScheduled(lang);\n }\n\n if (isChatWithSelf) {\n return renderSavedMessages(lang);\n }\n\n if (isGroupChatJustCreated) {\n return renderGroup(lang);\n }\n\n return (\n
{lang('NoMessages')}
\n );\n};\n\nfunction renderScheduled(lang: LangFn) {\n return (\n
{lang('ScheduledMessages.EmptyPlaceholder')}
\n );\n}\n\nfunction renderSavedMessages(lang: LangFn) {\n return (\n
\n
\n \n

{lang('Conversation.CloudStorageInfo.Title')}

\n
    \n
  • {lang('Conversation.ClousStorageInfo.Description1')}
  • \n
  • {lang('Conversation.ClousStorageInfo.Description2')}
  • \n
  • {lang('Conversation.ClousStorageInfo.Description3')}
  • \n
  • {lang('Conversation.ClousStorageInfo.Description4')}
  • \n
\n
\n
\n );\n}\n\nfunction renderGroup(lang: LangFn) {\n return (\n
\n
\n

{lang('EmptyGroupInfo.Title')}

\n

{lang('EmptyGroupInfo.Subtitle')}

\n
    \n
  • {lang('EmptyGroupInfo.Line1')}
  • \n
  • {lang('EmptyGroupInfo.Line2')}
  • \n
  • {lang('EmptyGroupInfo.Line3')}
  • \n
  • {lang('EmptyGroupInfo.Line4')}
  • \n
\n
\n
\n );\n}\n\nexport default memo(NoMessages);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef, useState,\n} from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiMessage, ApiRestrictionReason, MAIN_THREAD_ID,\n} from '../../api/types';\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport { LoadMoreDirection } from '../../types';\n\nimport { ANIMATION_END_DELAY, LOCAL_MESSAGE_ID_BASE, MESSAGE_LIST_SLICE } from '../../config';\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,\n selectCurrentMessageIds,\n} from '../../modules/selectors';\nimport {\n isChatChannel,\n isUserId,\n isChatWithRepliesBot,\n isChatGroup,\n} from '../../modules/helpers';\nimport { orderBy, pick } from '../../util/iteratees';\nimport { fastRaf, debounce, onTickEnd } from '../../util/schedulers';\nimport useLayoutEffectWithPrevDeps from '../../hooks/useLayoutEffectWithPrevDeps';\nimport useEffectWithPrevDeps from '../../hooks/useEffectWithPrevDeps';\nimport buildClassName from '../../util/buildClassName';\nimport { groupMessages } from './helpers/groupMessages';\nimport { preventMessageInputBlur } from './helpers/preventMessageInputBlur';\nimport useOnChange from '../../hooks/useOnChange';\nimport useStickyDates from './hooks/useStickyDates';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport resetScroll from '../../util/resetScroll';\nimport fastSmoothScroll, { isAnimatingScroll } from '../../util/fastSmoothScroll';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport useWindowSize from '../../hooks/useWindowSize';\n\nimport Loading from '../ui/Loading';\nimport MessageListContent from './MessageListContent';\nimport ContactGreeting from './ContactGreeting';\nimport NoMessages from './NoMessages';\n\nimport './MessageList.scss';\n\ntype OwnProps = {\n chatId: string;\n threadId: number;\n type: MessageListType;\n canPost: boolean;\n isReady: boolean;\n isActive: boolean;\n onFabToggle: (shouldShow: boolean) => void;\n onNotchToggle: (shouldShow: boolean) => void;\n hasTools?: boolean;\n};\n\ntype StateProps = {\n isChatLoaded?: boolean;\n isChannelChat?: boolean;\n isGroupChat?: boolean;\n isChatWithSelf?: boolean;\n isRepliesChat?: boolean;\n isCreator?: boolean;\n isBot?: 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 = 20;\nconst UNREAD_DIVIDER_TOP = 10;\nconst UNREAD_DIVIDER_TOP_WITH_TOOLS = 60;\nconst SCROLL_DEBOUNCE = 200;\nconst FOCUSING_DURATION = 1000;\nconst BOTTOM_FOCUS_MARGIN = 20;\nconst SELECT_MODE_ANIMATION_DURATION = 200;\nconst UNREAD_DIVIDER_CLASS = 'unread-divider';\n\nconst runDebouncedForScroll = debounce((cb) => cb(), SCROLL_DEBOUNCE, false);\n\nconst MessageList: FC = ({\n chatId,\n threadId,\n type,\n hasTools,\n onFabToggle,\n onNotchToggle,\n isChatLoaded,\n isChannelChat,\n isGroupChat,\n canPost,\n isReady,\n isActive,\n isChatWithSelf,\n isRepliesChat,\n isCreator,\n isBot,\n messageIds,\n messagesById,\n firstUnreadId,\n isViewportNewest,\n threadFirstMessageId,\n isRestricted,\n restrictionReason,\n focusingId,\n isSelectModeActive,\n loadViewportMessages,\n setScrollOffset,\n lastMessage,\n botDescription,\n threadTopMessageId,\n hasLinkedChat,\n openHistoryCalendar,\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 const memoFirstUnreadIdRef = useRef();\n const memoUnreadDividerBeforeIdRef = useRef();\n const memoFocusingIdRef = useRef();\n const isScrollTopJustUpdatedRef = useRef(false);\n const shouldAnimateAppearanceRef = useRef(Boolean(lastMessage));\n\n const [containerHeight, setContainerHeight] = useState();\n\n const areMessagesLoaded = Boolean(messageIds);\n\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 // Updated every time (to be used from intersection callback closure)\n useOnChange(() => {\n memoFirstUnreadIdRef.current = firstUnreadId;\n }, [firstUnreadId]);\n\n // Updated only once when messages are loaded (as we want the unread divider to keep its position)\n useOnChange(() => {\n if (areMessagesLoaded) {\n memoUnreadDividerBeforeIdRef.current = memoFirstUnreadIdRef.current;\n }\n }, [areMessagesLoaded]);\n\n useOnChange(() => {\n memoFocusingIdRef.current = focusingId;\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]).filter(Boolean);\n return groupMessages(orderBy(listedMessages, ['date', 'id']), memoUnreadDividerBeforeIdRef.current);\n }, [messageIds, messagesById, threadFirstMessageId, threadTopMessageId]);\n\n const loadMoreAround = useMemo(() => {\n if (type !== 'thread') {\n return undefined;\n }\n\n return debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Around }), 1000, true, false);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [loadViewportMessages, messageIds]);\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 // Memorize height for scroll animation\n const { height: windowHeight } = useWindowSize();\n\n useEffect(() => {\n if (isReady) {\n containerRef.current!.dataset.normalHeight = String(containerRef.current!.offsetHeight);\n }\n }, [windowHeight, isReady, canPost]);\n\n // Initial message loading\n useEffect(() => {\n if (!loadMoreAround || !isChatLoaded || isRestricted || focusingId) {\n return;\n }\n\n // Loading history while sending a message can return the same message and cause ambiguity\n const isLastMessageLocal = messageIds && messageIds[messageIds.length - 1] >= LOCAL_MESSAGE_ID_BASE;\n if (isLastMessageLocal) {\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 // Remember scroll position before repositioning it\n useOnChange(() => {\n if (!messageIds || !listItemElementsRef.current || !isReady) {\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 // This should match deps for `useLayoutEffectWithPrevDeps` below\n }, [messageIds, isViewportNewest, containerHeight, hasTools, isReady]);\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 hasLastMessageChanged = (\n messageIds && prevMessageIds && messageIds[messageIds.length - 1] !== prevMessageIds[prevMessageIds.length - 1]\n );\n const hasViewportShifted = (\n messageIds?.[0] !== prevMessageIds?.[0] && messageIds?.length === (MESSAGE_LIST_SLICE / 2 + 1)\n );\n const wasMessageAdded = hasLastMessageChanged && !hasViewportShifted;\n const isAlreadyFocusing = messageIds && memoFocusingIdRef.current === messageIds[messageIds.length - 1];\n\n const { scrollTop, scrollHeight, offsetHeight } = container;\n const scrollOffset = scrollOffsetRef.current!;\n const lastItemElement = listItemElementsRef.current[listItemElementsRef.current.length - 1];\n\n let bottomOffset = scrollOffset - (prevContainerHeight || offsetHeight);\n if (wasMessageAdded) {\n // If two new messages come at once (e.g. when bot responds) then the first message will update `scrollOffset`\n // right away (before animation) which creates inconsistency until the animation completes. To workaround that,\n // we calculate `isAtBottom` with a \"buffer\" of the latest message height (this is approximate).\n const lastItemHeight = lastItemElement ? lastItemElement.offsetHeight : 0;\n bottomOffset -= lastItemHeight;\n }\n const isAtBottom = isViewportNewest && prevIsViewportNewest && bottomOffset <= BOTTOM_THRESHOLD;\n\n let newScrollTop!: number;\n\n if (wasMessageAdded && isAtBottom && !isAlreadyFocusing) {\n if (lastItemElement) {\n fastRaf(() => {\n fastSmoothScroll(\n container,\n lastItemElement,\n 'end',\n BOTTOM_FOCUS_MARGIN,\n );\n });\n }\n\n newScrollTop = scrollHeight - offsetHeight;\n scrollOffsetRef.current = Math.max(Math.ceil(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 && document.getElementById(anchorIdRef.current);\n const unreadDivider = (\n !anchor\n && memoUnreadDividerBeforeIdRef.current\n && container.querySelector(`.${UNREAD_DIVIDER_CLASS}`)\n );\n\n if (isAtBottom && isResized) {\n if (isAnimatingScroll()) {\n return;\n }\n\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 = Math.min(\n unreadDivider.offsetTop - (hasTools ? UNREAD_DIVIDER_TOP_WITH_TOOLS : UNREAD_DIVIDER_TOP),\n scrollHeight - scrollOffset,\n );\n } else {\n newScrollTop = scrollHeight - scrollOffset;\n }\n\n resetScroll(container, Math.ceil(newScrollTop));\n\n if (!memoFocusingIdRef.current) {\n isScrollTopJustUpdatedRef.current = true;\n fastRaf(() => {\n isScrollTopJustUpdatedRef.current = false;\n });\n }\n\n scrollOffsetRef.current = Math.max(Math.ceil(scrollHeight - newScrollTop), offsetHeight);\n\n if (process.env.APP_ENV === 'perf') {\n // eslint-disable-next-line no-console\n console.timeEnd('scrollTop');\n }\n // This should match deps for `useOnChange` above\n }, [messageIds, isViewportNewest, containerHeight, hasTools]);\n\n useEffectWithPrevDeps(([prevIsSelectModeActive]) => {\n if (prevIsSelectModeActive !== undefined) {\n dispatchHeavyAnimationEvent(SELECT_MODE_ANIMATION_DURATION + ANIMATION_END_DELAY);\n }\n }, [isSelectModeActive]);\n\n const lang = useLang();\n\n const isPrivate = Boolean(chatId && isUserId(chatId));\n const withUsers = Boolean((!isPrivate && !isChannelChat) || isChatWithSelf || isRepliesChat);\n const noAvatars = Boolean(!withUsers || isChannelChat);\n const shouldRenderGreeting = isUserId(chatId) && !isChatWithSelf && !isBot\n && (\n (\n !messageGroups && !lastMessage && messageIds\n // Used to avoid flickering when deleting a greeting that has just been sent\n && (!listItemElementsRef.current || listItemElementsRef.current.length === 0)\n )\n || (messageIds?.length === 1 && messagesById?.[messageIds[0]]?.content.action?.type === 'contactSignUp')\n || (lastMessage?.content?.action?.type === 'contactSignUp')\n );\n\n const isGroupChatJustCreated = isGroupChat && isCreator\n && messageIds?.length === 1 && messagesById?.[messageIds[0]]?.content.action?.type === 'chatCreate';\n\n const className = buildClassName(\n 'MessageList custom-scroll',\n noAvatars && 'no-avatars',\n !canPost && 'no-composer',\n type === 'pinned' && 'type-pinned',\n isSelectModeActive && 'select-mode-active',\n isScrolled && 'scrolled',\n !isReady && 'is-animating',\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 ) : shouldRenderGreeting ? (\n \n ) : messageIds && (!messageGroups || isGroupChatJustCreated) ? (\n \n ) : ((messageIds && messageGroups) || lastMessage) ? (\n \n ) : (\n \n )}\n
\n );\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 const chatBot = selectChatBot(global, chatId)!;\n let botDescription: string | undefined;\n if (selectIsChatBotNotStarted(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 isGroupChat: isChatGroup(chat),\n isCreator: chat.isCreator,\n isChatWithSelf: selectIsChatWithSelf(global, chatId),\n isRepliesChat: isChatWithRepliesBot(chatId),\n isBot: Boolean(chatBot),\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 botDescription,\n threadTopMessageId,\n hasLinkedChat: chat.fullInfo && ('linkedChatId' in chat.fullInfo)\n ? Boolean(chat.fullInfo.linkedChatId)\n : undefined,\n ...(withLastMessageWhenPreloading && { lastMessage }),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadViewportMessages',\n 'setScrollOffset',\n 'openHistoryCalendar',\n ]),\n)(MessageList));\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 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 { formatIntegerCompact } from '../../util/textFormat';\nimport buildClassName from '../../util/buildClassName';\nimport { pick } from '../../util/iteratees';\nimport fastSmoothScroll from '../../util/fastSmoothScroll';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\nimport './ScrollDownButton.scss';\n\ntype OwnProps = {\n isShown: boolean;\n canPost?: boolean;\n withExtraShift?: boolean;\n};\n\ntype StateProps = {\n messageListType?: MessageListType;\n unreadCount?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst FOCUS_MARGIN = 20;\n\nconst ScrollDownButton: FC = ({\n isShown,\n canPost,\n messageListType,\n unreadCount,\n withExtraShift,\n focusNextReply,\n}) => {\n const lang = useLang();\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 focusNextReply();\n } else {\n const messagesContainer = elementRef.current!.parentElement!.querySelector('.MessageList')!;\n const messageElements = messagesContainer.querySelectorAll('.message-list-item');\n const lastMessageElement = messageElements[messageElements.length - 1];\n if (!lastMessageElement) {\n return;\n }\n\n fastSmoothScroll(messagesContainer, lastMessageElement, 'end', FOCUS_MARGIN);\n }\n }, [isShown, messageListType, focusNextReply]);\n\n const fabClassName = buildClassName(\n 'ScrollDownButton',\n isShown && 'revealed',\n !canPost && 'no-composer',\n withExtraShift && 'with-extra-shift',\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\n return {\n messageListType,\n unreadCount: chat && threadId === MAIN_THREAD_ID && messageListType === 'thread' ? chat.unreadCount : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['focusNextReply']),\n)(ScrollDownButton));\n","import { ApiAttachment } from '../../../../api/types';\nimport { SUPPORTED_IMAGE_CONTENT_TYPES, SUPPORTED_VIDEO_CONTENT_TYPES } from '../../../../config';\nimport {\n preloadImage,\n preloadVideo,\n createPosterForVideo,\n fetchBlob,\n} from '../../../../util/files';\nimport { scaleImage } from '../../../../util/imageResize';\n\nconst MAX_QUICK_IMG_SIZE = 1280; // px\nconst FILE_EXT_REGEX = /\\.[^/.]+$/;\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 (SUPPORTED_IMAGE_CONTENT_TYPES.has(mimeType)) {\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 resizedUrl = await scaleImage(blobUrl, MAX_QUICK_IMG_SIZE / Math.max(width, height), 'image/jpeg');\n URL.revokeObjectURL(blobUrl);\n const newBlob = await fetchBlob(resizedUrl);\n return buildAttachment(filename, newBlob, true, options);\n }\n\n if (mimeType === 'image/jpeg') {\n filename = filename.replace(FILE_EXT_REGEX, '.jpg');\n }\n\n quick = { width, height };\n } else {\n previewBlobUrl = blobUrl;\n }\n } else if (SUPPORTED_VIDEO_CONTENT_TYPES.has(mimeType)) {\n const { videoWidth: width, videoHeight: height, duration } = await preloadVideo(blobUrl);\n quick = { width, height, duration };\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","import { IS_IOS } from '../../../../util/environment';\n\nlet resetInput: HTMLInputElement;\n\nif (IS_IOS) {\n resetInput = document.createElement('input');\n resetInput.classList.add('for-ios-autocapitalization-fix');\n document.body.appendChild(resetInput);\n}\n\n// https://stackoverflow.com/a/55652503\nexport default function applyIosAutoCapitalizationFix(inputEl: HTMLElement) {\n resetInput.focus();\n inputEl.focus();\n}\n","export default __webpack_public_path__ + \"c0155344d336103c2b6a0b28cc510750.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 IOpusRecorder extends Omit {\n new(options: AnyLiteral): IOpusRecorder;\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: IOpusRecorder }>;\nlet OpusRecorder: IOpusRecorder;\nlet mediaRecorder: IOpusRecorder;\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: IOpusRecorder, 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 {\n useCallback, useEffect, useRef, useState,\n} from '../../../../lib/teact/teact';\n\nimport { IS_SAFARI, IS_VOICE_RECORDING_SUPPORTED } 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_SAFARI && IS_VOICE_RECORDING_SUPPORTED) {\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 { 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, inputId?: 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 && ![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)\n .find((item) => CLIPBOARD_ACCEPTED_TYPES.includes(item.type) && item.kind === 'file');\n const file = media && media.getAsFile();\n const pastedText = e.clipboardData.getData('text').substring(0, MAX_MESSAGE_LENGTH);\n\n e.preventDefault();\n\n if (!file && !pastedText) {\n return;\n }\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, input?.id);\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 '../../../../util/parseMessageInput';\nimport getMessageTextAsHtml from '../helpers/getMessageTextAsHtml';\nimport useBackgroundMode from '../../../../hooks/useBackgroundMode';\nimport useBeforeUnload from '../../../../hooks/useBeforeUnload';\nimport { IS_TOUCH_ENV } from '../../../../util/environment';\n\n// Used to avoid running debounced callbacks when chat changes.\nlet currentChatId: string | undefined;\nlet currentThreadId: number | undefined;\n\nexport default (\n draft: ApiFormattedText | undefined,\n chatId: string,\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: string, 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 if (!IS_TOUCH_ENV) {\n requestAnimationFrame(() => {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n focusEditableElement(messageInput, true);\n });\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 const handleBlur = useCallback(() => {\n if (chatId && threadId) {\n updateDraft(chatId, threadId);\n }\n }, [chatId, threadId, updateDraft]);\n\n useBackgroundMode(handleBlur);\n useBeforeUnload(handleBlur);\n};\n","import { useCallback, useEffect } from '../../../../lib/teact/teact';\nimport { getDispatch } from '../../../../lib/teact/teactn';\nimport { InlineBotSettings } from '../../../../types';\nimport useFlag from '../../../../hooks/useFlag';\nimport usePrevious from '../../../../hooks/usePrevious';\n\nconst tempEl = document.createElement('div');\nconst INLINE_BOT_QUERY_REGEXP = /^@([a-z0-9_]{1,32})[\\u00A0\\u0020]+(.*)/i;\nconst HAS_NEW_LINE = /^@([a-z0-9_]{1,32})[\\u00A0\\u0020]+\\n{2,}/i;\n\nexport default function useInlineBotTooltip(\n isAllowed: boolean,\n chatId: string,\n html: string,\n inlineBots?: Record,\n) {\n const [isOpen, markIsOpen, unmarkIsOpen] = useFlag();\n const text = getPlainText(html);\n const { queryInlineBot, resetInlineBot } = getDispatch();\n const { username, query, canShowHelp } = parseStartWithUsernameString(text);\n const usernameLowered = username.toLowerCase();\n const prevQuery = usePrevious(query);\n const prevUsername = usePrevious(username);\n const inlineBotData = inlineBots?.[usernameLowered];\n const {\n id: botId,\n switchPm,\n offset,\n results,\n isGallery,\n help,\n } = inlineBotData || {};\n\n useEffect(() => {\n if (prevQuery !== query) {\n unmarkIsOpen();\n }\n }, [prevQuery, query, unmarkIsOpen]);\n\n useEffect(() => {\n if (isAllowed && usernameLowered && chatId) {\n queryInlineBot({ chatId, username: usernameLowered, query });\n }\n }, [query, isAllowed, queryInlineBot, chatId, usernameLowered]);\n\n const loadMore = useCallback(() => {\n queryInlineBot({\n chatId, username: usernameLowered, query, offset,\n });\n }, [offset, chatId, query, queryInlineBot, usernameLowered]);\n\n useEffect(() => {\n if (isAllowed && botId && (switchPm || (results?.length))) {\n markIsOpen();\n } else {\n unmarkIsOpen();\n }\n }, [botId, isAllowed, markIsOpen, results, switchPm, unmarkIsOpen]);\n\n if (prevUsername !== username) {\n resetInlineBot({ username: prevUsername });\n }\n\n return {\n isOpen,\n closeTooltip: unmarkIsOpen,\n loadMore,\n username,\n id: botId,\n isGallery,\n switchPm,\n results,\n help: canShowHelp && help ? `@${username} ${help}` : undefined,\n };\n}\n\nfunction getPlainText(html: string) {\n tempEl.innerHTML = html.replace(/
/g, '\\n');\n\n return tempEl.innerText;\n}\n\nfunction parseStartWithUsernameString(text: string) {\n const result = text.match(INLINE_BOT_QUERY_REGEXP);\n if (!result) {\n return { username: '', query: '', canShowHelp: false };\n }\n\n return {\n username: result[1],\n query: result[2],\n canShowHelp: result[2] === '' && !text.match(HAS_NEW_LINE),\n };\n}\n","import {\n useCallback, useEffect, useState,\n} from '../../../../lib/teact/teact';\n\nimport { ApiBotCommand } from '../../../../api/types';\n\nimport { prepareForRegExp } from '../helpers/prepareForRegExp';\nimport { throttle } from '../../../../util/schedulers';\nimport useFlag from '../../../../hooks/useFlag';\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\nconst RE_COMMAND = /^[\\w@]{1,32}\\s?/i;\n\nexport default function useBotCommandTooltip(\n isAllowed: boolean,\n html: string,\n botCommands?: ApiBotCommand[] | false,\n chatBotCommands?: ApiBotCommand[],\n) {\n const [isOpen, markIsOpen, unmarkIsOpen] = useFlag();\n const [filteredBotCommands, setFilteredBotCommands] = useState();\n\n const getFilteredCommands = useCallback((filter) => {\n if (!botCommands && !chatBotCommands) {\n setFilteredBotCommands(undefined);\n\n return;\n }\n\n runThrottled(() => {\n const nextFilteredBotCommands = (botCommands || chatBotCommands || [])\n .filter(({ command }) => !filter || command.includes(filter));\n setFilteredBotCommands(\n nextFilteredBotCommands && nextFilteredBotCommands.length ? nextFilteredBotCommands : undefined,\n );\n });\n }, [botCommands, chatBotCommands]);\n\n useEffect(() => {\n if (!isAllowed || !html.length) {\n unmarkIsOpen();\n return;\n }\n\n const shouldShowCommands = html.startsWith('/');\n\n if (shouldShowCommands) {\n const filter = prepareForRegExp(html.substr(1)).match(RE_COMMAND);\n getFilteredCommands(filter ? filter[0] : '');\n } else {\n unmarkIsOpen();\n }\n }, [getFilteredCommands, html, isAllowed, unmarkIsOpen]);\n\n useEffect(() => {\n if (filteredBotCommands && filteredBotCommands.length) {\n markIsOpen();\n } else {\n unmarkIsOpen();\n }\n }, [filteredBotCommands, markIsOpen, unmarkIsOpen]);\n\n return {\n isOpen,\n close: unmarkIsOpen,\n filteredBotCommands,\n };\n}\n","import React, { FC, memo } 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 memo(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, memo } 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 memo(AttachMenuAsync);\n","import React, { FC, memo } 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 memo(SymbolMenuAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './InlineBotTooltip';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst InlineBotTooltipAsync: FC = (props) => {\n const { isOpen } = props;\n const InlineBotTooltip = useModuleLoader(Bundles.Extra, 'InlineBotTooltip', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return InlineBotTooltip ? : undefined;\n};\n\nexport default memo(InlineBotTooltipAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './MentionTooltip';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst MentionTooltipAsync: FC = (props) => {\n const { isOpen } = props;\n const MentionTooltip = useModuleLoader(Bundles.Extra, 'MentionTooltip', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return MentionTooltip ? : undefined;\n};\n\nexport default memo(MentionTooltipAsync);\n","import React, { FC, memo } 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 memo(CustomSendMenuAsync);\n","import React, { FC } from '../../../lib/teact/teact';\nimport { OwnProps } from './StickerTooltip';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst StickerTooltipAsync: FC = (props) => {\n const { isOpen } = props;\n const StickerTooltip = useModuleLoader(Bundles.Extra, 'StickerTooltip', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return StickerTooltip ? : undefined;\n};\n\nexport default StickerTooltipAsync;\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './BotCommandTooltip';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst BotCommandTooltipAsync: FC = (props) => {\n const { isOpen } = props;\n const BotCommandTooltip = useModuleLoader(Bundles.Extra, 'BotCommandTooltip', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return BotCommandTooltip ? : undefined;\n};\n\nexport default memo(BotCommandTooltipAsync);\n","import React, { FC, memo, useEffect } 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';\nimport useFlag from '../../../hooks/useFlag';\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 const { isKeyboardSingleUse } = message || {};\n const [forceOpen, markForceOpen, unmarkForceOpen] = useFlag(true);\n\n const handleClose = () => {\n unmarkForceOpen();\n onClose();\n };\n\n useEffect(() => {\n markForceOpen();\n }, [markForceOpen, message]);\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, {\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 { isUserId } 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 = isUserId(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, memo } 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 memo(AttachmentModalAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './BotCommandMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst BotCommandMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const BotCommandMenu = useModuleLoader(Bundles.Extra, 'BotCommandMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return BotCommandMenu ? : undefined;\n};\n\nexport default memo(BotCommandMenuAsync);\n","import React, { FC, memo } 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 memo(PollModalAsync);\n","import React, { FC, memo } 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 memo(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';\nimport { ISettings } from '../../../types';\n\nimport { RE_LINK_TEMPLATE } from '../../../config';\nimport { selectNoWebPage, selectTheme } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport parseMessageInput from '../../../util/parseMessageInput';\nimport useOnChange from '../../../hooks/useOnChange';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useCurrentOrPrev from '../../../hooks/useCurrentOrPrev';\nimport buildClassName from '../../../util/buildClassName';\n\nimport WebPage from '../message/WebPage';\nimport Button from '../../ui/Button';\n\nimport './WebPagePreview.scss';\n\ntype OwnProps = {\n chatId: string;\n threadId: number;\n messageText: string;\n disabled?: boolean;\n};\n\ntype StateProps = {\n webPagePreview?: ApiWebPage;\n noWebPage?: boolean;\n theme: ISettings['theme'];\n};\ntype DispatchProps = Pick;\n\nconst RE_LINK = new RegExp(RE_LINK_TEMPLATE, 'i');\n\nconst WebPagePreview: FC = ({\n chatId,\n threadId,\n messageText,\n disabled,\n webPagePreview,\n noWebPage,\n theme,\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 isShown = Boolean(webPagePreview && messageText.length && !noWebPage && !disabled);\n const { shouldRender, transitionClassNames } = useShowTransition(isShown);\n\n const renderingWebPage = useCurrentOrPrev(webPagePreview, true);\n\n if (!shouldRender || !renderingWebPage) {\n return undefined;\n }\n\n const handleClearWebpagePreview = () => {\n toggleMessageWebPage({ chatId, threadId, noWebPage: true });\n };\n\n // TODO Refactor so `WebPage` can be used without message\n const { photo, ...webPageWithoutPhoto } = renderingWebPage;\n const messageStub = {\n content: {\n webPage: webPageWithoutPhoto,\n },\n } as ApiMessage;\n\n return (\n
\n
\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 theme: selectTheme(global),\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, memo } 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 memo(CalendarModalAsync);\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 ApiBotInlineResult,\n ApiBotInlineMediaResult,\n ApiSticker,\n ApiVideo,\n ApiNewPoll,\n ApiMessage,\n ApiFormattedText,\n ApiChat,\n ApiChatMember,\n ApiUser,\n MAIN_THREAD_ID,\n ApiBotCommand,\n} from '../../../api/types';\nimport { InlineBotSettings } from '../../../types';\n\nimport {\n BASE_EMOJI_KEYWORD_LANG, EDITABLE_INPUT_ID, REPLIES_USER_ID, SCHEDULED_WHEN_ONLINE,\n} from '../../../config';\nimport { IS_VOICE_RECORDING_SUPPORTED, IS_SINGLE_COLUMN_LAYOUT, IS_IOS } from '../../../util/environment';\nimport {\n selectChat,\n selectIsRightColumnShown,\n selectIsInSelectMode,\n selectNewestMessageWithBotKeyboardButtons,\n selectDraft,\n selectScheduledIds,\n selectEditingMessage,\n selectIsChatWithSelf,\n selectChatBot,\n selectChatUser,\n selectChatMessage,\n} from '../../../modules/selectors';\nimport {\n getAllowedAttachmentOptions,\n getChatSlowModeOptions,\n isUserId,\n isChatAdmin,\n} from '../../../modules/helpers';\nimport { formatMediaDuration, formatVoiceRecordDuration, getDayStartAt } from '../../../util/dateFormat';\nimport focusEditableElement from '../../../util/focusEditableElement';\nimport parseMessageInput from '../../../util/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 windowSize from '../../../util/windowSize';\nimport { isSelectionInsideInput } from './helpers/selection';\nimport applyIosAutoCapitalizationFix from './helpers/applyIosAutoCapitalizationFix';\nimport { getServerTime } from '../../../util/serverTime';\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 useStickerTooltip from './hooks/useStickerTooltip';\nimport useEmojiTooltip from './hooks/useEmojiTooltip';\nimport useMentionTooltip from './hooks/useMentionTooltip';\nimport useContextMenuHandlers from '../../../hooks/useContextMenuHandlers';\nimport useLang from '../../../hooks/useLang';\nimport useInlineBotTooltip from './hooks/useInlineBotTooltip';\nimport useBotCommandTooltip from './hooks/useBotCommandTooltip';\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 InlineBotTooltip from './InlineBotTooltip.async';\nimport MentionTooltip from './MentionTooltip.async';\nimport CustomSendMenu from './CustomSendMenu.async';\nimport StickerTooltip from './StickerTooltip.async';\nimport EmojiTooltip from './EmojiTooltip.async';\nimport BotCommandTooltip from './BotCommandTooltip.async';\nimport BotKeyboardMenu from './BotKeyboardMenu';\nimport MessageInput from './MessageInput';\nimport ComposerEmbeddedMessage from './ComposerEmbeddedMessage';\nimport AttachmentModal from './AttachmentModal.async';\nimport BotCommandMenu from './BotCommandMenu.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';\n\nimport './Composer.scss';\n\ntype OwnProps = {\n chatId: string;\n threadId: number;\n messageListType: MessageListType;\n dropAreaState: string;\n isReady: boolean;\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 isPollModalOpen?: boolean;\n botKeyboardMessageId?: number;\n botKeyboardPlaceholder?: string;\n withScheduledButton?: boolean;\n shouldSchedule?: boolean;\n canScheduleUntilOnline?: boolean;\n stickersForEmoji?: ApiSticker[];\n groupChatMembers?: ApiChatMember[];\n currentUserId?: string;\n usersById?: Record;\n recentEmojis: string[];\n lastSyncTime?: number;\n contentToBeScheduled?: GlobalState['messages']['contentToBeScheduled'];\n shouldSuggestStickers?: boolean;\n baseEmojiKeywords?: Record;\n emojiKeywords?: Record;\n serverTimeOffset: number;\n topInlineBotIds?: string[];\n isInlineBotLoading: boolean;\n inlineBots?: Record;\n botCommands?: ApiBotCommand[] | false;\n chatBotCommands?: ApiBotCommand[];\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 MESSAGE_MAX_LENGTH = 4096;\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 isReady,\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 isPollModalOpen,\n botKeyboardMessageId,\n botKeyboardPlaceholder,\n withScheduledButton,\n stickersForEmoji,\n groupChatMembers,\n topInlineBotIds,\n currentUserId,\n usersById,\n lastSyncTime,\n contentToBeScheduled,\n shouldSuggestStickers,\n baseEmojiKeywords,\n emojiKeywords,\n serverTimeOffset,\n recentEmojis,\n inlineBots,\n isInlineBotLoading,\n botCommands,\n chatBotCommands,\n sendMessage,\n editMessage,\n saveDraft,\n clearDraft,\n showDialog,\n setStickerSearchQuery,\n setGifSearchQuery,\n forwardMessages,\n openPollModal,\n closePollModal,\n loadScheduledHistory,\n openChat,\n addRecentEmoji,\n sendInlineBotResult,\n}) => {\n const lang = useLang();\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 const { width: windowWidth } = windowSize.get();\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 && isReady) {\n loadScheduledHistory({ chatId });\n }\n }, [isReady, chatId, loadScheduledHistory, lastSyncTime, threadId]);\n\n useLayoutEffect(() => {\n if (!appendixRef.current) return;\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 [isBotCommandMenuOpen, openBotCommandMenu, closeBotCommandMenu] = 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 isMentionTooltipOpen, closeMentionTooltip, insertMention, mentionFilteredUsers,\n } = useMentionTooltip(\n !attachments.length,\n html,\n setHtml,\n undefined,\n groupChatMembers,\n topInlineBotIds,\n currentUserId,\n usersById,\n );\n\n const {\n isOpen: isInlineBotTooltipOpen,\n id: inlineBotId,\n isGallery: isInlineBotTooltipGallery,\n switchPm: inlineBotSwitchPm,\n results: inlineBotResults,\n closeTooltip: closeInlineBotTooltip,\n help: inlineBotHelp,\n loadMore: loadMoreForInlineBot,\n } = useInlineBotTooltip(\n Boolean(!attachments.length && lastSyncTime),\n chatId,\n html,\n inlineBots,\n );\n\n const {\n isOpen: isBotCommandTooltipOpen,\n close: closeBotCommandTooltip,\n filteredBotCommands: botTooltipCommands,\n } = useBotCommandTooltip(\n Boolean((botCommands && botCommands.length) || (chatBotCommands && chatBotCommands.length)),\n html,\n botCommands,\n chatBotCommands,\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 { isStickerTooltipOpen, closeStickerTooltip } = useStickerTooltip(\n Boolean(shouldSuggestStickers && allowedAttachmentOptions.canSendStickers && !attachments.length),\n html,\n stickersForEmoji,\n !isReady,\n );\n const {\n isEmojiTooltipOpen, closeEmojiTooltip, filteredEmojis, insertEmoji,\n } = useEmojiTooltip(\n Boolean(shouldSuggestStickers && allowedAttachmentOptions.canSendStickers && !attachments.length),\n html,\n recentEmojis,\n undefined,\n setHtml,\n baseEmojiKeywords,\n emojiKeywords,\n !isReady,\n );\n\n const insertTextAndUpdateCursor = useCallback((text: string, inputId: string = EDITABLE_INPUT_ID) => {\n const selection = window.getSelection()!;\n const messageInput = document.getElementById(inputId)!;\n const newHtml = renderText(text, ['escape_html', 'emoji_html', 'br_html'])\n .join('')\n .replace(/\\u200b+/g, '\\u200b');\n\n if (selection.rangeCount) {\n const selectionRange = selection.getRangeAt(0);\n if (isSelectionInsideInput(selectionRange, inputId)) {\n insertHtmlInSelection(newHtml);\n messageInput.dispatchEvent(new Event('input', { bubbles: true }));\n return;\n }\n }\n\n setHtml(`${htmlRef.current!}${newHtml}`);\n\n // If selection is outside of input, set cursor at the end of input\n requestAnimationFrame(() => {\n focusEditableElement(messageInput);\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, EDITABLE_INPUT_ID)) {\n document.execCommand('delete', false);\n return;\n }\n }\n\n setHtml(deleteLastCharacterOutsideSelection(htmlRef.current!));\n }, []);\n\n const resetComposer = useCallback((shouldPreserveInput = false) => {\n if (!shouldPreserveInput) {\n setHtml('');\n }\n setAttachments([]);\n closeStickerTooltip();\n closeCalendar();\n setScheduledMessageArgs(undefined);\n closeMentionTooltip();\n closeEmojiTooltip();\n\n if (IS_SINGLE_COLUMN_LAYOUT) {\n // @optimization\n setTimeout(() => closeSymbolMenu(), SENDING_ANIMATION_DURATION);\n } else {\n closeSymbolMenu();\n }\n }, [closeStickerTooltip, closeCalendar, closeMentionTooltip, closeEmojiTooltip, closeSymbolMenu]);\n\n // Handle chat change (ref is used to avoid redundant effect calls)\n const stopRecordingVoiceRef = useRef();\n stopRecordingVoiceRef.current = stopRecordingVoice;\n useEffect(() => {\n return () => {\n stopRecordingVoiceRef.current!();\n resetComposer();\n };\n }, [chatId, resetComposer, stopRecordingVoiceRef]);\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 handleAppendFiles = useCallback(async (files: File[], isQuick: boolean) => {\n setAttachments([\n ...attachments,\n ...await Promise.all(files.map((file) => buildAttachment(file.name, file, isQuick))),\n ]);\n }, [attachments]);\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\n if (!currentAttachments.length && !text && !isForwarding) {\n return;\n }\n\n const maxLength = currentAttachments.length ? CAPTION_MAX_LENGTH : MESSAGE_MAX_LENGTH;\n if (text?.length > maxLength) {\n const extraLength = text.length - maxLength;\n showDialog({\n data: {\n message: 'MESSAGE_TOO_LONG_PLEASE_REMOVE_CHARACTERS',\n textParams: {\n '{EXTRA_CHARS_COUNT}': extraLength,\n '{PLURAL_S}': extraLength > 1 ? 's' : '',\n },\n hasErrorKey: true,\n },\n });\n\n return;\n }\n\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n\n if (currentAttachments.length || text) {\n if (slowMode && !isAdmin) {\n const nowSeconds = getServerTime(serverTimeOffset);\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 showDialog({\n data: {\n message: lang('SlowModeHint', formatMediaDuration(secondsRemaining)),\n isSlowMode: true,\n hasErrorKey: false,\n },\n });\n\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\n if (isForwarding) {\n forwardMessages({\n scheduledAt,\n isSilent,\n });\n }\n\n lastMessageSendTimeSeconds.current = getServerTime(serverTimeOffset);\n\n clearDraft({ chatId, localOnly: true });\n\n if (IS_IOS && messageInput === document.activeElement) {\n applyIosAutoCapitalizationFix(messageInput);\n }\n\n // Wait until message animation starts\n requestAnimationFrame(() => {\n resetComposer();\n });\n }, [\n connectionState, attachments, activeVoiceRecording, isForwarding, clearDraft, chatId, serverTimeOffset,\n resetComposer, stopRecordingVoice, showDialog, slowMode, isAdmin, sendMessage, forwardMessages, lang,\n ]);\n\n const handleActivateBotCommandMenu = useCallback(() => {\n closeSymbolMenu();\n openBotCommandMenu();\n }, [closeSymbolMenu, openBotCommandMenu]);\n\n const handleActivateSymbolMenu = useCallback(() => {\n closeBotCommandMenu();\n openSymbolMenu();\n }, [closeBotCommandMenu, openSymbolMenu]);\n\n const handleStickerSelect = useCallback((sticker: ApiSticker, shouldPreserveInput = false) => {\n sticker = {\n ...sticker,\n isPreloadedGlobally: true,\n };\n\n if (shouldSchedule) {\n setScheduledMessageArgs({ sticker });\n openCalendar();\n } else {\n sendMessage({ sticker });\n requestAnimationFrame(() => {\n resetComposer(shouldPreserveInput);\n });\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(() => {\n resetComposer(true);\n });\n }\n }, [shouldSchedule, openCalendar, sendMessage, resetComposer]);\n\n const handleInlineBotSelect = useCallback((inlineResult: ApiBotInlineResult | ApiBotInlineMediaResult) => {\n if (connectionState !== 'connectionStateReady') {\n return;\n }\n\n sendInlineBotResult({\n id: inlineResult.id,\n queryId: inlineResult.queryId,\n });\n\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n if (IS_IOS && messageInput === document.activeElement) {\n applyIosAutoCapitalizationFix(messageInput);\n }\n\n clearDraft({ chatId, localOnly: true });\n requestAnimationFrame(() => {\n resetComposer();\n });\n }, [chatId, clearDraft, connectionState, resetComposer, sendInlineBotResult]);\n\n const handleBotCommandSelect = useCallback(() => {\n clearDraft({ chatId, localOnly: true });\n requestAnimationFrame(() => {\n resetComposer();\n });\n }, [chatId, clearDraft, 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 void handleSend(true);\n }\n }, [handleSend, openCalendar, shouldSchedule]);\n\n const handleMessageSchedule = useCallback((date: Date, isWhenOnline = false) => {\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 + (isWhenOnline ? 0 : serverTimeOffset);\n\n if (!scheduledMessageArgs || Object.keys(restArgs).length === 0) {\n void handleSend(!!isSilent, scheduledAt);\n } else {\n sendMessage({\n ...scheduledMessageArgs,\n scheduledAt,\n });\n requestAnimationFrame(() => {\n resetComposer();\n });\n }\n closeCalendar();\n }, [closeCalendar, handleSend, resetComposer, scheduledMessageArgs, sendMessage, serverTimeOffset]);\n\n const handleMessageScheduleUntilOnline = useCallback(() => {\n handleMessageSchedule(new Date(SCHEDULED_WHEN_ONLINE * 1000), true);\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_SINGLE_COLUMN_LAYOUT || messageInput !== document.activeElement) {\n openSymbolMenu();\n return;\n }\n\n messageInput.blur();\n setTimeout(() => {\n closeBotCommandMenu();\n openSymbolMenu();\n }, MOBILE_KEYBOARD_HIDE_DELAY_MS);\n }, [openSymbolMenu, closeBotCommandMenu]);\n\n const handleAllScheduledClick = useCallback(() => {\n openChat({ id: chatId, threadId, type: 'scheduled' });\n }, [openChat, chatId, threadId]);\n\n useEffect(() => {\n if (isRightColumnShown && IS_SINGLE_COLUMN_LAYOUT) {\n closeSymbolMenu();\n }\n }, [isRightColumnShown, closeSymbolMenu]);\n\n useEffect(() => {\n if (!isReady) return;\n\n if (isSelectModeActive) {\n disableHover();\n } else {\n setTimeout(() => {\n enableHover();\n }, SELECT_MODE_TRANSITION_MS);\n }\n }, [isSelectModeActive, enableHover, disableHover, isReady]);\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 void handleSend();\n }\n break;\n case MainButtonState.Record:\n void startRecordingVoice();\n break;\n case MainButtonState.Edit:\n handleEditComplete();\n break;\n default:\n break;\n }\n }, [\n mainButtonState, shouldSchedule, startRecordingVoice, handleEditComplete,\n activeVoiceRecording, openCalendar, pauseRecordingVoice, handleSend,\n ]);\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 = 'SendMessage';\n switch (mainButtonState) {\n case MainButtonState.Edit:\n sendButtonAriaLabel = 'Save edited message';\n break;\n case MainButtonState.Record:\n sendButtonAriaLabel = areVoiceMessagesNotAllowed\n ? 'Conversation.DefaultRestrictedMedia'\n : 'AccDescrVoiceMessage';\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 !isReady && 'not-ready',\n isSymbolMenuLoaded\n ? (isSymbolMenuOpen && 'menu-opened')\n : (isSymbolMenuOpen && 'is-loading'),\n );\n\n const onSend = mainButtonState === MainButtonState.Edit\n ? handleEditComplete\n : (shouldSchedule ? openCalendar : handleSend);\n\n return (\n
\n {allowedAttachmentOptions.canAttachMedia && isReady && (\n \n \n \n )}\n \n \n {renderedEditedMessage && (\n \n )}\n \n \n \n
\n
\n \n \n
\n {isChatWithBot && botCommands !== false && !activeVoiceRecording && !editingMessage && (\n \n \n \n )}\n {IS_SINGLE_COLUMN_LAYOUT ? (\n \n \n \n {isSymbolMenuOpen && !isSymbolMenuLoaded && }\n \n ) : (\n \n \n \n )}\n \n {isInlineBotLoading && Boolean(inlineBotId) && (\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 \n {botKeyboardMessageId && (\n \n )}\n {botCommands && (\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 chatBot = chatId !== REPLIES_USER_ID ? selectChatBot(global, chatId) : undefined;\n const isChatWithBot = Boolean(chatBot);\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const messageWithActualBotKeyboard = isChatWithBot && selectNewestMessageWithBotKeyboardButtons(global, chatId);\n const scheduledIds = selectScheduledIds(global, chatId);\n const { language, shouldSuggestStickers } = global.settings.byKey;\n const baseEmojiKeywords = global.emojiKeywords[BASE_EMOJI_KEYWORD_LANG];\n const emojiKeywords = language !== BASE_EMOJI_KEYWORD_LANG ? global.emojiKeywords[language] : undefined;\n const botKeyboardMessageId = messageWithActualBotKeyboard ? messageWithActualBotKeyboard.id : undefined;\n const keyboardMessage = botKeyboardMessageId ? selectChatMessage(global, chatId, botKeyboardMessageId) : undefined;\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 && isUserId(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?.length)\n ),\n shouldSchedule: messageListType === 'scheduled',\n botKeyboardMessageId,\n botKeyboardPlaceholder: keyboardMessage?.keyboardPlaceholder,\n isForwarding: chatId === global.forwardMessages.toChatId,\n isPollModalOpen: global.isPollModalOpen,\n stickersForEmoji: global.stickers.forEmoji.stickers,\n groupChatMembers: chat?.fullInfo?.members,\n topInlineBotIds: global.topInlineBots?.userIds,\n currentUserId: global.currentUserId,\n usersById: global.users.byId,\n lastSyncTime: global.lastSyncTime,\n contentToBeScheduled: global.messages.contentToBeScheduled,\n shouldSuggestStickers,\n recentEmojis: global.recentEmojis,\n baseEmojiKeywords: baseEmojiKeywords?.keywords,\n emojiKeywords: emojiKeywords?.keywords,\n serverTimeOffset: global.serverTimeOffset,\n inlineBots: global.inlineBots.byUsername,\n isInlineBotLoading: global.inlineBots.isLoading,\n chatBotCommands: chat && chat.fullInfo && chat.fullInfo.botCommands,\n botCommands: chatBot && chatBot.fullInfo ? (chatBot.fullInfo.botCommands || false) : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'sendMessage',\n 'editMessage',\n 'saveDraft',\n 'clearDraft',\n 'showDialog',\n 'setStickerSearchQuery',\n 'setGifSearchQuery',\n 'forwardMessages',\n 'openPollModal',\n 'closePollModal',\n 'loadScheduledHistory',\n 'openChat',\n 'addRecentEmoji',\n 'sendInlineBotResult',\n ]),\n)(Composer));\n","import { useEffect, useMemo } 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';\nimport { prepareForRegExp } from '../helpers/prepareForRegExp';\n\nexport default function useStickerTooltip(\n isAllowed: boolean,\n html: string,\n stickers?: ApiSticker[],\n isDisabled = false,\n) {\n const cleanHtml = useMemo(() => prepareForRegExp(html).trim(), [html]);\n const { loadStickersForEmoji, clearStickersForEmoji } = getDispatch();\n const isSingleEmoji = (\n (IS_EMOJI_SUPPORTED && parseEmojiOnlyString(cleanHtml) === 1)\n || (!IS_EMOJI_SUPPORTED && Boolean(html.match(/^]*?>$/g)))\n );\n const hasStickers = Boolean(stickers) && isSingleEmoji;\n\n useEffect(() => {\n if (isDisabled) return;\n\n if (isAllowed && isSingleEmoji) {\n loadStickersForEmoji({ emoji: cleanHtml });\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, isDisabled]);\n\n return {\n isStickerTooltipOpen: hasStickers,\n closeStickerTooltip: clearStickersForEmoji,\n };\n}\n","export default function insertHtmlInSelection(html: string) {\n const selection = window.getSelection();\n\n if (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 } else {\n range.collapse(false);\n }\n selection.removeAllRanges();\n selection.addRange(range);\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 '../../../../util/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, memo } 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 memo(MobileSearchAsync);\n","import React, { FC, memo } 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 memo(MessageSelectToolbarAsync);\n","import React, { FC, memo } 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 memo(UnpinAllMessagesModalAsync);\n","import React, { FC, memo } 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 memo(PaymentModalAsync);\n","import React, { FC, memo } 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 memo(ReceiptModalAsync);\n","import React, {\n FC, useEffect, useState, memo, useMemo, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChatBannedRights, MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalActions, MessageListType, MessageList as GlobalMessageList } from '../../global/types';\nimport { ThemeKey } from '../../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 ANIMATION_LEVEL_MAX,\n ANIMATION_END_DELAY,\n DARK_THEME_BG_COLOR,\n LIGHT_THEME_BG_COLOR,\n ANIMATION_LEVEL_MIN,\n SUPPORTED_IMAGE_CONTENT_TYPES,\n} from '../../config';\nimport {\n IS_SINGLE_COLUMN_LAYOUT,\n IS_TABLET_COLUMN_LAYOUT,\n IS_TOUCH_ENV,\n MASK_IMAGE_DISABLED,\n} from '../../util/environment';\nimport { DropAreaState } from './composer/DropArea';\nimport {\n selectChat,\n selectCurrentMessageList,\n selectCurrentTextSearch,\n selectIsChatBotNotStarted,\n selectIsInSelectMode,\n selectIsRightColumnShown,\n selectPinnedIds,\n selectTheme,\n} from '../../modules/selectors';\nimport { getCanPostInChat, getMessageSendingRestrictionReason, isUserId } 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 usePrevDuringAnimation from '../../hooks/usePrevDuringAnimation';\nimport calculateMiddleFooterTransforms from './helpers/calculateMiddleFooterTransforms';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\nimport { createMessageHash } from '../../util/routing';\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';\nimport PaymentModal from '../payment/PaymentModal.async';\nimport ReceiptModal from '../payment/ReceiptModal.async';\n\nimport './MiddleColumn.scss';\n\ntype StateProps = {\n chatId?: string;\n threadId?: number;\n messageListType?: MessageListType;\n isPrivate?: boolean;\n isPinnedMessageList?: boolean;\n isScheduledMessageList?: boolean;\n canPost?: boolean;\n currentUserBannedRights?: ApiChatBannedRights;\n defaultBannedRights?: ApiChatBannedRights;\n hasPinnedOrAudioMessage?: boolean;\n pinnedMessagesCount?: number;\n theme: ThemeKey;\n customBackground?: string;\n backgroundColor?: string;\n patternColor?: string;\n isLeftColumnShown?: boolean;\n isRightColumnShown?: boolean;\n isBackgroundBlurred?: boolean;\n isMobileSearchActive?: boolean;\n isSelectModeActive?: boolean;\n isPaymentModalOpen?: boolean;\n isReceiptModalOpen?: boolean;\n animationLevel?: number;\n shouldSkipHistoryAnimations?: boolean;\n currentTransitionKey: number;\n messageLists?: GlobalMessageList[];\n};\n\ntype DispatchProps = Pick;\n\nconst CLOSE_ANIMATION_DURATION = IS_SINGLE_COLUMN_LAYOUT ? 450 + ANIMATION_END_DELAY : undefined;\n\nfunction isImage(item: DataTransferItem) {\n return item.kind === 'file' && item.type && SUPPORTED_IMAGE_CONTENT_TYPES.has(item.type);\n}\n\nconst MiddleColumn: FC = ({\n chatId,\n threadId,\n messageListType,\n isPrivate,\n isPinnedMessageList,\n messageLists,\n canPost,\n currentUserBannedRights,\n defaultBannedRights,\n hasPinnedOrAudioMessage,\n pinnedMessagesCount,\n customBackground,\n theme,\n backgroundColor,\n patternColor,\n isLeftColumnShown,\n isRightColumnShown,\n isBackgroundBlurred,\n isMobileSearchActive,\n isSelectModeActive,\n isPaymentModalOpen,\n isReceiptModalOpen,\n animationLevel,\n shouldSkipHistoryAnimations,\n currentTransitionKey,\n openChat,\n unpinAllMessages,\n loadUser,\n closeLocalTextSearch,\n exitMessageSelectMode,\n closePaymentModal,\n clearReceipt,\n}) => {\n const { width: windowWidth } = useWindowSize();\n\n const lang = useLang();\n const [dropAreaState, setDropAreaState] = useState(DropAreaState.None);\n const [isFabShown, setIsFabShown] = useState();\n const [isNotchShown, setIsNotchShown] = useState();\n const [isUnpinModalOpen, setIsUnpinModalOpen] = useState(false);\n const [isReady, setIsReady] = useState(!IS_SINGLE_COLUMN_LAYOUT || animationLevel === ANIMATION_LEVEL_MIN);\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 renderingChatId = usePrevDuringAnimation(chatId, CLOSE_ANIMATION_DURATION);\n const renderingThreadId = usePrevDuringAnimation(threadId, CLOSE_ANIMATION_DURATION);\n const renderingMessageListType = usePrevDuringAnimation(messageListType, CLOSE_ANIMATION_DURATION);\n const renderingCanPost = usePrevDuringAnimation(canPost, CLOSE_ANIMATION_DURATION);\n const renderingHasTools = usePrevDuringAnimation(hasTools, CLOSE_ANIMATION_DURATION);\n const renderingIsFabShown = usePrevDuringAnimation(isFabShown, 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 setIsFabShown(undefined);\n setIsNotchShown(undefined);\n }, [chatId]);\n\n useEffect(() => {\n if (animationLevel === ANIMATION_LEVEL_MIN) {\n setIsReady(true);\n }\n }, [animationLevel]);\n\n // Fix for mobile virtual keyboard\n useEffect(() => {\n const { visualViewport } = window as any;\n if (!visualViewport) {\n return undefined;\n }\n\n const handleResize = () => {\n if (window.visualViewport.height !== document.documentElement.clientHeight) {\n document.body.classList.add('keyboard-visible');\n } else {\n document.body.classList.remove('keyboard-visible');\n }\n };\n\n visualViewport.addEventListener('resize', handleResize);\n\n return () => {\n visualViewport.removeEventListener('resize', handleResize);\n };\n }, []);\n\n const handleTransitionEnd = (e: React.TransitionEvent) => {\n if (e.propertyName === 'transform' && e.target === e.currentTarget) {\n setIsReady(Boolean(chatId));\n }\n };\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)\n // Filter unnecessary element for drag and drop images in Firefox (https://github.com/Ajaxy/telegram-tt/issues/49)\n // https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Recommended_drag_types#image\n .filter((item) => item.type !== 'text/uri-list')\n // As of September 2021, native clients suggest \"send quick, but compressed\" only for images\n .every(isImage);\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 handleTabletFocus = useCallback(() => {\n openChat({ id: chatId });\n }, [openChat, chatId]);\n\n const customBackgroundValue = useCustomBackground(theme, customBackground);\n\n const className = buildClassName(\n renderingHasTools && 'has-header-tools',\n customBackground && 'custom-bg-image',\n backgroundColor && 'custom-bg-color',\n customBackground && isBackgroundBlurred && 'blurred',\n MASK_IMAGE_DISABLED ? 'mask-image-disabled' : 'mask-image-enabled',\n );\n\n const messagingDisabledClassName = buildClassName(\n 'messaging-disabled',\n !isSelectModeActive && 'shown',\n );\n\n const messageSendingRestrictionReason = getMessageSendingRestrictionReason(\n lang, currentUserBannedRights, defaultBannedRights,\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 footerClassName = buildClassName(\n 'middle-column-footer',\n !renderingCanPost && 'no-composer',\n renderingCanPost && isNotchShown && !isSelectModeActive && 'with-notch',\n );\n\n const closeChat = () => {\n openChat({ id: undefined }, true);\n };\n\n useHistoryBack(renderingChatId && renderingThreadId,\n closeChat, undefined, undefined, undefined,\n messageLists ? messageLists.map(createMessageHash) : []);\n\n useHistoryBack(isMobileSearchActive, closeLocalTextSearch);\n useHistoryBack(isSelectModeActive, exitMessageSelectMode);\n\n const isMessagingDisabled = Boolean(!isPinnedMessageList && !renderingCanPost && messageSendingRestrictionReason);\n\n return (\n \n \n
\n {renderingChatId && renderingThreadId && (\n <>\n
\n \n \n {(isActive) => (\n <>\n \n
\n {renderingCanPost && (\n \n )}\n {isPinnedMessageList && (\n
\n \n \n {lang('Chat.Pinned.UnpinAll', pinnedMessagesCount, 'i')}\n \n
\n )}\n {isMessagingDisabled && (\n
\n
\n \n {messageSendingRestrictionReason}\n \n
\n
\n )}\n \n \n \n
\n \n )}\n \n\n \n
\n {IS_SINGLE_COLUMN_LAYOUT && }\n \n )}\n {chatId && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const theme = selectTheme(global);\n const {\n isBlurred: isBackgroundBlurred, background: customBackground, backgroundColor, patternColor,\n } = global.settings.themes[theme] || {};\n\n const { messageLists } = global.messages;\n const currentMessageList = selectCurrentMessageList(global);\n const { isLeftColumnShown, chats: { listIds } } = global;\n\n const state: StateProps = {\n theme,\n customBackground,\n backgroundColor,\n patternColor,\n isLeftColumnShown,\n isRightColumnShown: selectIsRightColumnShown(global),\n isBackgroundBlurred,\n isMobileSearchActive: Boolean(IS_SINGLE_COLUMN_LAYOUT && selectCurrentTextSearch(global)),\n isSelectModeActive: selectIsInSelectMode(global),\n isPaymentModalOpen: global.payment.isPaymentModalOpen,\n isReceiptModalOpen: Boolean(global.payment.receipt),\n animationLevel: global.settings.byKey.animationLevel,\n currentTransitionKey: Math.max(0, global.messages.messageLists.length - 1),\n };\n\n if (!currentMessageList || !listIds.active) {\n return state;\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 const isScheduledMessageList = messageListType === 'scheduled';\n\n return {\n ...state,\n chatId,\n threadId,\n messageListType,\n isPrivate: isUserId(chatId),\n canPost: !isPinnedMessageList && (!chat || canPost) && !isBotNotStarted,\n isPinnedMessageList,\n isScheduledMessageList,\n currentUserBannedRights: chat?.currentUserBannedRights,\n defaultBannedRights: chat?.defaultBannedRights,\n hasPinnedOrAudioMessage: (\n threadId !== MAIN_THREAD_ID\n || Boolean(pinnedIds?.length)\n || Boolean(audioChatId && audioMessageId)\n ),\n pinnedMessagesCount: pinnedIds ? pinnedIds.length : 0,\n shouldSkipHistoryAnimations: global.shouldSkipHistoryAnimations,\n messageLists,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat', 'unpinAllMessages', 'loadUser', 'closeLocalTextSearch', 'exitMessageSelectMode',\n 'closePaymentModal', 'clearReceipt',\n ]),\n)(MiddleColumn));\n","import { useEffect, useState } from '../lib/teact/teact';\n\nimport { ThemeKey } from '../types';\n\nimport { CUSTOM_BG_CACHE_NAME } from '../config';\nimport * as cacheApi from '../util/cacheApi';\nimport { preloadImage } from '../util/files';\n\nexport default (theme: ThemeKey, 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, theme, cacheApi.Type.Blob)\n .then((blob) => {\n const url = URL.createObjectURL(blob);\n preloadImage(url)\n .then(() => {\n setValue(`url(${url})`);\n });\n });\n }\n }, [settingValue, theme]);\n\n return settingValue ? value : undefined;\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_SINGLE_COLUMN_LAYOUT } 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 selectUser,\n} from '../../modules/selectors';\nimport {\n getCanAddContact,\n isChatAdmin,\n isChatChannel,\n isUserId,\n} from '../../modules/helpers';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\nimport useLang from '../../hooks/useLang';\n\nimport SearchInput from '../ui/SearchInput';\nimport Button from '../ui/Button';\nimport Transition from '../ui/Transition';\nimport './RightHeader.scss';\nimport { getDayStartAt } from '../../util/dateFormat';\n\ntype OwnProps = {\n chatId?: string;\n isColumnOpen?: boolean;\n isProfile?: boolean;\n isSearch?: boolean;\n isManagement?: boolean;\n isStickerSearch?: boolean;\n isGifSearch?: boolean;\n isPollResults?: boolean;\n isAddingChatMembers?: boolean;\n shouldSkipAnimation?: boolean;\n profileState?: ProfileState;\n managementScreen?: ManagementScreens;\n onClose: () => void;\n};\n\ntype StateProps = {\n canAddContact?: boolean;\n canManage?: boolean;\n isChannel?: boolean;\n userId?: string;\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 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 AddingMembers,\n}\n\nconst RightHeader: FC = ({\n isColumnOpen,\n isProfile,\n isSearch,\n isManagement,\n isStickerSearch,\n isGifSearch,\n isPollResults,\n isAddingChatMembers,\n profileState,\n managementScreen,\n canAddContact,\n userId,\n canManage,\n isChannel,\n onClose,\n messageSearchQuery,\n stickerSearchQuery,\n gifSearchQuery,\n setLocalTextSearchQuery,\n setStickerSearchQuery,\n setGifSearchQuery,\n searchTextMessagesLocal,\n toggleManagement,\n openHistoryCalendar,\n shouldSkipAnimation,\n addContact,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const backButtonRef = useRef(null);\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 handleStickerSearchQueryChange = useCallback((query: string) => {\n setStickerSearchQuery({ query });\n }, [setStickerSearchQuery]);\n\n const handleGifSearchQueryChange = useCallback((query: string) => {\n setGifSearchQuery({ query });\n }, [setGifSearchQuery]);\n\n const handleAddContact = useCallback(() => {\n addContact({ userId });\n }, [addContact, userId]);\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 ) : isAddingChatMembers ? (\n HeaderContent.AddingMembers\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 ) : 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 openHistoryCalendar({ selectedAt: getDayStartAt(Date.now()) })}\n ariaLabel=\"Search messages by date\"\n >\n \n \n \n );\n case HeaderContent.AddingMembers:\n return

{lang('GroupAddMembers')}

;\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.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

Profile

\n
\n {canAddContact && (\n \n \n \n )}\n {canManage && (\n \n \n \n )}\n
\n \n );\n }\n }\n\n const isBackButton = (\n IS_SINGLE_COLUMN_LAYOUT\n || contentKey === HeaderContent.SharedMedia\n || contentKey === HeaderContent.MemberList\n || contentKey === HeaderContent.AddingMembers\n || isManagement\n );\n\n const buttonClassName = buildClassName(\n 'animated-close-icon',\n isBackButton && 'state-back',\n (shouldSkipTransition || shouldSkipAnimation) && 'no-transition',\n );\n\n return (\n
\n \n
\n \n \n {renderHeaderContent}\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 const user = isProfile && chatId && isUserId(chatId) ? selectUser(global, chatId) : undefined;\n\n const canAddContact = user && getCanAddContact(user);\n const canManage = Boolean(\n !isManagement\n && isProfile\n && !canAddContact\n && chat\n && !selectIsChatWithSelf(global, chat.id)\n // chat.isCreator is for Basic Groups\n && (isUserId(chat.id) || ((isChatAdmin(chat) || chat.isCreator) && !chat.isNotJoined)),\n );\n\n return {\n canManage,\n canAddContact,\n isChannel,\n userId: user?.id,\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 'openHistoryCalendar',\n 'addContact',\n ]),\n)(RightHeader));\n","import { useMemo, useRef } from '../../../lib/teact/teact';\n\nimport {\n ApiChat, ApiChatMember, ApiMessage, ApiUser,\n} from '../../../api/types';\nimport { ProfileTabType, SharedMediaType } from '../../../types';\n\nimport { MEMBERS_SLICE, MESSAGE_SEARCH_SLICE, SHARED_MEDIA_SLICE } from '../../../config';\nimport { getMessageContentIds, sortChatIds, sortUserIds } from '../../../modules/helpers';\nimport useOnChange from '../../../hooks/useOnChange';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\n\nexport default function useProfileViewportIds(\n isRightColumnShown: boolean,\n loadMoreMembers: AnyToVoidFunction,\n loadCommonChats: AnyToVoidFunction,\n searchMessages: AnyToVoidFunction,\n tabType: ProfileTabType,\n mediaSearchType?: SharedMediaType,\n groupChatMembers?: ApiChatMember[],\n commonChatIds?: string[],\n usersById?: Record,\n chatsById?: Record,\n chatMessages?: Record,\n foundIds?: number[],\n chatId?: string,\n lastSyncTime?: number,\n serverTimeOffset = 0,\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 sortUserIds(groupChatMembers.map(({ userId }) => userId), usersById, undefined, serverTimeOffset);\n }, [groupChatMembers, serverTimeOffset, usersById]);\n\n const chatIds = useMemo(() => {\n if (!commonChatIds || !chatsById) {\n return undefined;\n }\n\n return sortChatIds(commonChatIds, chatsById, true);\n }, [chatsById, commonChatIds]);\n\n const [memberViewportIds, getMoreMembers, noProfileInfoForMembers] = useInfiniteScrollForLoadableItems(\n resultType, loadMoreMembers, lastSyncTime, memberIds,\n );\n\n const [commonChatViewportIds, getMoreCommonChats, noProfileInfoForCommonChats] = useInfiniteScrollForLoadableItems(\n resultType, loadCommonChats, lastSyncTime, chatIds,\n );\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 const [voiceViewportIds, getMoreVoices, noProfileInfoForVoices] = useInfiniteScrollForSharedMedia(\n 'voice', resultType, searchMessages, lastSyncTime, chatMessages, foundIds,\n );\n\n let viewportIds: number[] | string[] | undefined;\n let getMore: AnyToVoidFunction | undefined;\n let noProfileInfo = false;\n\n switch (resultType) {\n case 'members':\n viewportIds = memberViewportIds;\n getMore = getMoreMembers;\n noProfileInfo = noProfileInfoForMembers;\n break;\n case 'commonChats':\n viewportIds = commonChatViewportIds;\n getMore = getMoreCommonChats;\n noProfileInfo = noProfileInfoForCommonChats;\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 case 'voice':\n viewportIds = voiceViewportIds;\n getMore = getMoreVoices;\n noProfileInfo = noProfileInfoForVoices;\n break;\n }\n\n return [resultType, viewportIds, getMore, noProfileInfo] as const;\n}\n\nfunction useInfiniteScrollForLoadableItems(\n currentResultType?: ProfileTabType,\n handleLoadMore?: AnyToVoidFunction,\n lastSyncTime?: number,\n itemIds?: string[],\n) {\n const [viewportIds, getMore] = useInfiniteScroll(\n lastSyncTime ? handleLoadMore : undefined,\n itemIds,\n undefined,\n MEMBERS_SLICE,\n );\n\n const isOnTop = !viewportIds || !itemIds || viewportIds[0] === itemIds[0];\n\n return [viewportIds, getMore, !isOnTop] 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) {\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, {\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 ApiChat,\n MAIN_THREAD_ID,\n} from '../../api/types';\nimport { GlobalActions } from '../../global/types';\nimport {\n NewChatMembersProgress, ISettings, MediaViewerOrigin, ProfileState, ProfileTabType, SharedMediaType, AudioOrigin,\n} from '../../types';\n\nimport {\n MEMBERS_SLICE,\n PROFILE_SENSITIVE_AREA,\n SHARED_MEDIA_SLICE,\n SLIDE_TRANSITION_DURATION,\n} from '../../config';\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport {\n getHasAdminRight, isChatAdmin, isChatChannel, isChatGroup, isUserBot, isUserId,\n} from '../../modules/helpers';\nimport {\n selectChatMessages,\n selectChat,\n selectCurrentMediaSearch,\n selectIsRightColumnShown,\n selectTheme,\n selectActiveDownloadIds,\n selectUser,\n} from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../util/captureEvents';\nimport { getSenderName } from '../left/search/helpers/getSenderName';\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';\nimport useLang from '../../hooks/useLang';\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 ProfileInfo from '../common/ProfileInfo';\nimport Document from '../common/Document';\nimport Audio from '../common/Audio';\nimport ChatExtra from '../common/ChatExtra';\nimport Media from '../common/Media';\nimport WebLink from '../common/WebLink';\nimport NothingFound from '../common/NothingFound';\nimport FloatingActionButton from '../ui/FloatingActionButton';\nimport DeleteMemberModal from './DeleteMemberModal';\nimport GroupChatInfo from '../common/GroupChatInfo';\n\nimport './Profile.scss';\n\ntype OwnProps = {\n chatId: string;\n userId?: string;\n profileState: ProfileState;\n onProfileStateChange: (state: ProfileState) => void;\n};\n\ntype StateProps = {\n theme: ISettings['theme'];\n isChannel?: boolean;\n currentUserId?: string;\n resolvedUserId?: string;\n chatMessages?: Record;\n foundIds?: number[];\n mediaSearchType?: SharedMediaType;\n hasCommonChatsTab?: boolean;\n hasMembersTab?: boolean;\n areMembersHidden?: boolean;\n canAddMembers?: boolean;\n canDeleteMembers?: boolean;\n members?: ApiChatMember[];\n commonChatIds?: string[];\n chatsById: Record;\n usersById: Record;\n isRightColumnShown: boolean;\n isRestricted?: boolean;\n lastSyncTime?: number;\n serverTimeOffset: number;\n activeDownloadIds: 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 { type: 'voice', title: 'SharedVoiceTab2' },\n];\n\nconst HIDDEN_RENDER_DELAY = 1000;\n\nconst Profile: FC = ({\n chatId,\n profileState,\n onProfileStateChange,\n theme,\n isChannel,\n resolvedUserId,\n currentUserId,\n chatMessages,\n foundIds,\n mediaSearchType,\n hasCommonChatsTab,\n hasMembersTab,\n areMembersHidden,\n canAddMembers,\n canDeleteMembers,\n commonChatIds,\n members,\n usersById,\n chatsById,\n isRightColumnShown,\n isRestricted,\n lastSyncTime,\n activeDownloadIds,\n serverTimeOffset,\n setLocalMediaSearchType,\n loadMoreMembers,\n loadCommonChats,\n openChat,\n searchMediaMessagesLocal,\n openMediaViewer,\n openAudioPlayer,\n openUserInfo,\n focusMessage,\n loadProfilePhotos,\n setNewChatMembersDialogState,\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 const lang = useLang();\n const [activeTab, setActiveTab] = useState(0);\n const [deletingUserId, setDeletingUserId] = useState();\n\n const tabs = useMemo(() => ([\n ...(hasMembersTab ? [{\n type: 'members', title: isChannel ? 'ChannelSubscribers' : 'GroupMembers',\n }] : []),\n ...TABS,\n ...(hasCommonChatsTab ? [{\n type: 'commonChats', title: 'SharedGroupsTab2',\n }] : []),\n ]), [hasCommonChatsTab, hasMembersTab, isChannel]);\n const tabType = tabs[activeTab].type as ProfileTabType;\n\n const [resultType, viewportIds, getMore, noProfileInfo] = useProfileViewportIds(\n isRightColumnShown, loadMoreMembers, loadCommonChats, searchMediaMessagesLocal, tabType, mediaSearchType, members,\n commonChatIds, usersById, chatsById, chatMessages, foundIds, chatId, lastSyncTime, serverTimeOffset,\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 const handleNewMemberDialogOpen = useCallback(() => {\n setNewChatMembersDialogState(NewChatMembersProgress.InProgress);\n }, [setNewChatMembersDialogState]);\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 useEffect(() => {\n if (lastSyncTime) {\n loadProfilePhotos({ profileId });\n }\n }, [loadProfilePhotos, profileId, lastSyncTime]);\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: string) => {\n openUserInfo({ id });\n }, [openUserInfo]);\n\n const handleMessageFocus = useCallback((messageId: number) => {\n focusMessage({ chatId: profileId, messageId });\n }, [profileId, focusMessage]);\n\n const handleDeleteMembersModalClose = useCallback(() => {\n setDeletingUserId(undefined);\n }, []);\n\n useEffect(() => {\n if (!transitionRef.current || !IS_TOUCH_ENV) {\n return undefined;\n }\n\n return captureEvents(transitionRef.current, {\n selectorToPreventScroll: '.Profile',\n onSwipe: ((e, direction) => {\n if (direction === SwipeDirection.Left) {\n setActiveTab(Math.min(activeTab + 1, tabs.length - 1));\n return true;\n } else if (direction === SwipeDirection.Right) {\n setActiveTab(Math.max(0, activeTab - 1));\n return true;\n }\n\n return false;\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 getMemberContextAction(memberId: string) {\n return memberId === currentUserId || !canDeleteMembers ? undefined : [{\n title: lang('lng_context_remove_from_group'),\n icon: 'stop',\n handler: () => {\n setDeletingUserId(memberId);\n },\n }];\n }\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 'commonChats':\n text = lang('NoGroupsInCommon');\n break;\n case 'documents':\n text = lang('lng_media_file_empty');\n break;\n case 'links':\n text = lang('lng_media_link_empty');\n break;\n case 'audio':\n text = lang('lng_media_song_empty');\n break;\n case 'voice':\n text = lang('lng_media_audio_empty');\n break;\n default:\n text = lang('SharedMedia.EmptyTitle');\n }\n\n return (\n
\n \n
\n );\n }\n\n return (\n \n {resultType === 'media' ? (\n (viewportIds as number[])!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'documents' ? (\n (viewportIds as number[])!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'links' ? (\n (viewportIds as number[])!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'audio' ? (\n (viewportIds as number[])!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'voice' ? (\n (viewportIds as number[])!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'members' ? (\n (viewportIds as string[])!.map((id, i) => (\n handleMemberClick(id)}\n contextActions={getMemberContextAction(id)}\n >\n \n \n ))\n ) : resultType === 'commonChats' ? (\n (viewportIds as string[])!.map((id, i) => (\n openChat({ 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 {canAddMembers && (\n \n \n \n )}\n {canDeleteMembers && (\n \n )}\n \n );\n};\n\nfunction renderProfileInfo(chatId: string, resolvedUserId?: string) {\n return (\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 const { byId: chatsById } = global.chats;\n\n const isGroup = chat && isChatGroup(chat);\n const isChannel = chat && isChatChannel(chat);\n const hasMembersTab = isGroup || (isChannel && isChatAdmin(chat!));\n const members = chat?.fullInfo?.members;\n const areMembersHidden = hasMembersTab && chat && chat.fullInfo && !chat.fullInfo.canViewMembers;\n const canAddMembers = hasMembersTab && chat && (getHasAdminRight(chat, 'inviteUsers') || chat.isCreator);\n const canDeleteMembers = hasMembersTab && chat && (getHasAdminRight(chat, 'banUsers') || chat.isCreator);\n\n const activeDownloadIds = selectActiveDownloadIds(global, chatId);\n\n let hasCommonChatsTab;\n let resolvedUserId;\n let user;\n if (userId) {\n resolvedUserId = userId;\n } else if (isUserId(chatId)) {\n resolvedUserId = chatId;\n }\n if (resolvedUserId) {\n user = selectUser(global, resolvedUserId);\n hasCommonChatsTab = user && !user.isSelf && !isUserBot(user);\n }\n\n return {\n theme: selectTheme(global),\n isChannel,\n resolvedUserId,\n chatMessages,\n foundIds,\n mediaSearchType,\n hasCommonChatsTab,\n hasMembersTab,\n areMembersHidden,\n canAddMembers,\n canDeleteMembers,\n currentUserId: global.currentUserId,\n isRightColumnShown: selectIsRightColumnShown(global),\n isRestricted: chat?.isRestricted,\n lastSyncTime: global.lastSyncTime,\n serverTimeOffset: global.serverTimeOffset,\n activeDownloadIds,\n usersById,\n chatsById,\n ...(hasMembersTab && members && { members }),\n ...(hasCommonChatsTab && user && { commonChatIds: user.commonChats?.ids }),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalMediaSearchType',\n 'loadMoreMembers',\n 'searchMediaMessagesLocal',\n 'openMediaViewer',\n 'openAudioPlayer',\n 'openUserInfo',\n 'focusMessage',\n 'loadProfilePhotos',\n 'setNewChatMembersDialogState',\n 'loadCommonChats',\n 'openChat',\n ]),\n)(Profile));\n","import { useCallback, useEffect } from '../../../lib/teact/teact';\n\nexport default function useTransitionFixes(\n containerRef: { current: HTMLDivElement | null },\n transitionElSelector = '.Transition.shared-media-transition',\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(transitionElSelector);\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, transitionElSelector]);\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, memo } 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 memo(RightSearchAsync);\n","import React, { FC, memo } 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 memo(ManagementAsync);\n","import React, { FC, memo } 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 memo(StickerSearchAsync);\n","import React, { FC, memo } 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 memo(GifSearchAsync);\n","import React, { FC, memo } 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 memo(PollResultsAsync);\n","import React, {\n FC, useCallback, useMemo, memo, useState, useEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport {\n ApiChat, ApiChatMember, ApiUpdateConnectionStateType, ApiUser,\n} from '../../api/types';\nimport { NewChatMembersProgress } from '../../types';\n\nimport { pick, unique } from '../../util/iteratees';\nimport { selectChat } from '../../modules/selectors';\nimport searchWords from '../../util/searchWords';\nimport {\n getUserFullName, isChatChannel, isUserBot, sortChatIds,\n} from '../../modules/helpers';\nimport useLang from '../../hooks/useLang';\nimport usePrevious from '../../hooks/usePrevious';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Picker from '../common/Picker';\nimport FloatingActionButton from '../ui/FloatingActionButton';\nimport Spinner from '../ui/Spinner';\n\nimport './AddChatMembers.scss';\n\nexport type OwnProps = {\n chatId: string;\n isActive: boolean;\n onNextStep: (memberIds: string[]) => void;\n onClose: NoneToVoidFunction;\n};\n\ntype StateProps = {\n connectionState?: ApiUpdateConnectionStateType;\n isChannel?: boolean;\n members?: ApiChatMember[];\n currentUserId?: string;\n usersById: Record;\n chatsById: Record;\n localContactIds?: string[];\n searchQuery?: string;\n isLoading: boolean;\n isSearching?: boolean;\n localUserIds?: string[];\n globalUserIds?: string[];\n};\n\ntype DispatchProps = Pick;\n\nconst AddChatMembers: FC = ({\n isChannel,\n connectionState,\n members,\n onNextStep,\n currentUserId,\n usersById,\n chatsById,\n localContactIds,\n isLoading,\n searchQuery,\n isSearching,\n localUserIds,\n globalUserIds,\n setUserSearchQuery,\n onClose,\n isActive,\n loadContactList,\n}) => {\n const lang = useLang();\n const [selectedMemberIds, setSelectedMemberIds] = useState([]);\n const prevSelectedMemberIds = usePrevious(selectedMemberIds);\n const noPickerScrollRestore = prevSelectedMemberIds === selectedMemberIds;\n\n useEffect(() => {\n if (isActive && connectionState === 'connectionStateReady') {\n loadContactList();\n }\n }, [connectionState, isActive, loadContactList]);\n\n useHistoryBack(isActive, onClose);\n\n const memberIds = useMemo(() => {\n return members ? members.map((member) => member.userId) : [];\n }, [members]);\n\n const handleFilterChange = useCallback((query: string) => {\n setUserSearchQuery({ query });\n }, [setUserSearchQuery]);\n\n const displayedIds = useMemo(() => {\n const contactIds = localContactIds\n ? sortChatIds(localContactIds.filter((id) => id !== currentUserId), chatsById)\n : [];\n\n if (!searchQuery) {\n return contactIds.filter((id) => !memberIds.includes(id));\n }\n\n const foundContactIds = 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 sortChatIds(\n unique([\n ...foundContactIds,\n ...(localUserIds || []),\n ...(globalUserIds || []),\n ]).filter((contactId) => {\n const user = usersById[contactId];\n\n // The user can be added to the chat if the following conditions are met:\n // the user has not yet been added to the current chat\n // AND (it is not found (user from global search) OR it is not a bot OR it is a bot,\n // but the current chat is not a channel AND the appropriate permission is set).\n return !memberIds.includes(contactId)\n && (!user || !isUserBot(user) || (!isChannel && user.canBeInvitedToGroup));\n }),\n chatsById,\n );\n }, [\n localContactIds, chatsById, searchQuery, localUserIds, globalUserIds,\n currentUserId, usersById, memberIds, isChannel,\n ]);\n\n const handleNextStep = useCallback(() => {\n if (selectedMemberIds.length) {\n setUserSearchQuery({ query: '' });\n onNextStep(selectedMemberIds);\n }\n }, [selectedMemberIds, setUserSearchQuery, onNextStep]);\n\n return (\n
\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 { userIds: localContactIds } = global.contactList || {};\n const { byId: usersById } = global.users;\n const { byId: chatsById } = global.chats;\n const { currentUserId, newChatMembersProgress, connectionState } = global;\n const isChannel = chat && isChatChannel(chat);\n\n const {\n query: searchQuery,\n fetchingStatus,\n globalUserIds,\n localUserIds,\n } = global.userSearch;\n\n return {\n isChannel,\n members: chat?.fullInfo?.members,\n currentUserId,\n usersById,\n chatsById,\n localContactIds,\n searchQuery,\n isSearching: fetchingStatus,\n isLoading: newChatMembersProgress === NewChatMembersProgress.Loading,\n globalUserIds,\n localUserIds,\n connectionState,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadContactList', 'setUserSearchQuery']),\n)(AddChatMembers));\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 {\n ManagementScreens, NewChatMembersProgress, ProfileState, RightColumnContent,\n} 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';\nimport useHistoryBack from '../../hooks/useHistoryBack';\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 StickerSearch from './StickerSearch.async';\nimport GifSearch from './GifSearch.async';\nimport PollResults from './PollResults.async';\nimport AddChatMembers from './AddChatMembers';\n\nimport './RightColumn.scss';\n\ntype StateProps = {\n contentKey?: RightColumnContent;\n chatId?: string;\n threadId?: number;\n currentProfileUserId?: string;\n isChatSelected: boolean;\n shouldSkipHistoryAnimations?: 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 openUserInfo,\n closeLocalTextSearch,\n setStickerSearchQuery,\n setGifSearchQuery,\n closePollResults,\n addChatMembers,\n setNewChatMembersDialogState,\n shouldSkipHistoryAnimations,\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 isStickerSearch = contentKey === RightColumnContent.StickerSearch;\n const isGifSearch = contentKey === RightColumnContent.GifSearch;\n const isPollResults = contentKey === RightColumnContent.PollResults;\n const isAddingChatMembers = contentKey === RightColumnContent.AddingMembers;\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((shouldScrollUp = true) => {\n switch (contentKey) {\n case RightColumnContent.AddingMembers:\n setNewChatMembersDialogState(NewChatMembersProgress.Closed);\n break;\n case RightColumnContent.ChatInfo:\n if (isScrolledDown && shouldScrollUp) {\n setProfileState(ProfileState.Profile);\n break;\n }\n toggleChatInfo(undefined, true);\n break;\n case RightColumnContent.UserInfo:\n if (isScrolledDown && shouldScrollUp) {\n setProfileState(ProfileState.Profile);\n break;\n }\n openUserInfo({ id: undefined }, true);\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.Search: {\n blurSearchInput();\n closeLocalTextSearch();\n break;\n }\n case RightColumnContent.StickerSearch:\n blurSearchInput();\n setStickerSearchQuery({ query: undefined });\n break;\n case RightColumnContent.GifSearch: {\n blurSearchInput();\n setGifSearchQuery({ query: undefined });\n break;\n }\n case RightColumnContent.PollResults:\n closePollResults();\n break;\n }\n }, [\n contentKey, isScrolledDown, toggleChatInfo, openUserInfo, closePollResults, setNewChatMembersDialogState,\n managementScreen, toggleManagement, closeLocalTextSearch, setStickerSearchQuery, setGifSearchQuery,\n ]);\n\n const handleSelectChatMember = useCallback((memberId, isPromoted) => {\n setSelectedChatMemberId(memberId);\n setIsPromotedByCurrentUser(isPromoted);\n }, []);\n\n const handleAppendingChatMembers = useCallback((memberIds: string[]) => {\n addChatMembers({ chatId, memberIds });\n }, [addChatMembers, chatId]);\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 useHistoryBack(isChatSelected && (contentKey === RightColumnContent.ChatInfo\n || contentKey === RightColumnContent.UserInfo || contentKey === RightColumnContent.Management\n || contentKey === RightColumnContent.AddingMembers),\n () => close(false), toggleChatInfo);\n\n // eslint-disable-next-line consistent-return\n function renderContent(isActive: boolean) {\n if (renderingContentKey === -1) {\n return undefined;\n }\n\n switch (renderingContentKey) {\n case RightColumnContent.AddingMembers:\n return (\n \n );\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\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 shouldSkipHistoryAnimations: global.shouldSkipHistoryAnimations,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openUserInfo',\n 'toggleChatInfo',\n 'toggleManagement',\n 'closeLocalTextSearch',\n 'setStickerSearchQuery',\n 'setGifSearchQuery',\n 'closePollResults',\n 'addChatMembers',\n 'setNewChatMembersDialogState',\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","export default function download(url: string, filename: string) {\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n try {\n link.click();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err); // Suppress redundant \"Blob loading failed\" error popup on IOS\n }\n}\n","import { FC, memo, useEffect } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, Thread } from '../../global/types';\nimport { ApiMediaFormat, ApiMessage } from '../../api/types';\n\nimport * as mediaLoader from '../../util/mediaLoader';\nimport download from '../../util/download';\nimport {\n getMessageContentFilename, getMessageMediaHash,\n} from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\n\ntype StateProps = {\n activeDownloads: Record;\n messages: Record;\n threadsById: Record;\n }>;\n};\n\ntype DispatchProps = Pick;\n\nconst startedDownloads = new Set();\n\nconst DownloadManager: FC = ({\n activeDownloads,\n messages,\n cancelMessageMediaDownload,\n}) => {\n useEffect(() => {\n Object.entries(activeDownloads).forEach(([chatId, messageIds]) => {\n const activeMessages = messageIds.map((id) => messages[Number(chatId)].byId[id]);\n activeMessages.forEach((message) => {\n const downloadHash = getMessageMediaHash(message, 'download');\n if (!downloadHash) {\n cancelMessageMediaDownload({ message });\n return;\n }\n\n if (!startedDownloads.has(downloadHash)) {\n const mediaData = mediaLoader.getFromMemory(downloadHash);\n if (mediaData) {\n startedDownloads.delete(downloadHash);\n download(mediaData, getMessageContentFilename(message));\n cancelMessageMediaDownload({ message });\n return;\n }\n\n mediaLoader.fetch(downloadHash, ApiMediaFormat.BlobUrl, true).then((result) => {\n startedDownloads.delete(downloadHash);\n if (result) {\n download(result, getMessageContentFilename(message));\n }\n cancelMessageMediaDownload({ message });\n });\n\n startedDownloads.add(downloadHash);\n }\n });\n });\n }, [\n cancelMessageMediaDownload,\n messages,\n activeDownloads,\n ]);\n\n return undefined;\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const activeDownloads = global.activeDownloads.byChatId;\n const messages = global.messages.byChatId;\n return {\n activeDownloads,\n messages,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['cancelMessageMediaDownload']),\n)(DownloadManager));\n","import React, { FC, memo } 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 memo(NotificationsAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst DialogsAsync: FC = ({ isOpen }) => {\n const Dialogs = useModuleLoader(Bundles.Extra, 'Dialogs', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Dialogs ? : undefined;\n};\n\nexport default memo(DialogsAsync);\n","import React, { FC, memo } 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 memo(ForwardPickerAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport { OwnProps } from './SafeLinkModal';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst SafeLinkModalAsync: FC = (props) => {\n const { url } = props;\n const SafeLinkModal = useModuleLoader(Bundles.Extra, 'SafeLinkModal', !url);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return SafeLinkModal ? : undefined;\n};\n\nexport default memo(SafeLinkModalAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport { OwnProps } from './HistoryCalendar';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst HistoryCalendarAsync: FC = (props) => {\n const { isOpen } = props;\n const HistoryCalendar = useModuleLoader(Bundles.Extra, 'HistoryCalendar', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return HistoryCalendar ? : undefined;\n};\n\nexport default memo(HistoryCalendarAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport { Bundles } from '../../../util/moduleLoader';\nimport { OwnProps } from './GroupCall';\n\nconst GroupCallAsync: FC = (props) => {\n const { groupCallId } = props;\n const GroupCall = useModuleLoader(Bundles.Calls, 'GroupCall', !groupCallId);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return GroupCall ? : undefined;\n};\n\nexport default memo(GroupCallAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport { Bundles } from '../../util/moduleLoader';\n\ntype OwnProps = {\n groupCallId?: string;\n};\n\nconst ActiveCallHeaderAsync: FC = (props) => {\n const { groupCallId } = props;\n const ActiveCallHeader = useModuleLoader(Bundles.Calls, 'ActiveCallHeader', !groupCallId);\n\n return ActiveCallHeader ? : undefined;\n};\n\nexport default memo(ActiveCallHeaderAsync);\n","import React, {\n FC, useEffect, memo, useCallback,\n} from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { LangCode } from '../../types';\nimport { GlobalActions } from '../../global/types';\nimport { ApiMessage } from '../../api/types';\n\nimport '../../modules/actions/all';\nimport {\n BASE_EMOJI_KEYWORD_LANG, DEBUG, INACTIVE_MARKER, PAGE_TITLE,\n} from '../../config';\nimport { pick } from '../../util/iteratees';\nimport {\n selectChatMessage,\n selectCountNotMutedUnread,\n selectIsForwardModalOpen,\n selectIsMediaViewerOpen,\n selectIsRightColumnShown,\n selectIsServiceChatReady,\n} from '../../modules/selectors';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport buildClassName from '../../util/buildClassName';\nimport { fastRaf } from '../../util/schedulers';\nimport { waitForTransitionEnd } from '../../util/cssAnimationEndListeners';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useBackgroundMode from '../../hooks/useBackgroundMode';\nimport useBeforeUnload from '../../hooks/useBeforeUnload';\nimport useOnChange from '../../hooks/useOnChange';\nimport usePreventPinchZoomGesture from '../../hooks/usePreventPinchZoomGesture';\nimport { processDeepLink } from '../../util/deeplink';\nimport { LOCATION_HASH } from '../../hooks/useHistoryBack';\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 DownloadManager from './DownloadManager';\nimport Notifications from './Notifications.async';\nimport Dialogs from './Dialogs.async';\nimport ForwardPicker from './ForwardPicker.async';\nimport SafeLinkModal from './SafeLinkModal.async';\nimport HistoryCalendar from './HistoryCalendar.async';\nimport StickerSetModal from '../common/StickerSetModal.async';\nimport GroupCall from '../calls/group/GroupCall.async';\nimport ActiveCallHeader from '../calls/ActiveCallHeader.async';\n\nimport './Main.scss';\n\ntype StateProps = {\n lastSyncTime?: number;\n isLeftColumnShown: boolean;\n isRightColumnShown: boolean;\n isMediaViewerOpen: boolean;\n isForwardModalOpen: boolean;\n hasNotifications: boolean;\n hasDialogs: boolean;\n audioMessage?: ApiMessage;\n safeLinkModalUrl?: string;\n isHistoryCalendarOpen: boolean;\n shouldSkipHistoryAnimations?: boolean;\n openedStickerSetShortName?: string;\n activeGroupCallId?: string;\n isServiceChatReady?: boolean;\n animationLevel: number;\n language?: LangCode;\n wasTimeFormatSetManually?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst NOTIFICATION_INTERVAL = 1000;\n\nlet notificationInterval: number | undefined;\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nlet DEBUG_isLogged = false;\n\nconst Main: FC = ({\n lastSyncTime,\n isLeftColumnShown,\n isRightColumnShown,\n isMediaViewerOpen,\n isForwardModalOpen,\n hasNotifications,\n hasDialogs,\n audioMessage,\n activeGroupCallId,\n safeLinkModalUrl,\n isHistoryCalendarOpen,\n shouldSkipHistoryAnimations,\n openedStickerSetShortName,\n isServiceChatReady,\n animationLevel,\n language,\n wasTimeFormatSetManually,\n loadAnimatedEmojis,\n loadNotificationSettings,\n loadNotificationExceptions,\n updateIsOnline,\n loadTopInlineBots,\n loadEmojiKeywords,\n loadCountryList,\n ensureTimeFormat,\n openStickerSetShortName,\n checkVersionNotification,\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 updateIsOnline(true);\n loadAnimatedEmojis();\n loadNotificationSettings();\n loadNotificationExceptions();\n loadTopInlineBots();\n\n loadEmojiKeywords({ language: BASE_EMOJI_KEYWORD_LANG });\n if (language !== BASE_EMOJI_KEYWORD_LANG) {\n loadEmojiKeywords({ language });\n }\n\n loadCountryList({ langCode: language });\n }\n }, [\n lastSyncTime, loadAnimatedEmojis, loadNotificationExceptions, loadNotificationSettings, updateIsOnline,\n loadTopInlineBots, loadEmojiKeywords, loadCountryList, language,\n ]);\n\n useEffect(() => {\n if (lastSyncTime && isServiceChatReady) {\n checkVersionNotification();\n }\n }, [lastSyncTime, isServiceChatReady, checkVersionNotification]);\n\n useEffect(() => {\n if (lastSyncTime && !wasTimeFormatSetManually) {\n ensureTimeFormat();\n }\n }, [lastSyncTime, wasTimeFormatSetManually, ensureTimeFormat]);\n\n useEffect(() => {\n if (lastSyncTime && LOCATION_HASH.startsWith('#?tgaddr=')) {\n processDeepLink(decodeURIComponent(LOCATION_HASH.substr('#?tgaddr='.length)));\n }\n }, [lastSyncTime]);\n\n const {\n transitionClassNames: middleColumnTransitionClassNames,\n } = useShowTransition(!isLeftColumnShown, undefined, true, undefined, shouldSkipHistoryAnimations);\n\n const {\n transitionClassNames: rightColumnTransitionClassNames,\n } = useShowTransition(isRightColumnShown, undefined, true, undefined, shouldSkipHistoryAnimations);\n\n const className = buildClassName(\n middleColumnTransitionClassNames.replace(/([\\w-]+)/g, 'middle-column-$1'),\n rightColumnTransitionClassNames.replace(/([\\w-]+)/g, 'right-column-$1'),\n shouldSkipHistoryAnimations && 'history-animation-disabled',\n );\n\n // Dispatch heavy transition event when opening middle column\n useOnChange(([prevIsLeftColumnShown]) => {\n if (prevIsLeftColumnShown === undefined || animationLevel === 0) {\n return;\n }\n\n const dispatchHeavyAnimationEnd = dispatchHeavyAnimationEvent();\n\n waitForTransitionEnd(document.getElementById('MiddleColumn')!, dispatchHeavyAnimationEnd);\n }, [isLeftColumnShown]);\n\n // Dispatch heavy transition event and add body class when opening right column\n useOnChange(([prevIsRightColumnShown]) => {\n if (prevIsRightColumnShown === undefined || animationLevel === 0) {\n return;\n }\n\n fastRaf(() => {\n document.body.classList.add('animating-right-column');\n });\n\n const dispatchHeavyAnimationEnd = dispatchHeavyAnimationEvent();\n\n waitForTransitionEnd(document.getElementById('RightColumn')!, () => {\n dispatchHeavyAnimationEnd();\n\n fastRaf(() => {\n document.body.classList.remove('animating-right-column');\n });\n });\n }, [isRightColumnShown]);\n\n const handleBlur = useCallback(() => {\n updateIsOnline(false);\n\n const initialUnread = selectCountNotMutedUnread(getGlobal());\n let index = 0;\n\n clearInterval(notificationInterval);\n notificationInterval = window.setInterval(() => {\n if (document.title.includes(INACTIVE_MARKER)) {\n updateIcon(false);\n return;\n }\n\n if (index % 2 === 0) {\n const newUnread = selectCountNotMutedUnread(getGlobal()) - initialUnread;\n if (newUnread > 0) {\n updatePageTitle(`${newUnread} notification${newUnread > 1 ? 's' : ''}`);\n updateIcon(true);\n }\n } else {\n updatePageTitle(PAGE_TITLE);\n updateIcon(false);\n }\n\n index++;\n }, NOTIFICATION_INTERVAL);\n }, [updateIsOnline]);\n\n const handleFocus = useCallback(() => {\n updateIsOnline(true);\n\n clearInterval(notificationInterval);\n notificationInterval = undefined;\n\n if (!document.title.includes(INACTIVE_MARKER)) {\n updatePageTitle(PAGE_TITLE);\n }\n\n updateIcon(false);\n }, [updateIsOnline]);\n\n const handleStickerSetModalClose = useCallback(() => {\n openStickerSetShortName({ stickerSetShortName: undefined });\n }, [openStickerSetShortName]);\n\n // Online status and browser tab indicators\n useBackgroundMode(handleBlur, handleFocus);\n useBeforeUnload(handleBlur);\n\n usePreventPinchZoomGesture(isMediaViewerOpen);\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 {activeGroupCallId && (\n <>\n \n \n \n )}\n \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\n// For some reason setting `document.title` to the same value\n// causes increment of Chrome Dev Tools > Performance Monitor > DOM Nodes counter\nfunction updatePageTitle(nextTitle: string) {\n if (document.title !== nextTitle) {\n document.title = nextTitle;\n }\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { settings: { byKey: { animationLevel, language, wasTimeFormatSetManually } } } = global;\n const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n const audioMessage = audioChatId && audioMessageId\n ? selectChatMessage(global, audioChatId, audioMessageId)\n : undefined;\n\n return {\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 hasDialogs: Boolean(global.dialogs.length),\n audioMessage,\n safeLinkModalUrl: global.safeLinkModalUrl,\n isHistoryCalendarOpen: Boolean(global.historyCalendarSelectedAt),\n shouldSkipHistoryAnimations: global.shouldSkipHistoryAnimations,\n openedStickerSetShortName: global.openedStickerSetShortName,\n isServiceChatReady: selectIsServiceChatReady(global),\n activeGroupCallId: global.groupCalls.activeGroupCallId,\n animationLevel,\n language,\n wasTimeFormatSetManually,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadAnimatedEmojis', 'loadNotificationSettings', 'loadNotificationExceptions', 'updateIsOnline',\n 'loadTopInlineBots', 'loadEmojiKeywords', 'openStickerSetShortName', 'loadCountryList', 'ensureTimeFormat',\n 'checkVersionNotification',\n ]),\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"],"names":["closeLocalTextSearch","global","chatId","threadId","selectCurrentMessageList","updateLocalTextSearch","replaceLocalTextSearchResults","undefined","addReducer","actions","payload","query","chatThreadKey","buildChatThreadKey","currentQuery","localTextSearch","byChatThreadKey","MEMO_EMPTY_ARRAY","mediaType","updateLocalMediaSearchType","id","type","shouldReplaceHistory","currentMessageList","replaceThreadParam","exitMessageSelectMode","messages","contentToBeScheduled","forwardMessages","toChatId","setGlobal","updateCurrentMessageList","isChatInfoShown","openChat","chatCreation","newChatMembersProgress","targetIndexDelta","orderedIds","position","indexOf","nextId","FOCUS_NO_HIGHLIGHT_DURATION","FAST_SMOOTH_MAX_DURATION","ANIMATION_END_DELAY","blurTimeout","scrollOffset","messageId","paramName","chatMessages","selectChatMessages","viewportIds","selectViewportIds","lastOwnEditableMessageId","findLast","Boolean","selectAllowedMessageActions","canEdit","replyingToId","selectReplyingToId","selectIsViewportNewest","chatMessageKeys","Object","keys","newIndex","toString","length","Number","MAIN_THREAD_ID","chat","selectChat","lastMessage","threadInfo","selectThreadInfo","lastMessageId","setReplyingToId","focusMessage","avatarOwnerId","profilePhotoIndex","origin","mediaViewer","volume","playbackRate","isMuted","audioPlayer","selectIsRightColumnShown","pollResults","voters","window","setTimeout","newGlobal","getGlobal","noHighlight","replyStack","selectReplyStack","pop","focusLastMessage","messageListType","groupedId","groupedChatId","replyMessageId","isResizingContainer","ids","selectForwardedMessageIdsByGroupId","shouldSwitchChat","clearTimeout","updateFocusedMessage","updateFocusDirection","FocusDirection","includes","direction","loadViewportMessages","fromChatId","messageIds","groupedMessageIds","selectMessageIdsByGroupId","isModalShown","closeMediaViewer","selectedMessages","openForwardMenu","message","byChatId","activeDownloads","filter","map","canDownload","forEach","downloadMessageMedia","selectCurrentChat","enterMessageSelectMode","childMessageIds","withShift","toggleMessageSelection","shouldShowContextMenuHint","disableContextMenuHint","showNotification","IS_TOUCH_ENV","isPollModalOpen","currentVersion","APP_VERSION","slice","join","serviceNotifications","find","version","SERVICE_NOTIFICATIONS_USER_ID","date","getServerTime","serverTimeOffset","content","text","parseMessageInput","isOutgoing","createServiceNotification","serviceChat","maxId","Math","max","fractionalPart","floor","serviceNotification","isUnread","apiUpdate","globalSearch","updateGlobalSearch","globalResults","localResults","resultsByType","fetchingStatus","chats","recentlyFoundChatIds","newRecentIds","unshift","updateGlobalSearchContent","stickers","search","resultIds","gifs","offsetId","results","updateSelectedUserId","updateUserSearch","globalUserIds","localUserIds","leftColumnWidth","management","isActive","IS_SINGLE_COLUMN_LAYOUT","IS_TABLET_COLUMN_LAYOUT","isLeftColumnShown","messageLists","action","emoji","recentEmojis","newEmojis","e","sticker","recent","hash","newStickers","s","notification","localId","generateIdFor","newNotifications","notifications","existingNotificationIndex","findIndex","n","splice","push","data","hasErrorKey","getReadableErrorText","newDialogs","dialogs","existingErrorIndex","err","url","safeLinkModalUrl","selectedAt","historyCalendarSelectedAt","payment","isPaymentModalOpen","clearPayment","closeInvoice","error","uploadProgressCallbacks","Map","runDebouncedForMarkRead","debounce","cb","async","isOutlying","isBudgetPreload","addOffset","LoadMoreDirection","round","MESSAGE_LIST_SLICE","result","callApi","selectThreadOriginChat","limit","users","threadInfos","localMessages","allMessages","concat","byId","buildCollectionByKey","addChatMessagesById","updateOutlyingIds","updateListedIds","addUsers","addChats","updateThreadInfos","listedIds","selectListedIds","outlyingIds","selectOutlyingIds","areSortedArraysIntersecting","historyIds","newViewportIds","getViewportSlice","safeReplaceViewportIds","sourceIds","index","i","findClosestIndex","indexForDirection","from","to","areSomeLocal","areAllLocal","sendMessage","params","progressCallback","attachment","progress","messageLocalId","has","set","fileUploads","byMessageLocalId","replyingTo","IS_IOS","rafPromise","selectThreadTopMessageId","delete","isRestricted","Promise","resolve","loadWithBudget","selectFocusedMessageId","selectRealLastReadId","replyOriginForId","threadUpdate","MESSAGE_DELETED","replyMessage","selectChatMessage","updateChatMessage","replyToMessageId","loadMessage","isDeleting","updateThreadUnreadFromForwardedMessage","scheduledAt","clearWebPagePreview","value","noWebPage","selectNoWebPage","isSingle","attachments","isGrouped","restParams","entities","commonParams","groupedAttachments","split","MAX_MEDIA_FILES_FOR_ALBUM","firstAttachment","restAttachments","Date","now","selectEditingMessage","setEditingId","get","previousLocalId","cancelApiProgress","draft","replyToMsgId","updateChat","draftDate","localOnly","selectDraft","isUnpin","isOneSide","isSilent","unpinAllMessages","shouldDeleteForAll","editingId","selectEditingId","selectEditingScheduledId","activeChat","reason","description","peer","minId","selectFirstUnreadId","unreadCount","readCount","count","l","countSortedIds","lastReadInboxMessageId","webPagePreview","loadWebPagePreview","options","option","offset","shouldResetVoters","unique","user","offsets","nextOffset","loadPollOptionResults","fromChat","toChat","sort","a","b","realMessages","m","isServiceNotificationMessage","poll","replaceScheduledMessages","loadScheduledHistory","selectScheduledMessage","loadPinnedMessages","searchThrottled","throttle","searchGifs","updateGifSearch","added","addedStickers","updateStickerSets","sets","loadStickerSets","setIds","addedSetIds","loadStickers","stickerSetId","pause","recentStickers","loadRecentStickers","favorite","favoriteStickers","loadFavoriteStickers","greeting","featured","featuredStickers","loadFeaturedStickers","stickerSetShortName","stickerSetAccessHash","stickerSet","selectStickerSet","accessHash","packs","updateStickerSet","currentEmoji","forEmoji","rebuildStickersForEmoji","replaceAnimatedEmojis","loadAnimatedEmojis","saved","savedGifs","loadSavedGifs","unfave","unfaveSticker","installedDate","language","currentEmojiKeywords","emojiKeywords","isLoading","fromVersion","keywords","searchStickers","setsById","title","searchWords","updateStickersForEmoji","loadStickersForEmoji","openedStickerSetShortName","searchMessagesGlobal","offsetRate","maxDate","minDate","localResult","chatOrUser","GLOBAL_SEARCH_SLICE","totalCount","nextOffsetId","nextRate","currentSearchQuery","selectCurrentGlobalSearchQuery","updateGlobalSearchFetchingStatus","addMessages","updateGlobalSearchResults","localChats","localUsers","globalChats","globalUsers","chatIds","userIds","searchChats","timestampPlusDay","foundIds","currentSearch","selectCurrentTextSearch","topMessageId","MESSAGE_SEARCH_SLICE","newFoundIds","updateLocalTextSearchResults","searchTextMessages","peerId","selectCurrentMediaSearchPeerId","selectCurrentMediaSearch","currentType","currentResults","SHARED_MEDIA_SLICE","updateLocalMediaSearchResults","searchSharedMedia","timestamp","getDispatch","searchMessagesByDate","ManagementProgress","username","updateManagementProgress","updateManagement","isUsernameAvailable","isChatBasicGroup","loadAndReplaceArchivedChats","CHAT_LIST_LOAD_SLICE","archived","withPinned","updateUsers","updateChats","replaceChatListIds","updateChatListSecondaryInfo","loadAndUpdateUsers","contactIds","contactList","selectUser","updatedUsers","loadTopMessages","afterSyncCallback","DEBUG","console","log","savedUsers","lastLocalServiceMessage","selectLastServiceNotification","currentUserId","savedPrivateChatIds","savedChats","currentChatId","selectedChat","isUserId","selectedChatUser","replaceChats","draftsById","replyingToById","loadAndReplaceChats","areMessagesLoaded","currentThreadId","draftsByChatId","reduce","acc","newCurrentChatId","currentMessageListInfo","originChannelId","currentMessageListInfoOrigin","resultOrigin","byIdOrigin","listedIdsOrigin","threadsById","Array","prototype","replaceUsers","audioChatId","audioMessageId","closeAudioPlayer","loadAndReplaceMessages","lastSyncTime","sync","afterSync","all","updateAppBadge","selectCountNotMutedUnread","runDebouncedForFetchFullUser","runThrottledForSearch","replaceInlineBotSettings","inlineBotSettings","inlineBots","byUsername","replaceInlineBotsIsLoading","userId","topPeers","lastRequestedAt","loadTopUsers","getCompareString","lastName","firstName","collator","Intl","Collator","sortedUsers","compare","isSelf","loadContactList","isUserBot","commonChats","isFullyLoaded","updateUser","updateChatMutedState","phoneNumber","phone","updateContact","deleteUser","profileId","isPrivate","photos","userSearch","updateUserSearchFetchingStatus","searchUsers","pick","runDebouncedForSearch","sendBotCommand","command","button","match","RE_TME_LINK","RE_TG_LINK","openTelegramLink","toggleSafeLinkModal","showDialog","alert","isError","answerCallbackButton","openPollModal","getReceipt","receiptMessageId","getPaymentForm","setInvoiceMessageInfo","openPaymentModal","bot","selectChatBot","removeBlockedContact","topInlineBots","inlineBotData","inlineBot","switchPm","canLoadMore","shouldReplaceSettings","newInlineBotData","currentIds","Set","newResults","help","isGallery","searchInlineBot","queryId","resultId","botId","param","startParam","replaceSettings","hasPassword","updateTwoFaSettings","hint","currentPassword","onSuccess","isSuccess","password","email","waitingEmailCodeLength","code","requestInfo","saveInfo","selectPaymentChatId","selectPaymentMessageId","shouldSave","shippingOptions","setRequestInfoId","updateShippingOptions","setPaymentStep","PaymentStep","validateRequestedInfo","setPaymentForm","step","invoice","shippingAddressRequested","nameRequested","phoneRequested","emailRequested","setReceipt","receipt","publishableKey","selectProviderPublishableKey","credentials","k","buildQueryString","cardNumber","expiryMonth","expiryYear","cvv","zip","country","response","fetch","method","headers","Authorization","json","getStripeError","setStripeCardInfo","sendStripeCredentials","shippingOptionId","saveCredentials","formId","selectPaymentFormId","requestInfoId","selectPaymentRequestId","stripeCredentials","selectStripeCredentials","requestedInfoId","sendPaymentForm","save","runThrottledForUpdateAppBadge","update","noTopChatsRequest","selectIsChatListed","loadTopChats","newProfilePhoto","closeMessageNotifications","listType","selectChatListType","updateChatListIds","isNotJoined","requestChatUpdate","leaveChat","typingStatus","senderId","isFromScheduled","hasUnreadMention","unreadMentionsCount","notifyAboutNewMessage","messageUpdate","channelId","selectCommonBoxChatId","fullInfo","targetChat","folderId","ARCHIVED_FOLDER_ID","orderedPinnedIds","isPinned","newOrderedPinnedIds","MAX_ACTIVE_PINNED_CHATS","listIds","active","pinnedId","updateChatListType","folder","chatFoldersById","chatFolders","newChatFoldersById","newOrderedIds","orderedId","folders","recommended","replacedMembers","addedMember","deletedMemberId","shouldUpdate","members","some","deleteIndex","adminMembers","isOwner","isAdmin","membersCount","photo","formattedText","ANIMATION_DELAY","updateWithLocalMedia","isScheduled","currentMessage","video","document","getMessageContent","blobUrl","thumbnail","isPreloadedGlobally","previewBlobUrl","updateScheduledMessage","updateThreadUnread","selectThreadByMessage","originMessage","updateListedAndViewportIds","firstMessageId","isUnreadChatNotLoaded","isMessageLocal","addViewportId","messagesCount","firstUnreadId","updateChatLastMessage","force","currentLastMessage","findLastMessage","deleteMessages","newLastMessage","threadIdsToUpdate","deleteChatMessages","requestThreadInfoUpdate","chatsIdsToUpdate","commonBoxChatId","shouldForceReply","updateThreadInfo","newMessage","isMessageInCurrentMessageList","delayedGlobal","scheduledIds","selectScheduledIds","selectIsChatWithBot","selectScheduledMessages","deleteChatScheduledMessages","thread","markMessageListRead","currentPinnedIds","selectPinnedIds","newPinnedIds","newTheadInfo","messagesById","loadFullChat","scheduledMessages","deleteScheduledMessages","pollId","pollUpdate","selectChatMessageByPollId","updatedPoll","updatedResults","isChosen","chosenAnswers","chosenAnswer","chosenAnswerIndex","recentVoterIds","totalVoters","newRecentVoterIds","newTotalVoters","targetOption","targetOptionIndex","updatedOption","votersCount","selectIsServiceChatReady","flushStatusUpdatesThrottled","pendingStatusUpdates","statusUpdate","status","targetUser","isBlocked","addBlockedContact","settings","privacy","key","rules","updateNotifySettings","peerType","shouldShowPreviews","addNotifyException","twoFaSettings","call","connectionState","groupCalls","activeGroupCallId","leaveGroupCall","shouldRemove","removeGroupCall","updateGroupCall","omit","participantsCount","groupCallId","participants","participant","updateGroupCallParticipant","useBeforeUnload","callback","useEffect","onBeforeUnload","metaViewport","querySelector","defaultViewportContent","getAttribute","preventEvent","preventDefault","useBrowserOnline","isOnline","setIsOnline","useState","navigator","onLine","handleChange","addEventListener","removeEventListener","ANIMATION_LEVEL_OPTIONS","memo","withGlobal","searchQuery","chatsById","animationLevel","byKey","globalSearchChatId","searchDate","theme","selectTheme","contactsFilter","onSearchQuery","onSelectSettings","onSelectContacts","onSelectArchived","setGlobalSearchChatId","onReset","shouldSkipTransition","openTipsChat","setGlobalSearchDate","setSettingOption","lang","useLang","hasMenu","LeftColumnContent","selectedSearchDate","useMemo","formatDateToString","archivedUnreadChatsCount","values","total","isChatArchived","withOtherVersions","location","hostname","MainButton","onTrigger","isOpen","Button","ripple","size","color","className","onClick","ariaLabel","buildClassName","handleSearchFocus","useCallback","handleSelectSaved","handleDarkModeToggle","stopPropagation","newTheme","shouldUseSystemTheme","switchTheme","ANIMATION_LEVEL_MAX","handleAnimationLevelChange","newLevel","_","body","classList","toggle","isSearchFocused","searchInputPlaceholder","DropdownMenu","trigger","footer","APP_NAME","MenuItem","icon","Switcher","label","checked","noAnimation","toLowerCase","langCode","href","FEEDBACK_URL","localStorage","setItem","JSON","stringify","disableHistoryBack","SearchInput","inputId","parentContainerClassName","focused","placeholder","autoComplete","canClose","onChange","onFocus","PickerSelectedItem","isMinimized","clickArg","chatOrUserId","dir","isRtl","Spinner","usersById","orderedFolderIds","activeChatFolder","shouldSkipHistoryAnimations","notifySettings","selectNotifySettings","notifyExceptions","selectNotifyExceptions","foldersDispatch","onScreenSelect","loadChatFolders","setActiveChatFolder","transitionRef","useRef","displayedFolders","folderCountersById","resolverFn","ms","dependencies","runThrottled","useThrottle","setValue","isFrozen","freeze","unfreeze","useFlag","useHeavyAnimationCheck","useOnChange","counters","unreadDialogsCount","hasActiveDialogs","getFolderUnreadDialogs","badgeCount","isBadgeActive","useThrottledMemo","folderTabs","handleSwitchTab","current","captureEvents","selectorToPreventScroll","onSwipe","SwipeDirection","min","isNotInAllTabRef","captureEscKeyListener","useHistoryBack","handleKeyDown","ctrlKey","shiftKey","startsWith","digit","shouldRender","shouldRenderPlaceholder","transitionClassNames","useShowTransition","renderCurrentTab","activeFolder","ChatList","folderType","TabList","tabs","activeTab","onSwitchTab","Transition","ref","name","activeKey","renderCount","props","LeftSearch","useModuleLoader","Bundles","Loading","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","isConnecting","isMouseInside","handleSelectSettings","handleSelectContacts","handleSelectNewChannel","handleSelectNewGroup","handleSelectArchived","autoCloseTimeout","shouldRenderUpdateButton","updateButtonClassNames","handleUpdateClick","isAppOutdated","markIsAppOutdated","timeout","reload","useAppOutdatedCheck","ShowTransition","isCustom","shouldCleanup","cleanupExceptionKey","fluid","pill","Settings","NewChat","ArchivedChats","ContentType","RENDER_COUNT","setGlobalSearchQuery","resetChatCreation","loadPasswordInfo","clearTwoFaError","setLeftColumnWidth","resetLeftColumnWidth","resizeRef","setContent","settingsScreen","setSettingsScreen","SettingsScreens","setContactsFilter","foldersState","useFoldersReducer","lastResetTime","setLastResetTime","contentType","Main","Archived","NewChannel","NewGroup","handleReset","forceReturnToChatList","pickerSearchInput","getElementById","blur","handleSearchQuery","initResize","resetResize","handleMouseUp","elementRef","onResize","initialWidth","markIsActive","unmarkIsActive","initialMouseX","setInitialMouseX","initialElementWidth","setInitialElementWidth","style","width","remove","handleMouseMove","event","newWidth","ceil","clientX","stopDrag","offsetWidth","add","useResize","handleSettingsScreenSelect","screen","LAYERS_ANIMATION_NAME","currentScreen","isChannel","onMouseDown","onMouseUp","onDoubleClick","setSize","windowSize","handleResize","MAX_MESSAGES_LIST_WIDTH","HeaderMenuContainer","isChatChannel","selectIsInSelectMode","noMenu","isChatWithSelf","selectIsChatWithSelf","isMainThread","isDiscussionThread","isRightColumnShown","canRestartBot","selectIsUserBlocked","canStartBot","selectIsChatBotNotStarted","canSubscribe","isChatSuperGroup","canSearch","canMute","canLeave","canEnterVoiceChat","ARE_CALLS_SUPPORTED","isCallActive","canCreateVoiceChat","adminRights","manageCall","isCreator","canExpandActions","joinChannel","openLocalTextSearch","restartBot","menuButtonRef","menuPosition","setMenuPosition","handleHeaderMenuOpen","rect","getBoundingClientRect","x","right","y","bottom","handleHeaderMenuClose","handleHeaderMenuHide","handleSubscribeClick","handleStartBot","handleRestartBot","handleSearchClick","focus","searchInput","disabled","anchor","withExtraActions","onSubscribeChannel","onSearchClick","onCloseAnimationEnd","useWebpThumbnail","thumbDataUri","getMessageMediaThumbDataUri","shouldDecodeThumbnail","isWebpSupported","thumbnailDecoded","setThumbnailDecoded","EMPTY_IMAGE_DATA_URI","useLayoutEffect","webpToPngBase64","then","catch","drawRect","height","radius","containerRef","markupParams","reverseIndex","barHeight","getBarHeight","markHeight","getMarkHeight","trackHeight","getTrackHeight","clipPathId","clipPath","d","getClipPath","markTranslateY","getMarkTranslateY","trackTranslateY","getTrackTranslateY","calculateMarkup","firstChild","firstElementChild","currentElement","transform","svg","div","defs","innerHTML","customTitle","onUnpinMessage","onAllPinnedClick","mediaThumbnail","mediaBlobUrl","useMedia","getMessageMediaHash","getMessageSummaryText","isUnpinDialogOpen","openUnpinDialog","closeUnpinDialog","handleUnpinMessage","ConfirmDialog","confirmLabel","confirmHandler","getPictogramDimensions","src","alt","renderPictogram","renderText","RippleEffect","scaleImage","image","ratio","outputType","Blob","URL","createObjectURL","img","Image","onload","scale","blob","finally","revokeObjectURL","steppedScale","bitmap","createImageBitmap","resizeWidth","resizeHeight","resizeQuality","Error","res","canvas","createElement","ctx","getContext","transferFromImageBitmap","drawImage","toBlob","oc","octx","mul","cur","LOGO_DIMENSIONS","MINIMAL_SIZE","sender","audio","voice","fileName","artist","performer","getSenderTitle","getTranslation","album","getChatTitle","audioCoverHash","getAudioHasCover","avatarHash","getChatAvatarHash","media","thumbnailSizes","AVATAR_FULL_DIMENSIONS","getCoverSize","fn","deps","defaultValue","setIsLoading","setError","setResult","wasCancelled","telegramLogoPath","resizeImage","makeGoodArtwork","useAsync","buildMediaMetadata","artwork","selectSender","noUi","setAudioPlayerVolume","setAudioPlayerPlaybackRate","setAudioPlayerMuted","isVoice","senderName","mediaData","mediaLoader","mediaMetadata","useMessageMediaMetadata","playPause","stop","isPlaying","requestNextTrack","requestPreviousTrack","isFirst","isLast","setVolume","toggleMuted","setPlaybackRate","useAudioPlayer","makeTrackId","getMediaDuration","isVoicePlaying","handleClick","handleClose","clearMediaSession","handleVolumeChange","handleVolumeClick","handlePlaybackClick","volumeIcon","renderAudio","subtitle","renderVoice","withClickPropagation","RangeSlider","groupCall","selectChatGroupCall","isLoaded","isCallNotEmpty","hasPinnedOffset","joinGroupCall","subscribeToGroupCallUpdates","handleJoinGroupCall","fetchedParticipants","isUser","subscribed","p","Avatar","audioMessage","pinnedIds","state","isSelectModeActive","isChatWithBot","currentTransitionKey","assign","pinnedMessageId","topMessageSender","selectForwardedSender","pinnedMessageIds","canUnpin","firstPinnedMessage","isReady","openChatWithInfo","pinMessage","openPreviousChat","toggleLeftColumn","isBackButtonActive","pinnedMessageIndex","setPinnedMessageIndex","isArray","pinnedMessage","pinnedMessagesCount","chatTitleLength","topMessageTitle","useEnsureMessage","windowWidth","useWindowSize","isLeftColumnHideable","MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN","shouldShowCloseButton","componentRef","shouldAnimateTools","handleHeaderClick","handlePinnedMessageClick","cycleRestrict","handleAllPinnedClick","setBackButtonActive","handleBackClick","messageInput","EDITABLE_INPUT_ID","canToolsCollideWithChatInfo","SAFE_SCREEN_WIDTH_FOR_CHAT_INFO","MOBILE_SCREEN_MAX_WIDTH","shouldUseStackedToolsClass","MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","shouldRenderAudioPlayer","audioPlayerClassNames","renderingAudioMessage","useCurrentOrPrev","shouldRenderPinnedMessage","pinnedMessageClassNames","renderingPinnedMessage","renderingPinnedMessagesCount","renderingCanUnpin","renderingPinnedMessageTitle","canRevealTools","componentEl","renderInfo","renderBackButton","PrivateChatInfo","withFullInfo","withMediaViewer","withUpdatingStatus","noRtl","GroupChatInfo","asClose","withUnreadCount","formatIntegerCompact","isAudioPlayerRendered","Infinity","getMessageKey","isAlbum","messageOrAlbum","groupMessages","currentAlbum","currentSenderGroup","currentDateGroup","originalDate","datetime","getDayStart","senderGroups","dateGroups","isInAlbum","mainMessage","albumId","nextMessage","nextMessageDayStartsAt","isActionMessage","forwardInfo","senderUserId","hiddenUserName","inlineButtons","INTERSECTION_THROTTLE_FOR_MEDIA","IS_ANDROID","INTERSECTION_MARGIN_FOR_MEDIA","isEmojiOnlyMessage","customShape","getMinMediaWidth","hasText","hasCommentButton","calculateMediaDimensions","noAvatars","isOwn","isOwnMessage","isForwarded","isForwardedMessage","getMessagePhoto","getMessageWebPagePhoto","getMessageVideo","isWebPagePhoto","calculateInlineImageDimensions","calculateVideoDimensions","minMediaWidth","getMessageText","stretchFactor","finalWidth","finalHeight","isSmall","accumulate","list","initValue","accumulator","item","clamp","num","low","high","calculateContainerSize","layout","styles","dimensions","sides","calculateAlbumLayout","ratios","proportions","getProportions","averageRatio","getAverageRatio","albumCount","forceCalc","maxWidth","getAvailableWidth","REM","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","AlbumRectPart","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","element","calculateAuthorWidth","font","whiteSpace","left","opacity","appendChild","useFocusMessage","isFocused","focusDirection","noFocusHighlight","messagesContainer","closest","fastSmoothScroll","ContextMenuContainer","targetUserIds","targetChatId","targetMessageId","targetMessage","selectIsMessageFocused","focusedMessage","observeIntersection","isEmbedded","appearanceOrder","isLastInList","useOnIntersect","noAppearanceAnimation","markShown","targetUsers","renderActionMessageText","asPlain","isContextMenuOpen","contextMenuPosition","handleBeforeContextMenu","handleContextMenu","handleContextMenuClose","handleContextMenuHide","useContextMenuHandlers","isContextMenuShown","preventMessageInputBlur","onContextMenu","customText","isIntersecting","useIsIntersecting","pictogramId","isRoundVideo","getMessageRoundVideo","senderTitle","outgoingStatus","signature","views","isEdited","formatTime","MessageOutgoingStatus","observeIntersectionForPlaying","shouldLoop","isModalOpen","openModal","closeModal","isAnimated","isMemojiSticker","MEMOJI_STICKER_ID","shouldLoad","shouldPlay","mediaHash","getMessageMediaFormat","isMediaLoaded","isAnimationLoaded","markAnimationLoaded","isMediaReady","useMediaTransition","getStickerDimensions","thumbClassName","stickerClassName","AnimatedSticker","animationData","play","noLoop","onLoad","fromSticker","useBlurredMediaThumbRef","fullMediaData","useCanvasBlur","IS_CANVAS_FILTER_SUPPORTED","SELECTED_APPENDIX_COLORS","dark","outgoing","incoming","light","canAutoLoad","isInSelectMode","isSelected","uploadProgress","nonInteractive","shouldAffectAppendix","isDownloading","onCancelUpload","localBlobUrl","isLoadAllowed","setIsLoadAllowed","loadProgress","useMediaWithLoadProgress","thumbRef","downloadProgress","isUploading","isTransferring","transferProgress","getMediaTransferState","wasLoadDisabled","usePrevious","shouldRenderSpinner","spinnerClassNames","shouldRenderDownloadButton","downloadButtonClassNames","isAllowed","contentEl","inSelectMode","getImageData","getAppendixColorFromImage","getCustomAppendixBg","appendixBg","setProperty","setAttribute","ProgressSpinner","useVideoAutoPause","playerRef","canPlay","wasPlaying","paused","canPlayRef","freezePlaying","unfreezePlaying","contains","safePlay","unfreezePlayingOnRaf","fastRaf","useBackgroundMode","canAutoPlay","videoRef","getMessageWebPageVideo","isPlayAllowed","setIsPlayAllowed","previewClassNames","isInline","ApiMediaFormat","isBuffered","bufferingHandlers","useBuffering","shouldRenderPlayButton","playButtonClassNames","playProgress","setPlayProgress","handleTimeUpdate","currentTarget","currentTime","duration","useVideoCleanup","cancelMessageMediaDownload","autoPlay","muted","loop","playsInline","onTimeUpdate","isGif","formatMediaDuration","contact","countryList","phoneCodes","phoneCodeList","openUserInfo","formatPhoneNumberWithCode","getPercentage","toFixed","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","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","containerId","question","getPollTypeString","CheckboxGroup","loadingOptions","RadioGroup","loadingOption","isQuiz","getReadableVotersCount","isText","inPreview","onMediaClick","onCancelMediaTransfer","webPage","getMessageWebPage","isSquarePhoto","handleMediaClick","siteName","displayUrl","isMediaInteractive","truncatedDescription","trimText","SafeLink","getMessageInvoice","amount","currency","isTest","photoUrl","formatCurrency","withSelectControl","WrappedComponent","ownProps","selectIsMessageSelected","handleMessageSelect","newProps","PhotoWithSelect","Photo","VideoWithSelect","Video","activeDownloadIds","selectActiveDownloadIds","uploadsById","hasCustomAppendix","albumLayout","cancelSendingMessage","mediaCount","handleCancelUpload","containerWidth","containerHeight","fileUpload","selectCanAutoLoadMedia","selectCanAutoPlayMedia","currentOnRelease","playingProgressRef","shouldSpinnerRender","isActivated","setIsActivated","setProgress","svgCenter","ROUND_VIDEO_DIMENSIONS_PX","playerEl","playingProgressEl","stopPlaying","capturePlaying","onRelease","stopCurrentAudio","videoClassName","onEnded","recentReplierIds","recentRepliers","hasUnread","GROUP_MESSAGE_HOVER_ATTRIBUTE","APPENDIX_OWN","__html","APPENDIX_NOT_OWN","handleDocumentGroupMouseEnter","lastGroupElement","getLastElementInDocumentGroup","handleDocumentGroupMouseLeave","removeAttribute","nextElementSibling","withSenderName","withAvatar","viaBotId","replyToChatId","isRepliesChat","isChatWithRepliesBot","chatUsername","forceSenderName","isAnonymousOwnMessage","canShowSender","originSender","botSender","threadTopMessageId","isThreadTop","shouldHideReply","replyMessageSender","selectUploadProgress","isForwarding","highlight","singleEmoji","getMessageSingleEmoji","every","canReply","selectIsDownloading","isSingleEmoji","animatedEmoji","selectAnimatedEmoji","isGroupSelected","selectIsDocumentGroupSelected","isPinnedList","canAutoLoadMedia","canAutoPlayMedia","autoLoadFileMaxSizeMb","shouldLoopStickers","selectShouldLoopStickers","selectOutgoingStatus","observeIntersectionForBottom","observeIntersectionForMedia","observeIntersectionForAnimatedStickers","noComments","isFirstInGroup","isLastInGroup","isFirstInDocumentGroup","isLastInDocumentGroup","clickInlineButton","bottomMarkerRef","isLocal","hasReply","isReplyMessage","hasThread","asForwarded","isLinkedChannelPost","isInDocumentGroup","getMessageCustomShape","textParts","renderMessageText","adminTitle","metaSafeAuthorWidth","canShowActionButton","canForward","canFocus","isChannelPost","fromMessageId","avatarPeer","senderPeer","selectMessage","handleMouseDown","handleDoubleClick","handleContentDoubleClick","isSwiped","markSwiped","unmarkSwiped","startedAt","target","matches","useOuterHandlers","handleAvatarClick","handleSenderClick","handleViaBotClick","handleReplyClick","handleAudioPlay","handleAlbumMediaClick","handleMetaClick","handleReadMedia","handleVoteSend","handleGroupForward","handleForward","handleFocus","handleFocusForwarded","handleDocumentGroupSelectAll","openMediaViewer","openAudioPlayer","markMessagesRead","sendPollVote","focusMessageInComments","replyToTopMessageId","MediaViewerOrigin","albumMessageId","selectWithGroupedId","useInnerHandlers","containerClassName","contentClassName","hasComments","hasActionButton","classNames","isMedia","isMediaWithNoText","isViaBot","isRound","buildContentClassName","withCommentButton","withAppendix","calculatedWidth","noMediaCorners","extraPadding","isAvatarPeerUser","avatarUser","avatarChat","hiddenName","renderAvatar","shouldInlineMeta","textContentClass","senderColor","getUserColorKey","renderSenderName","AnimatedEmoji","forceLoadPreview","Audio","AudioOrigin","isSelectable","onPlay","onReadMedia","Document","renderContent","dangerouslySetInnerHTML","messageGroups","isViewportNewest","withUsers","anchorIdRef","memoUnreadDividerBeforeIdRef","memoFirstUnreadIdRef","hasLinkedChat","isSchedule","onFabToggle","onNotchToggle","openHistoryCalendar","observeIntersectionForReading","observe","useIntersectionObserver","rootRef","throttleMs","margin","freezeForReading","unfreezeForReading","noAutoFreeze","entries","mentionIds","entry","dataset","useMessageObservers","backwardsTriggerRef","forwardsTriggerRef","fabTriggerRef","loadMoreBackwards","loadMoreForwards","toggleScrollTools","offsetHeight","scrollHeight","scrollTop","scrollBottom","isAtBottom","MESSAGE_LIST_SENSITIVE_AREA","LOCAL_MESSAGE_ID_BASE","triggerEntry","resetScroll","observeIntersectionForFab","freezeForFab","unfreezeForFab","FAB_THRESHOLD","observeIntersectionForNotch","freezeForNotch","unfreezeForNotch","useScrollHooks","unreadDivider","messageCountToAnimate","messageGroup","flatten","appearanceIndex","dateGroup","dateGroupIndex","dateGroupsArray","senderGroup","senderGroupIndex","senderGroupsArray","compact","currentDocumentGroupId","messageIndex","isMessageAlbum","documentGroupId","nextDocumentGroupId","originalId","getMessageOriginalId","teactFastList","SCHEDULED_WHEN_ONLINE","formatHumanDate","dividend","getUserIdDividend","lastUnreadMessageId","loadGreetingStickers","debounceMs","handleStickerSelect","selectedSticker","StickerButton","isGroupChatJustCreated","renderScheduled","renderSavedMessages","renderGroup","runDebouncedForScroll","selectCurrentMessageIds","restrictionReason","focusingId","withLastMessageWhenPreloading","chatBot","botDescription","isChatLoaded","isChannelChat","isGroupChat","isChatGroup","isBot","threadFirstMessageId","selectFirstMessageId","linkedChatId","hasTools","canPost","setScrollOffset","scrollOffsetRef","selectScrollOffset","anchorTopRef","listItemElementsRef","memoFocusingIdRef","isScrollTopJustUpdatedRef","shouldAnimateAppearanceRef","setContainerHeight","onTickEnd","listedMessages","orderBy","loadMoreAround","isScrolled","updateStickyDates","markIsScrolled","runDebounced","useDebounce","container","currentStuck","stuckDateEl","allElements","querySelectorAll","containerTop","el","offsetTop","top","findStuckDate","useStickyDates","handleScroll","parentElement","observer","ResizeObserver","offsetParent","contentRect","disconnect","windowHeight","normalHeight","String","clientHeight","preservedItemElements","useLayoutEffectWithPrevDeps","prevMessageIds","prevIsViewportNewest","prevContainerHeight","shouldForceScroll","hasLastMessageChanged","hasViewportShifted","wasMessageAdded","isAlreadyFocusing","lastItemElement","bottomOffset","newScrollTop","isResized","isAnimatingScroll","useEffectWithPrevDeps","prevIsSelectModeActive","dispatchHeavyAnimationEvent","shouldRenderGreeting","onScroll","withExtraShift","focusNextReply","messageElements","lastMessageElement","MAX_QUICK_IMG_SIZE","FILE_EXT_REGEX","buildAttachment","filename","isQuick","mimeType","quick","SUPPORTED_IMAGE_CONTENT_TYPES","preloadImage","resizedUrl","fetchBlob","replace","SUPPORTED_VIDEO_CONTENT_TYPES","videoWidth","videoHeight","preloadVideo","createPosterForVideo","resetInput","applyIosAutoCapitalizationFix","inputEl","POLYFILL_OPTIONS","encoderPath","reuseWorker","BLOB_PARAMS","opusRecorderPromise","OpusRecorder","mediaRecorder","init","default","start","analyzerCallback","startMediaRecorder","pausedAt","chunks","waveform","ondataavailable","typedArray","releaseAnalyzer","recorder","source","sourceNode","analyser","context","createAnalyser","fftSize","connect","dataLength","frequencyBinCount","dataArray","Uint8Array","isDestroyed","tick","getByteFrequencyData","requestAnimationFrame","subscribeToAnalyzer","reject","onstop","onerror","delayStop","CLIPBOARD_ACCEPTED_TYPES","getMessageTextAsHtml","tempEl","INLINE_BOT_QUERY_REGEXP","HAS_NEW_LINE","RE_COMMAND","DeleteMessageModal","openTimeout","isFirstTimeActivation","onActivate","buttonProps","AttachMenu","SymbolMenu","InlineBotTooltip","MentionTooltip","CustomSend","StickerTooltip","BotCommandTooltip","useMouseInside","isKeyboardSingleUse","forceOpen","markForceOpen","unmarkForceOpen","keyboardButtons","forwardMessageIds","forwardedMessagesCount","exitForwardMode","canAnimate","useAsyncRendering","clearEmbedded","handleMessageClick","faded","AttachmentModal","BotCommandMenu","PollModal","DropArea","RE_LINK","RegExp","RE_LINK_TEMPLATE","messageText","toggleMessageWebPage","link","linkEntity","ApiMessageEntityTypes","textMatch","renderingWebPage","webPageWithoutPhoto","messageStub","CalendarModal","MainButtonState","chatUser","selectChatUser","REPLIES_USER_ID","messageWithActualBotKeyboard","selectNewestMessageWithBotKeyboardButtons","shouldSuggestStickers","baseEmojiKeywords","BASE_EMOJI_KEYWORD_LANG","botKeyboardMessageId","keyboardMessage","editingMessage","canScheduleUntilOnline","wasOnline","withScheduledButton","shouldSchedule","botKeyboardPlaceholder","keyboardPlaceholder","stickersForEmoji","groupChatMembers","topInlineBotIds","isInlineBotLoading","chatBotCommands","botCommands","dropAreaState","onDropHide","editMessage","saveDraft","clearDraft","setStickerSearchQuery","setGifSearchQuery","closePollModal","addRecentEmoji","sendInlineBotResult","appendixRef","html","setHtml","lastMessageSendTimeSeconds","prevDropAreaState","isCalendarOpen","openCalendar","closeCalendar","scheduledMessageArgs","setScheduledMessageArgs","htmlRef","setAttachments","isBotKeyboardOpen","openBotKeyboard","closeBotKeyboard","isBotCommandMenuOpen","openBotCommandMenu","closeBotCommandMenu","isAttachMenuOpen","openAttachMenu","closeAttachMenu","isSymbolMenuOpen","openSymbolMenu","closeSymbolMenu","isDeleteModalOpen","openDeleteModal","closeDeleteModal","isSymbolMenuLoaded","onSymbolMenuLoadingComplete","isHoverDisabled","disableHover","enableHover","startRecordingVoice","stopRecordingVoice","pauseRecordingVoice","activeVoiceRecording","currentRecordTime","recordButtonRef","mainButtonRef","startRecordTimeRef","setActiveVoiceRecording","setCurrentRecordTime","IS_SAFARI","IS_VOICE_RECORDING_SUPPORTED","voiceRecording","tickVolume","boxShadow","useVoiceRecording","mainButtonState","Edit","Send","Record","canShowCustomSendMenu","isMentionTooltipOpen","closeMentionTooltip","insertMention","mentionFilteredUsers","useMentionTooltip","isInlineBotTooltipOpen","inlineBotId","isInlineBotTooltipGallery","inlineBotSwitchPm","inlineBotResults","closeTooltip","closeInlineBotTooltip","inlineBotHelp","loadMore","loadMoreForInlineBot","markIsOpen","unmarkIsOpen","innerText","getPlainText","queryInlineBot","resetInlineBot","canShowHelp","parseStartWithUsernameString","usernameLowered","prevQuery","prevUsername","useInlineBotTooltip","isBotCommandTooltipOpen","close","closeBotCommandTooltip","filteredBotCommands","botTooltipCommands","setFilteredBotCommands","getFilteredCommands","nextFilteredBotCommands","prepareForRegExp","substr","useBotCommandTooltip","isCustomSendMenuOpen","allowedAttachmentOptions","getAllowedAttachmentOptions","isChatAdmin","slowMode","getChatSlowModeOptions","isStickerTooltipOpen","closeStickerTooltip","isDisabled","cleanHtml","trim","clearStickersForEmoji","IS_EMOJI_SUPPORTED","parseEmojiOnlyString","hasStickers","useStickerTooltip","canSendStickers","isEmojiTooltipOpen","closeEmojiTooltip","filteredEmojis","insertEmoji","useEmojiTooltip","insertTextAndUpdateCursor","selection","getSelection","newHtml","rangeCount","selectionRange","getRangeAt","isSelectionInsideInput","range","deleteContents","fragment","createContextualFragment","lastInsertedNode","lastChild","insertNode","setStartAfter","setEndAfter","collapse","removeAllRanges","addRange","insertHtmlInSelection","dispatchEvent","Event","bubbles","focusEditableElement","removeSymbol","execCommand","tempInput","contentEditable","textLength","createRange","setStart","setEnd","removeChild","deleteLastCharacterOutsideSelection","resetComposer","shouldPreserveInput","stopRecordingVoiceRef","handleEditComplete","editedMessage","hasMessageMedia","useEditing","updateDraft","draftChatId","draftThreadId","runDebouncedForSaveDraft","DRAFT_DEBOUNCE","prevChatId","prevThreadId","prevHtml","handleBlur","useDraft","handlePaste","clipboardData","input","activeElement","EDITABLE_INPUT_MODAL_ID","items","kind","file","getAsFile","pastedText","getData","substring","useClipboardPaste","handleFileSelect","files","handleAppendFiles","handleClearAttachment","handleSend","currentAttachments","record","maxLength","extraLength","textParams","nowSeconds","secondsSinceLastMessage","nextSendDateNotReached","nextSendDate","seconds","secondsRemaining","isSlowMode","handleActivateBotCommandMenu","handleActivateSymbolMenu","handleGifSelect","gif","handleInlineBotSelect","inlineResult","handleBotCommandSelect","handlePollSend","handleSilentSend","handleMessageSchedule","isWhenOnline","restArgs","getTime","handleMessageScheduleUntilOnline","handleCloseCalendar","handleSearchOpen","handleSymbolMenuOpen","handleAllScheduledClick","mainButtonHandler","areVoiceMessagesNotAllowed","canAttachMedia","prevEditedMessage","renderedEditedMessage","scheduledDefaultDate","setSeconds","setMilliseconds","scheduledMaxDate","setFullYear","getFullYear","sendButtonAriaLabel","symbolMenuButtonClassName","onSend","Portal","DropAreaState","withQuick","onHide","onFileSelect","caption","onCaptionUpdate","onFileAppend","onClear","onInsertUserName","filteredUsers","onSelectResult","withUsername","canAttachEmbedLinks","MessageInput","forcedPlaceholder","shouldSetFocus","shouldSuppressFocus","shouldSuppressTextFormatter","onUpdate","onSuppressedFocus","formatVoiceRecordDuration","onStickerSelect","emojis","onEmojiSelect","onPollCreate","onGifSelect","onRemoveSymbol","onSearchOpen","onSilentSend","onScheduleSend","withTimePicker","maxAt","getDayStartAt","isFutureMode","secondButtonLabel","onSubmit","onSecondButtonClick","MobileSearch","MessageSelectToolbar","UnpinAllMessagesModal","PaymentModal","ReceiptModal","CLOSE_ANIMATION_DURATION","isImage","isBlurred","isBackgroundBlurred","background","customBackground","backgroundColor","patternColor","themes","isMobileSearchActive","isReceiptModalOpen","getCanPostInChat","isBotNotStarted","isPinnedMessageList","isScheduledMessageList","currentUserBannedRights","defaultBannedRights","hasPinnedOrAudioMessage","loadUser","closePaymentModal","clearReceipt","setDropAreaState","isFabShown","setIsFabShown","isNotchShown","setIsNotchShown","isUnpinModalOpen","setIsUnpinModalOpen","setIsReady","ANIMATION_LEVEL_MIN","renderingChatId","usePrevDuringAnimation","renderingThreadId","renderingMessageListType","renderingCanPost","renderingHasTools","renderingIsFabShown","visualViewport","documentElement","handleDragEnter","dataTransfer","shouldDrawQuick","handleHideDropArea","handleOpenUnpinModal","closeUnpinModal","handleUnpinAllMessages","handleTabletFocus","customBackgroundValue","settingValue","cacheApi","CUSTOM_BG_CACHE_NAME","Type","useCustomBackground","MASK_IMAGE_DISABLED","messagingDisabledClassName","messageSendingRestrictionReason","getMessageSendingRestrictionReason","composerHiddenScale","toolbarHiddenScale","composerTranslateX","toolbarTranslateX","unpinHiddenScale","toolbarForUnpinHiddenScale","sidePadding","messageListWidth","rightColumnWidth","getMessageListWidth","sendButtonWidth","composerWidth","toolbarWidth","calculateMiddleFooterTransforms","footerClassName","createMessageHash","isMessagingDisabled","onTransitionEnd","propertyName","DARK_THEME_BG_COLOR","LIGHT_THEME_BG_COLOR","onDragEnter","onUnpin","HeaderContent","isProfile","isManagement","messageSearchQuery","stickerSearchQuery","selectCurrentStickerSearch","gifSearchQuery","selectCurrentGifSearch","canAddContact","getCanAddContact","canManage","isColumnOpen","isSearch","isStickerSearch","isGifSearch","isPollResults","isAddingChatMembers","profileState","managementScreen","setLocalTextSearchQuery","searchTextMessagesLocal","toggleManagement","shouldSkipAnimation","addContact","backButtonRef","handleMessageSearchQueryChange","handleStickerSearchQueryChange","handleGifSearchQueryChange","handleAddContact","setShouldSkipTransition","contentKey","ProfileState","Profile","SharedMedia","MemberList","Search","PollResults","StickerSearch","GifSearch","AddingMembers","ManagementScreens","ManageInitial","ManageChatPrivacyType","ManageDiscussion","ManageChannelSubscribers","ManageGroupPermissions","ManageChatAdministrators","ManageGroupRemovedUsers","ManageGroupUserPermissionsCreate","ManageGroupUserPermissions","ManageGroupRecentActions","ManageGroupAdminRights","ManageGroupMembers","renderingContentKey","renderHeaderContent","autoFocusSearch","isBackButton","buttonClassName","useInfiniteScrollForLoadableItems","currentResultType","handleLoadMore","itemIds","getMore","useInfiniteScroll","MEMBERS_SLICE","useInfiniteScrollForSharedMedia","forSharedMediaType","messageIdsRef","getMessageContentIds","reverse","runThrottledForScroll","isScrollingProgrammatically","TABS","buildInfiniteScrollItemSelector","resultType","mediaSearchType","isGroup","hasMembersTab","areMembersHidden","canViewMembers","canAddMembers","getHasAdminRight","canDeleteMembers","hasCommonChatsTab","resolvedUserId","commonChatIds","onProfileStateChange","setLocalMediaSearchType","loadMoreMembers","loadCommonChats","searchMediaMessagesLocal","loadProfilePhotos","setNewChatMembersDialogState","setActiveTab","deletingUserId","setDeletingUserId","tabType","noProfileInfo","searchMessages","memberIds","sortUserIds","sortChatIds","memberViewportIds","getMoreMembers","noProfileInfoForMembers","commonChatViewportIds","getMoreCommonChats","noProfileInfoForCommonChats","mediaViewportIds","getMoreMedia","noProfileInfoForMedia","documentViewportIds","getMoreDocuments","noProfileInfoForDocuments","linkViewportIds","getMoreLinks","noProfileInfoForLinks","audioViewportIds","getMoreAudio","noProfileInfoForAudio","voiceViewportIds","getMoreVoices","noProfileInfoForVoices","useProfileViewportIds","prevTabType","tabsEl","prevProfileState","determineProfileState","tabListEl","useProfileState","applyTransitionFix","releaseTransitionFix","transitionElSelector","setMinHeight","transitionEl","minHeight","overflowY","scrollBarWidth","clientWidth","marginRight","useTransitionFixes","cacheBuster","resetCacheBuster","setCacheBuster","useCacheBuster","handleTransitionStop","handleNewMemberDialogOpen","NewChatMembersProgress","handleSelectMedia","handlePlayAudio","handleMemberClick","handleMessageFocus","handleDeleteMembersModalClose","renderingDelay","isFirstTab","SLIDE_TRANSITION_DURATION","canRenderContents","renderSharedMedia","noSpinner","NothingFound","Media","withDate","smaller","onDateClick","WebLink","onMessageClick","getSenderName","ListItem","teactOrderKey","contextActions","memberId","handler","forceShowSelf","InfiniteScroll","itemSelector","sensitiveArea","PROFILE_SENSITIVE_AREA","preloadBackwards","noScrollRestoreOnTop","noFastList","onLoadMore","ProfileInfo","ChatExtra","renderProfileInfo","shouldRestoreHeight","onStart","onStop","big","FloatingActionButton","DeleteMemberModal","RightSearch","Management","localContactIds","isSearching","onNextStep","setUserSearchQuery","selectedMemberIds","setSelectedMemberIds","noPickerScrollRestore","member","handleFilterChange","displayedIds","foundContactIds","fullName","getUserFullName","contactId","canBeInvitedToGroup","handleNextStep","Picker","selectedIds","filterValue","filterPlaceholder","searchInputId","onSelectedIdsChange","onFilterChange","noScrollRestore","MAIN_SCREENS_COUNT","RightColumnContent","MANAGEMENT_SCREENS_COUNT","blurSearchInput","areActiveChatsLoaded","selectAreActiveChatsLoaded","selectRightColumnContentKey","currentProfileUserId","selectedId","isChatSelected","toggleChatInfo","closePollResults","addChatMembers","setProfileState","setManagementScreen","selectedChatMemberId","setSelectedChatMemberId","isPromotedByCurrentUser","setIsPromotedByCurrentUser","isScrolledDown","isOverlaying","shouldScrollUp","handleSelectChatMember","isPromoted","handleAppendingChatMembers","onChatMemberSelect","prevContentKey","MediaViewer","download","click","startedDownloads","downloadHash","getMessageContentFilename","Notifications","Dialogs","ForwardPicker","SafeLinkModal","HistoryCalendar","GroupCall","ActiveCallHeader","notificationInterval","DEBUG_isLogged","updateIcon","asUnread","updatePageTitle","nextTitle","wasTimeFormatSetManually","isMediaViewerOpen","selectIsMediaViewerOpen","isForwardModalOpen","selectIsForwardModalOpen","hasNotifications","hasDialogs","isHistoryCalendarOpen","isServiceChatReady","loadNotificationSettings","loadNotificationExceptions","updateIsOnline","loadTopInlineBots","loadEmojiKeywords","loadCountryList","ensureTimeFormat","openStickerSetShortName","checkVersionNotification","LOCATION_HASH","processDeepLink","decodeURIComponent","middleColumnTransitionClassNames","rightColumnTransitionClassNames","prevIsLeftColumnShown","dispatchHeavyAnimationEnd","waitForTransitionEnd","prevIsRightColumnShown","initialUnread","clearInterval","setInterval","INACTIVE_MARKER","newUnread","PAGE_TITLE","handleStickerSetModalClose","stopEvent","IS_PWA","usePreventPinchZoomGesture","onDrop","onDragOver","initApi"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/354.5a81437dab6fff49c131.js b/dist/354.e734f2f3723608c533ad.js similarity index 97% rename from dist/354.5a81437dab6fff49c131.js rename to dist/354.e734f2f3723608c533ad.js index ea8de6a27..0a90c5697 100644 --- a/dist/354.5a81437dab6fff49c131.js +++ b/dist/354.e734f2f3723608c533ad.js @@ -1,2 +1,2 @@ (()=>{"use strict";"undefined"!=typeof window&&window.innerHeight,Math.round(425),new Set(["newMessage","newScheduledMessage","deleteMessages","deleteScheduledMessages","deleteHistory"]);const e=new Set(["image/png","image/gif","image/jpeg"]),t=new Set(["video/mp4"]);new Set([...e,...t]),new Set(["AU","BD","CA","CO","EG","HN","IE","IN","JO","MX","MY","NI","NZ","PH","PK","SA","SV","US"]),self.onerror=e=>{console.error(e),n({type:"unhandledError",error:{message:e.error.message||"Uncaught exception in worker"}})},self.addEventListener("unhandledrejection",(e=>{console.error(e),n({type:"unhandledError",error:{message:e.reason.message||"Uncaught rejection in worker"}})}));const r=new Map;function n(e,t){t?postMessage(e,t):postMessage(e)}let a;self.importScripts("rlottie-wasm.js");const s=new Promise((e=>{Module.onRuntimeInitialized=()=>{a={init:Module.cwrap("lottie_init","",[]),destroy:Module.cwrap("lottie_destroy","",["number"]),resize:Module.cwrap("lottie_resize","",["number","number","number"]),buffer:Module.cwrap("lottie_buffer","number",["number"]),render:Module.cwrap("lottie_render","",["number","number"]),loadFromData:Module.cwrap("lottie_load_from_data","number",["number","number"])},e()}})),o=new Map;var i;i={init:async function(e,t,r,n,i,c){a||await s;const d=JSON.stringify(t),l=allocate(intArrayFromString(d),"i8",0),m=a.init(),u=a.loadFromData(m,l);a.resize(m,r,r),o.set(e,{imgSize:r,reduceFactor:i,handle:m}),c(Math.ceil(u/i))},changeData:async function(e,t,r){a||await s;const n=JSON.stringify(t),{reduceFactor:i,handle:c}=o.get(e),d=allocate(intArrayFromString(n),"i8",0),l=a.loadFromData(c,d);r(Math.ceil(l/i))},renderFrames:async function(e,t,r,n){a||await s;const{imgSize:i,reduceFactor:c,handle:d}=o.get(e);for(let e=t;e<=r;e++){const t=e*c;a.render(d,t);const r=a.buffer(d),s=Module.HEAPU8.subarray(r,r+i*i*4);n(e,new Uint8ClampedArray(s).buffer)}},destroy:function(e){const t=o.get(e);a.destroy(t.handle),o.delete(e)}},onmessage=async e=>{const{data:t}=e;switch(t.type){case"callMethod":{const{messageId:e,name:a,args:s}=t;try{if(e){const t=(...t)=>{const r=t[t.length-1];n({type:"methodCallback",messageId:e,callbackArgs:t},r instanceof ArrayBuffer?[r]:void 0)};r.set(e,t),s.push(t)}const[t,o]=await i[a](...s)||[];e&&n({type:"methodResponse",messageId:e,response:t},o)}catch(t){e&&n({type:"methodResponse",messageId:e,error:{message:t.message}})}e&&r.delete(e);break}case"cancelProgress":{const e=r.get(t.messageId);e&&(e.isCanceled=!0);break}}}})(); -//# sourceMappingURL=354.5a81437dab6fff49c131.js.map \ No newline at end of file +//# sourceMappingURL=354.e734f2f3723608c533ad.js.map \ No newline at end of file diff --git a/dist/354.5a81437dab6fff49c131.js.map b/dist/354.e734f2f3723608c533ad.js.map similarity index 99% rename from dist/354.5a81437dab6fff49c131.js.map rename to dist/354.e734f2f3723608c533ad.js.map index 5ab4fe244..c5c2f357f 100644 --- a/dist/354.5a81437dab6fff49c131.js.map +++ b/dist/354.e734f2f3723608c533ad.js.map @@ -1 +1 @@ -{"version":3,"file":"354.5a81437dab6fff49c131.js","mappings":"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","sources":["webpack://telegram-t/./src/config.ts","webpack://telegram-t/./src/util/createWorkerInterface.ts","webpack://telegram-t/./src/lib/rlottie/rlottie.worker.ts"],"sourcesContent":["export const PAGE_TITLE = 'Telegram';\nexport const INACTIVE_MARKER = ' [Inactive]';\n\nexport const APP_NAME = process.env.APP_NAME || 'Telegram WebZ';\nexport const APP_VERSION = process.env.APP_VERSION || 'dev';\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 SESSION_USER_KEY = 'user_auth';\nexport const LEGACY_SESSION_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-v6';\nexport const ASSET_CACHE_NAME = 'tt-assets';\nexport const AUTODOWNLOAD_FILESIZE_MB_LIMITS = [1, 5, 10, 50, 100, 500];\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 MEMBERS_SLICE = 30;\nexport const MEMBERS_LOAD_SLICE = 200;\nexport const PINNED_MESSAGES_LIMIT = 50;\nexport const BLOCKED_LIST_LIMIT = 100;\nexport const PROFILE_PHOTOS_LIMIT = 40;\nexport const PROFILE_SENSITIVE_AREA = 500;\nexport const COMMON_CHATS_LIMIT = 100;\nexport const GROUP_CALL_PARTICIPANTS_LIMIT = 100;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 20;\nexport const ALL_CHATS_PRELOAD_DISABLED = false;\n\nexport const DEFAULT_VOLUME = 1;\nexport const DEFAULT_PLAYBACK_RATE = 1;\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;\nexport const IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 17;\nexport const MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 15;\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;\nexport const TMP_CHAT_ID = '0';\n\nexport const ANIMATION_END_DELAY = 100;\n\nexport const FAST_SMOOTH_MAX_DISTANCE = 1500;\nexport const FAST_SMOOTH_MIN_DURATION = 250;\nexport const FAST_SMOOTH_MAX_DURATION = 600;\nexport const FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE = 500; // px\n\n// Average duration of message sending animation\nexport const API_UPDATE_THROTTLE = Math.round((FAST_SMOOTH_MIN_DURATION + FAST_SMOOTH_MAX_DURATION) / 2);\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\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 STICKER_SIZE_INLINE_BOT_RESULT = 100;\nexport const RECENT_STICKERS_LIMIT = 20;\nexport const MEMOJI_STICKER_ID = 'MEMOJI_STICKER';\n\nexport const BASE_EMOJI_KEYWORD_LANG = 'en';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\n\nexport const VIDEO_MOV_TYPE = 'video/quicktime';\n\nexport const SUPPORTED_IMAGE_CONTENT_TYPES = new Set([\n 'image/png', 'image/gif', 'image/jpeg',\n]);\n\nexport const SUPPORTED_VIDEO_CONTENT_TYPES = new Set([\n 'video/mp4', // video/quicktime added dynamically in environment.ts\n]);\n\nexport const CONTENT_TYPES_WITH_PREVIEW = new Set([\n ...SUPPORTED_IMAGE_CONTENT_TYPES,\n ...SUPPORTED_VIDEO_CONTENT_TYPES,\n]);\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,63})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_MENTION_TEMPLATE = '(@[\\\\w\\\\d_-]+)';\nexport const RE_TG_LINK = /^tg:(\\/\\/)?([?=&\\d\\w_-]+)?/gm;\nexport const RE_TME_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/)/gm;\n\n// eslint-disable-next-line max-len\nexport const COUNTRIES_WITH_12H_TIME_FORMAT = new Set(['AU', 'BD', 'CA', 'CO', 'EG', 'HN', 'IE', 'IN', 'JO', 'MX', 'MY', 'NI', 'NZ', 'PH', 'PK', 'SA', 'SV', 'US']);\n\n// MTProto constants\nexport const SERVICE_NOTIFICATIONS_USER_ID = '777000';\nexport const REPLIES_USER_ID = '1271266957'; // TODO For Test connection ID must be equal to 708513\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_CODE = 'en';\nexport const DEFAULT_LANG_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios', 'tdesktop', 'macos'] as const;\nexport const TIPS_USERNAME = 'TelegramTips';\nexport const LOCALIZED_TIPS = ['ar', 'pt-br', 'id', 'it', 'ko', 'ms', 'pl', 'es', 'tr'];\nexport const FEEDBACK_URL = 'https://bugs.telegram.org/?tag_ids=41&sort=time';\nexport const LIGHT_THEME_BG_COLOR = '#A2AF8E';\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\n// Group calls\nexport const GROUP_CALL_VOLUME_MULTIPLIER = 100;\nexport const GROUP_CALL_DEFAULT_VOLUME = 100 * GROUP_CALL_VOLUME_MULTIPLIER;\nexport const ENABLE_THUMBNAIL_VIDEO = false;\n","import { CancellableCallback, OriginMessageEvent, WorkerMessageData } from './WorkerConnector';\nimport { DEBUG } from '../config';\n\ndeclare const self: WorkerGlobalScope;\n\nhandleErrors();\n\nconst callbackState = new Map();\n\nexport default function createInterface(api: Record) {\n onmessage = async (message: OriginMessageEvent) => {\n const { data } = message;\n\n switch (data.type) {\n case 'callMethod': {\n const { messageId, name, args } = data;\n try {\n if (messageId) {\n const callback = (...callbackArgs: any[]) => {\n const lastArg = callbackArgs[callbackArgs.length - 1];\n\n sendToOrigin({\n type: 'methodCallback',\n messageId,\n callbackArgs,\n }, lastArg instanceof ArrayBuffer ? [lastArg] : undefined);\n };\n\n callbackState.set(messageId, callback);\n\n args.push(callback as never);\n }\n\n const [response, arrayBuffers] = (await api[name](...args)) || [];\n\n if (messageId) {\n sendToOrigin(\n {\n type: 'methodResponse',\n messageId,\n response,\n },\n arrayBuffers,\n );\n }\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n\n if (messageId) {\n sendToOrigin({\n type: 'methodResponse',\n messageId,\n error: { message: error.message },\n });\n }\n }\n\n if (messageId) {\n callbackState.delete(messageId);\n }\n\n break;\n }\n case 'cancelProgress': {\n const callback = callbackState.get(data.messageId);\n if (callback) {\n callback.isCanceled = true;\n }\n\n break;\n }\n }\n };\n}\n\nfunction handleErrors() {\n self.onerror = (e) => {\n // eslint-disable-next-line no-console\n console.error(e);\n sendToOrigin({ type: 'unhandledError', error: { message: e.error.message || 'Uncaught exception in worker' } });\n };\n\n self.addEventListener('unhandledrejection', (e) => {\n // eslint-disable-next-line no-console\n console.error(e);\n sendToOrigin({ type: 'unhandledError', error: { message: e.reason.message || 'Uncaught rejection in worker' } });\n });\n}\n\nfunction sendToOrigin(data: WorkerMessageData, arrayBuffers?: ArrayBuffer[]) {\n if (arrayBuffers) {\n postMessage(data, arrayBuffers);\n } else {\n postMessage(data);\n }\n}\n","import createWorkerInterface from '../../util/createWorkerInterface';\nimport { CancellableCallback } from '../../util/WorkerConnector';\n\ndeclare const Module: any;\n\ndeclare function allocate(...args: any[]): string;\n\ndeclare function intArrayFromString(str: String): string;\n\ndeclare const self: WorkerGlobalScope;\n\nself.importScripts('rlottie-wasm.js');\n\nlet rLottieApi: Record;\nconst rLottieApiPromise = new Promise((resolve) => {\n Module.onRuntimeInitialized = () => {\n rLottieApi = {\n init: Module.cwrap('lottie_init', '', []),\n destroy: Module.cwrap('lottie_destroy', '', ['number']),\n resize: Module.cwrap('lottie_resize', '', ['number', 'number', 'number']),\n buffer: Module.cwrap('lottie_buffer', 'number', ['number']),\n render: Module.cwrap('lottie_render', '', ['number', 'number']),\n loadFromData: Module.cwrap('lottie_load_from_data', 'number', ['number', 'number']),\n };\n\n resolve();\n };\n});\n\nconst renderers = new Map();\n\nasync function init(\n key: string,\n animationData: AnyLiteral,\n imgSize: number,\n isLowPriority: boolean,\n reduceFactor: number,\n onInit: CancellableCallback,\n) {\n if (!rLottieApi) {\n await rLottieApiPromise;\n }\n\n const json = JSON.stringify(animationData);\n const stringOnWasmHeap = allocate(intArrayFromString(json), 'i8', 0);\n const handle = rLottieApi.init();\n const framesCount = rLottieApi.loadFromData(handle, stringOnWasmHeap);\n rLottieApi.resize(handle, imgSize, imgSize);\n\n renderers.set(key, { imgSize, reduceFactor, handle });\n\n onInit(Math.ceil(framesCount / reduceFactor));\n}\n\nasync function changeData(\n key: string,\n animationData: AnyLiteral,\n onInit: CancellableCallback,\n) {\n if (!rLottieApi) {\n await rLottieApiPromise;\n }\n\n const json = JSON.stringify(animationData);\n const { reduceFactor, handle } = renderers.get(key)!;\n\n const stringOnWasmHeap = allocate(intArrayFromString(json), 'i8', 0);\n const framesCount = rLottieApi.loadFromData(handle, stringOnWasmHeap);\n onInit(Math.ceil(framesCount / reduceFactor));\n}\n\nasync function renderFrames(\n key: string, fromIndex: number, toIndex: number, onProgress: CancellableCallback,\n) {\n if (!rLottieApi) {\n await rLottieApiPromise;\n }\n\n const { imgSize, reduceFactor, handle } = renderers.get(key)!;\n\n for (let i = fromIndex; i <= toIndex; i++) {\n const realIndex = i * reduceFactor;\n\n rLottieApi.render(handle, realIndex);\n const bufferPointer = rLottieApi.buffer(handle);\n const data = Module.HEAPU8.subarray(bufferPointer, bufferPointer + (imgSize * imgSize * 4));\n const arrayBuffer = new Uint8ClampedArray(data).buffer;\n onProgress(i, arrayBuffer);\n }\n}\n\nfunction destroy(key: string) {\n const renderer = renderers.get(key)!;\n\n rLottieApi.destroy(renderer.handle);\n\n renderers.delete(key);\n}\n\ncreateWorkerInterface({\n init,\n changeData,\n renderFrames,\n destroy,\n});\n"],"names":["window","innerHeight","Math","round","Set","SUPPORTED_IMAGE_CONTENT_TYPES","SUPPORTED_VIDEO_CONTENT_TYPES","self","onerror","e","console","error","sendToOrigin","type","message","addEventListener","reason","callbackState","Map","data","arrayBuffers","postMessage","rLottieApi","importScripts","rLottieApiPromise","Promise","resolve","Module","onRuntimeInitialized","init","cwrap","destroy","resize","buffer","render","loadFromData","renderers","api","async","key","animationData","imgSize","isLowPriority","reduceFactor","onInit","json","JSON","stringify","stringOnWasmHeap","allocate","intArrayFromString","handle","framesCount","set","ceil","changeData","get","renderFrames","fromIndex","toIndex","onProgress","i","realIndex","bufferPointer","HEAPU8","subarray","Uint8ClampedArray","renderer","delete","onmessage","messageId","name","args","callback","callbackArgs","lastArg","length","ArrayBuffer","undefined","push","response","isCanceled"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"354.e734f2f3723608c533ad.js","mappings":"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","sources":["webpack://telegram-t/./src/config.ts","webpack://telegram-t/./src/util/createWorkerInterface.ts","webpack://telegram-t/./src/lib/rlottie/rlottie.worker.ts"],"sourcesContent":["export const PAGE_TITLE = 'Telegram';\nexport const INACTIVE_MARKER = ' [Inactive]';\n\nexport const APP_NAME = process.env.APP_NAME || 'Telegram WebZ';\nexport const APP_VERSION = process.env.APP_VERSION || 'dev';\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 SESSION_USER_KEY = 'user_auth';\nexport const LEGACY_SESSION_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-v6';\nexport const ASSET_CACHE_NAME = 'tt-assets';\nexport const AUTODOWNLOAD_FILESIZE_MB_LIMITS = [1, 5, 10, 50, 100, 500];\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 MEMBERS_SLICE = 30;\nexport const MEMBERS_LOAD_SLICE = 200;\nexport const PINNED_MESSAGES_LIMIT = 50;\nexport const BLOCKED_LIST_LIMIT = 100;\nexport const PROFILE_PHOTOS_LIMIT = 40;\nexport const PROFILE_SENSITIVE_AREA = 500;\nexport const COMMON_CHATS_LIMIT = 100;\nexport const GROUP_CALL_PARTICIPANTS_LIMIT = 100;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 20;\nexport const ALL_CHATS_PRELOAD_DISABLED = false;\n\nexport const DEFAULT_VOLUME = 1;\nexport const DEFAULT_PLAYBACK_RATE = 1;\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;\nexport const IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 17;\nexport const MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 15;\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;\nexport const TMP_CHAT_ID = '0';\n\nexport const ANIMATION_END_DELAY = 100;\n\nexport const FAST_SMOOTH_MAX_DISTANCE = 1500;\nexport const FAST_SMOOTH_MIN_DURATION = 250;\nexport const FAST_SMOOTH_MAX_DURATION = 600;\nexport const FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE = 500; // px\n\n// Average duration of message sending animation\nexport const API_UPDATE_THROTTLE = Math.round((FAST_SMOOTH_MIN_DURATION + FAST_SMOOTH_MAX_DURATION) / 2);\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\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 STICKER_SIZE_INLINE_BOT_RESULT = 100;\nexport const RECENT_STICKERS_LIMIT = 20;\nexport const MEMOJI_STICKER_ID = 'MEMOJI_STICKER';\n\nexport const BASE_EMOJI_KEYWORD_LANG = 'en';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\n\nexport const VIDEO_MOV_TYPE = 'video/quicktime';\n\nexport const SUPPORTED_IMAGE_CONTENT_TYPES = new Set([\n 'image/png', 'image/gif', 'image/jpeg',\n]);\n\nexport const SUPPORTED_VIDEO_CONTENT_TYPES = new Set([\n 'video/mp4', // video/quicktime added dynamically in environment.ts\n]);\n\nexport const CONTENT_TYPES_WITH_PREVIEW = new Set([\n ...SUPPORTED_IMAGE_CONTENT_TYPES,\n ...SUPPORTED_VIDEO_CONTENT_TYPES,\n]);\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,63})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_MENTION_TEMPLATE = '(@[\\\\w\\\\d_-]+)';\nexport const RE_TG_LINK = /^tg:(\\/\\/)?([?=&\\d\\w_-]+)?/gm;\nexport const RE_TME_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/)/gm;\n\n// eslint-disable-next-line max-len\nexport const COUNTRIES_WITH_12H_TIME_FORMAT = new Set(['AU', 'BD', 'CA', 'CO', 'EG', 'HN', 'IE', 'IN', 'JO', 'MX', 'MY', 'NI', 'NZ', 'PH', 'PK', 'SA', 'SV', 'US']);\n\n// MTProto constants\nexport const SERVICE_NOTIFICATIONS_USER_ID = '777000';\nexport const REPLIES_USER_ID = '1271266957'; // TODO For Test connection ID must be equal to 708513\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_CODE = 'en';\nexport const DEFAULT_LANG_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios', 'tdesktop', 'macos'] as const;\nexport const TIPS_USERNAME = 'TelegramTips';\nexport const LOCALIZED_TIPS = ['ar', 'pt-br', 'id', 'it', 'ko', 'ms', 'pl', 'es', 'tr'];\nexport const FEEDBACK_URL = 'https://bugs.telegram.org/?tag_ids=41&sort=time';\nexport const LIGHT_THEME_BG_COLOR = '#A2AF8E';\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\n// Group calls\nexport const GROUP_CALL_VOLUME_MULTIPLIER = 100;\nexport const GROUP_CALL_DEFAULT_VOLUME = 100 * GROUP_CALL_VOLUME_MULTIPLIER;\nexport const ENABLE_THUMBNAIL_VIDEO = false;\n","import { CancellableCallback, OriginMessageEvent, WorkerMessageData } from './WorkerConnector';\nimport { DEBUG } from '../config';\n\ndeclare const self: WorkerGlobalScope;\n\nhandleErrors();\n\nconst callbackState = new Map();\n\nexport default function createInterface(api: Record) {\n onmessage = async (message: OriginMessageEvent) => {\n const { data } = message;\n\n switch (data.type) {\n case 'callMethod': {\n const { messageId, name, args } = data;\n try {\n if (messageId) {\n const callback = (...callbackArgs: any[]) => {\n const lastArg = callbackArgs[callbackArgs.length - 1];\n\n sendToOrigin({\n type: 'methodCallback',\n messageId,\n callbackArgs,\n }, lastArg instanceof ArrayBuffer ? [lastArg] : undefined);\n };\n\n callbackState.set(messageId, callback);\n\n args.push(callback as never);\n }\n\n const [response, arrayBuffers] = (await api[name](...args)) || [];\n\n if (messageId) {\n sendToOrigin(\n {\n type: 'methodResponse',\n messageId,\n response,\n },\n arrayBuffers,\n );\n }\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n\n if (messageId) {\n sendToOrigin({\n type: 'methodResponse',\n messageId,\n error: { message: error.message },\n });\n }\n }\n\n if (messageId) {\n callbackState.delete(messageId);\n }\n\n break;\n }\n case 'cancelProgress': {\n const callback = callbackState.get(data.messageId);\n if (callback) {\n callback.isCanceled = true;\n }\n\n break;\n }\n }\n };\n}\n\nfunction handleErrors() {\n self.onerror = (e) => {\n // eslint-disable-next-line no-console\n console.error(e);\n sendToOrigin({ type: 'unhandledError', error: { message: e.error.message || 'Uncaught exception in worker' } });\n };\n\n self.addEventListener('unhandledrejection', (e) => {\n // eslint-disable-next-line no-console\n console.error(e);\n sendToOrigin({ type: 'unhandledError', error: { message: e.reason.message || 'Uncaught rejection in worker' } });\n });\n}\n\nfunction sendToOrigin(data: WorkerMessageData, arrayBuffers?: ArrayBuffer[]) {\n if (arrayBuffers) {\n postMessage(data, arrayBuffers);\n } else {\n postMessage(data);\n }\n}\n","import createWorkerInterface from '../../util/createWorkerInterface';\nimport { CancellableCallback } from '../../util/WorkerConnector';\n\ndeclare const Module: any;\n\ndeclare function allocate(...args: any[]): string;\n\ndeclare function intArrayFromString(str: String): string;\n\ndeclare const self: WorkerGlobalScope;\n\nself.importScripts('rlottie-wasm.js');\n\nlet rLottieApi: Record;\nconst rLottieApiPromise = new Promise((resolve) => {\n Module.onRuntimeInitialized = () => {\n rLottieApi = {\n init: Module.cwrap('lottie_init', '', []),\n destroy: Module.cwrap('lottie_destroy', '', ['number']),\n resize: Module.cwrap('lottie_resize', '', ['number', 'number', 'number']),\n buffer: Module.cwrap('lottie_buffer', 'number', ['number']),\n render: Module.cwrap('lottie_render', '', ['number', 'number']),\n loadFromData: Module.cwrap('lottie_load_from_data', 'number', ['number', 'number']),\n };\n\n resolve();\n };\n});\n\nconst renderers = new Map();\n\nasync function init(\n key: string,\n animationData: AnyLiteral,\n imgSize: number,\n isLowPriority: boolean,\n reduceFactor: number,\n onInit: CancellableCallback,\n) {\n if (!rLottieApi) {\n await rLottieApiPromise;\n }\n\n const json = JSON.stringify(animationData);\n const stringOnWasmHeap = allocate(intArrayFromString(json), 'i8', 0);\n const handle = rLottieApi.init();\n const framesCount = rLottieApi.loadFromData(handle, stringOnWasmHeap);\n rLottieApi.resize(handle, imgSize, imgSize);\n\n renderers.set(key, { imgSize, reduceFactor, handle });\n\n onInit(Math.ceil(framesCount / reduceFactor));\n}\n\nasync function changeData(\n key: string,\n animationData: AnyLiteral,\n onInit: CancellableCallback,\n) {\n if (!rLottieApi) {\n await rLottieApiPromise;\n }\n\n const json = JSON.stringify(animationData);\n const { reduceFactor, handle } = renderers.get(key)!;\n\n const stringOnWasmHeap = allocate(intArrayFromString(json), 'i8', 0);\n const framesCount = rLottieApi.loadFromData(handle, stringOnWasmHeap);\n onInit(Math.ceil(framesCount / reduceFactor));\n}\n\nasync function renderFrames(\n key: string, fromIndex: number, toIndex: number, onProgress: CancellableCallback,\n) {\n if (!rLottieApi) {\n await rLottieApiPromise;\n }\n\n const { imgSize, reduceFactor, handle } = renderers.get(key)!;\n\n for (let i = fromIndex; i <= toIndex; i++) {\n const realIndex = i * reduceFactor;\n\n rLottieApi.render(handle, realIndex);\n const bufferPointer = rLottieApi.buffer(handle);\n const data = Module.HEAPU8.subarray(bufferPointer, bufferPointer + (imgSize * imgSize * 4));\n const arrayBuffer = new Uint8ClampedArray(data).buffer;\n onProgress(i, arrayBuffer);\n }\n}\n\nfunction destroy(key: string) {\n const renderer = renderers.get(key)!;\n\n rLottieApi.destroy(renderer.handle);\n\n renderers.delete(key);\n}\n\ncreateWorkerInterface({\n init,\n changeData,\n renderFrames,\n destroy,\n});\n"],"names":["window","innerHeight","Math","round","Set","SUPPORTED_IMAGE_CONTENT_TYPES","SUPPORTED_VIDEO_CONTENT_TYPES","self","onerror","e","console","error","sendToOrigin","type","message","addEventListener","reason","callbackState","Map","data","arrayBuffers","postMessage","rLottieApi","importScripts","rLottieApiPromise","Promise","resolve","Module","onRuntimeInitialized","init","cwrap","destroy","resize","buffer","render","loadFromData","renderers","api","async","key","animationData","imgSize","isLowPriority","reduceFactor","onInit","json","JSON","stringify","stringOnWasmHeap","allocate","intArrayFromString","handle","framesCount","set","ceil","changeData","get","renderFrames","fromIndex","toIndex","onProgress","i","realIndex","bufferPointer","HEAPU8","subarray","Uint8ClampedArray","renderer","delete","onmessage","messageId","name","args","callback","callbackArgs","lastArg","length","ArrayBuffer","undefined","push","response","isCanceled"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/943.33a4b193ecb893d99436.css b/dist/435.15d3c1acaf8d2000388e.css similarity index 99% rename from dist/943.33a4b193ecb893d99436.css rename to dist/435.15d3c1acaf8d2000388e.css index dd857d29b..993c4fe60 100644 --- a/dist/943.33a4b193ecb893d99436.css +++ b/dist/435.15d3c1acaf8d2000388e.css @@ -35,4 +35,4 @@ .TextFormatter{transform:translate(-50%, -3.25rem)}.TextFormatter,.TextFormatter-link-control{position:absolute;background:var(--color-background);border-radius:var(--border-radius-messages);padding:.5rem .375rem;box-shadow:0 1px 2px var(--color-default-shadow)}.TextFormatter-link-control{left:0;top:0;opacity:0;pointer-events:none;transition:opacity .3s ease}.Modal .TextFormatter-link-control{max-width:100%}@media(max-width: 600px){.TextFormatter-link-control{max-width:calc(100vw - var(--text-formatter-left) + 3rem)}}.TextFormatter-link-control input{border:none !important;outline:none !important;width:100%;color:var(--color-text);background-color:var(--color-background)}.TextFormatter-buttons,.TextFormatter-link-url-confirm{display:flex;flex-wrap:nowrap;align-items:center}.TextFormatter-divider{width:1px;height:1.75rem;margin:0 .25rem;background-color:var(--color-borders)}.TextFormatter-link-url-input-wrapper{width:20rem;position:relative;max-width:100%}@media(max-width: 600px){.TextFormatter-link-url-input-wrapper{max-width:90vw}}.TextFormatter-link-url-input-wrapper::before,.TextFormatter-link-url-input-wrapper::after{content:"";display:block;position:absolute;top:0;bottom:0;width:1rem;z-index:2;opacity:0;transition:opacity .2s ease}.TextFormatter-link-url-input-wrapper::before{left:0;background:linear-gradient(to right, var(--color-background) 0.25rem, transparent 1rem)}.TextFormatter-link-url-input-wrapper::after{right:0;background:linear-gradient(to left, var(--color-background) 0.25rem, transparent 1rem)}.TextFormatter-link-url-input-wrapper.mask-left::before{opacity:1}.TextFormatter-link-url-input-wrapper.mask-right::after{opacity:1}.TextFormatter-link-url-confirm{flex-shrink:0;opacity:0;transition:opacity .3s ease}.TextFormatter-link-url-confirm.shown{opacity:1}.TextFormatter.link-control-shown .TextFormatter-link-control{opacity:1;pointer-events:all}.TextFormatter .Button{width:2rem;height:2rem;padding:.25rem;font-size:1.5rem;margin:0 .125rem;border-radius:var(--border-radius-messages-small);flex-shrink:0;cursor:pointer}.TextFormatter .Button.active{background-color:var(--color-primary) !important;color:#fff}.TextFormatter .Button.disabled{opacity:.5;pointer-events:none} .Picker{height:100%;display:flex;flex-direction:column;overflow:hidden}.Picker .picker-header{padding:0 1rem .25rem .75rem;border-bottom:1px solid var(--color-borders);display:flex;flex-flow:row wrap;flex-shrink:0;overflow-y:auto;max-height:20rem}.Picker .picker-header .input-group{margin-bottom:.5rem;margin-left:.5rem;flex-grow:1}.Picker .picker-header .form-control{height:2rem;border:none;border-radius:0;padding:0;box-shadow:none}.Picker .picker-list{flex-grow:1;overflow-y:auto;overflow-x:hidden;padding:.5rem}@media(max-width: 600px){.Picker .picker-list{padding-left:0 !important;padding-right:0 !important}}.Picker .no-results{height:100%;margin:0;padding:1rem 1rem;display:flex;align-items:center;justify-content:center;color:var(--color-text-secondary)} -/*# sourceMappingURL=943.33a4b193ecb893d99436.css.map*/ \ No newline at end of file +/*# sourceMappingURL=435.15d3c1acaf8d2000388e.css.map*/ \ No newline at end of file diff --git a/dist/943.33a4b193ecb893d99436.css.map b/dist/435.15d3c1acaf8d2000388e.css.map similarity index 99% rename from dist/943.33a4b193ecb893d99436.css.map rename to dist/435.15d3c1acaf8d2000388e.css.map index 8a130ca43..d2e0869fe 100644 --- a/dist/943.33a4b193ecb893d99436.css.map +++ b/dist/435.15d3c1acaf8d2000388e.css.map @@ -1 +1 @@ -{"version":3,"file":"943.33a4b193ecb893d99436.css","mappings":"AAAA,YACE,kBAEA,cACE,WACA,YACA,wCACA,gCAEA,oCACE,kBACA,MACA,OAGF,+CACE,wBAKJ,kCACE,2BAQA,sBACE,2BAIA,kCACE,4CAGF,gCACE,2CAMJ,gCACE,4BAIA,4CACE,qDAGF,0CACE,sDAOJ,+BACE,4BAIA,2CACE,4CAGF,yCACE,2CAKF,yCACE,2BAIA,qDACE,qDAGF,mDACE,sDAWN,2BACE,wCAGF,6BACE,4BAIA,yCACE,gCAGF,uCACE,+BAMJ,uCACE,6BAIA,mDACE,yCAGF,iDACE,0CASJ,6BACE,sBACA,wBACA,UAGF,2BACE,sBACA,6BACA,UAIA,uCACE,+FAGF,qCACE,6FAMJ,uCACE,wBACA,UAGF,qCACE,8BACA,UAIA,iDACE,iHAGF,+CACE,mHASJ,4BACE,wBACA,mBACA,UAGF,0BACE,wBACA,UAMA,sCACE,qCAGF,oCACE,gEAMJ,sCACE,mBAGF,oCACE,sBAIA,gDACE,mFAGF,8CACE,sFASJ,uBACE,UAGF,qBACE,UAIA,iCACE,qCAGF,+BACE,oCASN,yBACE,4CACA,gBAEA,6BACE,mCAGF,6BACE,2BAIA,yCACE,mDAGF,uCACE,2CAMJ,uCACE,2BACA,YAIA,mDACE,qDAGF,iDACE,6DAUJ,2BACE,mCAGF,6BACE,wBACA,mBACA,UAEA,4CACE,uCAEA,qEACE,wCAKN,2BACE,2BAIA,uCACE,mCAGF,qCACE,uCAMJ,qCACE,qBAIA,iDACE,iDAGF,+CACE,6CASJ,uBACE,gEAIA,iCACE,kCAMJ,mCACE,0DAGF,iCACE,sCAIA,6CACE,6CAGF,2CACE,eASR,2BACE,GACE,UAEF,KACE,WAIJ,4BACE,GACE,UAEF,KACE,WAIJ,qCACE,GACE,UAEF,KACE,WAIJ,sCACE,GACE,UAEF,KACE,WAOJ,oBACE,GACE,2BAEF,KACE,yBAIJ,qBACE,GACE,wBAEF,KACE,6BAIJ,8BACE,GACE,wBAEF,KACE,4BAIJ,+BACE,GACE,4BAEF,KACE,yBAOJ,uBACE,GACE,4BAEF,KACE,yBAIJ,wBACE,GACE,wBAEF,KACE,8BAIJ,iCACE,GACE,wBAEF,KACE,6BAIJ,kCACE,GACE,6BAEF,KACE,yBAOJ,8BACE,GACE,6BAEF,KACE,yBAIJ,+BACE,GACE,wBAEF,KACE,+BAIJ,wCACE,GACE,wBAEF,KACE,8BAIJ,yCACE,GACE,8BAEF,KACE,yBAOJ,6BACE,GACE,qBAEF,KACE,oBAIJ,uCACE,GACE,mBAEF,KACE,sBAIJ,wCACE,GACE,sBAEF,KACE,oBAOJ,4BACE,GACE,wBACA,UAEF,KACE,2BACA,iDAIJ,sCACE,GACE,2BACA,gDAEF,KACE,wBACA,WAQJ,oBACE,GACE,mBACA,UAEF,KACE,qBACA,WAIJ,8BACE,GACE,qBACA,UAEF,KACE,mBACA,WAOJ,wBACE,GACE,2BAEF,KACE,yBAIJ,kCACE,GACE,wBAEF,KACE,4BAOJ,qBACE,GACE,gEAEF,KACE,2DAOJ,+BACE,GACE,0DAEF,KACE,iE;AC1pBJ,QACE,mCACA,UACA,mBACA,uBACA,eACA,gBACA,kBACA,wEACA,WACA,iBACA,aACA,mBACA,gEAEA,wBACE,kBAGF,eACE,WACA,YAGF,UACE,iBAEA,4BACE,qBAIJ,mBACE,WACA,YACA,mBAEA,0BACE,eACA,gBAIJ,kBACE,WACA,YACA,kBAEA,yBACE,cACA,eAIJ,mBACE,eACA,gBACA,kBAEA,0BACE,cACA,eAIJ,oBACE,cACA,eACA,oBAEA,2BACE,WACA,YAIJ,mBACE,oBAEA,qBACE,iBAGF,0BACE,gBACA,iBAIJ,mBACE,aACA,cACA,iBAEA,qBACE,eAGF,0BACE,aACA,cAIJ,eACE,kBAEA,sBACE,WACA,cACA,kBACA,cACA,aACA,cACA,eACA,kBACA,yCACA,yBACA,cAIJ,oBACE,eAGF,wBACE,WACA,Y;AChIJ,iBACE,kBACA,UACA,eACA,gBACA,qFACA,kBACA,eAEA,0BACE,kCACA,oBAGF,wBACE,sBAEA,+BACE,WACA,kBACA,eACA,gBACA,sBACA,sBACA,SACA,QACA,qCAIJ,gDACE,WACA,YACA,iFAEA,8DACE,sBACA,aACA,cAIJ,yBACE,cACA,eAEA,6BACE,WACA,YACA,eAGF,gCACE,iBAIJ,6BACE,wCAGF,qBACE,cACA,yBACA,yBACA,yDAGF,wBACE,iCAIJ,oCACE,KACE,uBAEF,GACE,0+B;AC9EJ,OACE,kBACA,uBAGE,4IACE,gBAKF,gCACE,gBAKF,4BACE,gBAKF,4BACE,gBAIJ,wBACE,eACA,MACA,SACA,OACA,QACA,aACA,uBACA,mBAGF,uBACE,eACA,MACA,QACA,SACA,OACA,WACA,iCAGF,4CACE,6BAGF,qBACE,kBACA,oBACA,sBACA,WACA,gBACA,kBACA,iBACA,yCACA,8DACA,2CACA,mCAEA,+CAEA,4CACE,gBACA,0BAGF,yBApBF,qBAqBI,yCAIJ,0BACE,+BAGF,6BACE,kCAGF,oDACE,oBACA,aACA,mBACA,cAGF,oBACE,kBACA,gBACA,cACA,gBACA,uBAEA,qCACE,mBAIJ,+BAEE,4CAEA,oDACE,kBACA,eACA,WACA,qBACA,iBACA,qBACA,sBACA,eAIJ,sBACE,WACA,YACA,aACA,gBAEA,qDAEE,sBAIJ,kEAGE,uBACA,mBAGF,uBACE,aACA,qBAEA,qEACE,iBAIJ,8BACE,WACA,YACA,iBACA,iBACA,gBACA,qB;AC3JJ,UACE,kBAGE,oGACE,WACA,kBACA,SACA,YACA,QACA,iBACA,iCAGF,oFACE,cAGF,8EACE,OAMF,oDACE,gBACA,uBAIJ,2BACE,WACA,yCACA,uBACA,2BACA,wBACA,aACA,aACA,kBACA,gBACA,mBACA,mBACA,wBACA,2CACA,mCAEA,6BACE,iBACA,kBACA,kCAIJ,oFACE,mBACA,uBAIA,uCACE,kBACA,WAIJ,mBACE,oBAEA,oCACE,WAKF,0DACE,eAEA,gFACE,4BAGF,qBACE,gIACE,6CAIJ,yBACE,iEACE,6CAMR,yBAGI,4HACE,yDAKN,yCACE,4CAGF,iBACE,qBAEA,kCACE,mBAIJ,mBACE,oBAGF,gBACE,4CAIA,uCACE,yBAEA,yCACE,cAKN,uBACE,kBAEA,+BACE,WAEA,gDACE,6BACA,8BAKN,8BACE,iBAEA,sFAEE,0DAGF,+CACE,iBAGF,sCACE,cACA,mBAGF,oCACE,YACA,gBAGF,6EACE,gBACA,aACA,2BACA,mBAGF,gKACE,eACA,sBACA,SACA,gBACA,mBACA,uBACA,mBAIA,wCACE,gBAGF,mDACE,cACA,eACA,mBAGF,4CACE,2BACA,wBACA,cAIJ,6FAEE,kBACA,oBACA,kCAGF,wCACE,aACA,mBACA,YACA,gBAEA,uGACE,kBACA,oBACA,kCACA,qBAEA,qHACE,2BAGF,oPAEE,mBACA,WAGF,gTAEE,kBAKN,6PAGE,mBACA,uBAMA,4UAEE,mBAKF,wDACE,4CAGF,+CACE,kBACA,eAGF,qDACE,WAMJ,uCACE,qBAGF,mCACE,cAGF,6EACE,eACA,mBACA,gBACA,mBACA,uBACA,gBAGF,iDACE,iBACA,eAGF,0CACE,kCACA,kBAEA,mEACE,wBACA,mBACA,qBACA,kBAKF,0DACE,cACA,kBAGF,mDACE,eACA,cAKN,2BACE,SAEA,4CACE,eACA,aACA,mBAGF,mCACE,WACA,YAGF,qCACE,cACA,cACA,SACA,kBAIA,8CACE,eACA,mBAKN,0BACE,oBACA,gBAEA,qEACE,cACA,mBAGF,iCACE,oBACA,gBACA,uBAGF,oCACE,kBACA,mBACA,kCAEA,8CACE,oBAGF,0CACE,wBAMJ,sCACE,iBACA,e;AC/XN,cACE,qBACA,cACA,aACA,cACA,yDACA,4BACA,qBACA,gC;ACRF,2BACE,qBACA,oCAGE,WACE,kCACA,0BAIJ,YACE,WACA,gBACA,iCAEA,aACE,uDACA,6FAEA,mCAEE,6BAMR,KACE,2BACE,kCAIJ,KACE,0BACE,E;ACpCJ,wBACE,kBACA,YACA,gBACA,mBACA,8BAEA,0BAPF,wBAQI,8CAGF,sCACE,mBAEA,wDACE,oBAKN,cACE,4FACA,uBACA,2CACA,4CACA,WACA,eAEA,6GAGE,sBACA,0BAGF,uBACE,iBACA,sBACA,+e;ACtCJ,OACE,cACA,kBACA,oBACA,gBACA,qBACA,mBACA,eAEA,gBACE,oBACA,WAGF,qBACE,eAEE,iFACE,kBAKN,aACE,kBACA,uBACA,UAIA,qDACE,WACA,cACA,kBACA,eACA,QACA,cACA,eACA,2BAGF,2BACE,4CACA,kBACA,yCACA,UACA,kDAGF,0BACE,cACA,cACA,eACA,kBACA,gCACA,UACA,4BAGF,0BACE,cACA,sBACA,uBACA,gBAGF,6BACE,cACA,kBACA,iBACA,kCACA,uBAKF,yCACE,kCAGF,wCACE,UAKF,qEAEE,qBAGF,wBACE,kBACA,eACA,QACA,2BACA,UACA,oCACA,wBAIJ,gBACE,eACA,qBAEA,4BACE,iBAEA,oCACE,UACA,gBAGF,mCACE,UACA,eAIJ,iDAEE,iBAGA,iCACA,UACA,gBAKN,mBACE,KACE,UAEF,GACE,W;ACzIJ,KACE,aACA,uBACA,cACA,6DACA,gBACA,WACA,SACA,YACA,uBACA,gBACA,kCACA,eACA,2DACA,4DAEA,4BAGE,aAGF,YACE,eACA,2BAEA,cACE,UAIJ,wBACE,kDAGF,UACE,kBACA,aACA,mBAGF,YACE,kBACA,eACA,0BACA,6BACA,qBACA,mBACA,WACA,kBACA,sBACA,gBACA,kBACA,cAEA,kDAEE,oBAGF,mBACE,gCAIJ,OACE,kBACA,4BACA,OACA,UACA,sCACA,gBACA,WACA,oCACA,oBACA,uBACA,sBAEA,eACE,6CAEA,sCACE,2B;AClFR,SACE,gBACA,MACA,cACA,aACA,8BACA,qBACA,kBACA,iBACA,+CACA,yCACA,gBACA,kBAEA,qBACA,8BAEA,aACE,eACA,kCAGF,4BACE,SAGF,kCACE,+B;AC1BF,+BACE,gBAGF,+BACE,2BAGF,+CACE,oBAGF,gCACE,sBAGF,wCACE,uB;AClBJ,aACE,kBACA,WACA,iDACA,yCACA,yCACA,uBACA,kCAEA,8BACE,aAEA,2CACE,aAGF,oCACE,mBAIA,6CACE,oBACA,eAKN,uBACE,kCACA,iCACA,yCAGE,+BACE,2BAKN,mBACE,cACA,gBACA,uBACA,uBACA,wCACA,2BACA,0JAEA,gCACE,gCAIJ,eACE,kBACA,UACA,YACA,mBAGF,sBACE,kBACA,UACA,YACA,cAEA,+BACE,uBAIJ,qBACE,kBACA,YACA,cACA,eAGF,yBACE,mBACE,cACA,sBACA,kDAGF,eACE,WAKF,4BACE,cAGF,wBACE,UACA,aAGF,+BACE,WACA,WAGF,8BACE,aACA,W;AC5GN,oBACE,aACA,mBACA,mCACA,YACA,eACA,kBACA,oBACA,mBACA,mBACA,eACA,kBACA,gBACA,cACA,sCAEA,6BAEA,8BACE,gBAGF,0BACE,0CAGF,oCACE,oDAEA,iDACE,UAGF,2FACE,UAKF,6CACE,gCAGF,sCACE,mCAGF,2CACE,kBAIJ,iCACE,cACA,kBACA,WACA,eAEA,kCAGF,2DACE,WACA,YACA,UACA,cACA,6BAEA,+DACE,eAIJ,+BACE,aACA,mBACA,uBACA,gBACA,kBACA,sCACA,WAEA,iCACE,kBACA,kBACA,SAIJ,+BACE,kBACA,mBACA,gBACA,uBAEA,kDACE,eACA,gBACA,yBACA,oBAIJ,iCACE,kBACA,OACA,MACA,WACA,YACA,kBACA,aACA,mBACA,uBACA,oCACA,iBACA,WACA,UACA,6BAGF,6BACE,kBACA,gBAEA,uCACE,gBACA,eAGF,0CACE,UACA,gBAGF,wCACE,cACA,mBAGF,0CACE,UACA,Q;AC7IN,UACE,oBACA,mBACA,kBACA,SAEA,mBACE,oBACA,WAGF,mBACE,oBAKA,8JAEE,2BAGF,kGACE,eAIJ,gBACE,SACA,QACA,kBACA,kBACA,uBACA,UAGF,kBACE,eACA,mBACA,eACA,eACA,6BACA,qBACA,oBACA,kBACA,kCAGF,wBACE,WACA,kBACA,cACA,OACA,eACA,gBACA,mCACA,qBACA,wBACA,uCAGF,gCACE,gCAGF,sCACE,2BACA,6CACA,kCAGF,+BACE,c;ACxEJ,uBACE,cACA,eACA,gBACA,qBACA,cACA,oBAEA,yBACE,mCAGF,+CACE,oBAGF,mCACE,WACA,Y;AClBJ,iBACE,mBACA,uBACA,cACA,iBACA,cACA,aACA,mBAEA,wCACE,qCACA,mBACA,kBAEA,oDACE,wBAIJ,uBACE,6BACA,oB;ACrBJ,kBACE,UACA,2DAEA,6BACE,mBACA,UAGF,8BACE,aAGF,0BACE,uDAIJ,eACE,aAEA,sBACE,0BAIJ,OACE,iBACA,cACA,6BACA,qBACA,mBACA,WACA,kBACA,sBACA,gBACA,kBACA,cAEA,qBACE,mBAGF,mBACE,qBACA,mBACA,gBACA,kBAGF,yCACE,8BACA,yBAGF,2BACE,0BACA,uBACA,aACA,UAEA,6BACE,iBAIJ,eACE,aACA,eAEA,iBACE,eACA,qBAGF,2BACE,eACA,eAEA,6BACE,kB;AC/ER,qCACE,0BACA,6BACA,2BACA,0BACA,2BACA,6BACA,2BACA,6BACA,6BAGF,qCACE,uBACA,6BACA,2BACA,6BACA,wBACA,6BACA,2BACA,6BACA,0BAIF,gBACE,kBACA,UACA,SACA,WACA,YACA,kBACA,yBACA,yCACA,gBAEA,2BACE,WACA,YACA,aACA,mBACA,uBACA,kBACA,+BACE,UACA,WACA,mCACA,kBACA,WACA,sBACA,wBAEF,8CACE,sBAEF,+CACE,uBAIJ,yBACE,oCACA,sCACA,wCACE,0CAKF,qDACE,yDAGF,sDACE,yD;AC3EN,MACE,4CAOA,kBACA,MACA,OACA,SACA,WATA,sCAEE,gDASF,sBACE,oBACA,gCAGF,wBACE,sBACA,kCAIA,qFACE,qCAIJ,yBACE,eACE,uDAEA,qCACE,sCAKN,yBACE,oCAEE,wDAEA,gFACE,iDACA,8BAGF,sEACE,wDACA,iCACA,8CACA,sCACA,2CACA,kCACA,mCAGF,4DACE,oCAGF,4EACE,8BACA,gCAKN,yBACE,uBACE,4BAIJ,cACE,kBACA,cAIA,sBACE,qBAGF,eACE,WACA,cAGF,wBACE,kBACA,mBACA,sBACA,cAEA,oCACE,aACA,mBAIJ,6BACE,iBAEA,yCACE,kBACA,eAIJ,qDACE,qBACA,YACA,kCACA,uBAEA,uEACE,gBAGF,+EACE,wBAGF,mEACE,yBAMA,wCACE,aAIJ,iCACE,yBAGF,8BACE,cACA,eACA,iBACA,sBACA,wBACA,yBAEA,0CACE,eACA,gBACA,0BAGF,oCACE,sBAIJ,uCACE,WACA,YACA,yBAGF,qCACE,kBACA,qBACA,iBACA,WACA,6BACA,wBACA,gBAEA,iDACE,8BACA,SAQJ,sCACE,cACA,kBAGF,2DACE,oBACA,gBAGF,iCACE,cACA,oBAGF,uEACE,mBACA,gBACA,iBACA,uB;AC9MR,eACE,qBAEA,mBACE,kBACA,WACA,YAEA,sCACE,qB;ACTN,aACE,WACA,WACA,aACA,mBACA,uBACA,sBAEA,0BARF,aASI,aAGF,sBACE,YACA,uBAGF,oBACE,kBACA,sBAGF,0BACE,kBACA,kCAEA,8EAEE,wCAIJ,0BACE,mBACA,gBACA,4BACA,uBAEA,4BACE,0BACA,iB;ACxCN,cACE,aACA,mBACA,uBACA,6BAEA,+BACE,sBAGF,+BACE,cAGF,2BACE,kCACA,kBACA,kBACA,gBACA,uB;ACnBJ,OACE,SACA,oBACA,gBACA,kBACA,eAEA,uBACE,kBACA,YACA,WACA,2BACA,WACA,iBACA,mBACA,uBACA,qBAGF,WACE,kBACA,OACA,MACA,WACA,YACA,iB;ACzBJ,SACE,gBACA,2BACA,kBACA,qBACA,kBAEA,kBACE,kBAGF,+BACE,2BACA,WACA,YACA,kBACA,OACA,MACA,yDACA,WACA,aACA,mBACA,uBACA,kDACA,yBACA,gBACA,iBAGF,gBACE,kBACA,OACA,MACA,WACA,YACA,0BACA,gCACA,6DAGF,oEAGE,sBACA,mBAGF,oBACE,cACA,yBACA,gBACA,mBACA,gBACA,uBAGF,qBACE,eACA,gBACA,uBACA,sBAGF,iDAEE,gBACA,kCACA,qBACA,mBACA,oBACA,qBACA,4BACA,gBAGF,sBACE,kBAGF,kCACE,sBACA,uBAGF,kBACE,2BAEA,iEAEE,UACA,QAGF,2BACE,iB;AC9FN,oDACE,aAaA,mBACA,oBAZA,0CACE,sBAGF,eACE,0BACA,qBAFF,eAGI,6BAOJ,iBACE,2DAGF,cAGE,gBACA,yBACA,kDACA,gCACA,aACA,mBACA,uBACA,sBAGF,iBACE,MACA,OACA,kBAGF,yBACE,qBACA,cACA,kBACA,WACA,4BAEA,cACE,gBACA,wBACA,yBAGF,UACE,cACA,kBACA,MACA,QACA,iCACA,2BACA,qFACA,mCACA,mBACA,qCACA,qBAIJ,sBACE,gBACA,qEAEA,yBAEE,kDACA,yBAGF,gBACE,oBAIJ,UACE,iBACA,kBACA,MACA,QACA,eACA,gBACA,aACA,mBACA,uBACA,UACA,wBACA,wCAGF,cACE,gEAGE,cACE,2DAGF,SACE,kEAEA,SACE,wDAIJ,SACE,kBAKN,mBACE,qBACA,mBACA,gBACA,YACA,wBAEA,gBACE,kCACA,kBACA,mBACA,mBAIJ,cACE,mBACA,gBACA,gBACA,uBACA,0BAEA,mBACE,sBAIJ,iBACE,qBACA,6BACA,eACA,gBACA,uBACA,wCAGE,aACE,eAKN,2CACE,yCACA,8GAEA,UAIE,YACA,0BAGF,sBACE,iCAEA,0BACE,0BAIJ,oBACE,2BAGF,eACE,8BAGF,gBACE,2KAMF,kBAGE,eACA,qDAGF,gBACE,iEAEA,cACE,mBACA,yDAIJ,SACE,QACA,+CAQJ,mCACE,qDAGF,qCACE,mDAGF,wCACE,C;ACxOJ,OACE,aACA,uBACA,kBAEA,sBACE,kBACA,oBAEA,kCACE,mBAIJ,WACE,4CACA,oDACA,qEACA,qEAEA,uBACE,sCACA,uCAGF,mBACE,yCACA,0CACA,wDACA,2CAEA,+BACE,4BACA,mCAKN,oBACE,wBAEA,sCACE,2BAGF,4BACE,WACA,YACA,yBAEA,8BACE,mBAEA,yCACE,oBAKN,sBACE,kBAEA,gCACE,qBACA,yBAFF,gCAGI,qBAKN,+DACE,UACA,mBACA,uEAGF,yJAIE,UACA,qBAIJ,wBACE,kBACA,2BACA,4BACA,UACA,eACA,cACA,6CACA,UAEA,0BACE,mBAIJ,+BACE,UACA,SACA,6CAGF,gBACE,kBACA,YACA,YACA,mBAGF,oBACE,aACA,8BAGF,cACE,gBACA,SACA,iBACA,mBACA,gBACA,uBAGF,cACE,YAGF,uBACE,kBACA,kBACA,kCACA,kCACA,aACA,qBAEA,qCACE,WACA,kBACA,0BACA,eACA,gBACA,kBACA,qCAKF,iDACE,uBAIJ,sCACE,2BAGF,iBACE,eACA,gBACA,kBAGF,4CAGE,kBACA,kCACA,SACA,gBACA,mBACA,uBACA,uBAGF,iBACE,kBACA,kCACA,mBACA,gBACA,uBACA,cACA,kCAGF,aACE,aACA,mBACA,mBACA,yBAEA,kBACE,YACA,mBACA,gBACA,uBAGF,wBACE,cAGF,qCACE,0BAGF,qBACE,gBACA,cAIJ,iBACE,YACA,eACA,kBACA,QACA,eACA,kBAEA,yBACE,WACA,kBACA,WACA,QACA,WACA,mDACA,kBAIJ,kEACE,kBACA,WACA,kBACA,gBACA,WACA,QAEA,sEACE,kBACA,WACA,iDACA,WACA,kBACA,WAIJ,qCACE,8DAGF,uBACE,kBACA,WACA,QACA,OAEA,yBACE,oBACA,kBACA,WACA,WAEA,gCACE,WACA,kBACA,SACA,WACA,WACA,YACA,kBACA,2CAMJ,qBACE,mBACA,gBACA,uBACA,gBACA,mBAGF,oBACE,eAGF,6CAEE,sBAGF,wBACE,iBAGF,6BACE,aACA,cAIA,sCACE,qBACA,QAKN,mCACE,cACA,eAIA,2BACE,sBAGF,6BACE,kBACA,eAEA,qCACE,mBACA,eAIJ,6CACE,4BAGF,mDAEE,iBAGF,iCACE,UACA,WAKN,6BACE,uB;ACjWF,cACE,WACA,YACA,eACA,kBAEA,8BACE,WACA,iBAGF,iCACE,kBACA,OACA,MACA,WAGF,+BACE,WACA,YAGF,mJAKE,aACA,mBACA,uBACA,yBACA,wEACA,eAGF,uBACE,gBAGF,6FAGE,gB;AC3CJ,aACE,iBACA,kBAEA,kCACE,qBACE,WACA,iBACA,WAGF,oBACE,cACA,WACA,YAIJ,4BACE,WACA,kBACA,OACA,MACA,SAEA,wCACE,WACA,YAIJ,2BACE,kBACA,WACA,eACA,kBACA,UAEA,aACA,UACA,OAGF,yBACE,cACA,oCACA,YACA,sBACA,iBAEA,iCACE,YAIJ,yBACE,kBACA,MACA,SACA,UACA,YACA,UACA,SACA,6DACA,iCACA,wBACA,YACA,wBACA,aACA,eACA,UAEA,sEACE,UAGF,8BACE,OACA,yDACA,gCAGF,8BACE,QACA,yDACA,6CAIJ,mBACE,kBACA,SACA,OACA,WACA,iBACA,uBACA,+EACA,yBACA,aACA,sBACA,yBACA,oBAGE,oCACE,iBACA,uBAKF,oCACE,iBACA,uBAKN,oBACE,aACA,mBAEA,uBACE,gBACA,kBACA,qBACA,qBACA,sBACA,qBAGF,kCACE,mBACA,qBAGF,2BACE,aACA,cACA,uBAIJ,qBACE,kBACA,WAIA,uCACE,UACA,QACA,qBAGF,uCACE,OACA,WACA,qBAIJ,kBACE,wBACA,gBAEA,wBACE,SAGF,qCACE,UAGF,wBACE,sBAGF,0BACE,+C;ACnLN,YACE,2CACA,mCACA,gBACA,cACA,WACA,mBACA,iBACA,kBACA,uBACA,aACA,cACA,iDAEA,0BAdF,YAeI,gBAGF,oCACE,2BACA,mDAGF,wBACE,oBAGF,uBACE,gBAGF,4BACE,oBACA,2CACA,oBACA,cACA,aACA,sBACA,mBACA,uBACA,oCAGF,kBACE,kBACA,sBACA,sBAEA,0BALF,kBAMI,kBACA,mBACA,oBAGF,0BAXF,kBAYI,eACA,iBACA,oBACA,mBAIJ,mBACE,oBACA,gBACA,uBAEA,0BALF,mBAMI,gBAIJ,yBACE,eACA,oBAEA,0BAJF,yBAKI,mB;AC7EN,sBACE,kBACA,WACA,YACA,yEACA,4DAEA,6CACE,2BAGF,+BACE,yE;ACKJ,aACE,qCAEA,mBAEA,sBACE,oBACA,4CAGF,6BACE,aACA,8BACA,sBAEA,oCACE,cACA,iBACA,kCAIA,6CACE,cACA,kBAKN,0BACE,kBACA,UAEA,kCACE,WACA,kBACA,WACA,OACA,aACA,eACA,sCACA,sBACA,WACA,WAIJ,gCACE,kBACA,WACA,OACA,aACA,eACA,qCACA,sBACA,oBCvDF,+BACE,wBACA,cACA,WACA,cACA,oBACA,uBAEA,qCACE,aAGF,0CACE,WACA,eAEA,uBACA,yBACA,kBAGF,qDACE,wBAGF,kDACE,qBAGF,8DACE,eAGF,qGACE,eD+BF,qDA/EF,+BACA,YACA,cACA,aACA,kBACA,eACA,mBACA,oFAEA,2DACE,qBAyEA,iDAnFF,+BACA,YACA,cACA,aACA,kBACA,eACA,mBACA,iFAEA,uDACE,qBA6EA,0CAvFF,+BACA,YACA,cACA,aACA,kBACA,eACA,mBACA,gFAEA,gDACE,qBAkFF,6BACE,aACA,wBACA,sBACA,sBAGF,4BACE,kBACA,kBACA,eACA,kCACA,0BAEA,qEACE,wBAGF,mCACE,gBAGF,wCACE,gBAGF,uCACE,iB;AE1HN,UACE,kBACA,MACA,QACA,OACA,aACA,2BACA,uBAEA,aACA,sBAEA,kCACE,iD;ACbJ,eACE,qBACA,WACA,YACA,aACA,kDACA,wCACA,wBACA,kEACA,kBAEA,2BACE,eAEA,iCACE,wDAEA,wDACE,UAMN,yBAxBF,eAyBI,eAGF,0BACE,yBACA,eACA,eAGF,qBACE,YACA,aACA,SAGF,mDACE,kBACA,MACA,OACA,WACA,YAGF,mBACE,mBAGF,sCACE,kBACA,YACA,cACA,cACA,eACA,gBAMA,UAJA,wCACE,e;AC7DN,eACE,oCAEA,2CACE,kBACA,mCACA,4CACA,sBACA,iDAGF,4BACE,OACA,MACA,UACA,oBACA,4BAEA,mCACE,eAGF,yBAXF,4BAYI,2DAGF,kCACE,uBACA,wBACA,WACA,wBACA,yCAIJ,uDACE,aACA,iBACA,mBAGF,uBACE,UACA,eACA,gBACA,sCAGF,sCACE,YACA,kBACA,eAEA,yBALF,sCAMI,gBAGF,2FACE,WACA,cACA,kBACA,MACA,SACA,WACA,UACA,UACA,4BAGF,8CACE,OACA,wFAGF,6CACE,QACA,uFAIA,wDACE,UAKF,wDACE,UAKN,gCACE,cACA,UACA,4BAEA,sCACE,UAKF,8DACE,UACA,mBAIJ,uBACE,WACA,YACA,eACA,iBACA,iBACA,kDACA,cACA,eAEA,8BACE,iDACA,WAGF,gCACE,WACA,oB;AC9HN,QACE,YACA,aACA,sBACA,gBAEA,uBACE,6BACA,6CACA,aACA,mBACA,cAEA,gBACA,iBAEA,oCACE,oBACA,kBACA,YAGF,qCACE,YACA,YACA,gBACA,UACA,gBAIJ,qBACE,YACA,gBACA,kBACA,cAEA,yBANF,qBAOI,0BACA,4BAIJ,oBACE,YACA,SACA,kBACA,aACA,mBACA,uBACA,kC","sources":["webpack://telegram-t/./src/components/ui/Transition.scss","webpack://telegram-t/./src/components/common/Avatar.scss","webpack://telegram-t/./src/components/ui/ProgressSpinner.scss","webpack://telegram-t/./src/components/ui/Modal.scss","webpack://telegram-t/./src/components/ui/ListItem.scss","webpack://telegram-t/./src/components/common/VerifiedIcon.scss","webpack://telegram-t/./src/components/common/TypingStatus.scss","webpack://telegram-t/./src/components/ui/Notification.scss","webpack://telegram-t/./src/components/ui/Radio.scss","webpack://telegram-t/./src/components/ui/Tab.scss","webpack://telegram-t/./src/components/ui/TabList.scss","webpack://telegram-t/./src/components/common/DeleteChatModal.scss","webpack://telegram-t/./src/components/ui/SearchInput.scss","webpack://telegram-t/./src/components/common/PickerSelectedItem.scss","webpack://telegram-t/./src/components/ui/Switcher.scss","webpack://telegram-t/./src/components/common/MessageOutgoingStatus.scss","webpack://telegram-t/./src/components/common/LastMessageMeta.scss","webpack://telegram-t/./src/components/left/main/Badge.scss","webpack://telegram-t/./src/components/left/main/ChatCallStatus.scss","webpack://telegram-t/./src/components/left/main/Chat.scss","webpack://telegram-t/./src/components/common/AnimatedEmoji.scss","webpack://telegram-t/./src/components/left/main/EmptyFolder.scss","webpack://telegram-t/./src/components/common/NothingFound.scss","webpack://telegram-t/./src/components/common/Media.scss","webpack://telegram-t/./src/components/common/WebLink.scss","webpack://telegram-t/./src/components/common/File.scss","webpack://telegram-t/./src/components/common/Audio.scss","webpack://telegram-t/./src/components/common/ProfilePhoto.scss","webpack://telegram-t/./src/components/common/ProfileInfo.scss","webpack://telegram-t/./src/components/middle/composer/DropTarget.scss","webpack://telegram-t/./src/components/ui/FloatingActionButton.scss","webpack://telegram-t/./src/components/ui/RangeSlider.scss","webpack://telegram-t/./src/styles/_mixins.scss","webpack://telegram-t/./src/components/middle/composer/DropArea.scss","webpack://telegram-t/./src/components/common/StickerButton.scss","webpack://telegram-t/./src/components/middle/composer/TextFormatter.scss","webpack://telegram-t/./src/components/common/Picker.scss"],"sourcesContent":[".Transition {\n position: relative;\n\n > * {\n width: 100%;\n height: 100%;\n animation-fill-mode: forwards !important;\n transition: background-color .2s;\n\n &.from, &.to {\n position: absolute;\n top: 0;\n left: 0;\n }\n\n &:not(.active):not(.from):not(.to) {\n display: none !important; // Best performance when animating container\n //transform: scale(0); // Shortest initial delay\n }\n }\n\n &.skip-slide-transition {\n transition: none !important;\n }\n\n /*\n * slide\n */\n\n &.slide {\n > .to {\n transform: translateX(100%);\n }\n\n &.animating {\n > .from {\n animation: slide-out var(--slide-transition);\n }\n\n > .to {\n animation: slide-in var(--slide-transition);\n }\n }\n }\n\n &.slide.backwards {\n > .to {\n transform: translateX(-100%);\n }\n\n &.animating {\n > .from {\n animation: slide-in-backwards var(--slide-transition);\n }\n\n > .to {\n animation: slide-out-backwards var(--slide-transition);\n }\n }\n }\n\n\n &.slide-reversed {\n > .to {\n transform: translateX(-100%);\n }\n\n &.animating {\n > .from {\n animation: slide-out var(--slide-transition);\n }\n\n > .to {\n animation: slide-in var(--slide-transition);\n }\n }\n\n &.backwards {\n > .to {\n transform: translateX(100%);\n }\n\n &.animating {\n > .from {\n animation: slide-in-backwards var(--slide-transition);\n }\n\n > .to {\n animation: slide-out-backwards var(--slide-transition);\n }\n }\n }\n }\n\n /*\n * mv-slide\n */\n\n &.mv-slide {\n > * > div {\n animation-fill-mode: forwards !important;\n }\n\n > .to > div {\n transform: translateX(100vw);\n }\n\n &.animating {\n > .from > div {\n animation: mv-slide-out .4s ease;\n }\n\n > .to > div {\n animation: mv-slide-in .4s ease;\n }\n }\n }\n\n &.mv-slide.backwards {\n > .to > div {\n transform: translateX(-100vw);\n }\n\n &.animating {\n > .from > div {\n animation: mv-slide-in-backwards .4s ease;\n }\n\n > .to > div {\n animation: mv-slide-out-backwards .4s ease;\n }\n }\n }\n\n /*\n * slide-fade\n */\n &.slide-fade {\n > .from {\n transform-origin: left;\n transform: translateX(0);\n opacity: 1;\n }\n\n > .to {\n transform-origin: left;\n transform: translateX(1.5rem);\n opacity: 0;\n }\n\n &.animating {\n > .from {\n animation: fade-out-opacity var(--slide-transition), slide-fade-out-move var(--slide-transition);\n }\n\n > .to {\n animation: fade-in-opacity var(--slide-transition), slide-fade-in-move var(--slide-transition);\n }\n }\n }\n\n &.slide-fade.backwards {\n > .from {\n transform: translateX(0);\n opacity: 1;\n }\n\n > .to {\n transform: translateX(-1.5rem);\n opacity: 0;\n }\n\n &.animating {\n > .from {\n animation: fade-in-backwards-opacity var(--slide-transition), slide-fade-in-backwards-move var(--slide-transition);\n }\n\n > .to {\n animation: fade-out-backwards-opacity var(--slide-transition), slide-fade-out-backwards-move var(--slide-transition);\n }\n }\n }\n\n /*\n * zoom-fade\n */\n &.zoom-fade {\n > .from {\n transform-origin: center;\n transform: scale(1);\n opacity: 1;\n }\n\n > .to {\n transform-origin: center;\n opacity: 0;\n // We can omit `transform: scale(1.1);` here because `opacity` is 0.\n // We need to for proper position calculation in `InfiniteScroll`.\n }\n\n &.animating {\n > .from {\n animation: fade-out-opacity .15s ease;\n }\n\n > .to {\n animation: fade-in-opacity .15s ease, zoom-fade-in-move .15s ease;\n }\n }\n }\n\n &.zoom-fade.backwards {\n > .from {\n transform: scale(1);\n }\n\n > .to {\n transform: scale(0.95);\n }\n\n &.animating {\n > .from {\n animation: fade-in-backwards-opacity .1s ease, zoom-fade-in-backwards-move .15s ease;\n }\n\n > .to {\n animation: fade-out-backwards-opacity .15s ease, zoom-fade-out-backwards-move .15s ease;\n }\n }\n }\n\n /*\n * fade\n */\n &.fade {\n > .from {\n opacity: 1;\n }\n\n > .to {\n opacity: 0;\n }\n\n &.animating {\n > .from {\n animation: fade-out-opacity .15s ease;\n }\n\n > .to {\n animation: fade-in-opacity .15s ease;\n }\n }\n }\n\n /*\n * slide-layers\n */\n\n &.slide-layers {\n --background-color: var(--color-background);\n background: black;\n\n > div {\n background: var(--background-color);\n }\n\n > .to {\n transform: translateX(100%);\n }\n\n &.animating {\n > .from {\n animation: slide-layers-out var(--layer-transition);\n }\n\n > .to {\n animation: slide-in var(--layer-transition);\n }\n }\n }\n\n &.slide-layers.backwards {\n > .to {\n transform: translateX(-20%);\n opacity: 0.75;\n }\n\n &.animating {\n > .from {\n animation: slide-in-backwards var(--layer-transition);\n }\n\n > .to {\n animation: slide-layers-out-backwards var(--layer-transition);\n }\n }\n }\n\n /*\n * push-slide\n */\n\n &.push-slide {\n > div {\n background: var(--color-background);\n }\n\n > .from {\n transform-origin: center;\n transform: scale(1);\n opacity: 1;\n\n .custom-scroll {\n scrollbar-color: transparent !important;\n\n &::-webkit-scrollbar-thumb {\n background-color: transparent !important;\n }\n }\n }\n\n > .to {\n transform: translateX(100%);\n }\n\n &.animating {\n > .from {\n animation: push-out .3s ease-in-out;\n }\n\n > .to {\n animation: slide-in-200 .3s ease-in-out;\n }\n }\n }\n\n &.push-slide.backwards {\n > .to {\n transform: scale(0.7);\n }\n\n &.animating {\n > .from {\n animation: slide-in-200-backwards .3s ease-in-out;\n }\n\n > .to {\n animation: push-out-backwards .3s ease-in-out;\n }\n }\n }\n\n /*\n * slide-fade\n */\n &.reveal {\n > .to {\n clip-path: inset(0 100% 0 0);\n }\n\n &.animating {\n > .to {\n animation: reveal-in 350ms ease-in;\n }\n }\n }\n\n &.reveal.backwards {\n > .from {\n clip-path: inset(0 0 0 0);\n }\n\n > .to {\n clip-path: none;\n }\n\n &.animating {\n > .from {\n animation: reveal-in-backwards 350ms ease-out;\n }\n\n > .to {\n animation: none;\n }\n }\n }\n}\n\n/*\n * common\n */\n@keyframes fade-in-opacity {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n\n@keyframes fade-out-opacity {\n 0% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n}\n\n@keyframes fade-in-backwards-opacity {\n 0% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n}\n\n@keyframes fade-out-backwards-opacity {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n\n/*\n * slide\n */\n@keyframes slide-in {\n 0% {\n transform: translateX(100%);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n@keyframes slide-out {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(-100%);\n }\n}\n\n@keyframes slide-in-backwards {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(100%);\n }\n}\n\n@keyframes slide-out-backwards {\n 0% {\n transform: translateX(-100%);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n/*\n * mv-slide\n */\n@keyframes mv-slide-in {\n 0% {\n transform: translateX(100vw);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n@keyframes mv-slide-out {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(-100vw);\n }\n}\n\n@keyframes mv-slide-in-backwards {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(100vw);\n }\n}\n\n@keyframes mv-slide-out-backwards {\n 0% {\n transform: translateX(-100vw);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n/*\n * slide-fade\n */\n@keyframes slide-fade-in-move {\n 0% {\n transform: translateX(1.5rem);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n@keyframes slide-fade-out-move {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(-1.5rem);\n }\n}\n\n@keyframes slide-fade-in-backwards-move {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(1.5rem);\n }\n}\n\n@keyframes slide-fade-out-backwards-move {\n 0% {\n transform: translateX(-1.5rem);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n/*\n * zoom-fade\n */\n@keyframes zoom-fade-in-move {\n 0% {\n transform: scale(1.1);\n }\n 100% {\n transform: scale(1);\n }\n}\n\n@keyframes zoom-fade-in-backwards-move {\n 0% {\n transform: scale(1);\n }\n 100% {\n transform: scale(1.1);\n }\n}\n\n@keyframes zoom-fade-out-backwards-move {\n 0% {\n transform: scale(0.95);\n }\n 100% {\n transform: scale(1);\n }\n}\n\n/*\n * slide-layers\n */\n@keyframes slide-layers-out {\n 0% {\n transform: translateX(0);\n opacity: 1;\n }\n 100% {\n transform: translateX(-20%);\n opacity: calc(1 - var(--layer-blackout-opacity));\n }\n}\n\n@keyframes slide-layers-out-backwards {\n 0% {\n transform: translateX(-20%);\n opacity: calc(1 - var(--layer-blackout-opacity));\n }\n 100% {\n transform: translateX(0);\n opacity: 1;\n }\n}\n\n/*\n * push-slide\n */\n\n@keyframes push-out {\n 0% {\n transform: scale(1);\n opacity: 1;\n }\n 100% {\n transform: scale(0.7);\n opacity: 0;\n }\n}\n\n@keyframes push-out-backwards {\n 0% {\n transform: scale(0.7);\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n/*\n * slide\n */\n@keyframes slide-in-200 {\n 0% {\n transform: translateX(200%);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n@keyframes slide-in-200-backwards {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(200%);\n }\n}\n\n/*\n * slide\n */\n@keyframes reveal-in {\n 0% {\n clip-path: inset(0 100% 0 0);\n }\n 100% {\n clip-path: inset(0 0 0 0);\n }\n}\n\n/*\n * slide\n */\n@keyframes reveal-in-backwards {\n 0% {\n clip-path: inset(0 0 0 0);\n }\n 100% {\n clip-path: inset(0 100% 0 0);\n }\n}\n",".Avatar {\n --color-user: var(--color-primary);\n flex: none;\n align-items: center;\n justify-content: center;\n width: 3.375rem;\n height: 3.375rem;\n border-radius: 50%;\n background: linear-gradient(var(--color-white) -125%, var(--color-user));\n color: white;\n font-weight: bold;\n display: flex;\n white-space: nowrap;\n user-select: none;\n\n img:not(.emoji) {\n border-radius: 50%;\n }\n\n .emoji {\n width: 1rem;\n height: 1rem;\n }\n\n i {\n font-size: 2.5rem;\n\n &.icon-reply-filled {\n transform: scale(.7);\n }\n }\n\n &.size-micro {\n width: 1rem;\n height: 1rem;\n font-size: 0.5125rem;\n\n .emoji {\n width: .5625rem;\n height: .5625rem;\n }\n }\n\n &.size-tiny {\n width: 2rem;\n height: 2rem;\n font-size: .875rem;\n\n .emoji {\n width: .875rem;\n height: .875rem;\n }\n }\n\n &.size-small {\n width: 2.125rem;\n height: 2.125rem;\n font-size: 0.875rem;\n\n .emoji {\n width: .875rem;\n height: .875rem;\n }\n }\n\n &.size-medium {\n width: 2.75rem;\n height: 2.75rem;\n font-size: 1.1875rem;\n\n .emoji {\n width: 1rem;\n height: 1rem;\n }\n }\n\n &.size-large {\n font-size: 1.3125rem;\n\n i {\n font-size: 3.5rem;\n }\n\n .emoji {\n width: 1.3125rem;\n height: 1.3125rem;\n }\n }\n\n &.size-jumbo {\n width: 7.5rem;\n height: 7.5rem;\n font-size: 3.5rem;\n\n i {\n font-size: 6rem;\n }\n\n .emoji {\n width: 3.5rem;\n height: 3.5rem;\n }\n }\n\n &.online {\n position: relative;\n\n &::after {\n content: '';\n display: block;\n position: absolute;\n bottom: 0.05rem;\n right: 0.05rem;\n width: 0.875rem;\n height: 0.875rem;\n border-radius: 50%;\n border: 2px solid var(--color-background);\n background-color: #0ac630;\n flex-shrink: 0;\n }\n }\n\n &.interactive {\n cursor: pointer;\n }\n\n img:not(.emoji) {\n width: 100%;\n height: 100%;\n }\n}\n",".ProgressSpinner {\n position: relative;\n z-index: 1;\n width: 3.375rem;\n height: 3.375rem;\n background: rgba(0, 0, 0, .25) url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTkiIGhlaWdodD0iMTkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjcxNyA5Ljc1TDE4LjMgMi4xNjdhLjY4NC42ODQgMCAxMC0uOTY3LS45NjdMOS43NSA4Ljc4MyAyLjE2NyAxLjJhLjY4NC42ODQgMCAxMC0uOTY3Ljk2N0w4Ljc4MyA5Ljc1IDEuMiAxNy4zMzNhLjY4NC42ODQgMCAxMC45NjcuOTY3bDcuNTgzLTcuNTgzIDcuNTgzIDcuNTgzYS42ODEuNjgxIDAgMDAuOTY3IDAgLjY4NC42ODQgMCAwMDAtLjk2N0wxMC43MTcgOS43NXoiIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjRkZGIiBzdHJva2Utd2lkdGg9Ii43NSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==) no-repeat 49% 49%;\n border-radius: 50%;\n cursor: pointer;\n\n &.no-cross {\n background: transparent !important;\n pointer-events: none;\n }\n\n &.square {\n background-image: none;\n\n &::after {\n content: '';\n position: absolute;\n width: .8125rem;\n height: .8125rem;\n border-radius: .125rem;\n background-color: #fff;\n left: 50%;\n top: 50%;\n transform: translate3d(-50%, -50%, 0);\n }\n }\n\n &.size-s, &.size-m {\n width: auto;\n height: auto;\n background: transparent url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUiIGhlaWdodD0iMTUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMjE4IDcuNWw1LjYzMy01LjYzM2EuNTA4LjUwOCAwIDEwLS43MTgtLjcxOEw3LjUgNi43ODIgMS44NjcgMS4xNDlhLjUwOC41MDggMCAxMC0uNzE4LjcxOEw2Ljc4MiA3LjVsLTUuNjMzIDUuNjMzYS41MDguNTA4IDAgMTAuNzE4LjcxOEw3LjUgOC4yMThsNS42MzMgNS42MzNhLjUwNi41MDYgMCAwMC43MTggMCAuNTA4LjUwOCAwIDAwMC0uNzE4TDguMjE4IDcuNXoiIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjRkZGIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9zdmc+) no-repeat 49% 49%;\n\n &.square {\n background-image: none;\n width: .75rem;\n height: .75rem;\n }\n }\n\n &.size-xl {\n width: 3.25rem;\n height: 3.25rem;\n\n svg {\n width: 3rem;\n height: 3rem;\n margin: .125rem;\n }\n\n circle {\n stroke-width: 3px;\n }\n }\n\n &.transparent {\n background-color: transparent !important;\n }\n\n svg {\n display: block;\n transform: rotate(-90deg);\n transform-origin: 50% 50%;\n animation: 4s linear 0s infinite ProgressSpinnerAnimation;\n }\n\n circle {\n transition: stroke-dashoffset .5s;\n }\n}\n\n@keyframes ProgressSpinnerAnimation {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n",".Modal {\n position: relative;\n z-index: var(--z-modal);\n\n &.delete, &.error, &.confirm, &.pin, &.unpin-all {\n .modal-dialog {\n max-width: 23rem;\n }\n }\n\n &.error {\n .modal-content > div {\n margin-top: 1rem;\n }\n }\n\n &.narrow {\n .modal-dialog {\n max-width: 20rem;\n }\n }\n\n &.report {\n .modal-dialog {\n max-width: 15rem;\n }\n }\n\n .modal-container {\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n .modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n background-color: rgba(0, 0, 0, .25);\n }\n\n &.transparent-backdrop .modal-backdrop {\n background-color: transparent;\n }\n\n .modal-dialog {\n position: relative;\n display: inline-flex;\n flex-direction: column;\n width: 100%;\n max-width: 35rem;\n min-width: 17.5rem;\n margin: 2rem auto;\n background-color: var(--color-background);\n box-shadow: 0 .25rem .5rem .125rem var(--color-default-shadow);\n border-radius: var(--border-radius-default);\n transform: translate3d(0, -1rem, 0);\n\n transition: transform .2s ease, opacity .2s ease;\n\n body.animation-level-0 & {\n transition: none;\n transform: none !important;\n }\n\n @media (max-width: 450px) {\n max-width: calc(100vw - 3rem) !important;\n }\n }\n\n &.open .modal-dialog {\n transform: translate3d(0, 0, 0);\n }\n\n &.closing .modal-dialog {\n transform: translate3d(0, 1rem, 0);\n }\n\n .modal-header {\n padding: 1rem 1rem 0;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n }\n\n .modal-title {\n font-size: 1.25rem;\n font-weight: 500;\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:not(:only-child) {\n margin: 0 1.3125rem;\n }\n }\n\n .modal-header-condensed {\n @extend .modal-header;\n padding: .5rem 1.25rem 0 .9375rem !important;\n\n .modal-action-button {\n font-size: 0.875rem;\n height: 2.25rem;\n width: auto;\n line-height: 1.625rem;\n margin-left: auto;\n padding-left: 1.25rem;\n padding-right: 1.25rem;\n min-width: 5rem;\n }\n }\n\n .modal-content {\n width: 100%;\n flex-grow: 1;\n padding: 1rem;\n overflow-y: auto;\n\n b,\n strong {\n word-break: break-word;\n }\n }\n\n .modal-title,\n .modal-content,\n .modal-content > p {\n unicode-bidi: plaintext;\n text-align: initial;\n }\n\n .dialog-buttons {\n display: flex;\n align-items: flex-end;\n\n .confirm-dialog-button + .confirm-dialog-button {\n margin-left: 1rem;\n }\n }\n\n .confirm-dialog-button {\n width: auto;\n height: auto;\n margin-left: auto;\n text-align: right;\n font-weight: 500;\n white-space: pre-wrap;\n }\n}\n",".ListItem {\n position: relative;\n\n body.is-ios &, body.is-android & {\n &:not(:last-of-type)::after {\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 4.5rem;\n right: 0;\n height: 0.03125rem;\n background: var(--color-dividers);\n }\n\n &.small-icon::after {\n left: 3.875rem;\n }\n\n &.no-icon::after {\n left: 0;\n }\n }\n\n // Using half-pixel height is efficient on iOS but not supported on Android, so `transform` is used instead\n body.is-android & {\n &:not(:last-of-type)::after {\n height: 0.0625rem;\n transform: scaleY(0.25);\n }\n }\n\n .ListItem-button {\n width: 100%;\n background-color: var(--background-color);\n border: none !important;\n box-shadow: none !important;\n outline: none !important;\n display: flex;\n padding: 1rem;\n position: relative;\n overflow: hidden;\n line-height: 1.5rem;\n white-space: nowrap;\n color: var(--color-text);\n border-radius: var(--border-radius-default);\n --ripple-color: rgba(0, 0, 0, .08);\n\n > i {\n font-size: 1.5rem;\n margin-right: 2rem;\n color: var(--color-text-secondary);\n }\n }\n\n .user-status, .group-status, .title, .subtitle {\n text-align: initial;\n unicode-bidi: plaintext;\n }\n\n &.multiline {\n .ListItem-button > i {\n position: relative;\n top: .25rem;\n }\n }\n\n &.disabled {\n pointer-events: none;\n\n .ListItem-button {\n opacity: 0.5;\n }\n }\n\n &:not(.disabled):not(.is-static) {\n .ListItem-button {\n cursor: pointer;\n\n body.cursor-ew-resize & {\n cursor: ew-resize !important;\n }\n\n @media (hover: hover) {\n &:hover, &:focus {\n --background-color: var(--color-chat-hover);\n }\n }\n\n @media (max-width: 600px) {\n &.active {\n --background-color: var(--color-chat-hover);\n }\n }\n }\n }\n\n @media (min-width: 600px) {\n &:not(.has-ripple):not(.is-static),\n body.animation-level-0 & {\n .ListItem-button:active {\n --background-color: var(--color-item-active) !important;\n }\n }\n }\n\n &.has-menu-open .ListItem-button {\n --background-color: var(--color-chat-hover);\n }\n\n &.narrow {\n margin-bottom: 0.75rem;\n\n .ListItem-button {\n padding: 0.5rem 1rem;\n }\n }\n\n &.inactive {\n pointer-events: none;\n }\n\n &.focus {\n --background-color: var(--color-chat-hover);\n }\n\n &.destructive {\n .ListItem-button {\n color: var(--color-error);\n\n i {\n color: inherit;\n }\n }\n }\n\n &-context-menu {\n position: absolute;\n\n .bubble {\n width: auto;\n\n .MenuItem button {\n padding-left: 1rem !important;\n padding-right: 2rem !important;\n }\n }\n }\n\n &.chat-item-clickable {\n margin: 0 -0.5rem;\n\n body.is-ios &,\n body.is-macos & {\n --color-text-secondary: var(--color-text-secondary-apple);\n }\n\n .ListItem-button {\n padding: .5625rem;\n }\n\n .Avatar {\n flex-shrink: 0;\n margin-right: 0.5rem;\n }\n\n .info {\n flex-grow: 1;\n overflow: hidden;\n }\n\n .title, .subtitle {\n overflow: hidden;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n }\n\n h3, .last-message, .status, .typing-status {\n font-size: 1rem;\n line-height: 1.6875rem;\n margin: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-align: initial;\n }\n\n .title {\n h3 {\n font-weight: 500;\n }\n\n .VerifiedIcon {\n width: 1.25rem;\n height: 1.25rem;\n margin-left: 0.25rem;\n }\n\n .emoji {\n vertical-align: text-bottom;\n background-position: 0 0;\n flex-shrink: 0;\n }\n }\n\n .contact-phone,\n .contact-username {\n font-size: 0.875rem;\n line-height: 1.25rem;\n color: var(--color-text-secondary);\n }\n\n .ChatInfo {\n display: flex;\n align-items: center;\n flex-grow: 1;\n overflow: hidden;\n\n .status, .typing-status {\n font-size: 0.875rem;\n line-height: 1.25rem;\n color: var(--color-text-secondary);\n display: inline-block;\n\n &.online {\n color: var(--color-primary);\n }\n\n &[dir=rtl],\n &[dir=auto] {\n text-align: initial;\n width: 100%;\n }\n\n .group-status:only-child,\n .user-status:only-child {\n display: flow-root;\n }\n }\n }\n\n .contact-phone,\n .contact-username,\n h3, .last-message, .status, .typing-status {\n text-align: initial;\n unicode-bidi: plaintext;\n }\n\n .last-message,\n .status,\n .typing-status {\n body.is-ios &,\n body.is-macos & {\n font-size: .9375rem;\n }\n }\n\n &[dir=rtl] {\n .ListItem-button {\n padding: .5625rem .5625rem .5625rem .6975rem;\n }\n\n .Avatar {\n margin-left: 0.5rem;\n margin-right: 0;\n }\n\n .info > .status {\n width: 100%;\n }\n }\n }\n\n &.search-result-message {\n .title {\n padding-right: .15rem;\n }\n\n h3 {\n max-width: 80%;\n }\n\n h3, .subtitle {\n font-size: 1rem;\n line-height: 1.5rem;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-align: left;\n }\n\n .LastMessageMeta {\n margin-left: auto;\n margin-right: 0;\n }\n\n .subtitle {\n color: var(--color-text-secondary);\n margin-right: 2rem;\n\n .matching-text-highlight {\n color: var(--color-text);\n background: #CAE3F7;\n border-radius: 0.25rem;\n padding: 0 0.125rem;\n }\n }\n\n &[dir=rtl] {\n .LastMessageMeta {\n margin-left: 0;\n margin-right: auto;\n }\n\n .subtitle {\n margin-right: 0;\n display: block;\n }\n }\n }\n\n &.picker-list-item {\n margin: 0;\n\n .ListItem-button {\n padding-left: 0;\n display: flex;\n align-items: center;\n }\n\n .Avatar {\n width: 3rem;\n height: 3rem;\n }\n\n .Checkbox {\n flex-shrink: 0;\n height: 1.5rem;\n margin: 0;\n padding-left: 4rem;\n }\n\n &[dir=rtl] {\n .Checkbox {\n padding-left: 0;\n padding-right: 4rem;\n }\n }\n }\n\n .multiline-item {\n white-space: initial;\n overflow: hidden;\n\n .title, .subtitle {\n display: block;\n text-align: initial;\n }\n\n .title {\n line-height: 1.25rem;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .subtitle {\n font-size: 0.875rem;\n line-height: 1.5rem;\n color: var(--color-text-secondary);\n\n & + .subtitle {\n margin-top: -0.25rem;\n }\n\n &.black {\n color: var(--color-text);\n }\n }\n }\n\n &[dir=rtl] {\n .ListItem-button > i {\n margin-left: 2rem;\n margin-right: 0;\n }\n }\n}\n",".VerifiedIcon {\n display: inline-block;\n flex-shrink: 0;\n width: 1.5rem;\n height: 1.5rem;\n background-image: url('../../assets/icon-verified.svg');\n background-repeat: no-repeat;\n background-size: 100%;\n background-position: center;\n}\n",".typing-status {\n display: flex;\n align-items: baseline;\n\n .sender-name {\n &::after {\n content: '\\00a0';\n color: var(--color-text-secondary);\n }\n }\n\n .ellipsis {\n display: flex;\n width: 1rem;\n overflow: hidden;\n\n &::after {\n content: '...';\n animation: typing-animation 1s steps(4, start) infinite;\n\n html[lang=ar] &,\n html[lang=fa] & {\n animation-name: typing-animation-rtl;\n }\n }\n }\n}\n\n@keyframes typing-animation {\n from {\n transform: translateX(-1rem);\n }\n}\n\n@keyframes typing-animation-rtl {\n from {\n transform: translateX(1rem);\n }\n}\n",".Notification-container {\n position: relative;\n width: 24rem;\n max-width: 100vw;\n margin: .25rem auto;\n z-index: var(--z-notification);\n\n @media (min-width: 1276px) {\n transition: transform var(--layer-transition);\n }\n\n &:first-of-type {\n margin-top: 4.25rem;\n\n .has-header-tools & {\n margin-top: 7.375rem;\n }\n }\n}\n\n.Notification {\n background: rgba(32, 32, 32, .8) url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48Y2lyY2xlIGZpbGw9IiNGRkYiIGN4PSIxMiIgY3k9IjEyIiByPSIxMiIvPjxjaXJjbGUgZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJub256ZXJvIiBjeD0iMTIiIGN5PSI2LjUiIHI9IjEuNSIvPjxwYXRoIGQ9Ik0xMiA5LjVjLS41NTIgMC0xIC4zNy0xIC44MjZ2Ny4zNDhjMCAuNDU2LjQ0OC44MjYgMSAuODI2czEtLjM3IDEtLjgyNnYtNy4zNDhjMC0uNDU2LS40NDgtLjgyNi0xLS44MjZ6IiBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L2c+PC9zdmc+\") no-repeat .9375rem 50%;\n background-size: 1.5rem;\n border-radius: var(--border-radius-default);\n padding: .9375rem .9375rem .9375rem 3.375rem;\n color: #fff;\n margin: 0 .5rem;\n\n .text-entity-link,\n .text-entity-link:hover,\n .text-entity-link:active {\n color: #fff !important;\n text-decoration: underline;\n }\n\n .content {\n line-height: 1.25;\n word-break: break-word;\n font-size: .9375rem;\n }\n}\n",".Radio {\n display: block;\n position: relative;\n padding-left: 4.5rem;\n text-align: left;\n margin-bottom: 1.5rem;\n line-height: 1.5rem;\n cursor: pointer;\n\n &.disabled {\n pointer-events: none;\n opacity: 0.5;\n }\n\n &.hidden-widget {\n cursor: default;\n .Radio-main {\n &::before, &::after {\n visibility: hidden;\n }\n }\n }\n\n > input {\n position: absolute;\n z-index: var(--z-below);\n opacity: 0;\n }\n\n .Radio-main {\n &::before, &::after {\n content: '';\n display: block;\n position: absolute;\n left: 1.0625rem;\n top: 50%;\n width: 1.25rem;\n height: 1.25rem;\n transform: translateY(-50%);\n }\n\n &::before {\n border: 2px solid var(--color-borders-input);\n border-radius: 50%;\n background-color: var(--color-background);\n opacity: 1;\n transition: border-color .1s ease, opacity .1s ease;\n }\n\n &::after {\n left: 1.375rem;\n width: 0.625rem;\n height: 0.625rem;\n border-radius: 50%;\n background: var(--color-primary);\n opacity: 0;\n transition: opacity .1s ease;\n }\n\n .label {\n display: block;\n word-break: break-word;\n unicode-bidi: plaintext;\n text-align: left;\n }\n\n .subLabel {\n display: block;\n font-size: 0.875rem;\n line-height: 1rem;\n color: var(--color-text-secondary);\n unicode-bidi: plaintext;\n }\n }\n\n input:checked ~ .Radio-main {\n &::before {\n border-color: var(--color-primary);\n }\n\n &::after {\n opacity: 1;\n }\n }\n\n &.loading {\n .Radio-main::before,\n .Radio-main::after {\n opacity: 0 !important;\n }\n\n .Spinner {\n position: absolute;\n left: 1.0625rem;\n top: 50%;\n transform: translateY(-50%);\n opacity: 0;\n animation: fade-in .2s ease forwards;\n --spinner-size: 1.25rem;\n }\n }\n\n &[dir=rtl] {\n padding-left: 0;\n padding-right: 4.5rem;\n\n .Radio-main {\n text-align: right;\n\n &::before {\n left: auto;\n right: 1.0625rem;\n }\n\n &::after {\n left: auto;\n right: 1.375rem;\n }\n }\n\n .label,\n .subLabel {\n text-align: right;\n }\n\n &.loading .Spinner {\n left: auto;\n right: 1.0625rem;\n }\n }\n}\n\n@keyframes fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n",".Tab {\n display: flex;\n justify-content: center;\n flex: 1 1 auto;\n appearance: none;\n background: none;\n width: auto;\n margin: 0;\n border: none;\n padding: .625rem .25rem;\n font-weight: 500;\n color: var(--color-text-secondary);\n cursor: pointer;\n border-top-left-radius: var(--border-radius-messages-small);\n border-top-right-radius: var(--border-radius-messages-small);\n\n &,\n &:active,\n &:focus {\n outline: none;\n }\n\n &.active {\n cursor: default;\n color: var(--color-primary);\n\n i {\n opacity: 1;\n }\n }\n\n &:not(.active):hover {\n background: var(--color-interactive-element-hover);\n }\n\n > span {\n position: relative;\n display: flex;\n align-items: center;\n }\n\n .badge {\n min-width: 1.25rem;\n height: 1.25rem;\n margin-inline-start: 0.5rem;\n background: var(--color-gray);\n border-radius: 0.75rem;\n padding: 0 .3125rem;\n color: white;\n font-size: 0.875rem;\n line-height: 1.3125rem;\n font-weight: 500;\n text-align: center;\n flex-shrink: 0;\n\n body.is-ios &,\n body.is-macos & {\n line-height: 1.25rem;\n }\n\n &.active {\n background: var(--color-primary);\n }\n }\n\n i {\n position: absolute;\n bottom: calc(-.625rem - 1px);\n left: 0;\n opacity: 0;\n background-color: var(--color-primary);\n height: .1875rem;\n width: 100%;\n border-radius: .1875rem .1875rem 0 0;\n pointer-events: none;\n box-sizing: content-box;\n transform-origin: left;\n\n &.animate {\n transition: transform var(--slide-transition);\n\n body.animation-level-0 & {\n transition: none !important;\n }\n }\n }\n}\n",".TabList {\n position: sticky;\n top: 0;\n flex-shrink: 0;\n display: flex;\n justify-content: space-between;\n align-items: flex-end;\n font-size: .875rem;\n flex-wrap: nowrap;\n box-shadow: 0 2px 2px var(--color-light-shadow);\n background-color: var(--color-background);\n overflow-x: auto;\n overflow-y: hidden;\n\n scrollbar-width: none;\n scrollbar-color: rgba(0, 0, 0, 0);\n\n &.big {\n font-size: 1rem;\n --border-radius-messages-small: 0;\n }\n\n &::-webkit-scrollbar {\n height: 0;\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, 0);\n }\n}\n",".DeleteChatModal {\n .modal-dialog {\n max-width: 20rem;\n }\n\n .modal-header {\n padding: 1.125rem 1.25rem 0;\n }\n\n .modal-title:not(:only-child) {\n margin: 0 0 0 .75rem;\n }\n\n .modal-content {\n padding: .5rem 1.25rem;\n }\n\n .confirm-dialog-button {\n margin-right: -.625rem;\n }\n}\n",".SearchInput {\n position: relative;\n width: 100%;\n color: rgba(var(--color-text-secondary-rgb), 0.5);\n background-color: var(--color-chat-hover);\n border: 2px solid var(--color-chat-hover);\n border-radius: 1.375rem;\n transition: border-color 0.15s ease;\n\n &.with-picker-item {\n display: flex;\n\n .icon-search {\n display: none;\n }\n\n input {\n padding-left: .5rem;\n }\n\n &[dir=rtl] {\n input {\n padding-right: .5rem;\n padding-left: 0;\n }\n }\n }\n\n &.has-focus {\n border-color: var(--color-primary);\n caret-color: var(--color-primary);\n background-color: var(--color-background);\n\n input {\n & + i {\n color: var(--color-primary);\n }\n }\n }\n\n input {\n height: 2.5rem;\n margin-bottom: 0;\n border: none !important;\n border-radius: 1.375rem;\n background-color: transparent !important;\n box-shadow: none !important;\n padding: calc(0.4375rem - var(--border-width)) calc(2.625rem - var(--border-width)) calc(0.5rem - var(--border-width)) calc(2.75rem - var(--border-width));\n\n &::placeholder {\n color: var(--color-placeholders);\n }\n }\n\n > i {\n position: absolute;\n top: .5rem;\n left: .75rem;\n font-size: 1.375rem;\n }\n\n .Loading {\n position: absolute;\n top: .5rem;\n right: .5rem;\n height: 1.5rem;\n\n .Spinner {\n --spinner-size: 1.5rem;\n }\n }\n\n .Button {\n position: absolute;\n top: .125rem;\n right: .125rem;\n font-size: 1rem;\n }\n\n @media (max-width: 600px) {\n input {\n height: 2.5rem;\n border-radius: 1.25rem;\n padding-left: calc(2.625rem - var(--border-width));\n }\n\n i {\n top: 0.5rem;\n }\n }\n\n &[dir=rtl] {\n input {\n direction: rtl;\n }\n\n > i {\n left: auto;\n right: .75rem;\n }\n\n .Loading {\n left: .5rem;\n right: auto;\n }\n\n .Button {\n left: .125rem;\n right: auto;\n }\n }\n}\n",".PickerSelectedItem {\n display: flex;\n align-items: center;\n background: var(--color-chat-hover);\n height: 2rem;\n min-width: 2rem;\n margin-left: 0.5rem;\n margin-bottom: 0.5rem;\n padding-right: 1rem;\n border-radius: 1rem;\n cursor: pointer;\n position: relative;\n overflow: hidden;\n flex-shrink: 1;\n transition: background-color .15s ease;\n\n max-width: calc(50% - 0.5rem);\n\n &.minimized {\n padding-right: 0;\n }\n\n &:hover {\n background-color: var(--color-item-active);\n }\n\n &.closeable:hover {\n background-color: rgba(var(--color-error-rgb), 0.16);\n\n .item-remove {\n opacity: 1;\n }\n\n .Avatar, .item-icon {\n opacity: 0;\n }\n }\n\n &.search-date {\n .item-remove {\n background: var(--color-primary);\n }\n\n &:hover {\n background: var(--color-chat-hover);\n }\n\n .item-name {\n font-size: 0.875rem;\n }\n }\n\n .SearchInput & {\n flex: 1 0 auto;\n position: relative;\n top: .25rem;\n left: -.125rem;\n\n color: var(--color-text-secondary);\n }\n\n .Avatar, .item-icon {\n width: 2rem;\n height: 2rem;\n opacity: 1;\n flex-shrink: 0;\n transition: opacity .15s ease;\n\n i {\n font-size: 2rem;\n }\n }\n\n .item-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0.375rem;\n border-radius: 50%;\n background-color: var(--color-primary);\n color: white;\n\n i {\n font-size: 1.25rem;\n position: relative;\n top: -1px;\n }\n }\n\n .item-name {\n margin-left: 0.5rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n .emoji.emoji-small {\n width: 1.125rem;\n height: 1.125rem;\n background-size: 1.125rem;\n vertical-align: -2px;\n }\n }\n\n .item-remove {\n position: absolute;\n left: 0;\n top: 0;\n width: 2rem;\n height: 2rem;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--color-error);\n font-size: 1.5rem;\n color: white;\n opacity: 0;\n transition: opacity .15s ease;\n }\n\n &[dir=rtl] {\n padding-left: 1rem;\n padding-right: 0;\n\n &.minimized {\n padding-right: 0;\n padding-left: 0;\n }\n\n .SearchInput & {\n left: auto;\n right: -.125rem;\n }\n\n .item-name {\n margin-left: 0;\n margin-right: 0.5rem;\n }\n\n .item-remove {\n left: auto;\n right: 0;\n }\n }\n}\n",".Switcher {\n display: inline-flex;\n align-items: center;\n position: relative;\n margin: 0;\n\n &.disabled {\n pointer-events: none;\n opacity: 0.5;\n }\n\n &.inactive {\n pointer-events: none;\n }\n\n body.animation-level-0 &,\n &.no-animation {\n .widget,\n .widget::after {\n transition: none !important;\n }\n\n .widget:active:after {\n width: 1.125rem;\n }\n }\n\n input {\n height: 0;\n width: 0;\n visibility: hidden;\n position: absolute;\n z-index: var(--z-below);\n opacity: 0;\n }\n\n .widget {\n cursor: pointer;\n text-indent: -999px;\n width: 2.125rem;\n height: 0.875rem;\n background: var(--color-gray);\n display: inline-block;\n border-radius: .5rem;\n position: relative;\n transition: background .2s ease-in;\n }\n\n .widget:after {\n content: '';\n position: absolute;\n top: -.125rem;\n left: 0;\n width: 1.125rem;\n height: 1.125rem;\n background: var(--color-background);\n border-radius: .75rem;\n transition: 0.2s ease-out;\n border: .125rem solid var(--color-gray);\n }\n\n input:checked + .widget {\n background: var(--color-primary);\n }\n\n input:checked + .widget:after {\n left: calc(100% - 1.125rem);\n transform: translateX(calc(-100% + 1.125rem));\n border-color: var(--color-primary);\n }\n\n .widget:active:after {\n width: 1.25rem;\n }\n}\n",".MessageOutgoingStatus {\n width: 1.19rem;\n height: 1.19rem;\n overflow: hidden;\n display: inline-block;\n line-height: 1;\n font-size: 1.1875rem;\n\n i {\n background: var(--background-color);\n }\n\n .icon-message-succeeded {\n padding-left: 0.13rem;\n }\n\n .Transition {\n width: 100%;\n height: 100%;\n }\n}\n",".LastMessageMeta {\n margin-right: .2rem;\n padding: .3rem 0 .15rem;\n flex-shrink: 0;\n font-size: 0.75rem;\n line-height: 1;\n display: flex;\n align-items: center;\n\n .MessageOutgoingStatus {\n color: var(--color-text-meta-colored);\n margin-right: 0.1rem;\n font-size: 1.15rem;\n\n body.is-ios & {\n margin-bottom: -.125rem;\n }\n }\n\n .time {\n color: var(--color-text-meta);\n line-height: 1.15rem;\n }\n}\n",".Badge-transition {\n opacity: 1;\n transition: transform .3s cubic-bezier(0.34, 1.56, 0.64, 1);\n\n &:not(.open) {\n transform: scale(0);\n opacity: 0;\n }\n\n &:not(.shown) {\n display: none;\n }\n\n &.closing {\n transition: transform .2s ease-out, opacity .2s ease-out;\n }\n}\n\n.Badge-wrapper {\n display: flex;\n\n .Badge {\n margin-inline-start: .5rem;\n }\n}\n\n.Badge {\n min-width: 1.5rem;\n height: 1.5rem;\n background: var(--color-gray);\n border-radius: 0.75rem;\n padding: 0 .4375rem;\n color: white;\n font-size: 0.875rem;\n line-height: 1.5625rem;\n font-weight: 500;\n text-align: center;\n flex-shrink: 0;\n\n body.is-macos & {\n line-height: 1.5rem;\n }\n\n body.is-ios & {\n line-height: 1.375rem;\n min-width: 1.375rem;\n height: 1.375rem;\n padding: 0 .375rem;\n }\n\n &.mention, &.unread:not(.muted) {\n background: var(--color-green);\n color: var(--color-white);\n }\n\n &.pinned:not(.unread) {\n color: var(--color-pinned);\n background: transparent;\n width: 1.5rem;\n padding: 0;\n\n i {\n font-size: 1.5rem;\n }\n }\n\n &.mention {\n width: 1.5rem;\n padding: 0.25rem;\n\n i {\n font-size: 1rem;\n vertical-align: super;\n }\n\n body.is-ios & {\n width: 1.375rem;\n padding: 0.25rem;\n\n i {\n font-size: .875rem;\n }\n }\n }\n}\n\n\n","\n@keyframes bar-animation-transform-1 {\n 0% { transform: scaleY(0.33); }\n 12.5% { transform: scaleY(1.66); }\n 25% { transform: scaleY(0.33); }\n 37.5% { transform: scaleY(1); }\n 50% { transform: scaleY(0.33); }\n 62.5% { transform: scaleY(1.66); }\n 75% { transform: scaleY(0.33); }\n 87.5% { transform: scaleY(1.66); }\n 100% { transform: scaleY(0.33); }\n}\n\n@keyframes bar-animation-transform-2 {\n 0% { transform: scaleY(1); }\n 12.5% { transform: scaleY(0.33); }\n 25% { transform: scaleY(1.66); }\n 37.5% { transform: scaleY(0.33); }\n 50% { transform: scaleY(1); }\n 62.5% { transform: scaleY(0.33); }\n 75% { transform: scaleY(1.66); }\n 87.5% { transform: scaleY(0.33); }\n 100% { transform: scaleY(1); }\n}\n\n\n.ChatCallStatus {\n position: absolute;\n right: 6px;\n bottom: 0;\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background-color: #0ac630;\n border: 2px solid var(--color-background);\n overflow: hidden;\n\n .indicator {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n & > div {\n width: 2px;\n height: 6px;\n background: var(--color-background);\n border-radius: 1px;\n margin: 1px;\n will-change: transform;\n transform: translateZ(0);\n }\n & > div:nth-child(odd) {\n transform: scaleY(0.8);\n }\n & > div:nth-child(even) {\n transform: scaleY(1.33);\n }\n }\n\n &.selected {\n background-color: var(--color-white);\n border-color: var(--color-chat-active);\n .indicator div{\n background-color: var(--color-chat-active);\n }\n }\n\n &.active .indicator {\n div:nth-child(odd) {\n animation: bar-animation-transform-2 3.2s normal infinite;\n }\n\n div:nth-child(even) {\n animation: bar-animation-transform-1 3.2s normal infinite;\n }\n }\n\n}\n",".Chat {\n --background-color: var(--color-background);\n\n body.is-ios &,\n body.is-macos & {\n --color-text-meta: var(--color-text-meta-apple);\n }\n\n position: absolute;\n top: 0;\n left: 0;\n margin: 0;\n width: 100%;\n\n &.animate-opacity {\n will-change: opacity;\n transition: opacity .2s ease-out;\n }\n\n &.animate-transform {\n will-change: transform;\n transition: transform .2s ease-out;\n }\n\n &:hover, &.ListItem.has-menu-open {\n .Avatar.online::after {\n border-color: var(--color-chat-hover);\n }\n }\n\n @media (max-width: 600px) {\n &.selected {\n --background-color: var(--color-chat-hover) !important;\n\n .Avatar.online::after {\n border-color: var(--color-chat-hover);\n }\n }\n }\n\n @media (min-width: 600px) {\n &.selected,\n &.selected:hover {\n --background-color: var(--color-chat-active) !important;\n\n .Avatar.online::after {\n border-color: var(--color-chat-active) !important;\n background: var(--color-white);\n }\n\n .ListItem-button {\n --background-color: var(--color-chat-active) !important;\n --color-text: var(--color-white);\n --color-text-meta-colored: var(--color-white);\n --color-text-meta: var(--color-white);\n --color-text-secondary: var(--color-white);\n --color-error: var(--color-white);\n --color-pinned: var(--color-white);\n }\n\n .icon-muted {\n color: var(--color-white) !important;\n }\n\n .Badge:not(.pinned) {\n background: var(--color-white);\n color: var(--color-chat-active);\n }\n }\n }\n\n @media (max-width: 600px) {\n .ListItem-button {\n border-radius: 0 !important;\n }\n }\n\n .status {\n position: relative;\n flex-shrink: 0;\n }\n\n .info {\n .subtitle {\n margin-top: -.125rem;\n }\n\n h3 {\n width: auto;\n max-width: 80%;\n }\n\n .icon-muted {\n font-size: 1.25rem;\n margin-left: 0.25rem;\n margin-top: -.0625rem;\n color: #C6C8CA;\n\n body.is-ios & {\n margin-top: 0;\n margin-right: .5rem;\n }\n }\n\n .LastMessageMeta {\n margin-left: auto;\n\n body.is-ios & {\n font-size: .875rem;\n margin-right: 0;\n }\n }\n\n .last-message, .typing-status {\n padding-right: 0.25rem;\n flex-grow: 1;\n color: var(--color-text-secondary);\n unicode-bidi: plaintext;\n\n &[dir=ltr] {\n text-align: left;\n }\n\n .sender-name {\n color: var(--color-text);\n }\n\n .draft {\n color: var(--color-error);\n }\n }\n\n .last-message {\n .draft {\n &::after {\n content: ': ';\n }\n }\n\n .colon {\n margin-inline-end: .25rem;\n }\n\n img {\n width: 1.25rem;\n height: 1.25rem;\n object-fit: cover;\n border-radius: .125rem;\n vertical-align: -.25rem;\n margin-inline-end: .25rem;\n\n body.is-ios & {\n width: 1.125rem;\n height: 1.125rem;\n vertical-align: -.1875rem;\n }\n\n &.round {\n border-radius: .625rem;\n }\n }\n\n .emoji-small {\n width: 1rem;\n height: 1rem;\n vertical-align: -.125rem;\n }\n\n .icon-play {\n position: relative;\n display: inline-block;\n font-size: .75rem;\n color: #fff;\n margin-inline-start: -1.25rem;\n margin-inline-end: 0.5rem;\n bottom: 0.0625rem;\n\n body.is-ios & {\n margin-inline-start: -1.125rem;\n bottom: 0;\n }\n }\n }\n }\n\n &[dir=rtl] {\n .info {\n .LastMessageMeta {\n margin-left: 0;\n margin-right: auto;\n }\n\n .title, .subtitle {\n padding-left: .15rem;\n padding-right: 0;\n }\n\n .icon-muted {\n margin-left: 0;\n margin-right: 0.25rem;\n }\n\n .last-message, .typing-status {\n padding-left: 0.5rem;\n padding-right: 0;\n text-align: right;\n unicode-bidi: plaintext;\n }\n }\n }\n}\n",".AnimatedEmoji {\n margin-bottom: 0.75rem;\n\n img {\n position: absolute;\n width: 100%;\n height: 100%;\n\n &.like-sticker-thumb {\n transform: scale(0.8);\n }\n }\n}\n",".EmptyFolder {\n width: 100%;\n height: 80%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n\n @media (max-height: 480px) {\n height: 100%;\n }\n\n .sticker {\n height: 8rem;\n margin-bottom: 1.875rem;\n }\n\n .title {\n font-size: 1.25rem;\n margin-bottom: .125rem;\n }\n\n .description {\n font-size: .875rem;\n color: var(--color-text-secondary);\n\n body.is-ios &,\n body.is-macos & {\n color: var(--color-text-secondary-apple);\n }\n }\n\n .Button.pill {\n margin-top: .625rem;\n font-weight: 500;\n padding-inline-start: .75rem;\n unicode-bidi: plaintext;\n\n i {\n margin-inline-end: .625rem;\n font-size: 1.5rem;\n }\n }\n}\n",".NothingFound {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-text-meta);\n\n &.with-description {\n flex-direction: column;\n }\n\n .AnimatedSticker {\n margin: 0 auto;\n }\n\n .description {\n color: var(--color-text-secondary);\n font-size: .875rem;\n text-align: center;\n margin: 1rem 0 0;\n unicode-bidi: plaintext;\n }\n}\n",".Media {\n height: 0;\n padding-bottom: 100%;\n overflow: hidden;\n position: relative;\n cursor: pointer;\n\n .video-duration {\n position: absolute;\n left: .25rem;\n top: .25rem;\n background: rgba(0, 0, 0, .25);\n color: #fff;\n font-size: .75rem;\n padding: 0 .3125rem;\n border-radius: .1875rem;\n line-height: 1.125rem;\n }\n\n img {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n}\n",".WebLink {\n min-height: 3rem;\n padding: .25rem 0 0 3.75rem;\n font-size: 0.875rem;\n line-height: 1.125rem;\n position: relative;\n\n & + & {\n margin-top: 1.5rem;\n }\n\n &.without-media::before {\n content: attr(data-initial);\n width: 3rem;\n height: 3rem;\n position: absolute;\n left: 0;\n top: 0;\n background-color: var(--color-webpage-initial-background);\n color: #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--border-radius-messages-small);\n text-transform: uppercase;\n font-weight: 500;\n font-size: 1.5rem;\n }\n\n .Media {\n position: absolute;\n left: 0;\n top: 0;\n width: 3rem;\n height: 3rem;\n cursor: default !important;\n padding-bottom: unset !important;\n border-radius: var(--border-radius-messages-small) !important;\n }\n\n .site-name,\n .site-description,\n .site-title {\n word-break: break-word;\n text-align: initial;\n }\n\n .site-name {\n display: block;\n color: var(--color-links);\n font-weight: 400;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .site-title {\n font-size: 1rem;\n font-weight: 400;\n margin-bottom: .0625rem;\n line-height: 1.3125rem;\n }\n\n .sender-name,\n .site-description {\n margin-bottom: 0;\n color: var(--color-text-secondary);\n line-height: 1.125rem;\n max-height: 2.25rem;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .sender-name {\n margin-top: .25rem;\n }\n\n .site-description .emoji {\n width: 1rem !important;\n height: 1rem !important;\n }\n\n &[dir=rtl] {\n padding: .25rem 3.75rem 0 0;\n\n .Media,\n &.without-media::before {\n left: auto;\n right: 0;\n }\n\n .content {\n text-align: right;\n }\n }\n}\n",".File {\n --secondary-color: var(--color-text-secondary);\n\n .Message.own & {\n --secondary-color: var(--color-text-green);\n }\n\n .content-inner & {\n min-width: 14rem;\n @media (max-width: 340px) {\n min-width: 11rem;\n }\n }\n\n display: flex;\n align-items: center;\n\n .file-icon-container {\n position: relative;\n }\n\n .file-progress,\n .file-icon,\n .file-preview {\n width: 3.375rem;\n height: 3.375rem;\n margin-inline-end: .75rem;\n border-radius: var(--border-radius-messages-small);\n background: var(--color-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .file-progress {\n position: absolute;\n top: 0;\n left: 0;\n }\n\n .file-icon {\n padding: 1rem .75rem .5rem;\n align-items: flex-end;\n flex-shrink: 0;\n position: relative;\n color: white;\n\n .file-ext {\n font-size: 1rem;\n font-weight: 500;\n transition: opacity .15s;\n }\n\n &::after {\n content: \"\";\n display: block;\n position: absolute;\n top: 0;\n right: 0;\n border-bottom-left-radius: 0.25rem;\n background: rgba(black, 0.25);\n border-color: transparent var(--background-color) transparent var(--background-color);\n border-width: 0 1.125rem 1.125rem 0;\n border-style: solid;\n transition: border-width .15s ease-in;\n }\n }\n\n .file-preview {\n background: transparent;\n overflow: hidden;\n\n & + .action-icon,\n & + .file-progress {\n background: rgba(black, 0.5);\n border-radius: var(--border-radius-messages-small);\n }\n\n img {\n object-fit: cover;\n }\n }\n\n .action-icon {\n color: #fff;\n font-size: 1.5rem;\n position: absolute;\n top: 0;\n start: 0;\n width: 3.375rem;\n height: 3.375rem;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity .25s;\n }\n\n &.interactive .file-icon-container {\n cursor: pointer;\n\n &:hover {\n .file-icon::after {\n border-width: 0;\n }\n\n .action-icon {\n opacity: 1;\n\n &.hidden {\n opacity: 0;\n }\n }\n\n .file-ext {\n opacity: 0;\n }\n }\n }\n\n .file-info {\n margin-top: .1875rem;\n margin-right: .125rem;\n white-space: nowrap;\n overflow: hidden;\n flex-grow: 1;\n\n & + .Link {\n font-size: .75rem;\n color: var(--color-text-secondary);\n padding-left: 1rem;\n white-space: nowrap;\n }\n }\n\n .file-title {\n font-size: 1rem;\n line-height: 1.5rem;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n\n .emoji {\n vertical-align: -4px;\n }\n }\n\n .file-subtitle {\n font-size: .875rem;\n line-height: .9375rem;\n color: var(--secondary-color);\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n\n span + span {\n &::before {\n content: '\\00a0\\2022\\00a0';\n }\n }\n }\n\n &.smaller {\n --background-color: var(--color-background);\n --border-radius-messages-small: .3125rem;\n\n .action-icon,\n .file-progress,\n .file-icon,\n .file-preview {\n width: 3rem;\n height: 3rem;\n }\n\n .file-icon {\n padding-bottom: .375rem;\n\n &::after {\n border-width: 0 1rem 1rem 0;\n }\n }\n\n .file-info {\n margin-top: -.125rem;\n }\n\n .file-title {\n font-weight: 400;\n }\n\n .file-subtitle {\n line-height: 1rem;\n }\n }\n\n &:dir(rtl),\n &[dir=rtl] {\n .file-progress,\n .file-icon,\n .file-preview {\n margin-left: .75rem;\n margin-right: 0;\n }\n\n .file-info {\n text-align: right;\n\n & + .Link {\n padding-left: 0;\n padding-right: 1rem;\n }\n }\n\n .action-icon {\n left: auto;\n right: 0;\n }\n }\n}\n\n// Document extension colors\n.File .file-progress,\n.File .file-icon {\n &.red {\n background-color: var(--color-error);\n }\n\n &.orange {\n background-color: var(--color-warning);\n }\n\n &.green {\n background-color: var(--color-text-green);\n }\n}\n",".Audio {\n display: flex;\n align-items: flex-start;\n position: relative;\n\n .media-loading {\n position: absolute;\n pointer-events: none;\n\n &.interactive {\n pointer-events: all;\n }\n }\n\n &.own {\n --color-text-secondary: var(--accent-color);\n --color-interactive-active: var(--color-text-green);\n --color-interactive-inactive: rgba(var(--color-text-green-rgb), 0.4);\n --color-interactive-buffered: rgba(var(--color-text-green-rgb), 0.4); // Overlays underlying inactive color\n\n .theme-dark & {\n --color-text-green-rgb: 255, 255, 255;\n --color-text-green: var(--color-white);\n }\n\n .Button {\n --color-primary: var(--color-text-green);\n --color-primary-shade: var(--color-green);\n --color-primary-shade-darker: var(--color-green-darker);\n --color-white: var(--color-background-own);\n\n .theme-dark & {\n --color-primary-shade: #fff;\n --color-primary-shade-darker: #fff;\n }\n }\n }\n\n .toggle-play {\n margin-inline-end: .5rem;\n\n &.translucent-white {\n color: rgba(255, 255, 255, 0.8);\n }\n\n &.smaller {\n width: 3rem;\n height: 3rem;\n margin-inline-end: .75rem;\n\n i {\n font-size: 1.625rem;\n\n &.icon-pause {\n font-size: 1.5625rem;\n }\n }\n }\n\n i {\n position: absolute;\n\n &.icon-play {\n margin-left: .1875rem;\n @media (max-width: 600px) {\n margin-left: .125rem;\n }\n }\n }\n\n .icon-play, .icon-pause {\n opacity: 1;\n transform: scale(1);\n transition: opacity .4s, transform .6s cubic-bezier(0.34, 1.56, 0.64, 1);\n }\n\n &.play .icon-pause,\n &.pause .icon-play,\n &.loading .icon-play,\n &.loading .icon-pause {\n opacity: 0;\n transform: scale(.5);\n }\n }\n\n .download-button {\n position: absolute;\n width: 1.1875rem !important;\n height: 1.1875rem !important;\n padding: 0;\n left: 1.9375rem;\n top: 1.9375rem;\n border: .125rem solid var(--background-color);\n z-index: 1;\n\n i {\n font-size: 0.8125rem;\n }\n }\n\n &.bigger .download-button {\n left: 2rem;\n top: 2rem;\n border: .125rem solid var(--color-background);\n }\n\n .content {\n align-self: center;\n min-width: 0;\n flex-grow: 1;\n text-align: initial;\n }\n\n .content-row {\n display: flex;\n justify-content: space-between;\n }\n\n .title {\n font-weight: 500;\n margin: 0;\n line-height: 1.25;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n canvas {\n height: 23px;\n }\n\n .voice-duration {\n margin: .25rem 0 0;\n font-size: .875rem;\n color: var(--color-text-secondary);\n font-variant-numeric: tabular-nums;\n display: flex;\n align-items: flex-end;\n\n &.unread::after {\n content: '';\n position: relative;\n margin: 0 0 .375rem .25rem;\n width: 0.4375rem;\n height: 0.4375rem;\n border-radius: 50%;\n background-color: var(--accent-color);\n }\n }\n\n body.is-ios & {\n .voice-duration.unread::after {\n margin-bottom: .4375rem;\n }\n }\n\n &:not(.own) .voice-duration span {\n color: var(--color-primary);\n }\n\n .waveform {\n cursor: pointer;\n margin-left: 1px;\n touch-action: none;\n }\n\n .meta,\n .performer,\n .date {\n font-size: .875rem;\n color: var(--color-text-secondary);\n margin: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n unicode-bidi: plaintext;\n }\n\n .duration {\n font-size: .875rem;\n color: var(--color-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n flex-shrink: 0;\n font-variant-numeric: tabular-nums;\n }\n\n .meta {\n display: flex;\n align-items: center;\n margin-top: 0.125rem;\n padding-inline-end: 0.5rem;\n\n & > span {\n min-width: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .performer {\n flex-shrink: 0;\n }\n\n .duration.with-seekline {\n margin-inline-end: 0.625rem;\n }\n\n .bullet {\n margin: 0 0.25rem;\n flex-shrink: 0;\n }\n }\n\n .seekline {\n flex-grow: 1;\n height: 1.25rem;\n position: relative;\n top: 3px;\n cursor: pointer;\n touch-action: none;\n\n &::before {\n content: '';\n position: absolute;\n width: 100%;\n top: 6px;\n height: 2px;\n background-color: var(--color-interactive-inactive);\n border-radius: 2px;\n }\n }\n\n .seekline-buffered-progress, .seekline-play-progress {\n position: absolute;\n height: 2px;\n border-radius: 2px;\n overflow: hidden;\n width: 100%;\n top: 6px;\n\n i {\n position: absolute;\n width: 100%;\n background-color: var(--color-interactive-active);\n height: 2px;\n border-radius: 2px;\n right: 100%;\n }\n }\n\n .seekline-buffered-progress i {\n background-color: var(--color-interactive-buffered) !important;\n }\n\n .seekline-thumb {\n position: absolute;\n width: 100%;\n top: 7px;\n left: 0;\n\n i {\n pointer-events: none;\n position: absolute;\n width: 100%;\n right: 100%;\n\n &::after {\n content: '';\n position: absolute;\n top: -6px;\n right: -6px;\n width: 12px;\n height: 12px;\n border-radius: 6px;\n background: var(--color-interactive-active);\n }\n }\n }\n\n &.bigger {\n .title {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-weight: 400;\n line-height: 1.5rem;\n }\n\n .meta {\n height: 1.25rem;\n }\n\n .performer,\n .date {\n line-height: 1.0625rem;\n }\n\n .duration {\n line-height: 1rem;\n }\n\n .media-loading {\n top: 0.1875rem;\n left: 0.1875rem;\n }\n\n &[dir=rtl] {\n .media-loading {\n left: auto !important;\n right: 0;\n }\n }\n }\n\n .ProgressSpinner.size-s svg {\n width: 2.25rem;\n height: 2.25rem;\n }\n\n &[dir=rtl] {\n &:last-child {\n margin-bottom: 0.625rem;\n }\n\n .toggle-play {\n margin-left: .5rem;\n margin-right: 0;\n\n &.smaller {\n margin-left: .75rem;\n margin-right: 0;\n }\n }\n\n .meta.duration.with-seekline {\n margin-inline-start: 0.625rem;\n }\n\n .content,\n .duration {\n text-align: right;\n }\n\n .download-button {\n left: auto;\n right: 2rem;\n }\n }\n}\n\n.has-replies .Audio[dir=rtl] {\n margin-bottom: 1.625rem;\n}\n",".ProfilePhoto {\n width: 100%;\n height: 100%;\n cursor: pointer;\n position: relative;\n\n img:not(.emoji) {\n width: 100%;\n object-fit: cover;\n }\n\n .prev-avatar-media {\n position: absolute;\n left: 0;\n top: 0;\n z-index: -1;\n }\n\n .spinner-wrapper {\n width: 100%;\n height: 100%;\n }\n\n .spinner-wrapper,\n &.deleted-account,\n &.replies-bot-account,\n &.no-photo,\n &.saved-messages {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-white);\n background: linear-gradient(var(--color-white) -125%, var(--color-user));\n cursor: default;\n }\n\n &.no-photo {\n font-size: 14rem;\n }\n\n &.replies-bot-account,\n &.deleted-account,\n &.saved-messages {\n font-size: 20rem;\n }\n}\n",".ProfileInfo {\n aspect-ratio: 1 / 1;\n position: relative;\n\n @supports not (aspect-ratio: 1 / 1) {\n &::before {\n float: left;\n padding-top: 100%;\n content: \"\";\n }\n\n &::after {\n display: block;\n content: \"\";\n clear: both;\n }\n }\n\n .photo-wrapper {\n width: 100%;\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n\n > .Transition {\n width: 100%;\n height: 100%;\n }\n }\n\n .photo-dashes {\n position: absolute;\n width: 100%;\n height: .125rem;\n padding: 0 .375rem;\n z-index: 1;\n\n display: flex;\n top: .5rem;\n left: 0;\n }\n\n .photo-dash {\n flex: 1 1 auto;\n background-color: var(--color-white);\n opacity: .25;\n border-radius: .125rem;\n margin: 0 .125rem;\n\n &.current {\n opacity: .75;\n }\n }\n\n .navigation {\n position: absolute;\n top: 0;\n bottom: 0;\n width: 25%;\n border: none;\n padding: 0;\n margin: 0;\n appearance: none;\n background: transparent no-repeat;\n background-size: 1.25rem;\n opacity: .25;\n transition: opacity .15s;\n outline: none;\n cursor: pointer;\n z-index: 1;\n\n &:hover, .is-touch-env & {\n opacity: 1;\n }\n\n &.prev {\n left: 0;\n background-image: url(\"../../assets/media_navigation_previous.svg\");\n background-position: 1.25rem 50%;\n }\n\n &.next {\n right: 0;\n background-image: url(\"../../assets/media_navigation_next.svg\");\n background-position: calc(100% - 1.25rem) 50%;\n }\n }\n\n .info {\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n min-height: 100px;\n padding: 0 1.5rem .5rem;\n background: linear-gradient(0deg, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0) 100%);\n color: var(--color-white);\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n pointer-events: none;\n\n &:dir(rtl) {\n .status {\n text-align: right;\n unicode-bidi: plaintext;\n }\n }\n\n &[dir=rtl] {\n .status {\n text-align: right;\n unicode-bidi: plaintext;\n }\n }\n }\n\n .title {\n display: flex;\n align-items: center;\n\n h3 {\n font-weight: 500;\n font-size: 1.25rem;\n line-height: 1.375rem;\n white-space: pre-wrap;\n word-break: break-word;\n margin-bottom: .25rem;\n }\n\n .VerifiedIcon {\n margin-left: 0.25rem;\n margin-top: -0.125rem;\n }\n\n .emoji {\n width: 1.5rem;\n height: 1.5rem;\n background-size: 1.5rem;\n }\n }\n\n .status {\n font-size: 0.875rem;\n opacity: .5;\n }\n\n &[dir=rtl] {\n .navigation.prev {\n left: auto;\n right: 0;\n transform: scaleX(-1);\n }\n\n .navigation.next {\n left: 0;\n right: auto;\n transform: scaleX(-1);\n }\n }\n\n &.self {\n margin: 0 -.5rem .75rem;\n overflow: hidden;\n\n &.ghost {\n margin: 0;\n }\n\n .prev-avatar-media {\n z-index: 0;\n }\n\n .info {\n padding-bottom: .75rem;\n }\n\n .status {\n line-height: 1rem;\n }\n }\n}\n",".DropTarget {\n border-radius: var(--border-radius-default);\n background: var(--color-background);\n padding: 1.25rem;\n flex: 1 1 auto;\n width: 100%;\n max-width: 43.75rem;\n margin-left: auto;\n margin-right: auto;\n margin-bottom: .3125rem;\n display: flex;\n color: #A4ACB3;\n box-shadow: 0 1px 2px var(--color-default-shadow);\n\n @media (max-height: 350px) {\n padding: .75rem;\n }\n\n &.hovered .target-content {\n color: var(--color-primary);\n background-image: var(--drag-target-border-hovered);\n }\n\n & + & {\n margin-top: .3125rem;\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n\n .target-content {\n pointer-events: none;\n background-image: var(--drag-target-border);\n border-radius: .5rem;\n flex: 1 1 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n transition: .2s color, .2s background;\n }\n\n .icon {\n font-size: 6.25rem;\n line-height: 4.6875rem;\n margin-bottom: 2.25rem;\n\n @media (max-height: 520px) {\n font-size: 4.25rem;\n line-height: 3.5rem;\n margin-bottom: 1rem;\n }\n\n @media (max-height: 450px) {\n font-size: 2rem;\n line-height: 1rem;\n margin-bottom: .5rem;\n margin-top: .25rem;\n }\n }\n\n .title {\n font-size: 1.3125rem;\n font-weight: 500;\n letter-spacing: -.18px;\n\n @media (max-height: 450px) {\n font-size: 1rem;\n }\n }\n\n .description {\n font-size: 1rem;\n letter-spacing: .3px;\n\n @media (max-height: 450px) {\n font-size: .875rem;\n }\n }\n}\n",".FloatingActionButton {\n position: absolute;\n right: 1rem;\n bottom: 1rem;\n transform: translateY(calc(5rem - var(--group-call-header-height, 0rem)));\n transition: transform .25s cubic-bezier(0.34, 1.56, 0.64, 1);\n\n body.animation-level-0 & {\n transition: none !important;\n }\n\n &.revealed {\n transform: translateY(calc(0rem - var(--group-call-header-height, 0rem)));\n }\n}\n","@import '../../styles/mixins';\n\n@mixin thumb-styles() {\n background: var(--slider-color);\n border: none;\n height: 0.75rem;\n width: 0.75rem;\n border-radius: 50%;\n cursor: pointer;\n transform: scale(1);\n transition: transform .25s ease-in-out;\n\n &:hover {\n transform: scale(1.2);\n }\n}\n\n.RangeSlider {\n --slider-color: var(--color-primary);\n\n margin-bottom: 1rem;\n\n &.disabled {\n pointer-events: none;\n --slider-color: var(--color-text-secondary);\n }\n\n .slider-top-row {\n display: flex;\n justify-content: space-between;\n margin-bottom: 0.625rem;\n\n .value {\n flex-shrink: 0;\n margin-left: 1rem;\n color: var(--color-text-secondary);\n }\n\n &[dir=rtl] {\n .value {\n margin-left: 0;\n margin-right: 1rem;\n }\n }\n }\n\n .slider-main {\n position: relative;\n z-index: 1;\n\n &::before {\n content: '';\n position: absolute;\n width: 100%;\n left: 0;\n top: 0.3125rem;\n height: 0.125rem;\n background-color: var(--color-borders);\n border-radius: 0.125rem;\n opacity: 0.5;\n z-index: -1;\n }\n }\n\n .slider-fill-track {\n position: absolute;\n width: 100%;\n left: 0;\n top: 0.3125rem;\n height: 0.125rem;\n background-color: var(--slider-color);\n border-radius: 0.125rem;\n pointer-events: none;\n }\n\n // Reset range input browser styles\n @include reset-range();\n\n // Apply custom styles\n input[type=\"range\"] {\n // Note that while we're repeating code here, that's necessary as you can't comma-separate these type of selectors.\n // Browsers will drop the entire selector if it doesn't understand a part of it.\n &::-webkit-slider-thumb {\n @include thumb-styles();\n }\n\n &::-moz-range-thumb {\n @include thumb-styles();\n }\n\n &::-ms-thumb {\n @include thumb-styles();\n }\n }\n\n .slider-options {\n display: grid;\n grid-template-rows: auto;\n grid-auto-columns: 1fr;\n grid-auto-flow: column;\n }\n\n .slider-option {\n font-size: 0.825rem;\n text-align: center;\n cursor: pointer;\n color: var(--color-text-secondary);\n transition: color .2s ease;\n\n &:hover, &.active {\n color: var(--color-text);\n }\n\n &.active {\n font-weight: 500;\n }\n\n &:first-child {\n text-align: left;\n }\n\n &:last-child {\n text-align: right;\n }\n }\n}\n","// @optimization\n@mixin while-transition() {\n .Transition > div:not(.active) &, body.animating-right-column & {\n @content;\n }\n}\n\n@mixin overflow-y-overlay() {\n @supports (overflow-y: overlay) {\n overflow-y: overlay;\n\n //Workaround for Android <= 9\n overflow-x: hidden;\n }\n}\n\n@mixin reset-range() {\n input[type=\"range\"] {\n -webkit-appearance: none;\n display: block;\n width: 100%;\n height: 0.75rem;\n margin-bottom: 0.5rem;\n background: transparent;\n\n &:focus {\n outline: none;\n }\n\n &::-ms-track {\n width: 100%;\n cursor: pointer;\n\n background: transparent;\n border-color: transparent;\n color: transparent;\n }\n\n &::-webkit-slider-thumb {\n -webkit-appearance: none;\n }\n\n &::-moz-slider-thumb {\n -moz-appearance: none;\n }\n\n &::-webkit-slider-runnable-track {\n cursor: pointer;\n }\n\n &::-moz-range-track, &::-moz-range-progress {\n cursor: pointer;\n }\n }\n}\n",".DropArea {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n height: 100vh;\n z-index: var(--z-drop-area);\n padding: 80px 20px 20px;\n\n display: flex;\n flex-direction: column;\n\n #Main.right-column-open & {\n max-width: calc(100% - var(--right-column-width));\n }\n}\n",".StickerButton {\n display: inline-block;\n width: 4rem;\n height: 4rem;\n margin: 0.5rem;\n border-radius: var(--border-radius-messages-small);\n background: transparent no-repeat center;\n background-size: contain;\n transition: background-color .15s ease, opacity .3s ease !important;\n position: relative;\n\n &.interactive {\n cursor: pointer;\n\n &:hover {\n background-color: var(--color-interactive-element-hover);\n\n .sticker-unfave-button {\n opacity: 1;\n }\n }\n\n }\n\n @media (max-width: 600px) {\n margin: 0.25rem;\n }\n\n &.set-button {\n width: 2.75rem !important;\n height: 2.75rem;\n margin: 0 0.5rem;\n }\n\n &.large {\n width: 10rem;\n height: 10rem;\n margin: 0;\n }\n\n .AnimatedSticker, img {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n\n img {\n object-fit: contain;\n }\n\n .sticker-unfave-button {\n position: absolute;\n top: -0.5rem;\n right: -0.5rem;\n width: 1.25rem;\n height: 1.25rem;\n padding: 0.125rem;\n\n i {\n font-size: 1rem;\n }\n\n opacity: 0;\n }\n}\n",".TextFormatter {\n transform: translate(-50%, -3.25rem);\n\n &, &-link-control {\n position: absolute;\n background: var(--color-background);\n border-radius: var(--border-radius-messages);\n padding: 0.5rem 0.375rem;\n box-shadow: 0 1px 2px var(--color-default-shadow);\n }\n\n &-link-control {\n left: 0;\n top: 0;\n opacity: 0;\n pointer-events: none;\n transition: opacity .3s ease;\n\n .Modal & {\n max-width: 100%;\n }\n\n @media (max-width: 600px) {\n max-width: calc(100vw - var(--text-formatter-left) + 3rem);\n }\n\n input {\n border: none !important;\n outline: none !important;\n width: 100%;\n color: var(--color-text);\n background-color: var(--color-background);\n }\n }\n\n &-buttons, &-link-url-confirm {\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n }\n\n &-divider {\n width: 1px;\n height: 1.75rem;\n margin: 0 0.25rem;\n background-color: var(--color-borders);\n }\n\n &-link-url-input-wrapper {\n width: 20rem;\n position: relative;\n max-width: 100%;\n\n @media (max-width: 600px) {\n max-width: 90vw;\n }\n\n &::before, &::after {\n content: \"\";\n display: block;\n position: absolute;\n top: 0;\n bottom: 0;\n width: 1rem;\n z-index: 2;\n opacity: 0;\n transition: opacity .2s ease;\n }\n\n &::before {\n left: 0;\n background: linear-gradient(to right, var(--color-background) .25rem, transparent 1rem)\n }\n\n &::after {\n right: 0;\n background: linear-gradient(to left, var(--color-background) .25rem, transparent 1rem)\n }\n\n &.mask-left {\n &::before {\n opacity: 1;\n }\n }\n\n &.mask-right {\n &::after {\n opacity: 1;\n }\n }\n }\n\n &-link-url-confirm {\n flex-shrink: 0;\n opacity: 0;\n transition: opacity .3s ease;\n\n &.shown {\n opacity: 1;\n }\n }\n\n &.link-control-shown {\n .TextFormatter-link-control {\n opacity: 1;\n pointer-events: all;\n }\n }\n\n .Button {\n width: 2rem;\n height: 2rem;\n padding: 0.25rem;\n font-size: 1.5rem;\n margin: 0 0.125rem;\n border-radius: var(--border-radius-messages-small);\n flex-shrink: 0;\n cursor: pointer;\n\n &.active {\n background-color: var(--color-primary) !important;\n color: white;\n }\n\n &.disabled {\n opacity: .5;\n pointer-events: none;\n }\n }\n}\n",".Picker {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n\n .picker-header {\n padding: 0 1rem 0.25rem 0.75rem;\n border-bottom: 1px solid var(--color-borders);\n display: flex;\n flex-flow: row wrap;\n flex-shrink: 0;\n\n overflow-y: auto;\n max-height: 20rem;\n\n .input-group {\n margin-bottom: 0.5rem;\n margin-left: 0.5rem;\n flex-grow: 1;\n }\n\n .form-control {\n height: 2rem;\n border: none;\n border-radius: 0;\n padding: 0;\n box-shadow: none;\n }\n }\n\n .picker-list {\n flex-grow: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 0.5rem;\n\n @media (max-width: 600px) {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n }\n\n .no-results {\n height: 100%;\n margin: 0;\n padding: 1rem 1rem;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-text-secondary);\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"435.15d3c1acaf8d2000388e.css","mappings":"AAAA,YACE,kBAEA,cACE,WACA,YACA,wCACA,gCAEA,oCACE,kBACA,MACA,OAGF,+CACE,wBAKJ,kCACE,2BAQA,sBACE,2BAIA,kCACE,4CAGF,gCACE,2CAMJ,gCACE,4BAIA,4CACE,qDAGF,0CACE,sDAOJ,+BACE,4BAIA,2CACE,4CAGF,yCACE,2CAKF,yCACE,2BAIA,qDACE,qDAGF,mDACE,sDAWN,2BACE,wCAGF,6BACE,4BAIA,yCACE,gCAGF,uCACE,+BAMJ,uCACE,6BAIA,mDACE,yCAGF,iDACE,0CASJ,6BACE,sBACA,wBACA,UAGF,2BACE,sBACA,6BACA,UAIA,uCACE,+FAGF,qCACE,6FAMJ,uCACE,wBACA,UAGF,qCACE,8BACA,UAIA,iDACE,iHAGF,+CACE,mHASJ,4BACE,wBACA,mBACA,UAGF,0BACE,wBACA,UAMA,sCACE,qCAGF,oCACE,gEAMJ,sCACE,mBAGF,oCACE,sBAIA,gDACE,mFAGF,8CACE,sFASJ,uBACE,UAGF,qBACE,UAIA,iCACE,qCAGF,+BACE,oCASN,yBACE,4CACA,gBAEA,6BACE,mCAGF,6BACE,2BAIA,yCACE,mDAGF,uCACE,2CAMJ,uCACE,2BACA,YAIA,mDACE,qDAGF,iDACE,6DAUJ,2BACE,mCAGF,6BACE,wBACA,mBACA,UAEA,4CACE,uCAEA,qEACE,wCAKN,2BACE,2BAIA,uCACE,mCAGF,qCACE,uCAMJ,qCACE,qBAIA,iDACE,iDAGF,+CACE,6CASJ,uBACE,gEAIA,iCACE,kCAMJ,mCACE,0DAGF,iCACE,sCAIA,6CACE,6CAGF,2CACE,eASR,2BACE,GACE,UAEF,KACE,WAIJ,4BACE,GACE,UAEF,KACE,WAIJ,qCACE,GACE,UAEF,KACE,WAIJ,sCACE,GACE,UAEF,KACE,WAOJ,oBACE,GACE,2BAEF,KACE,yBAIJ,qBACE,GACE,wBAEF,KACE,6BAIJ,8BACE,GACE,wBAEF,KACE,4BAIJ,+BACE,GACE,4BAEF,KACE,yBAOJ,uBACE,GACE,4BAEF,KACE,yBAIJ,wBACE,GACE,wBAEF,KACE,8BAIJ,iCACE,GACE,wBAEF,KACE,6BAIJ,kCACE,GACE,6BAEF,KACE,yBAOJ,8BACE,GACE,6BAEF,KACE,yBAIJ,+BACE,GACE,wBAEF,KACE,+BAIJ,wCACE,GACE,wBAEF,KACE,8BAIJ,yCACE,GACE,8BAEF,KACE,yBAOJ,6BACE,GACE,qBAEF,KACE,oBAIJ,uCACE,GACE,mBAEF,KACE,sBAIJ,wCACE,GACE,sBAEF,KACE,oBAOJ,4BACE,GACE,wBACA,UAEF,KACE,2BACA,iDAIJ,sCACE,GACE,2BACA,gDAEF,KACE,wBACA,WAQJ,oBACE,GACE,mBACA,UAEF,KACE,qBACA,WAIJ,8BACE,GACE,qBACA,UAEF,KACE,mBACA,WAOJ,wBACE,GACE,2BAEF,KACE,yBAIJ,kCACE,GACE,wBAEF,KACE,4BAOJ,qBACE,GACE,gEAEF,KACE,2DAOJ,+BACE,GACE,0DAEF,KACE,iE;AC1pBJ,QACE,mCACA,UACA,mBACA,uBACA,eACA,gBACA,kBACA,wEACA,WACA,iBACA,aACA,mBACA,gEAEA,wBACE,kBAGF,eACE,WACA,YAGF,UACE,iBAEA,4BACE,qBAIJ,mBACE,WACA,YACA,mBAEA,0BACE,eACA,gBAIJ,kBACE,WACA,YACA,kBAEA,yBACE,cACA,eAIJ,mBACE,eACA,gBACA,kBAEA,0BACE,cACA,eAIJ,oBACE,cACA,eACA,oBAEA,2BACE,WACA,YAIJ,mBACE,oBAEA,qBACE,iBAGF,0BACE,gBACA,iBAIJ,mBACE,aACA,cACA,iBAEA,qBACE,eAGF,0BACE,aACA,cAIJ,eACE,kBAEA,sBACE,WACA,cACA,kBACA,cACA,aACA,cACA,eACA,kBACA,yCACA,yBACA,cAIJ,oBACE,eAGF,wBACE,WACA,Y;AChIJ,iBACE,kBACA,UACA,eACA,gBACA,qFACA,kBACA,eAEA,0BACE,kCACA,oBAGF,wBACE,sBAEA,+BACE,WACA,kBACA,eACA,gBACA,sBACA,sBACA,SACA,QACA,qCAIJ,gDACE,WACA,YACA,iFAEA,8DACE,sBACA,aACA,cAIJ,yBACE,cACA,eAEA,6BACE,WACA,YACA,eAGF,gCACE,iBAIJ,6BACE,wCAGF,qBACE,cACA,yBACA,yBACA,yDAGF,wBACE,iCAIJ,oCACE,KACE,uBAEF,GACE,0+B;AC9EJ,OACE,kBACA,uBAGE,4IACE,gBAKF,gCACE,gBAKF,4BACE,gBAKF,4BACE,gBAIJ,wBACE,eACA,MACA,SACA,OACA,QACA,aACA,uBACA,mBAGF,uBACE,eACA,MACA,QACA,SACA,OACA,WACA,iCAGF,4CACE,6BAGF,qBACE,kBACA,oBACA,sBACA,WACA,gBACA,kBACA,iBACA,yCACA,8DACA,2CACA,mCAEA,+CAEA,4CACE,gBACA,0BAGF,yBApBF,qBAqBI,yCAIJ,0BACE,+BAGF,6BACE,kCAGF,oDACE,oBACA,aACA,mBACA,cAGF,oBACE,kBACA,gBACA,cACA,gBACA,uBAEA,qCACE,mBAIJ,+BAEE,4CAEA,oDACE,kBACA,eACA,WACA,qBACA,iBACA,qBACA,sBACA,eAIJ,sBACE,WACA,YACA,aACA,gBAEA,qDAEE,sBAIJ,kEAGE,uBACA,mBAGF,uBACE,aACA,qBAEA,qEACE,iBAIJ,8BACE,WACA,YACA,iBACA,iBACA,gBACA,qB;AC3JJ,UACE,kBAGE,oGACE,WACA,kBACA,SACA,YACA,QACA,iBACA,iCAGF,oFACE,cAGF,8EACE,OAMF,oDACE,gBACA,uBAIJ,2BACE,WACA,yCACA,uBACA,2BACA,wBACA,aACA,aACA,kBACA,gBACA,mBACA,mBACA,wBACA,2CACA,mCAEA,6BACE,iBACA,kBACA,kCAIJ,oFACE,mBACA,uBAIA,uCACE,kBACA,WAIJ,mBACE,oBAEA,oCACE,WAKF,0DACE,eAEA,gFACE,4BAGF,qBACE,gIACE,6CAIJ,yBACE,iEACE,6CAMR,yBAGI,4HACE,yDAKN,yCACE,4CAGF,iBACE,qBAEA,kCACE,mBAIJ,mBACE,oBAGF,gBACE,4CAIA,uCACE,yBAEA,yCACE,cAKN,uBACE,kBAEA,+BACE,WAEA,gDACE,6BACA,8BAKN,8BACE,iBAEA,sFAEE,0DAGF,+CACE,iBAGF,sCACE,cACA,mBAGF,oCACE,YACA,gBAGF,6EACE,gBACA,aACA,2BACA,mBAGF,gKACE,eACA,sBACA,SACA,gBACA,mBACA,uBACA,mBAIA,wCACE,gBAGF,mDACE,cACA,eACA,mBAGF,4CACE,2BACA,wBACA,cAIJ,6FAEE,kBACA,oBACA,kCAGF,wCACE,aACA,mBACA,YACA,gBAEA,uGACE,kBACA,oBACA,kCACA,qBAEA,qHACE,2BAGF,oPAEE,mBACA,WAGF,gTAEE,kBAKN,6PAGE,mBACA,uBAMA,4UAEE,mBAKF,wDACE,4CAGF,+CACE,kBACA,eAGF,qDACE,WAMJ,uCACE,qBAGF,mCACE,cAGF,6EACE,eACA,mBACA,gBACA,mBACA,uBACA,gBAGF,iDACE,iBACA,eAGF,0CACE,kCACA,kBAEA,mEACE,wBACA,mBACA,qBACA,kBAKF,0DACE,cACA,kBAGF,mDACE,eACA,cAKN,2BACE,SAEA,4CACE,eACA,aACA,mBAGF,mCACE,WACA,YAGF,qCACE,cACA,cACA,SACA,kBAIA,8CACE,eACA,mBAKN,0BACE,oBACA,gBAEA,qEACE,cACA,mBAGF,iCACE,oBACA,gBACA,uBAGF,oCACE,kBACA,mBACA,kCAEA,8CACE,oBAGF,0CACE,wBAMJ,sCACE,iBACA,e;AC/XN,cACE,qBACA,cACA,aACA,cACA,yDACA,4BACA,qBACA,gC;ACRF,2BACE,qBACA,oCAGE,WACE,kCACA,0BAIJ,YACE,WACA,gBACA,iCAEA,aACE,uDACA,6FAEA,mCAEE,6BAMR,KACE,2BACE,kCAIJ,KACE,0BACE,E;ACpCJ,wBACE,kBACA,YACA,gBACA,mBACA,8BAEA,0BAPF,wBAQI,8CAGF,sCACE,mBAEA,wDACE,oBAKN,cACE,4FACA,uBACA,2CACA,4CACA,WACA,eAEA,6GAGE,sBACA,0BAGF,uBACE,iBACA,sBACA,+e;ACtCJ,OACE,cACA,kBACA,oBACA,gBACA,qBACA,mBACA,eAEA,gBACE,oBACA,WAGF,qBACE,eAEE,iFACE,kBAKN,aACE,kBACA,uBACA,UAIA,qDACE,WACA,cACA,kBACA,eACA,QACA,cACA,eACA,2BAGF,2BACE,4CACA,kBACA,yCACA,UACA,kDAGF,0BACE,cACA,cACA,eACA,kBACA,gCACA,UACA,4BAGF,0BACE,cACA,sBACA,uBACA,gBAGF,6BACE,cACA,kBACA,iBACA,kCACA,uBAKF,yCACE,kCAGF,wCACE,UAKF,qEAEE,qBAGF,wBACE,kBACA,eACA,QACA,2BACA,UACA,oCACA,wBAIJ,gBACE,eACA,qBAEA,4BACE,iBAEA,oCACE,UACA,gBAGF,mCACE,UACA,eAIJ,iDAEE,iBAGA,iCACA,UACA,gBAKN,mBACE,KACE,UAEF,GACE,W;ACzIJ,KACE,aACA,uBACA,cACA,6DACA,gBACA,WACA,SACA,YACA,uBACA,gBACA,kCACA,eACA,2DACA,4DAEA,4BAGE,aAGF,YACE,eACA,2BAEA,cACE,UAIJ,wBACE,kDAGF,UACE,kBACA,aACA,mBAGF,YACE,kBACA,eACA,0BACA,6BACA,qBACA,mBACA,WACA,kBACA,sBACA,gBACA,kBACA,cAEA,kDAEE,oBAGF,mBACE,gCAIJ,OACE,kBACA,4BACA,OACA,UACA,sCACA,gBACA,WACA,oCACA,oBACA,uBACA,sBAEA,eACE,6CAEA,sCACE,2B;AClFR,SACE,gBACA,MACA,cACA,aACA,8BACA,qBACA,kBACA,iBACA,+CACA,yCACA,gBACA,kBAEA,qBACA,8BAEA,aACE,eACA,kCAGF,4BACE,SAGF,kCACE,+B;AC1BF,+BACE,gBAGF,+BACE,2BAGF,+CACE,oBAGF,gCACE,sBAGF,wCACE,uB;AClBJ,aACE,kBACA,WACA,iDACA,yCACA,yCACA,uBACA,kCAEA,8BACE,aAEA,2CACE,aAGF,oCACE,mBAIA,6CACE,oBACA,eAKN,uBACE,kCACA,iCACA,yCAGE,+BACE,2BAKN,mBACE,cACA,gBACA,uBACA,uBACA,wCACA,2BACA,0JAEA,gCACE,gCAIJ,eACE,kBACA,UACA,YACA,mBAGF,sBACE,kBACA,UACA,YACA,cAEA,+BACE,uBAIJ,qBACE,kBACA,YACA,cACA,eAGF,yBACE,mBACE,cACA,sBACA,kDAGF,eACE,WAKF,4BACE,cAGF,wBACE,UACA,aAGF,+BACE,WACA,WAGF,8BACE,aACA,W;AC5GN,oBACE,aACA,mBACA,mCACA,YACA,eACA,kBACA,oBACA,mBACA,mBACA,eACA,kBACA,gBACA,cACA,sCAEA,6BAEA,8BACE,gBAGF,0BACE,0CAGF,oCACE,oDAEA,iDACE,UAGF,2FACE,UAKF,6CACE,gCAGF,sCACE,mCAGF,2CACE,kBAIJ,iCACE,cACA,kBACA,WACA,eAEA,kCAGF,2DACE,WACA,YACA,UACA,cACA,6BAEA,+DACE,eAIJ,+BACE,aACA,mBACA,uBACA,gBACA,kBACA,sCACA,WAEA,iCACE,kBACA,kBACA,SAIJ,+BACE,kBACA,mBACA,gBACA,uBAEA,kDACE,eACA,gBACA,yBACA,oBAIJ,iCACE,kBACA,OACA,MACA,WACA,YACA,kBACA,aACA,mBACA,uBACA,oCACA,iBACA,WACA,UACA,6BAGF,6BACE,kBACA,gBAEA,uCACE,gBACA,eAGF,0CACE,UACA,gBAGF,wCACE,cACA,mBAGF,0CACE,UACA,Q;AC7IN,UACE,oBACA,mBACA,kBACA,SAEA,mBACE,oBACA,WAGF,mBACE,oBAKA,8JAEE,2BAGF,kGACE,eAIJ,gBACE,SACA,QACA,kBACA,kBACA,uBACA,UAGF,kBACE,eACA,mBACA,eACA,eACA,6BACA,qBACA,oBACA,kBACA,kCAGF,wBACE,WACA,kBACA,cACA,OACA,eACA,gBACA,mCACA,qBACA,wBACA,uCAGF,gCACE,gCAGF,sCACE,2BACA,6CACA,kCAGF,+BACE,c;ACxEJ,uBACE,cACA,eACA,gBACA,qBACA,cACA,oBAEA,yBACE,mCAGF,+CACE,oBAGF,mCACE,WACA,Y;AClBJ,iBACE,mBACA,uBACA,cACA,iBACA,cACA,aACA,mBAEA,wCACE,qCACA,mBACA,kBAEA,oDACE,wBAIJ,uBACE,6BACA,oB;ACrBJ,kBACE,UACA,2DAEA,6BACE,mBACA,UAGF,8BACE,aAGF,0BACE,uDAIJ,eACE,aAEA,sBACE,0BAIJ,OACE,iBACA,cACA,6BACA,qBACA,mBACA,WACA,kBACA,sBACA,gBACA,kBACA,cAEA,qBACE,mBAGF,mBACE,qBACA,mBACA,gBACA,kBAGF,yCACE,8BACA,yBAGF,2BACE,0BACA,uBACA,aACA,UAEA,6BACE,iBAIJ,eACE,aACA,eAEA,iBACE,eACA,qBAGF,2BACE,eACA,eAEA,6BACE,kB;AC/ER,qCACE,0BACA,6BACA,2BACA,0BACA,2BACA,6BACA,2BACA,6BACA,6BAGF,qCACE,uBACA,6BACA,2BACA,6BACA,wBACA,6BACA,2BACA,6BACA,0BAIF,gBACE,kBACA,UACA,SACA,WACA,YACA,kBACA,yBACA,yCACA,gBAEA,2BACE,WACA,YACA,aACA,mBACA,uBACA,kBACA,+BACE,UACA,WACA,mCACA,kBACA,WACA,sBACA,wBAEF,8CACE,sBAEF,+CACE,uBAIJ,yBACE,oCACA,sCACA,wCACE,0CAKF,qDACE,yDAGF,sDACE,yD;AC3EN,MACE,4CAOA,kBACA,MACA,OACA,SACA,WATA,sCAEE,gDASF,sBACE,oBACA,gCAGF,wBACE,sBACA,kCAIA,qFACE,qCAIJ,yBACE,eACE,uDAEA,qCACE,sCAKN,yBACE,oCAEE,wDAEA,gFACE,iDACA,8BAGF,sEACE,wDACA,iCACA,8CACA,sCACA,2CACA,kCACA,mCAGF,4DACE,oCAGF,4EACE,8BACA,gCAKN,yBACE,uBACE,4BAIJ,cACE,kBACA,cAIA,sBACE,qBAGF,eACE,WACA,cAGF,wBACE,kBACA,mBACA,sBACA,cAEA,oCACE,aACA,mBAIJ,6BACE,iBAEA,yCACE,kBACA,eAIJ,qDACE,qBACA,YACA,kCACA,uBAEA,uEACE,gBAGF,+EACE,wBAGF,mEACE,yBAMA,wCACE,aAIJ,iCACE,yBAGF,8BACE,cACA,eACA,iBACA,sBACA,wBACA,yBAEA,0CACE,eACA,gBACA,0BAGF,oCACE,sBAIJ,uCACE,WACA,YACA,yBAGF,qCACE,kBACA,qBACA,iBACA,WACA,6BACA,wBACA,gBAEA,iDACE,8BACA,SAQJ,sCACE,cACA,kBAGF,2DACE,oBACA,gBAGF,iCACE,cACA,oBAGF,uEACE,mBACA,gBACA,iBACA,uB;AC9MR,eACE,qBAEA,mBACE,kBACA,WACA,YAEA,sCACE,qB;ACTN,aACE,WACA,WACA,aACA,mBACA,uBACA,sBAEA,0BARF,aASI,aAGF,sBACE,YACA,uBAGF,oBACE,kBACA,sBAGF,0BACE,kBACA,kCAEA,8EAEE,wCAIJ,0BACE,mBACA,gBACA,4BACA,uBAEA,4BACE,0BACA,iB;ACxCN,cACE,aACA,mBACA,uBACA,6BAEA,+BACE,sBAGF,+BACE,cAGF,2BACE,kCACA,kBACA,kBACA,gBACA,uB;ACnBJ,OACE,SACA,oBACA,gBACA,kBACA,eAEA,uBACE,kBACA,YACA,WACA,2BACA,WACA,iBACA,mBACA,uBACA,qBAGF,WACE,kBACA,OACA,MACA,WACA,YACA,iB;ACzBJ,SACE,gBACA,2BACA,kBACA,qBACA,kBAEA,kBACE,kBAGF,+BACE,2BACA,WACA,YACA,kBACA,OACA,MACA,yDACA,WACA,aACA,mBACA,uBACA,kDACA,yBACA,gBACA,iBAGF,gBACE,kBACA,OACA,MACA,WACA,YACA,0BACA,gCACA,6DAGF,oEAGE,sBACA,mBAGF,oBACE,cACA,yBACA,gBACA,mBACA,gBACA,uBAGF,qBACE,eACA,gBACA,uBACA,sBAGF,iDAEE,gBACA,kCACA,qBACA,mBACA,oBACA,qBACA,4BACA,gBAGF,sBACE,kBAGF,kCACE,sBACA,uBAGF,kBACE,2BAEA,iEAEE,UACA,QAGF,2BACE,iB;AC9FN,oDACE,aAaA,mBACA,oBAZA,0CACE,sBAGF,eACE,0BACA,qBAFF,eAGI,6BAOJ,iBACE,2DAGF,cAGE,gBACA,yBACA,kDACA,gCACA,aACA,mBACA,uBACA,sBAGF,iBACE,MACA,OACA,kBAGF,yBACE,qBACA,cACA,kBACA,WACA,4BAEA,cACE,gBACA,wBACA,yBAGF,UACE,cACA,kBACA,MACA,QACA,iCACA,2BACA,qFACA,mCACA,mBACA,qCACA,qBAIJ,sBACE,gBACA,qEAEA,yBAEE,kDACA,yBAGF,gBACE,oBAIJ,UACE,iBACA,kBACA,MACA,QACA,eACA,gBACA,aACA,mBACA,uBACA,UACA,wBACA,wCAGF,cACE,gEAGE,cACE,2DAGF,SACE,kEAEA,SACE,wDAIJ,SACE,kBAKN,mBACE,qBACA,mBACA,gBACA,YACA,wBAEA,gBACE,kCACA,kBACA,mBACA,mBAIJ,cACE,mBACA,gBACA,gBACA,uBACA,0BAEA,mBACE,sBAIJ,iBACE,qBACA,6BACA,eACA,gBACA,uBACA,wCAGE,aACE,eAKN,2CACE,yCACA,8GAEA,UAIE,YACA,0BAGF,sBACE,iCAEA,0BACE,0BAIJ,oBACE,2BAGF,eACE,8BAGF,gBACE,2KAMF,kBAGE,eACA,qDAGF,gBACE,iEAEA,cACE,mBACA,yDAIJ,SACE,QACA,+CAQJ,mCACE,qDAGF,qCACE,mDAGF,wCACE,C;ACxOJ,OACE,aACA,uBACA,kBAEA,sBACE,kBACA,oBAEA,kCACE,mBAIJ,WACE,4CACA,oDACA,qEACA,qEAEA,uBACE,sCACA,uCAGF,mBACE,yCACA,0CACA,wDACA,2CAEA,+BACE,4BACA,mCAKN,oBACE,wBAEA,sCACE,2BAGF,4BACE,WACA,YACA,yBAEA,8BACE,mBAEA,yCACE,oBAKN,sBACE,kBAEA,gCACE,qBACA,yBAFF,gCAGI,qBAKN,+DACE,UACA,mBACA,uEAGF,yJAIE,UACA,qBAIJ,wBACE,kBACA,2BACA,4BACA,UACA,eACA,cACA,6CACA,UAEA,0BACE,mBAIJ,+BACE,UACA,SACA,6CAGF,gBACE,kBACA,YACA,YACA,mBAGF,oBACE,aACA,8BAGF,cACE,gBACA,SACA,iBACA,mBACA,gBACA,uBAGF,cACE,YAGF,uBACE,kBACA,kBACA,kCACA,kCACA,aACA,qBAEA,qCACE,WACA,kBACA,0BACA,eACA,gBACA,kBACA,qCAKF,iDACE,uBAIJ,sCACE,2BAGF,iBACE,eACA,gBACA,kBAGF,4CAGE,kBACA,kCACA,SACA,gBACA,mBACA,uBACA,uBAGF,iBACE,kBACA,kCACA,mBACA,gBACA,uBACA,cACA,kCAGF,aACE,aACA,mBACA,mBACA,yBAEA,kBACE,YACA,mBACA,gBACA,uBAGF,wBACE,cAGF,qCACE,0BAGF,qBACE,gBACA,cAIJ,iBACE,YACA,eACA,kBACA,QACA,eACA,kBAEA,yBACE,WACA,kBACA,WACA,QACA,WACA,mDACA,kBAIJ,kEACE,kBACA,WACA,kBACA,gBACA,WACA,QAEA,sEACE,kBACA,WACA,iDACA,WACA,kBACA,WAIJ,qCACE,8DAGF,uBACE,kBACA,WACA,QACA,OAEA,yBACE,oBACA,kBACA,WACA,WAEA,gCACE,WACA,kBACA,SACA,WACA,WACA,YACA,kBACA,2CAMJ,qBACE,mBACA,gBACA,uBACA,gBACA,mBAGF,oBACE,eAGF,6CAEE,sBAGF,wBACE,iBAGF,6BACE,aACA,cAIA,sCACE,qBACA,QAKN,mCACE,cACA,eAIA,2BACE,sBAGF,6BACE,kBACA,eAEA,qCACE,mBACA,eAIJ,6CACE,4BAGF,mDAEE,iBAGF,iCACE,UACA,WAKN,6BACE,uB;ACjWF,cACE,WACA,YACA,eACA,kBAEA,8BACE,WACA,iBAGF,iCACE,kBACA,OACA,MACA,WAGF,+BACE,WACA,YAGF,mJAKE,aACA,mBACA,uBACA,yBACA,wEACA,eAGF,uBACE,gBAGF,6FAGE,gB;AC3CJ,aACE,iBACA,kBAEA,kCACE,qBACE,WACA,iBACA,WAGF,oBACE,cACA,WACA,YAIJ,4BACE,WACA,kBACA,OACA,MACA,SAEA,wCACE,WACA,YAIJ,2BACE,kBACA,WACA,eACA,kBACA,UAEA,aACA,UACA,OAGF,yBACE,cACA,oCACA,YACA,sBACA,iBAEA,iCACE,YAIJ,yBACE,kBACA,MACA,SACA,UACA,YACA,UACA,SACA,6DACA,iCACA,wBACA,YACA,wBACA,aACA,eACA,UAEA,sEACE,UAGF,8BACE,OACA,yDACA,gCAGF,8BACE,QACA,yDACA,6CAIJ,mBACE,kBACA,SACA,OACA,WACA,iBACA,uBACA,+EACA,yBACA,aACA,sBACA,yBACA,oBAGE,oCACE,iBACA,uBAKF,oCACE,iBACA,uBAKN,oBACE,aACA,mBAEA,uBACE,gBACA,kBACA,qBACA,qBACA,sBACA,qBAGF,kCACE,mBACA,qBAGF,2BACE,aACA,cACA,uBAIJ,qBACE,kBACA,WAIA,uCACE,UACA,QACA,qBAGF,uCACE,OACA,WACA,qBAIJ,kBACE,wBACA,gBAEA,wBACE,SAGF,qCACE,UAGF,wBACE,sBAGF,0BACE,+C;ACnLN,YACE,2CACA,mCACA,gBACA,cACA,WACA,mBACA,iBACA,kBACA,uBACA,aACA,cACA,iDAEA,0BAdF,YAeI,gBAGF,oCACE,2BACA,mDAGF,wBACE,oBAGF,uBACE,gBAGF,4BACE,oBACA,2CACA,oBACA,cACA,aACA,sBACA,mBACA,uBACA,oCAGF,kBACE,kBACA,sBACA,sBAEA,0BALF,kBAMI,kBACA,mBACA,oBAGF,0BAXF,kBAYI,eACA,iBACA,oBACA,mBAIJ,mBACE,oBACA,gBACA,uBAEA,0BALF,mBAMI,gBAIJ,yBACE,eACA,oBAEA,0BAJF,yBAKI,mB;AC7EN,sBACE,kBACA,WACA,YACA,yEACA,4DAEA,6CACE,2BAGF,+BACE,yE;ACKJ,aACE,qCAEA,mBAEA,sBACE,oBACA,4CAGF,6BACE,aACA,8BACA,sBAEA,oCACE,cACA,iBACA,kCAIA,6CACE,cACA,kBAKN,0BACE,kBACA,UAEA,kCACE,WACA,kBACA,WACA,OACA,aACA,eACA,sCACA,sBACA,WACA,WAIJ,gCACE,kBACA,WACA,OACA,aACA,eACA,qCACA,sBACA,oBCvDF,+BACE,wBACA,cACA,WACA,cACA,oBACA,uBAEA,qCACE,aAGF,0CACE,WACA,eAEA,uBACA,yBACA,kBAGF,qDACE,wBAGF,kDACE,qBAGF,8DACE,eAGF,qGACE,eD+BF,qDA/EF,+BACA,YACA,cACA,aACA,kBACA,eACA,mBACA,oFAEA,2DACE,qBAyEA,iDAnFF,+BACA,YACA,cACA,aACA,kBACA,eACA,mBACA,iFAEA,uDACE,qBA6EA,0CAvFF,+BACA,YACA,cACA,aACA,kBACA,eACA,mBACA,gFAEA,gDACE,qBAkFF,6BACE,aACA,wBACA,sBACA,sBAGF,4BACE,kBACA,kBACA,eACA,kCACA,0BAEA,qEACE,wBAGF,mCACE,gBAGF,wCACE,gBAGF,uCACE,iB;AE1HN,UACE,kBACA,MACA,QACA,OACA,aACA,2BACA,uBAEA,aACA,sBAEA,kCACE,iD;ACbJ,eACE,qBACA,WACA,YACA,aACA,kDACA,wCACA,wBACA,kEACA,kBAEA,2BACE,eAEA,iCACE,wDAEA,wDACE,UAMN,yBAxBF,eAyBI,eAGF,0BACE,yBACA,eACA,eAGF,qBACE,YACA,aACA,SAGF,mDACE,kBACA,MACA,OACA,WACA,YAGF,mBACE,mBAGF,sCACE,kBACA,YACA,cACA,cACA,eACA,gBAMA,UAJA,wCACE,e;AC7DN,eACE,oCAEA,2CACE,kBACA,mCACA,4CACA,sBACA,iDAGF,4BACE,OACA,MACA,UACA,oBACA,4BAEA,mCACE,eAGF,yBAXF,4BAYI,2DAGF,kCACE,uBACA,wBACA,WACA,wBACA,yCAIJ,uDACE,aACA,iBACA,mBAGF,uBACE,UACA,eACA,gBACA,sCAGF,sCACE,YACA,kBACA,eAEA,yBALF,sCAMI,gBAGF,2FACE,WACA,cACA,kBACA,MACA,SACA,WACA,UACA,UACA,4BAGF,8CACE,OACA,wFAGF,6CACE,QACA,uFAIA,wDACE,UAKF,wDACE,UAKN,gCACE,cACA,UACA,4BAEA,sCACE,UAKF,8DACE,UACA,mBAIJ,uBACE,WACA,YACA,eACA,iBACA,iBACA,kDACA,cACA,eAEA,8BACE,iDACA,WAGF,gCACE,WACA,oB;AC9HN,QACE,YACA,aACA,sBACA,gBAEA,uBACE,6BACA,6CACA,aACA,mBACA,cAEA,gBACA,iBAEA,oCACE,oBACA,kBACA,YAGF,qCACE,YACA,YACA,gBACA,UACA,gBAIJ,qBACE,YACA,gBACA,kBACA,cAEA,yBANF,qBAOI,0BACA,4BAIJ,oBACE,YACA,SACA,kBACA,aACA,mBACA,uBACA,kC","sources":["webpack://telegram-t/./src/components/ui/Transition.scss","webpack://telegram-t/./src/components/common/Avatar.scss","webpack://telegram-t/./src/components/ui/ProgressSpinner.scss","webpack://telegram-t/./src/components/ui/Modal.scss","webpack://telegram-t/./src/components/ui/ListItem.scss","webpack://telegram-t/./src/components/common/VerifiedIcon.scss","webpack://telegram-t/./src/components/common/TypingStatus.scss","webpack://telegram-t/./src/components/ui/Notification.scss","webpack://telegram-t/./src/components/ui/Radio.scss","webpack://telegram-t/./src/components/ui/Tab.scss","webpack://telegram-t/./src/components/ui/TabList.scss","webpack://telegram-t/./src/components/common/DeleteChatModal.scss","webpack://telegram-t/./src/components/ui/SearchInput.scss","webpack://telegram-t/./src/components/common/PickerSelectedItem.scss","webpack://telegram-t/./src/components/ui/Switcher.scss","webpack://telegram-t/./src/components/common/MessageOutgoingStatus.scss","webpack://telegram-t/./src/components/common/LastMessageMeta.scss","webpack://telegram-t/./src/components/left/main/Badge.scss","webpack://telegram-t/./src/components/left/main/ChatCallStatus.scss","webpack://telegram-t/./src/components/left/main/Chat.scss","webpack://telegram-t/./src/components/common/AnimatedEmoji.scss","webpack://telegram-t/./src/components/left/main/EmptyFolder.scss","webpack://telegram-t/./src/components/common/NothingFound.scss","webpack://telegram-t/./src/components/common/Media.scss","webpack://telegram-t/./src/components/common/WebLink.scss","webpack://telegram-t/./src/components/common/File.scss","webpack://telegram-t/./src/components/common/Audio.scss","webpack://telegram-t/./src/components/common/ProfilePhoto.scss","webpack://telegram-t/./src/components/common/ProfileInfo.scss","webpack://telegram-t/./src/components/middle/composer/DropTarget.scss","webpack://telegram-t/./src/components/ui/FloatingActionButton.scss","webpack://telegram-t/./src/components/ui/RangeSlider.scss","webpack://telegram-t/./src/styles/_mixins.scss","webpack://telegram-t/./src/components/middle/composer/DropArea.scss","webpack://telegram-t/./src/components/common/StickerButton.scss","webpack://telegram-t/./src/components/middle/composer/TextFormatter.scss","webpack://telegram-t/./src/components/common/Picker.scss"],"sourcesContent":[".Transition {\n position: relative;\n\n > * {\n width: 100%;\n height: 100%;\n animation-fill-mode: forwards !important;\n transition: background-color .2s;\n\n &.from, &.to {\n position: absolute;\n top: 0;\n left: 0;\n }\n\n &:not(.active):not(.from):not(.to) {\n display: none !important; // Best performance when animating container\n //transform: scale(0); // Shortest initial delay\n }\n }\n\n &.skip-slide-transition {\n transition: none !important;\n }\n\n /*\n * slide\n */\n\n &.slide {\n > .to {\n transform: translateX(100%);\n }\n\n &.animating {\n > .from {\n animation: slide-out var(--slide-transition);\n }\n\n > .to {\n animation: slide-in var(--slide-transition);\n }\n }\n }\n\n &.slide.backwards {\n > .to {\n transform: translateX(-100%);\n }\n\n &.animating {\n > .from {\n animation: slide-in-backwards var(--slide-transition);\n }\n\n > .to {\n animation: slide-out-backwards var(--slide-transition);\n }\n }\n }\n\n\n &.slide-reversed {\n > .to {\n transform: translateX(-100%);\n }\n\n &.animating {\n > .from {\n animation: slide-out var(--slide-transition);\n }\n\n > .to {\n animation: slide-in var(--slide-transition);\n }\n }\n\n &.backwards {\n > .to {\n transform: translateX(100%);\n }\n\n &.animating {\n > .from {\n animation: slide-in-backwards var(--slide-transition);\n }\n\n > .to {\n animation: slide-out-backwards var(--slide-transition);\n }\n }\n }\n }\n\n /*\n * mv-slide\n */\n\n &.mv-slide {\n > * > div {\n animation-fill-mode: forwards !important;\n }\n\n > .to > div {\n transform: translateX(100vw);\n }\n\n &.animating {\n > .from > div {\n animation: mv-slide-out .4s ease;\n }\n\n > .to > div {\n animation: mv-slide-in .4s ease;\n }\n }\n }\n\n &.mv-slide.backwards {\n > .to > div {\n transform: translateX(-100vw);\n }\n\n &.animating {\n > .from > div {\n animation: mv-slide-in-backwards .4s ease;\n }\n\n > .to > div {\n animation: mv-slide-out-backwards .4s ease;\n }\n }\n }\n\n /*\n * slide-fade\n */\n &.slide-fade {\n > .from {\n transform-origin: left;\n transform: translateX(0);\n opacity: 1;\n }\n\n > .to {\n transform-origin: left;\n transform: translateX(1.5rem);\n opacity: 0;\n }\n\n &.animating {\n > .from {\n animation: fade-out-opacity var(--slide-transition), slide-fade-out-move var(--slide-transition);\n }\n\n > .to {\n animation: fade-in-opacity var(--slide-transition), slide-fade-in-move var(--slide-transition);\n }\n }\n }\n\n &.slide-fade.backwards {\n > .from {\n transform: translateX(0);\n opacity: 1;\n }\n\n > .to {\n transform: translateX(-1.5rem);\n opacity: 0;\n }\n\n &.animating {\n > .from {\n animation: fade-in-backwards-opacity var(--slide-transition), slide-fade-in-backwards-move var(--slide-transition);\n }\n\n > .to {\n animation: fade-out-backwards-opacity var(--slide-transition), slide-fade-out-backwards-move var(--slide-transition);\n }\n }\n }\n\n /*\n * zoom-fade\n */\n &.zoom-fade {\n > .from {\n transform-origin: center;\n transform: scale(1);\n opacity: 1;\n }\n\n > .to {\n transform-origin: center;\n opacity: 0;\n // We can omit `transform: scale(1.1);` here because `opacity` is 0.\n // We need to for proper position calculation in `InfiniteScroll`.\n }\n\n &.animating {\n > .from {\n animation: fade-out-opacity .15s ease;\n }\n\n > .to {\n animation: fade-in-opacity .15s ease, zoom-fade-in-move .15s ease;\n }\n }\n }\n\n &.zoom-fade.backwards {\n > .from {\n transform: scale(1);\n }\n\n > .to {\n transform: scale(0.95);\n }\n\n &.animating {\n > .from {\n animation: fade-in-backwards-opacity .1s ease, zoom-fade-in-backwards-move .15s ease;\n }\n\n > .to {\n animation: fade-out-backwards-opacity .15s ease, zoom-fade-out-backwards-move .15s ease;\n }\n }\n }\n\n /*\n * fade\n */\n &.fade {\n > .from {\n opacity: 1;\n }\n\n > .to {\n opacity: 0;\n }\n\n &.animating {\n > .from {\n animation: fade-out-opacity .15s ease;\n }\n\n > .to {\n animation: fade-in-opacity .15s ease;\n }\n }\n }\n\n /*\n * slide-layers\n */\n\n &.slide-layers {\n --background-color: var(--color-background);\n background: black;\n\n > div {\n background: var(--background-color);\n }\n\n > .to {\n transform: translateX(100%);\n }\n\n &.animating {\n > .from {\n animation: slide-layers-out var(--layer-transition);\n }\n\n > .to {\n animation: slide-in var(--layer-transition);\n }\n }\n }\n\n &.slide-layers.backwards {\n > .to {\n transform: translateX(-20%);\n opacity: 0.75;\n }\n\n &.animating {\n > .from {\n animation: slide-in-backwards var(--layer-transition);\n }\n\n > .to {\n animation: slide-layers-out-backwards var(--layer-transition);\n }\n }\n }\n\n /*\n * push-slide\n */\n\n &.push-slide {\n > div {\n background: var(--color-background);\n }\n\n > .from {\n transform-origin: center;\n transform: scale(1);\n opacity: 1;\n\n .custom-scroll {\n scrollbar-color: transparent !important;\n\n &::-webkit-scrollbar-thumb {\n background-color: transparent !important;\n }\n }\n }\n\n > .to {\n transform: translateX(100%);\n }\n\n &.animating {\n > .from {\n animation: push-out .3s ease-in-out;\n }\n\n > .to {\n animation: slide-in-200 .3s ease-in-out;\n }\n }\n }\n\n &.push-slide.backwards {\n > .to {\n transform: scale(0.7);\n }\n\n &.animating {\n > .from {\n animation: slide-in-200-backwards .3s ease-in-out;\n }\n\n > .to {\n animation: push-out-backwards .3s ease-in-out;\n }\n }\n }\n\n /*\n * slide-fade\n */\n &.reveal {\n > .to {\n clip-path: inset(0 100% 0 0);\n }\n\n &.animating {\n > .to {\n animation: reveal-in 350ms ease-in;\n }\n }\n }\n\n &.reveal.backwards {\n > .from {\n clip-path: inset(0 0 0 0);\n }\n\n > .to {\n clip-path: none;\n }\n\n &.animating {\n > .from {\n animation: reveal-in-backwards 350ms ease-out;\n }\n\n > .to {\n animation: none;\n }\n }\n }\n}\n\n/*\n * common\n */\n@keyframes fade-in-opacity {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n\n@keyframes fade-out-opacity {\n 0% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n}\n\n@keyframes fade-in-backwards-opacity {\n 0% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n}\n\n@keyframes fade-out-backwards-opacity {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n\n/*\n * slide\n */\n@keyframes slide-in {\n 0% {\n transform: translateX(100%);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n@keyframes slide-out {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(-100%);\n }\n}\n\n@keyframes slide-in-backwards {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(100%);\n }\n}\n\n@keyframes slide-out-backwards {\n 0% {\n transform: translateX(-100%);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n/*\n * mv-slide\n */\n@keyframes mv-slide-in {\n 0% {\n transform: translateX(100vw);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n@keyframes mv-slide-out {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(-100vw);\n }\n}\n\n@keyframes mv-slide-in-backwards {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(100vw);\n }\n}\n\n@keyframes mv-slide-out-backwards {\n 0% {\n transform: translateX(-100vw);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n/*\n * slide-fade\n */\n@keyframes slide-fade-in-move {\n 0% {\n transform: translateX(1.5rem);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n@keyframes slide-fade-out-move {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(-1.5rem);\n }\n}\n\n@keyframes slide-fade-in-backwards-move {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(1.5rem);\n }\n}\n\n@keyframes slide-fade-out-backwards-move {\n 0% {\n transform: translateX(-1.5rem);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n/*\n * zoom-fade\n */\n@keyframes zoom-fade-in-move {\n 0% {\n transform: scale(1.1);\n }\n 100% {\n transform: scale(1);\n }\n}\n\n@keyframes zoom-fade-in-backwards-move {\n 0% {\n transform: scale(1);\n }\n 100% {\n transform: scale(1.1);\n }\n}\n\n@keyframes zoom-fade-out-backwards-move {\n 0% {\n transform: scale(0.95);\n }\n 100% {\n transform: scale(1);\n }\n}\n\n/*\n * slide-layers\n */\n@keyframes slide-layers-out {\n 0% {\n transform: translateX(0);\n opacity: 1;\n }\n 100% {\n transform: translateX(-20%);\n opacity: calc(1 - var(--layer-blackout-opacity));\n }\n}\n\n@keyframes slide-layers-out-backwards {\n 0% {\n transform: translateX(-20%);\n opacity: calc(1 - var(--layer-blackout-opacity));\n }\n 100% {\n transform: translateX(0);\n opacity: 1;\n }\n}\n\n/*\n * push-slide\n */\n\n@keyframes push-out {\n 0% {\n transform: scale(1);\n opacity: 1;\n }\n 100% {\n transform: scale(0.7);\n opacity: 0;\n }\n}\n\n@keyframes push-out-backwards {\n 0% {\n transform: scale(0.7);\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n/*\n * slide\n */\n@keyframes slide-in-200 {\n 0% {\n transform: translateX(200%);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n@keyframes slide-in-200-backwards {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(200%);\n }\n}\n\n/*\n * slide\n */\n@keyframes reveal-in {\n 0% {\n clip-path: inset(0 100% 0 0);\n }\n 100% {\n clip-path: inset(0 0 0 0);\n }\n}\n\n/*\n * slide\n */\n@keyframes reveal-in-backwards {\n 0% {\n clip-path: inset(0 0 0 0);\n }\n 100% {\n clip-path: inset(0 100% 0 0);\n }\n}\n",".Avatar {\n --color-user: var(--color-primary);\n flex: none;\n align-items: center;\n justify-content: center;\n width: 3.375rem;\n height: 3.375rem;\n border-radius: 50%;\n background: linear-gradient(var(--color-white) -125%, var(--color-user));\n color: white;\n font-weight: bold;\n display: flex;\n white-space: nowrap;\n user-select: none;\n\n img:not(.emoji) {\n border-radius: 50%;\n }\n\n .emoji {\n width: 1rem;\n height: 1rem;\n }\n\n i {\n font-size: 2.5rem;\n\n &.icon-reply-filled {\n transform: scale(.7);\n }\n }\n\n &.size-micro {\n width: 1rem;\n height: 1rem;\n font-size: 0.5125rem;\n\n .emoji {\n width: .5625rem;\n height: .5625rem;\n }\n }\n\n &.size-tiny {\n width: 2rem;\n height: 2rem;\n font-size: .875rem;\n\n .emoji {\n width: .875rem;\n height: .875rem;\n }\n }\n\n &.size-small {\n width: 2.125rem;\n height: 2.125rem;\n font-size: 0.875rem;\n\n .emoji {\n width: .875rem;\n height: .875rem;\n }\n }\n\n &.size-medium {\n width: 2.75rem;\n height: 2.75rem;\n font-size: 1.1875rem;\n\n .emoji {\n width: 1rem;\n height: 1rem;\n }\n }\n\n &.size-large {\n font-size: 1.3125rem;\n\n i {\n font-size: 3.5rem;\n }\n\n .emoji {\n width: 1.3125rem;\n height: 1.3125rem;\n }\n }\n\n &.size-jumbo {\n width: 7.5rem;\n height: 7.5rem;\n font-size: 3.5rem;\n\n i {\n font-size: 6rem;\n }\n\n .emoji {\n width: 3.5rem;\n height: 3.5rem;\n }\n }\n\n &.online {\n position: relative;\n\n &::after {\n content: '';\n display: block;\n position: absolute;\n bottom: 0.05rem;\n right: 0.05rem;\n width: 0.875rem;\n height: 0.875rem;\n border-radius: 50%;\n border: 2px solid var(--color-background);\n background-color: #0ac630;\n flex-shrink: 0;\n }\n }\n\n &.interactive {\n cursor: pointer;\n }\n\n img:not(.emoji) {\n width: 100%;\n height: 100%;\n }\n}\n",".ProgressSpinner {\n position: relative;\n z-index: 1;\n width: 3.375rem;\n height: 3.375rem;\n background: rgba(0, 0, 0, .25) url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTkiIGhlaWdodD0iMTkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjcxNyA5Ljc1TDE4LjMgMi4xNjdhLjY4NC42ODQgMCAxMC0uOTY3LS45NjdMOS43NSA4Ljc4MyAyLjE2NyAxLjJhLjY4NC42ODQgMCAxMC0uOTY3Ljk2N0w4Ljc4MyA5Ljc1IDEuMiAxNy4zMzNhLjY4NC42ODQgMCAxMC45NjcuOTY3bDcuNTgzLTcuNTgzIDcuNTgzIDcuNTgzYS42ODEuNjgxIDAgMDAuOTY3IDAgLjY4NC42ODQgMCAwMDAtLjk2N0wxMC43MTcgOS43NXoiIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjRkZGIiBzdHJva2Utd2lkdGg9Ii43NSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==) no-repeat 49% 49%;\n border-radius: 50%;\n cursor: pointer;\n\n &.no-cross {\n background: transparent !important;\n pointer-events: none;\n }\n\n &.square {\n background-image: none;\n\n &::after {\n content: '';\n position: absolute;\n width: .8125rem;\n height: .8125rem;\n border-radius: .125rem;\n background-color: #fff;\n left: 50%;\n top: 50%;\n transform: translate3d(-50%, -50%, 0);\n }\n }\n\n &.size-s, &.size-m {\n width: auto;\n height: auto;\n background: transparent url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUiIGhlaWdodD0iMTUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMjE4IDcuNWw1LjYzMy01LjYzM2EuNTA4LjUwOCAwIDEwLS43MTgtLjcxOEw3LjUgNi43ODIgMS44NjcgMS4xNDlhLjUwOC41MDggMCAxMC0uNzE4LjcxOEw2Ljc4MiA3LjVsLTUuNjMzIDUuNjMzYS41MDguNTA4IDAgMTAuNzE4LjcxOEw3LjUgOC4yMThsNS42MzMgNS42MzNhLjUwNi41MDYgMCAwMC43MTggMCAuNTA4LjUwOCAwIDAwMC0uNzE4TDguMjE4IDcuNXoiIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjRkZGIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9zdmc+) no-repeat 49% 49%;\n\n &.square {\n background-image: none;\n width: .75rem;\n height: .75rem;\n }\n }\n\n &.size-xl {\n width: 3.25rem;\n height: 3.25rem;\n\n svg {\n width: 3rem;\n height: 3rem;\n margin: .125rem;\n }\n\n circle {\n stroke-width: 3px;\n }\n }\n\n &.transparent {\n background-color: transparent !important;\n }\n\n svg {\n display: block;\n transform: rotate(-90deg);\n transform-origin: 50% 50%;\n animation: 4s linear 0s infinite ProgressSpinnerAnimation;\n }\n\n circle {\n transition: stroke-dashoffset .5s;\n }\n}\n\n@keyframes ProgressSpinnerAnimation {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n",".Modal {\n position: relative;\n z-index: var(--z-modal);\n\n &.delete, &.error, &.confirm, &.pin, &.unpin-all {\n .modal-dialog {\n max-width: 23rem;\n }\n }\n\n &.error {\n .modal-content > div {\n margin-top: 1rem;\n }\n }\n\n &.narrow {\n .modal-dialog {\n max-width: 20rem;\n }\n }\n\n &.report {\n .modal-dialog {\n max-width: 15rem;\n }\n }\n\n .modal-container {\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n .modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n background-color: rgba(0, 0, 0, .25);\n }\n\n &.transparent-backdrop .modal-backdrop {\n background-color: transparent;\n }\n\n .modal-dialog {\n position: relative;\n display: inline-flex;\n flex-direction: column;\n width: 100%;\n max-width: 35rem;\n min-width: 17.5rem;\n margin: 2rem auto;\n background-color: var(--color-background);\n box-shadow: 0 .25rem .5rem .125rem var(--color-default-shadow);\n border-radius: var(--border-radius-default);\n transform: translate3d(0, -1rem, 0);\n\n transition: transform .2s ease, opacity .2s ease;\n\n body.animation-level-0 & {\n transition: none;\n transform: none !important;\n }\n\n @media (max-width: 450px) {\n max-width: calc(100vw - 3rem) !important;\n }\n }\n\n &.open .modal-dialog {\n transform: translate3d(0, 0, 0);\n }\n\n &.closing .modal-dialog {\n transform: translate3d(0, 1rem, 0);\n }\n\n .modal-header {\n padding: 1rem 1rem 0;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n }\n\n .modal-title {\n font-size: 1.25rem;\n font-weight: 500;\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:not(:only-child) {\n margin: 0 1.3125rem;\n }\n }\n\n .modal-header-condensed {\n @extend .modal-header;\n padding: .5rem 1.25rem 0 .9375rem !important;\n\n .modal-action-button {\n font-size: 0.875rem;\n height: 2.25rem;\n width: auto;\n line-height: 1.625rem;\n margin-left: auto;\n padding-left: 1.25rem;\n padding-right: 1.25rem;\n min-width: 5rem;\n }\n }\n\n .modal-content {\n width: 100%;\n flex-grow: 1;\n padding: 1rem;\n overflow-y: auto;\n\n b,\n strong {\n word-break: break-word;\n }\n }\n\n .modal-title,\n .modal-content,\n .modal-content > p {\n unicode-bidi: plaintext;\n text-align: initial;\n }\n\n .dialog-buttons {\n display: flex;\n align-items: flex-end;\n\n .confirm-dialog-button + .confirm-dialog-button {\n margin-left: 1rem;\n }\n }\n\n .confirm-dialog-button {\n width: auto;\n height: auto;\n margin-left: auto;\n text-align: right;\n font-weight: 500;\n white-space: pre-wrap;\n }\n}\n",".ListItem {\n position: relative;\n\n body.is-ios &, body.is-android & {\n &:not(:last-of-type)::after {\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 4.5rem;\n right: 0;\n height: 0.03125rem;\n background: var(--color-dividers);\n }\n\n &.small-icon::after {\n left: 3.875rem;\n }\n\n &.no-icon::after {\n left: 0;\n }\n }\n\n // Using half-pixel height is efficient on iOS but not supported on Android, so `transform` is used instead\n body.is-android & {\n &:not(:last-of-type)::after {\n height: 0.0625rem;\n transform: scaleY(0.25);\n }\n }\n\n .ListItem-button {\n width: 100%;\n background-color: var(--background-color);\n border: none !important;\n box-shadow: none !important;\n outline: none !important;\n display: flex;\n padding: 1rem;\n position: relative;\n overflow: hidden;\n line-height: 1.5rem;\n white-space: nowrap;\n color: var(--color-text);\n border-radius: var(--border-radius-default);\n --ripple-color: rgba(0, 0, 0, .08);\n\n > i {\n font-size: 1.5rem;\n margin-right: 2rem;\n color: var(--color-text-secondary);\n }\n }\n\n .user-status, .group-status, .title, .subtitle {\n text-align: initial;\n unicode-bidi: plaintext;\n }\n\n &.multiline {\n .ListItem-button > i {\n position: relative;\n top: .25rem;\n }\n }\n\n &.disabled {\n pointer-events: none;\n\n .ListItem-button {\n opacity: 0.5;\n }\n }\n\n &:not(.disabled):not(.is-static) {\n .ListItem-button {\n cursor: pointer;\n\n body.cursor-ew-resize & {\n cursor: ew-resize !important;\n }\n\n @media (hover: hover) {\n &:hover, &:focus {\n --background-color: var(--color-chat-hover);\n }\n }\n\n @media (max-width: 600px) {\n &.active {\n --background-color: var(--color-chat-hover);\n }\n }\n }\n }\n\n @media (min-width: 600px) {\n &:not(.has-ripple):not(.is-static),\n body.animation-level-0 & {\n .ListItem-button:active {\n --background-color: var(--color-item-active) !important;\n }\n }\n }\n\n &.has-menu-open .ListItem-button {\n --background-color: var(--color-chat-hover);\n }\n\n &.narrow {\n margin-bottom: 0.75rem;\n\n .ListItem-button {\n padding: 0.5rem 1rem;\n }\n }\n\n &.inactive {\n pointer-events: none;\n }\n\n &.focus {\n --background-color: var(--color-chat-hover);\n }\n\n &.destructive {\n .ListItem-button {\n color: var(--color-error);\n\n i {\n color: inherit;\n }\n }\n }\n\n &-context-menu {\n position: absolute;\n\n .bubble {\n width: auto;\n\n .MenuItem button {\n padding-left: 1rem !important;\n padding-right: 2rem !important;\n }\n }\n }\n\n &.chat-item-clickable {\n margin: 0 -0.5rem;\n\n body.is-ios &,\n body.is-macos & {\n --color-text-secondary: var(--color-text-secondary-apple);\n }\n\n .ListItem-button {\n padding: .5625rem;\n }\n\n .Avatar {\n flex-shrink: 0;\n margin-right: 0.5rem;\n }\n\n .info {\n flex-grow: 1;\n overflow: hidden;\n }\n\n .title, .subtitle {\n overflow: hidden;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n }\n\n h3, .last-message, .status, .typing-status {\n font-size: 1rem;\n line-height: 1.6875rem;\n margin: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-align: initial;\n }\n\n .title {\n h3 {\n font-weight: 500;\n }\n\n .VerifiedIcon {\n width: 1.25rem;\n height: 1.25rem;\n margin-left: 0.25rem;\n }\n\n .emoji {\n vertical-align: text-bottom;\n background-position: 0 0;\n flex-shrink: 0;\n }\n }\n\n .contact-phone,\n .contact-username {\n font-size: 0.875rem;\n line-height: 1.25rem;\n color: var(--color-text-secondary);\n }\n\n .ChatInfo {\n display: flex;\n align-items: center;\n flex-grow: 1;\n overflow: hidden;\n\n .status, .typing-status {\n font-size: 0.875rem;\n line-height: 1.25rem;\n color: var(--color-text-secondary);\n display: inline-block;\n\n &.online {\n color: var(--color-primary);\n }\n\n &[dir=rtl],\n &[dir=auto] {\n text-align: initial;\n width: 100%;\n }\n\n .group-status:only-child,\n .user-status:only-child {\n display: flow-root;\n }\n }\n }\n\n .contact-phone,\n .contact-username,\n h3, .last-message, .status, .typing-status {\n text-align: initial;\n unicode-bidi: plaintext;\n }\n\n .last-message,\n .status,\n .typing-status {\n body.is-ios &,\n body.is-macos & {\n font-size: .9375rem;\n }\n }\n\n &[dir=rtl] {\n .ListItem-button {\n padding: .5625rem .5625rem .5625rem .6975rem;\n }\n\n .Avatar {\n margin-left: 0.5rem;\n margin-right: 0;\n }\n\n .info > .status {\n width: 100%;\n }\n }\n }\n\n &.search-result-message {\n .title {\n padding-right: .15rem;\n }\n\n h3 {\n max-width: 80%;\n }\n\n h3, .subtitle {\n font-size: 1rem;\n line-height: 1.5rem;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-align: left;\n }\n\n .LastMessageMeta {\n margin-left: auto;\n margin-right: 0;\n }\n\n .subtitle {\n color: var(--color-text-secondary);\n margin-right: 2rem;\n\n .matching-text-highlight {\n color: var(--color-text);\n background: #CAE3F7;\n border-radius: 0.25rem;\n padding: 0 0.125rem;\n }\n }\n\n &[dir=rtl] {\n .LastMessageMeta {\n margin-left: 0;\n margin-right: auto;\n }\n\n .subtitle {\n margin-right: 0;\n display: block;\n }\n }\n }\n\n &.picker-list-item {\n margin: 0;\n\n .ListItem-button {\n padding-left: 0;\n display: flex;\n align-items: center;\n }\n\n .Avatar {\n width: 3rem;\n height: 3rem;\n }\n\n .Checkbox {\n flex-shrink: 0;\n height: 1.5rem;\n margin: 0;\n padding-left: 4rem;\n }\n\n &[dir=rtl] {\n .Checkbox {\n padding-left: 0;\n padding-right: 4rem;\n }\n }\n }\n\n .multiline-item {\n white-space: initial;\n overflow: hidden;\n\n .title, .subtitle {\n display: block;\n text-align: initial;\n }\n\n .title {\n line-height: 1.25rem;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .subtitle {\n font-size: 0.875rem;\n line-height: 1.5rem;\n color: var(--color-text-secondary);\n\n & + .subtitle {\n margin-top: -0.25rem;\n }\n\n &.black {\n color: var(--color-text);\n }\n }\n }\n\n &[dir=rtl] {\n .ListItem-button > i {\n margin-left: 2rem;\n margin-right: 0;\n }\n }\n}\n",".VerifiedIcon {\n display: inline-block;\n flex-shrink: 0;\n width: 1.5rem;\n height: 1.5rem;\n background-image: url('../../assets/icon-verified.svg');\n background-repeat: no-repeat;\n background-size: 100%;\n background-position: center;\n}\n",".typing-status {\n display: flex;\n align-items: baseline;\n\n .sender-name {\n &::after {\n content: '\\00a0';\n color: var(--color-text-secondary);\n }\n }\n\n .ellipsis {\n display: flex;\n width: 1rem;\n overflow: hidden;\n\n &::after {\n content: '...';\n animation: typing-animation 1s steps(4, start) infinite;\n\n html[lang=ar] &,\n html[lang=fa] & {\n animation-name: typing-animation-rtl;\n }\n }\n }\n}\n\n@keyframes typing-animation {\n from {\n transform: translateX(-1rem);\n }\n}\n\n@keyframes typing-animation-rtl {\n from {\n transform: translateX(1rem);\n }\n}\n",".Notification-container {\n position: relative;\n width: 24rem;\n max-width: 100vw;\n margin: .25rem auto;\n z-index: var(--z-notification);\n\n @media (min-width: 1276px) {\n transition: transform var(--layer-transition);\n }\n\n &:first-of-type {\n margin-top: 4.25rem;\n\n .has-header-tools & {\n margin-top: 7.375rem;\n }\n }\n}\n\n.Notification {\n background: rgba(32, 32, 32, .8) url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48Y2lyY2xlIGZpbGw9IiNGRkYiIGN4PSIxMiIgY3k9IjEyIiByPSIxMiIvPjxjaXJjbGUgZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJub256ZXJvIiBjeD0iMTIiIGN5PSI2LjUiIHI9IjEuNSIvPjxwYXRoIGQ9Ik0xMiA5LjVjLS41NTIgMC0xIC4zNy0xIC44MjZ2Ny4zNDhjMCAuNDU2LjQ0OC44MjYgMSAuODI2czEtLjM3IDEtLjgyNnYtNy4zNDhjMC0uNDU2LS40NDgtLjgyNi0xLS44MjZ6IiBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L2c+PC9zdmc+\") no-repeat .9375rem 50%;\n background-size: 1.5rem;\n border-radius: var(--border-radius-default);\n padding: .9375rem .9375rem .9375rem 3.375rem;\n color: #fff;\n margin: 0 .5rem;\n\n .text-entity-link,\n .text-entity-link:hover,\n .text-entity-link:active {\n color: #fff !important;\n text-decoration: underline;\n }\n\n .content {\n line-height: 1.25;\n word-break: break-word;\n font-size: .9375rem;\n }\n}\n",".Radio {\n display: block;\n position: relative;\n padding-left: 4.5rem;\n text-align: left;\n margin-bottom: 1.5rem;\n line-height: 1.5rem;\n cursor: pointer;\n\n &.disabled {\n pointer-events: none;\n opacity: 0.5;\n }\n\n &.hidden-widget {\n cursor: default;\n .Radio-main {\n &::before, &::after {\n visibility: hidden;\n }\n }\n }\n\n > input {\n position: absolute;\n z-index: var(--z-below);\n opacity: 0;\n }\n\n .Radio-main {\n &::before, &::after {\n content: '';\n display: block;\n position: absolute;\n left: 1.0625rem;\n top: 50%;\n width: 1.25rem;\n height: 1.25rem;\n transform: translateY(-50%);\n }\n\n &::before {\n border: 2px solid var(--color-borders-input);\n border-radius: 50%;\n background-color: var(--color-background);\n opacity: 1;\n transition: border-color .1s ease, opacity .1s ease;\n }\n\n &::after {\n left: 1.375rem;\n width: 0.625rem;\n height: 0.625rem;\n border-radius: 50%;\n background: var(--color-primary);\n opacity: 0;\n transition: opacity .1s ease;\n }\n\n .label {\n display: block;\n word-break: break-word;\n unicode-bidi: plaintext;\n text-align: left;\n }\n\n .subLabel {\n display: block;\n font-size: 0.875rem;\n line-height: 1rem;\n color: var(--color-text-secondary);\n unicode-bidi: plaintext;\n }\n }\n\n input:checked ~ .Radio-main {\n &::before {\n border-color: var(--color-primary);\n }\n\n &::after {\n opacity: 1;\n }\n }\n\n &.loading {\n .Radio-main::before,\n .Radio-main::after {\n opacity: 0 !important;\n }\n\n .Spinner {\n position: absolute;\n left: 1.0625rem;\n top: 50%;\n transform: translateY(-50%);\n opacity: 0;\n animation: fade-in .2s ease forwards;\n --spinner-size: 1.25rem;\n }\n }\n\n &[dir=rtl] {\n padding-left: 0;\n padding-right: 4.5rem;\n\n .Radio-main {\n text-align: right;\n\n &::before {\n left: auto;\n right: 1.0625rem;\n }\n\n &::after {\n left: auto;\n right: 1.375rem;\n }\n }\n\n .label,\n .subLabel {\n text-align: right;\n }\n\n &.loading .Spinner {\n left: auto;\n right: 1.0625rem;\n }\n }\n}\n\n@keyframes fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n",".Tab {\n display: flex;\n justify-content: center;\n flex: 1 1 auto;\n appearance: none;\n background: none;\n width: auto;\n margin: 0;\n border: none;\n padding: .625rem .25rem;\n font-weight: 500;\n color: var(--color-text-secondary);\n cursor: pointer;\n border-top-left-radius: var(--border-radius-messages-small);\n border-top-right-radius: var(--border-radius-messages-small);\n\n &,\n &:active,\n &:focus {\n outline: none;\n }\n\n &.active {\n cursor: default;\n color: var(--color-primary);\n\n i {\n opacity: 1;\n }\n }\n\n &:not(.active):hover {\n background: var(--color-interactive-element-hover);\n }\n\n > span {\n position: relative;\n display: flex;\n align-items: center;\n }\n\n .badge {\n min-width: 1.25rem;\n height: 1.25rem;\n margin-inline-start: 0.5rem;\n background: var(--color-gray);\n border-radius: 0.75rem;\n padding: 0 .3125rem;\n color: white;\n font-size: 0.875rem;\n line-height: 1.3125rem;\n font-weight: 500;\n text-align: center;\n flex-shrink: 0;\n\n body.is-ios &,\n body.is-macos & {\n line-height: 1.25rem;\n }\n\n &.active {\n background: var(--color-primary);\n }\n }\n\n i {\n position: absolute;\n bottom: calc(-.625rem - 1px);\n left: 0;\n opacity: 0;\n background-color: var(--color-primary);\n height: .1875rem;\n width: 100%;\n border-radius: .1875rem .1875rem 0 0;\n pointer-events: none;\n box-sizing: content-box;\n transform-origin: left;\n\n &.animate {\n transition: transform var(--slide-transition);\n\n body.animation-level-0 & {\n transition: none !important;\n }\n }\n }\n}\n",".TabList {\n position: sticky;\n top: 0;\n flex-shrink: 0;\n display: flex;\n justify-content: space-between;\n align-items: flex-end;\n font-size: .875rem;\n flex-wrap: nowrap;\n box-shadow: 0 2px 2px var(--color-light-shadow);\n background-color: var(--color-background);\n overflow-x: auto;\n overflow-y: hidden;\n\n scrollbar-width: none;\n scrollbar-color: rgba(0, 0, 0, 0);\n\n &.big {\n font-size: 1rem;\n --border-radius-messages-small: 0;\n }\n\n &::-webkit-scrollbar {\n height: 0;\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, 0);\n }\n}\n",".DeleteChatModal {\n .modal-dialog {\n max-width: 20rem;\n }\n\n .modal-header {\n padding: 1.125rem 1.25rem 0;\n }\n\n .modal-title:not(:only-child) {\n margin: 0 0 0 .75rem;\n }\n\n .modal-content {\n padding: .5rem 1.25rem;\n }\n\n .confirm-dialog-button {\n margin-right: -.625rem;\n }\n}\n",".SearchInput {\n position: relative;\n width: 100%;\n color: rgba(var(--color-text-secondary-rgb), 0.5);\n background-color: var(--color-chat-hover);\n border: 2px solid var(--color-chat-hover);\n border-radius: 1.375rem;\n transition: border-color 0.15s ease;\n\n &.with-picker-item {\n display: flex;\n\n .icon-search {\n display: none;\n }\n\n input {\n padding-left: .5rem;\n }\n\n &[dir=rtl] {\n input {\n padding-right: .5rem;\n padding-left: 0;\n }\n }\n }\n\n &.has-focus {\n border-color: var(--color-primary);\n caret-color: var(--color-primary);\n background-color: var(--color-background);\n\n input {\n & + i {\n color: var(--color-primary);\n }\n }\n }\n\n input {\n height: 2.5rem;\n margin-bottom: 0;\n border: none !important;\n border-radius: 1.375rem;\n background-color: transparent !important;\n box-shadow: none !important;\n padding: calc(0.4375rem - var(--border-width)) calc(2.625rem - var(--border-width)) calc(0.5rem - var(--border-width)) calc(2.75rem - var(--border-width));\n\n &::placeholder {\n color: var(--color-placeholders);\n }\n }\n\n > i {\n position: absolute;\n top: .5rem;\n left: .75rem;\n font-size: 1.375rem;\n }\n\n .Loading {\n position: absolute;\n top: .5rem;\n right: .5rem;\n height: 1.5rem;\n\n .Spinner {\n --spinner-size: 1.5rem;\n }\n }\n\n .Button {\n position: absolute;\n top: .125rem;\n right: .125rem;\n font-size: 1rem;\n }\n\n @media (max-width: 600px) {\n input {\n height: 2.5rem;\n border-radius: 1.25rem;\n padding-left: calc(2.625rem - var(--border-width));\n }\n\n i {\n top: 0.5rem;\n }\n }\n\n &[dir=rtl] {\n input {\n direction: rtl;\n }\n\n > i {\n left: auto;\n right: .75rem;\n }\n\n .Loading {\n left: .5rem;\n right: auto;\n }\n\n .Button {\n left: .125rem;\n right: auto;\n }\n }\n}\n",".PickerSelectedItem {\n display: flex;\n align-items: center;\n background: var(--color-chat-hover);\n height: 2rem;\n min-width: 2rem;\n margin-left: 0.5rem;\n margin-bottom: 0.5rem;\n padding-right: 1rem;\n border-radius: 1rem;\n cursor: pointer;\n position: relative;\n overflow: hidden;\n flex-shrink: 1;\n transition: background-color .15s ease;\n\n max-width: calc(50% - 0.5rem);\n\n &.minimized {\n padding-right: 0;\n }\n\n &:hover {\n background-color: var(--color-item-active);\n }\n\n &.closeable:hover {\n background-color: rgba(var(--color-error-rgb), 0.16);\n\n .item-remove {\n opacity: 1;\n }\n\n .Avatar, .item-icon {\n opacity: 0;\n }\n }\n\n &.search-date {\n .item-remove {\n background: var(--color-primary);\n }\n\n &:hover {\n background: var(--color-chat-hover);\n }\n\n .item-name {\n font-size: 0.875rem;\n }\n }\n\n .SearchInput & {\n flex: 1 0 auto;\n position: relative;\n top: .25rem;\n left: -.125rem;\n\n color: var(--color-text-secondary);\n }\n\n .Avatar, .item-icon {\n width: 2rem;\n height: 2rem;\n opacity: 1;\n flex-shrink: 0;\n transition: opacity .15s ease;\n\n i {\n font-size: 2rem;\n }\n }\n\n .item-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0.375rem;\n border-radius: 50%;\n background-color: var(--color-primary);\n color: white;\n\n i {\n font-size: 1.25rem;\n position: relative;\n top: -1px;\n }\n }\n\n .item-name {\n margin-left: 0.5rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n .emoji.emoji-small {\n width: 1.125rem;\n height: 1.125rem;\n background-size: 1.125rem;\n vertical-align: -2px;\n }\n }\n\n .item-remove {\n position: absolute;\n left: 0;\n top: 0;\n width: 2rem;\n height: 2rem;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--color-error);\n font-size: 1.5rem;\n color: white;\n opacity: 0;\n transition: opacity .15s ease;\n }\n\n &[dir=rtl] {\n padding-left: 1rem;\n padding-right: 0;\n\n &.minimized {\n padding-right: 0;\n padding-left: 0;\n }\n\n .SearchInput & {\n left: auto;\n right: -.125rem;\n }\n\n .item-name {\n margin-left: 0;\n margin-right: 0.5rem;\n }\n\n .item-remove {\n left: auto;\n right: 0;\n }\n }\n}\n",".Switcher {\n display: inline-flex;\n align-items: center;\n position: relative;\n margin: 0;\n\n &.disabled {\n pointer-events: none;\n opacity: 0.5;\n }\n\n &.inactive {\n pointer-events: none;\n }\n\n body.animation-level-0 &,\n &.no-animation {\n .widget,\n .widget::after {\n transition: none !important;\n }\n\n .widget:active:after {\n width: 1.125rem;\n }\n }\n\n input {\n height: 0;\n width: 0;\n visibility: hidden;\n position: absolute;\n z-index: var(--z-below);\n opacity: 0;\n }\n\n .widget {\n cursor: pointer;\n text-indent: -999px;\n width: 2.125rem;\n height: 0.875rem;\n background: var(--color-gray);\n display: inline-block;\n border-radius: .5rem;\n position: relative;\n transition: background .2s ease-in;\n }\n\n .widget:after {\n content: '';\n position: absolute;\n top: -.125rem;\n left: 0;\n width: 1.125rem;\n height: 1.125rem;\n background: var(--color-background);\n border-radius: .75rem;\n transition: 0.2s ease-out;\n border: .125rem solid var(--color-gray);\n }\n\n input:checked + .widget {\n background: var(--color-primary);\n }\n\n input:checked + .widget:after {\n left: calc(100% - 1.125rem);\n transform: translateX(calc(-100% + 1.125rem));\n border-color: var(--color-primary);\n }\n\n .widget:active:after {\n width: 1.25rem;\n }\n}\n",".MessageOutgoingStatus {\n width: 1.19rem;\n height: 1.19rem;\n overflow: hidden;\n display: inline-block;\n line-height: 1;\n font-size: 1.1875rem;\n\n i {\n background: var(--background-color);\n }\n\n .icon-message-succeeded {\n padding-left: 0.13rem;\n }\n\n .Transition {\n width: 100%;\n height: 100%;\n }\n}\n",".LastMessageMeta {\n margin-right: .2rem;\n padding: .3rem 0 .15rem;\n flex-shrink: 0;\n font-size: 0.75rem;\n line-height: 1;\n display: flex;\n align-items: center;\n\n .MessageOutgoingStatus {\n color: var(--color-text-meta-colored);\n margin-right: 0.1rem;\n font-size: 1.15rem;\n\n body.is-ios & {\n margin-bottom: -.125rem;\n }\n }\n\n .time {\n color: var(--color-text-meta);\n line-height: 1.15rem;\n }\n}\n",".Badge-transition {\n opacity: 1;\n transition: transform .3s cubic-bezier(0.34, 1.56, 0.64, 1);\n\n &:not(.open) {\n transform: scale(0);\n opacity: 0;\n }\n\n &:not(.shown) {\n display: none;\n }\n\n &.closing {\n transition: transform .2s ease-out, opacity .2s ease-out;\n }\n}\n\n.Badge-wrapper {\n display: flex;\n\n .Badge {\n margin-inline-start: .5rem;\n }\n}\n\n.Badge {\n min-width: 1.5rem;\n height: 1.5rem;\n background: var(--color-gray);\n border-radius: 0.75rem;\n padding: 0 .4375rem;\n color: white;\n font-size: 0.875rem;\n line-height: 1.5625rem;\n font-weight: 500;\n text-align: center;\n flex-shrink: 0;\n\n body.is-macos & {\n line-height: 1.5rem;\n }\n\n body.is-ios & {\n line-height: 1.375rem;\n min-width: 1.375rem;\n height: 1.375rem;\n padding: 0 .375rem;\n }\n\n &.mention, &.unread:not(.muted) {\n background: var(--color-green);\n color: var(--color-white);\n }\n\n &.pinned:not(.unread) {\n color: var(--color-pinned);\n background: transparent;\n width: 1.5rem;\n padding: 0;\n\n i {\n font-size: 1.5rem;\n }\n }\n\n &.mention {\n width: 1.5rem;\n padding: 0.25rem;\n\n i {\n font-size: 1rem;\n vertical-align: super;\n }\n\n body.is-ios & {\n width: 1.375rem;\n padding: 0.25rem;\n\n i {\n font-size: .875rem;\n }\n }\n }\n}\n\n\n","\n@keyframes bar-animation-transform-1 {\n 0% { transform: scaleY(0.33); }\n 12.5% { transform: scaleY(1.66); }\n 25% { transform: scaleY(0.33); }\n 37.5% { transform: scaleY(1); }\n 50% { transform: scaleY(0.33); }\n 62.5% { transform: scaleY(1.66); }\n 75% { transform: scaleY(0.33); }\n 87.5% { transform: scaleY(1.66); }\n 100% { transform: scaleY(0.33); }\n}\n\n@keyframes bar-animation-transform-2 {\n 0% { transform: scaleY(1); }\n 12.5% { transform: scaleY(0.33); }\n 25% { transform: scaleY(1.66); }\n 37.5% { transform: scaleY(0.33); }\n 50% { transform: scaleY(1); }\n 62.5% { transform: scaleY(0.33); }\n 75% { transform: scaleY(1.66); }\n 87.5% { transform: scaleY(0.33); }\n 100% { transform: scaleY(1); }\n}\n\n\n.ChatCallStatus {\n position: absolute;\n right: 6px;\n bottom: 0;\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background-color: #0ac630;\n border: 2px solid var(--color-background);\n overflow: hidden;\n\n .indicator {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n & > div {\n width: 2px;\n height: 6px;\n background: var(--color-background);\n border-radius: 1px;\n margin: 1px;\n will-change: transform;\n transform: translateZ(0);\n }\n & > div:nth-child(odd) {\n transform: scaleY(0.8);\n }\n & > div:nth-child(even) {\n transform: scaleY(1.33);\n }\n }\n\n &.selected {\n background-color: var(--color-white);\n border-color: var(--color-chat-active);\n .indicator div{\n background-color: var(--color-chat-active);\n }\n }\n\n &.active .indicator {\n div:nth-child(odd) {\n animation: bar-animation-transform-2 3.2s normal infinite;\n }\n\n div:nth-child(even) {\n animation: bar-animation-transform-1 3.2s normal infinite;\n }\n }\n\n}\n",".Chat {\n --background-color: var(--color-background);\n\n body.is-ios &,\n body.is-macos & {\n --color-text-meta: var(--color-text-meta-apple);\n }\n\n position: absolute;\n top: 0;\n left: 0;\n margin: 0;\n width: 100%;\n\n &.animate-opacity {\n will-change: opacity;\n transition: opacity .2s ease-out;\n }\n\n &.animate-transform {\n will-change: transform;\n transition: transform .2s ease-out;\n }\n\n &:hover, &.ListItem.has-menu-open {\n .Avatar.online::after {\n border-color: var(--color-chat-hover);\n }\n }\n\n @media (max-width: 600px) {\n &.selected {\n --background-color: var(--color-chat-hover) !important;\n\n .Avatar.online::after {\n border-color: var(--color-chat-hover);\n }\n }\n }\n\n @media (min-width: 600px) {\n &.selected,\n &.selected:hover {\n --background-color: var(--color-chat-active) !important;\n\n .Avatar.online::after {\n border-color: var(--color-chat-active) !important;\n background: var(--color-white);\n }\n\n .ListItem-button {\n --background-color: var(--color-chat-active) !important;\n --color-text: var(--color-white);\n --color-text-meta-colored: var(--color-white);\n --color-text-meta: var(--color-white);\n --color-text-secondary: var(--color-white);\n --color-error: var(--color-white);\n --color-pinned: var(--color-white);\n }\n\n .icon-muted {\n color: var(--color-white) !important;\n }\n\n .Badge:not(.pinned) {\n background: var(--color-white);\n color: var(--color-chat-active);\n }\n }\n }\n\n @media (max-width: 600px) {\n .ListItem-button {\n border-radius: 0 !important;\n }\n }\n\n .status {\n position: relative;\n flex-shrink: 0;\n }\n\n .info {\n .subtitle {\n margin-top: -.125rem;\n }\n\n h3 {\n width: auto;\n max-width: 80%;\n }\n\n .icon-muted {\n font-size: 1.25rem;\n margin-left: 0.25rem;\n margin-top: -.0625rem;\n color: #C6C8CA;\n\n body.is-ios & {\n margin-top: 0;\n margin-right: .5rem;\n }\n }\n\n .LastMessageMeta {\n margin-left: auto;\n\n body.is-ios & {\n font-size: .875rem;\n margin-right: 0;\n }\n }\n\n .last-message, .typing-status {\n padding-right: 0.25rem;\n flex-grow: 1;\n color: var(--color-text-secondary);\n unicode-bidi: plaintext;\n\n &[dir=ltr] {\n text-align: left;\n }\n\n .sender-name {\n color: var(--color-text);\n }\n\n .draft {\n color: var(--color-error);\n }\n }\n\n .last-message {\n .draft {\n &::after {\n content: ': ';\n }\n }\n\n .colon {\n margin-inline-end: .25rem;\n }\n\n img {\n width: 1.25rem;\n height: 1.25rem;\n object-fit: cover;\n border-radius: .125rem;\n vertical-align: -.25rem;\n margin-inline-end: .25rem;\n\n body.is-ios & {\n width: 1.125rem;\n height: 1.125rem;\n vertical-align: -.1875rem;\n }\n\n &.round {\n border-radius: .625rem;\n }\n }\n\n .emoji-small {\n width: 1rem;\n height: 1rem;\n vertical-align: -.125rem;\n }\n\n .icon-play {\n position: relative;\n display: inline-block;\n font-size: .75rem;\n color: #fff;\n margin-inline-start: -1.25rem;\n margin-inline-end: 0.5rem;\n bottom: 0.0625rem;\n\n body.is-ios & {\n margin-inline-start: -1.125rem;\n bottom: 0;\n }\n }\n }\n }\n\n &[dir=rtl] {\n .info {\n .LastMessageMeta {\n margin-left: 0;\n margin-right: auto;\n }\n\n .title, .subtitle {\n padding-left: .15rem;\n padding-right: 0;\n }\n\n .icon-muted {\n margin-left: 0;\n margin-right: 0.25rem;\n }\n\n .last-message, .typing-status {\n padding-left: 0.5rem;\n padding-right: 0;\n text-align: right;\n unicode-bidi: plaintext;\n }\n }\n }\n}\n",".AnimatedEmoji {\n margin-bottom: 0.75rem;\n\n img {\n position: absolute;\n width: 100%;\n height: 100%;\n\n &.like-sticker-thumb {\n transform: scale(0.8);\n }\n }\n}\n",".EmptyFolder {\n width: 100%;\n height: 80%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n\n @media (max-height: 480px) {\n height: 100%;\n }\n\n .sticker {\n height: 8rem;\n margin-bottom: 1.875rem;\n }\n\n .title {\n font-size: 1.25rem;\n margin-bottom: .125rem;\n }\n\n .description {\n font-size: .875rem;\n color: var(--color-text-secondary);\n\n body.is-ios &,\n body.is-macos & {\n color: var(--color-text-secondary-apple);\n }\n }\n\n .Button.pill {\n margin-top: .625rem;\n font-weight: 500;\n padding-inline-start: .75rem;\n unicode-bidi: plaintext;\n\n i {\n margin-inline-end: .625rem;\n font-size: 1.5rem;\n }\n }\n}\n",".NothingFound {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-text-meta);\n\n &.with-description {\n flex-direction: column;\n }\n\n .AnimatedSticker {\n margin: 0 auto;\n }\n\n .description {\n color: var(--color-text-secondary);\n font-size: .875rem;\n text-align: center;\n margin: 1rem 0 0;\n unicode-bidi: plaintext;\n }\n}\n",".Media {\n height: 0;\n padding-bottom: 100%;\n overflow: hidden;\n position: relative;\n cursor: pointer;\n\n .video-duration {\n position: absolute;\n left: .25rem;\n top: .25rem;\n background: rgba(0, 0, 0, .25);\n color: #fff;\n font-size: .75rem;\n padding: 0 .3125rem;\n border-radius: .1875rem;\n line-height: 1.125rem;\n }\n\n img {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n}\n",".WebLink {\n min-height: 3rem;\n padding: .25rem 0 0 3.75rem;\n font-size: 0.875rem;\n line-height: 1.125rem;\n position: relative;\n\n & + & {\n margin-top: 1.5rem;\n }\n\n &.without-media::before {\n content: attr(data-initial);\n width: 3rem;\n height: 3rem;\n position: absolute;\n left: 0;\n top: 0;\n background-color: var(--color-webpage-initial-background);\n color: #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--border-radius-messages-small);\n text-transform: uppercase;\n font-weight: 500;\n font-size: 1.5rem;\n }\n\n .Media {\n position: absolute;\n left: 0;\n top: 0;\n width: 3rem;\n height: 3rem;\n cursor: default !important;\n padding-bottom: unset !important;\n border-radius: var(--border-radius-messages-small) !important;\n }\n\n .site-name,\n .site-description,\n .site-title {\n word-break: break-word;\n text-align: initial;\n }\n\n .site-name {\n display: block;\n color: var(--color-links);\n font-weight: 400;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .site-title {\n font-size: 1rem;\n font-weight: 400;\n margin-bottom: .0625rem;\n line-height: 1.3125rem;\n }\n\n .sender-name,\n .site-description {\n margin-bottom: 0;\n color: var(--color-text-secondary);\n line-height: 1.125rem;\n max-height: 2.25rem;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .sender-name {\n margin-top: .25rem;\n }\n\n .site-description .emoji {\n width: 1rem !important;\n height: 1rem !important;\n }\n\n &[dir=rtl] {\n padding: .25rem 3.75rem 0 0;\n\n .Media,\n &.without-media::before {\n left: auto;\n right: 0;\n }\n\n .content {\n text-align: right;\n }\n }\n}\n",".File {\n --secondary-color: var(--color-text-secondary);\n\n .Message.own & {\n --secondary-color: var(--color-text-green);\n }\n\n .content-inner & {\n min-width: 14rem;\n @media (max-width: 340px) {\n min-width: 11rem;\n }\n }\n\n display: flex;\n align-items: center;\n\n .file-icon-container {\n position: relative;\n }\n\n .file-progress,\n .file-icon,\n .file-preview {\n width: 3.375rem;\n height: 3.375rem;\n margin-inline-end: .75rem;\n border-radius: var(--border-radius-messages-small);\n background: var(--color-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .file-progress {\n position: absolute;\n top: 0;\n left: 0;\n }\n\n .file-icon {\n padding: 1rem .75rem .5rem;\n align-items: flex-end;\n flex-shrink: 0;\n position: relative;\n color: white;\n\n .file-ext {\n font-size: 1rem;\n font-weight: 500;\n transition: opacity .15s;\n }\n\n &::after {\n content: \"\";\n display: block;\n position: absolute;\n top: 0;\n right: 0;\n border-bottom-left-radius: 0.25rem;\n background: rgba(black, 0.25);\n border-color: transparent var(--background-color) transparent var(--background-color);\n border-width: 0 1.125rem 1.125rem 0;\n border-style: solid;\n transition: border-width .15s ease-in;\n }\n }\n\n .file-preview {\n background: transparent;\n overflow: hidden;\n\n & + .action-icon,\n & + .file-progress {\n background: rgba(black, 0.5);\n border-radius: var(--border-radius-messages-small);\n }\n\n img {\n object-fit: cover;\n }\n }\n\n .action-icon {\n color: #fff;\n font-size: 1.5rem;\n position: absolute;\n top: 0;\n start: 0;\n width: 3.375rem;\n height: 3.375rem;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity .25s;\n }\n\n &.interactive .file-icon-container {\n cursor: pointer;\n\n &:hover {\n .file-icon::after {\n border-width: 0;\n }\n\n .action-icon {\n opacity: 1;\n\n &.hidden {\n opacity: 0;\n }\n }\n\n .file-ext {\n opacity: 0;\n }\n }\n }\n\n .file-info {\n margin-top: .1875rem;\n margin-right: .125rem;\n white-space: nowrap;\n overflow: hidden;\n flex-grow: 1;\n\n & + .Link {\n font-size: .75rem;\n color: var(--color-text-secondary);\n padding-left: 1rem;\n white-space: nowrap;\n }\n }\n\n .file-title {\n font-size: 1rem;\n line-height: 1.5rem;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n\n .emoji {\n vertical-align: -4px;\n }\n }\n\n .file-subtitle {\n font-size: .875rem;\n line-height: .9375rem;\n color: var(--secondary-color);\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n\n span + span {\n &::before {\n content: '\\00a0\\2022\\00a0';\n }\n }\n }\n\n &.smaller {\n --background-color: var(--color-background);\n --border-radius-messages-small: .3125rem;\n\n .action-icon,\n .file-progress,\n .file-icon,\n .file-preview {\n width: 3rem;\n height: 3rem;\n }\n\n .file-icon {\n padding-bottom: .375rem;\n\n &::after {\n border-width: 0 1rem 1rem 0;\n }\n }\n\n .file-info {\n margin-top: -.125rem;\n }\n\n .file-title {\n font-weight: 400;\n }\n\n .file-subtitle {\n line-height: 1rem;\n }\n }\n\n &:dir(rtl),\n &[dir=rtl] {\n .file-progress,\n .file-icon,\n .file-preview {\n margin-left: .75rem;\n margin-right: 0;\n }\n\n .file-info {\n text-align: right;\n\n & + .Link {\n padding-left: 0;\n padding-right: 1rem;\n }\n }\n\n .action-icon {\n left: auto;\n right: 0;\n }\n }\n}\n\n// Document extension colors\n.File .file-progress,\n.File .file-icon {\n &.red {\n background-color: var(--color-error);\n }\n\n &.orange {\n background-color: var(--color-warning);\n }\n\n &.green {\n background-color: var(--color-text-green);\n }\n}\n",".Audio {\n display: flex;\n align-items: flex-start;\n position: relative;\n\n .media-loading {\n position: absolute;\n pointer-events: none;\n\n &.interactive {\n pointer-events: all;\n }\n }\n\n &.own {\n --color-text-secondary: var(--accent-color);\n --color-interactive-active: var(--color-text-green);\n --color-interactive-inactive: rgba(var(--color-text-green-rgb), 0.4);\n --color-interactive-buffered: rgba(var(--color-text-green-rgb), 0.4); // Overlays underlying inactive color\n\n .theme-dark & {\n --color-text-green-rgb: 255, 255, 255;\n --color-text-green: var(--color-white);\n }\n\n .Button {\n --color-primary: var(--color-text-green);\n --color-primary-shade: var(--color-green);\n --color-primary-shade-darker: var(--color-green-darker);\n --color-white: var(--color-background-own);\n\n .theme-dark & {\n --color-primary-shade: #fff;\n --color-primary-shade-darker: #fff;\n }\n }\n }\n\n .toggle-play {\n margin-inline-end: .5rem;\n\n &.translucent-white {\n color: rgba(255, 255, 255, 0.8);\n }\n\n &.smaller {\n width: 3rem;\n height: 3rem;\n margin-inline-end: .75rem;\n\n i {\n font-size: 1.625rem;\n\n &.icon-pause {\n font-size: 1.5625rem;\n }\n }\n }\n\n i {\n position: absolute;\n\n &.icon-play {\n margin-left: .1875rem;\n @media (max-width: 600px) {\n margin-left: .125rem;\n }\n }\n }\n\n .icon-play, .icon-pause {\n opacity: 1;\n transform: scale(1);\n transition: opacity .4s, transform .6s cubic-bezier(0.34, 1.56, 0.64, 1);\n }\n\n &.play .icon-pause,\n &.pause .icon-play,\n &.loading .icon-play,\n &.loading .icon-pause {\n opacity: 0;\n transform: scale(.5);\n }\n }\n\n .download-button {\n position: absolute;\n width: 1.1875rem !important;\n height: 1.1875rem !important;\n padding: 0;\n left: 1.9375rem;\n top: 1.9375rem;\n border: .125rem solid var(--background-color);\n z-index: 1;\n\n i {\n font-size: 0.8125rem;\n }\n }\n\n &.bigger .download-button {\n left: 2rem;\n top: 2rem;\n border: .125rem solid var(--color-background);\n }\n\n .content {\n align-self: center;\n min-width: 0;\n flex-grow: 1;\n text-align: initial;\n }\n\n .content-row {\n display: flex;\n justify-content: space-between;\n }\n\n .title {\n font-weight: 500;\n margin: 0;\n line-height: 1.25;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n canvas {\n height: 23px;\n }\n\n .voice-duration {\n margin: .25rem 0 0;\n font-size: .875rem;\n color: var(--color-text-secondary);\n font-variant-numeric: tabular-nums;\n display: flex;\n align-items: flex-end;\n\n &.unread::after {\n content: '';\n position: relative;\n margin: 0 0 .375rem .25rem;\n width: 0.4375rem;\n height: 0.4375rem;\n border-radius: 50%;\n background-color: var(--accent-color);\n }\n }\n\n body.is-ios & {\n .voice-duration.unread::after {\n margin-bottom: .4375rem;\n }\n }\n\n &:not(.own) .voice-duration span {\n color: var(--color-primary);\n }\n\n .waveform {\n cursor: pointer;\n margin-left: 1px;\n touch-action: none;\n }\n\n .meta,\n .performer,\n .date {\n font-size: .875rem;\n color: var(--color-text-secondary);\n margin: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n unicode-bidi: plaintext;\n }\n\n .duration {\n font-size: .875rem;\n color: var(--color-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n flex-shrink: 0;\n font-variant-numeric: tabular-nums;\n }\n\n .meta {\n display: flex;\n align-items: center;\n margin-top: 0.125rem;\n padding-inline-end: 0.5rem;\n\n & > span {\n min-width: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .performer {\n flex-shrink: 0;\n }\n\n .duration.with-seekline {\n margin-inline-end: 0.625rem;\n }\n\n .bullet {\n margin: 0 0.25rem;\n flex-shrink: 0;\n }\n }\n\n .seekline {\n flex-grow: 1;\n height: 1.25rem;\n position: relative;\n top: 3px;\n cursor: pointer;\n touch-action: none;\n\n &::before {\n content: '';\n position: absolute;\n width: 100%;\n top: 6px;\n height: 2px;\n background-color: var(--color-interactive-inactive);\n border-radius: 2px;\n }\n }\n\n .seekline-buffered-progress, .seekline-play-progress {\n position: absolute;\n height: 2px;\n border-radius: 2px;\n overflow: hidden;\n width: 100%;\n top: 6px;\n\n i {\n position: absolute;\n width: 100%;\n background-color: var(--color-interactive-active);\n height: 2px;\n border-radius: 2px;\n right: 100%;\n }\n }\n\n .seekline-buffered-progress i {\n background-color: var(--color-interactive-buffered) !important;\n }\n\n .seekline-thumb {\n position: absolute;\n width: 100%;\n top: 7px;\n left: 0;\n\n i {\n pointer-events: none;\n position: absolute;\n width: 100%;\n right: 100%;\n\n &::after {\n content: '';\n position: absolute;\n top: -6px;\n right: -6px;\n width: 12px;\n height: 12px;\n border-radius: 6px;\n background: var(--color-interactive-active);\n }\n }\n }\n\n &.bigger {\n .title {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-weight: 400;\n line-height: 1.5rem;\n }\n\n .meta {\n height: 1.25rem;\n }\n\n .performer,\n .date {\n line-height: 1.0625rem;\n }\n\n .duration {\n line-height: 1rem;\n }\n\n .media-loading {\n top: 0.1875rem;\n left: 0.1875rem;\n }\n\n &[dir=rtl] {\n .media-loading {\n left: auto !important;\n right: 0;\n }\n }\n }\n\n .ProgressSpinner.size-s svg {\n width: 2.25rem;\n height: 2.25rem;\n }\n\n &[dir=rtl] {\n &:last-child {\n margin-bottom: 0.625rem;\n }\n\n .toggle-play {\n margin-left: .5rem;\n margin-right: 0;\n\n &.smaller {\n margin-left: .75rem;\n margin-right: 0;\n }\n }\n\n .meta.duration.with-seekline {\n margin-inline-start: 0.625rem;\n }\n\n .content,\n .duration {\n text-align: right;\n }\n\n .download-button {\n left: auto;\n right: 2rem;\n }\n }\n}\n\n.has-replies .Audio[dir=rtl] {\n margin-bottom: 1.625rem;\n}\n",".ProfilePhoto {\n width: 100%;\n height: 100%;\n cursor: pointer;\n position: relative;\n\n img:not(.emoji) {\n width: 100%;\n object-fit: cover;\n }\n\n .prev-avatar-media {\n position: absolute;\n left: 0;\n top: 0;\n z-index: -1;\n }\n\n .spinner-wrapper {\n width: 100%;\n height: 100%;\n }\n\n .spinner-wrapper,\n &.deleted-account,\n &.replies-bot-account,\n &.no-photo,\n &.saved-messages {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-white);\n background: linear-gradient(var(--color-white) -125%, var(--color-user));\n cursor: default;\n }\n\n &.no-photo {\n font-size: 14rem;\n }\n\n &.replies-bot-account,\n &.deleted-account,\n &.saved-messages {\n font-size: 20rem;\n }\n}\n",".ProfileInfo {\n aspect-ratio: 1 / 1;\n position: relative;\n\n @supports not (aspect-ratio: 1 / 1) {\n &::before {\n float: left;\n padding-top: 100%;\n content: \"\";\n }\n\n &::after {\n display: block;\n content: \"\";\n clear: both;\n }\n }\n\n .photo-wrapper {\n width: 100%;\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n\n > .Transition {\n width: 100%;\n height: 100%;\n }\n }\n\n .photo-dashes {\n position: absolute;\n width: 100%;\n height: .125rem;\n padding: 0 .375rem;\n z-index: 1;\n\n display: flex;\n top: .5rem;\n left: 0;\n }\n\n .photo-dash {\n flex: 1 1 auto;\n background-color: var(--color-white);\n opacity: .25;\n border-radius: .125rem;\n margin: 0 .125rem;\n\n &.current {\n opacity: .75;\n }\n }\n\n .navigation {\n position: absolute;\n top: 0;\n bottom: 0;\n width: 25%;\n border: none;\n padding: 0;\n margin: 0;\n appearance: none;\n background: transparent no-repeat;\n background-size: 1.25rem;\n opacity: .25;\n transition: opacity .15s;\n outline: none;\n cursor: pointer;\n z-index: 1;\n\n &:hover, .is-touch-env & {\n opacity: 1;\n }\n\n &.prev {\n left: 0;\n background-image: url(\"../../assets/media_navigation_previous.svg\");\n background-position: 1.25rem 50%;\n }\n\n &.next {\n right: 0;\n background-image: url(\"../../assets/media_navigation_next.svg\");\n background-position: calc(100% - 1.25rem) 50%;\n }\n }\n\n .info {\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n min-height: 100px;\n padding: 0 1.5rem .5rem;\n background: linear-gradient(0deg, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0) 100%);\n color: var(--color-white);\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n pointer-events: none;\n\n &:dir(rtl) {\n .status {\n text-align: right;\n unicode-bidi: plaintext;\n }\n }\n\n &[dir=rtl] {\n .status {\n text-align: right;\n unicode-bidi: plaintext;\n }\n }\n }\n\n .title {\n display: flex;\n align-items: center;\n\n h3 {\n font-weight: 500;\n font-size: 1.25rem;\n line-height: 1.375rem;\n white-space: pre-wrap;\n word-break: break-word;\n margin-bottom: .25rem;\n }\n\n .VerifiedIcon {\n margin-left: 0.25rem;\n margin-top: -0.125rem;\n }\n\n .emoji {\n width: 1.5rem;\n height: 1.5rem;\n background-size: 1.5rem;\n }\n }\n\n .status {\n font-size: 0.875rem;\n opacity: .5;\n }\n\n &[dir=rtl] {\n .navigation.prev {\n left: auto;\n right: 0;\n transform: scaleX(-1);\n }\n\n .navigation.next {\n left: 0;\n right: auto;\n transform: scaleX(-1);\n }\n }\n\n &.self {\n margin: 0 -.5rem .75rem;\n overflow: hidden;\n\n &.ghost {\n margin: 0;\n }\n\n .prev-avatar-media {\n z-index: 0;\n }\n\n .info {\n padding-bottom: .75rem;\n }\n\n .status {\n line-height: 1rem;\n }\n }\n}\n",".DropTarget {\n border-radius: var(--border-radius-default);\n background: var(--color-background);\n padding: 1.25rem;\n flex: 1 1 auto;\n width: 100%;\n max-width: 43.75rem;\n margin-left: auto;\n margin-right: auto;\n margin-bottom: .3125rem;\n display: flex;\n color: #A4ACB3;\n box-shadow: 0 1px 2px var(--color-default-shadow);\n\n @media (max-height: 350px) {\n padding: .75rem;\n }\n\n &.hovered .target-content {\n color: var(--color-primary);\n background-image: var(--drag-target-border-hovered);\n }\n\n & + & {\n margin-top: .3125rem;\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n\n .target-content {\n pointer-events: none;\n background-image: var(--drag-target-border);\n border-radius: .5rem;\n flex: 1 1 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n transition: .2s color, .2s background;\n }\n\n .icon {\n font-size: 6.25rem;\n line-height: 4.6875rem;\n margin-bottom: 2.25rem;\n\n @media (max-height: 520px) {\n font-size: 4.25rem;\n line-height: 3.5rem;\n margin-bottom: 1rem;\n }\n\n @media (max-height: 450px) {\n font-size: 2rem;\n line-height: 1rem;\n margin-bottom: .5rem;\n margin-top: .25rem;\n }\n }\n\n .title {\n font-size: 1.3125rem;\n font-weight: 500;\n letter-spacing: -.18px;\n\n @media (max-height: 450px) {\n font-size: 1rem;\n }\n }\n\n .description {\n font-size: 1rem;\n letter-spacing: .3px;\n\n @media (max-height: 450px) {\n font-size: .875rem;\n }\n }\n}\n",".FloatingActionButton {\n position: absolute;\n right: 1rem;\n bottom: 1rem;\n transform: translateY(calc(5rem - var(--group-call-header-height, 0rem)));\n transition: transform .25s cubic-bezier(0.34, 1.56, 0.64, 1);\n\n body.animation-level-0 & {\n transition: none !important;\n }\n\n &.revealed {\n transform: translateY(calc(0rem - var(--group-call-header-height, 0rem)));\n }\n}\n","@import '../../styles/mixins';\n\n@mixin thumb-styles() {\n background: var(--slider-color);\n border: none;\n height: 0.75rem;\n width: 0.75rem;\n border-radius: 50%;\n cursor: pointer;\n transform: scale(1);\n transition: transform .25s ease-in-out;\n\n &:hover {\n transform: scale(1.2);\n }\n}\n\n.RangeSlider {\n --slider-color: var(--color-primary);\n\n margin-bottom: 1rem;\n\n &.disabled {\n pointer-events: none;\n --slider-color: var(--color-text-secondary);\n }\n\n .slider-top-row {\n display: flex;\n justify-content: space-between;\n margin-bottom: 0.625rem;\n\n .value {\n flex-shrink: 0;\n margin-left: 1rem;\n color: var(--color-text-secondary);\n }\n\n &[dir=rtl] {\n .value {\n margin-left: 0;\n margin-right: 1rem;\n }\n }\n }\n\n .slider-main {\n position: relative;\n z-index: 1;\n\n &::before {\n content: '';\n position: absolute;\n width: 100%;\n left: 0;\n top: 0.3125rem;\n height: 0.125rem;\n background-color: var(--color-borders);\n border-radius: 0.125rem;\n opacity: 0.5;\n z-index: -1;\n }\n }\n\n .slider-fill-track {\n position: absolute;\n width: 100%;\n left: 0;\n top: 0.3125rem;\n height: 0.125rem;\n background-color: var(--slider-color);\n border-radius: 0.125rem;\n pointer-events: none;\n }\n\n // Reset range input browser styles\n @include reset-range();\n\n // Apply custom styles\n input[type=\"range\"] {\n // Note that while we're repeating code here, that's necessary as you can't comma-separate these type of selectors.\n // Browsers will drop the entire selector if it doesn't understand a part of it.\n &::-webkit-slider-thumb {\n @include thumb-styles();\n }\n\n &::-moz-range-thumb {\n @include thumb-styles();\n }\n\n &::-ms-thumb {\n @include thumb-styles();\n }\n }\n\n .slider-options {\n display: grid;\n grid-template-rows: auto;\n grid-auto-columns: 1fr;\n grid-auto-flow: column;\n }\n\n .slider-option {\n font-size: 0.825rem;\n text-align: center;\n cursor: pointer;\n color: var(--color-text-secondary);\n transition: color .2s ease;\n\n &:hover, &.active {\n color: var(--color-text);\n }\n\n &.active {\n font-weight: 500;\n }\n\n &:first-child {\n text-align: left;\n }\n\n &:last-child {\n text-align: right;\n }\n }\n}\n","// @optimization\n@mixin while-transition() {\n .Transition > div:not(.active) &, body.animating-right-column & {\n @content;\n }\n}\n\n@mixin overflow-y-overlay() {\n @supports (overflow-y: overlay) {\n overflow-y: overlay;\n\n //Workaround for Android <= 9\n overflow-x: hidden;\n }\n}\n\n@mixin reset-range() {\n input[type=\"range\"] {\n -webkit-appearance: none;\n display: block;\n width: 100%;\n height: 0.75rem;\n margin-bottom: 0.5rem;\n background: transparent;\n\n &:focus {\n outline: none;\n }\n\n &::-ms-track {\n width: 100%;\n cursor: pointer;\n\n background: transparent;\n border-color: transparent;\n color: transparent;\n }\n\n &::-webkit-slider-thumb {\n -webkit-appearance: none;\n }\n\n &::-moz-slider-thumb {\n -moz-appearance: none;\n }\n\n &::-webkit-slider-runnable-track {\n cursor: pointer;\n }\n\n &::-moz-range-track, &::-moz-range-progress {\n cursor: pointer;\n }\n }\n}\n",".DropArea {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n height: 100vh;\n z-index: var(--z-drop-area);\n padding: 80px 20px 20px;\n\n display: flex;\n flex-direction: column;\n\n #Main.right-column-open & {\n max-width: calc(100% - var(--right-column-width));\n }\n}\n",".StickerButton {\n display: inline-block;\n width: 4rem;\n height: 4rem;\n margin: 0.5rem;\n border-radius: var(--border-radius-messages-small);\n background: transparent no-repeat center;\n background-size: contain;\n transition: background-color .15s ease, opacity .3s ease !important;\n position: relative;\n\n &.interactive {\n cursor: pointer;\n\n &:hover {\n background-color: var(--color-interactive-element-hover);\n\n .sticker-unfave-button {\n opacity: 1;\n }\n }\n\n }\n\n @media (max-width: 600px) {\n margin: 0.25rem;\n }\n\n &.set-button {\n width: 2.75rem !important;\n height: 2.75rem;\n margin: 0 0.5rem;\n }\n\n &.large {\n width: 10rem;\n height: 10rem;\n margin: 0;\n }\n\n .AnimatedSticker, img {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n\n img {\n object-fit: contain;\n }\n\n .sticker-unfave-button {\n position: absolute;\n top: -0.5rem;\n right: -0.5rem;\n width: 1.25rem;\n height: 1.25rem;\n padding: 0.125rem;\n\n i {\n font-size: 1rem;\n }\n\n opacity: 0;\n }\n}\n",".TextFormatter {\n transform: translate(-50%, -3.25rem);\n\n &, &-link-control {\n position: absolute;\n background: var(--color-background);\n border-radius: var(--border-radius-messages);\n padding: 0.5rem 0.375rem;\n box-shadow: 0 1px 2px var(--color-default-shadow);\n }\n\n &-link-control {\n left: 0;\n top: 0;\n opacity: 0;\n pointer-events: none;\n transition: opacity .3s ease;\n\n .Modal & {\n max-width: 100%;\n }\n\n @media (max-width: 600px) {\n max-width: calc(100vw - var(--text-formatter-left) + 3rem);\n }\n\n input {\n border: none !important;\n outline: none !important;\n width: 100%;\n color: var(--color-text);\n background-color: var(--color-background);\n }\n }\n\n &-buttons, &-link-url-confirm {\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n }\n\n &-divider {\n width: 1px;\n height: 1.75rem;\n margin: 0 0.25rem;\n background-color: var(--color-borders);\n }\n\n &-link-url-input-wrapper {\n width: 20rem;\n position: relative;\n max-width: 100%;\n\n @media (max-width: 600px) {\n max-width: 90vw;\n }\n\n &::before, &::after {\n content: \"\";\n display: block;\n position: absolute;\n top: 0;\n bottom: 0;\n width: 1rem;\n z-index: 2;\n opacity: 0;\n transition: opacity .2s ease;\n }\n\n &::before {\n left: 0;\n background: linear-gradient(to right, var(--color-background) .25rem, transparent 1rem)\n }\n\n &::after {\n right: 0;\n background: linear-gradient(to left, var(--color-background) .25rem, transparent 1rem)\n }\n\n &.mask-left {\n &::before {\n opacity: 1;\n }\n }\n\n &.mask-right {\n &::after {\n opacity: 1;\n }\n }\n }\n\n &-link-url-confirm {\n flex-shrink: 0;\n opacity: 0;\n transition: opacity .3s ease;\n\n &.shown {\n opacity: 1;\n }\n }\n\n &.link-control-shown {\n .TextFormatter-link-control {\n opacity: 1;\n pointer-events: all;\n }\n }\n\n .Button {\n width: 2rem;\n height: 2rem;\n padding: 0.25rem;\n font-size: 1.5rem;\n margin: 0 0.125rem;\n border-radius: var(--border-radius-messages-small);\n flex-shrink: 0;\n cursor: pointer;\n\n &.active {\n background-color: var(--color-primary) !important;\n color: white;\n }\n\n &.disabled {\n opacity: .5;\n pointer-events: none;\n }\n }\n}\n",".Picker {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n\n .picker-header {\n padding: 0 1rem 0.25rem 0.75rem;\n border-bottom: 1px solid var(--color-borders);\n display: flex;\n flex-flow: row wrap;\n flex-shrink: 0;\n\n overflow-y: auto;\n max-height: 20rem;\n\n .input-group {\n margin-bottom: 0.5rem;\n margin-left: 0.5rem;\n flex-grow: 1;\n }\n\n .form-control {\n height: 2rem;\n border: none;\n border-radius: 0;\n padding: 0;\n box-shadow: none;\n }\n }\n\n .picker-list {\n flex-grow: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 0.5rem;\n\n @media (max-width: 600px) {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n }\n\n .no-results {\n height: 100%;\n margin: 0;\n padding: 1rem 1rem;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-text-secondary);\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/dist/435.15d3c1acaf8d2000388e.js b/dist/435.15d3c1acaf8d2000388e.js new file mode 100644 index 000000000..43d3f7ac2 --- /dev/null +++ b/dist/435.15d3c1acaf8d2000388e.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunktelegram_t=self.webpackChunktelegram_t||[]).push([[435],{7854:(e,t,n)=>{n.d(t,{Z:()=>m});var a=n(4050),r=n(6137),s=n(4399),i=n(3657),o=n(6202),l=n(692),c=n(706),d=n(7799);const u={large:160,medium:128,small:104},m=({sticker:e,size:t="medium",observeIntersection:n,lastSyncTime:m,forceLoadPreview:h})=>{var f;const v=(0,a.sO)(null),[p,Z]=(0,c.Z)(),g=`sticker${e.id}`,E=(0,i.Op)(v,n),P=null===(f=e.thumbnail)||void 0===f?void 0:f.dataUri,y=(0,o.Z)(`${g}?size=m`,!E&&!h,r.IU.BlobUrl,m),C=(0,l.Z)(y),b=(0,o.Z)(g,!E,r.IU.Lottie,m),N=Boolean(b),[w,k]=(0,a.eJ)(String(Math.random())),I=(0,a.I4)((()=>{k(String(Math.random()))}),[]),T=u[t],M=`width: ${T}px; height: ${T}px;`;return a.ZP.createElement("div",{ref:v,className:"AnimatedEmoji media-inner",style:M,onClick:I},!p&&P&&a.ZP.createElement("img",{src:P,className:e.id===s.wB?"like-sticker-thumb":void 0,alt:""}),!p&&y&&a.ZP.createElement("img",{src:y,className:C,alt:""}),N&&a.ZP.createElement(d.Z,{key:g,id:g,animationData:b,size:T,quality:1,play:E&&w,noLoop:!0,onLoad:Z}))}},4752:(e,t,n)=>{n.d(t,{Z:()=>T});var a=n(4050),r=n(5116),s=n(6137),i=n(1713),o=n(7361),l=n(790),c=n(2858),d=n(6752),u=n(2340),m=n(5376),h=n(2566),f=n(1212),v=n(2019),p=n(3186),Z=n(9107),g=n(1174),E=n(6202),P=n(396),y=n(663),C=n(231),b=n(9196),N=n(8033);const w=o.wB?20:25,k=o.wB?50:75;function I(e,t,n){return a.ZP.createElement("div",{className:"seekline no-selection",ref:n},a.ZP.createElement("span",{className:"seekline-buffered-progress"},a.ZP.createElement("i",{style:`transform: translateX(${100*t}%)`})),a.ZP.createElement("span",{className:"seekline-play-progress"},a.ZP.createElement("i",{style:`transform: translateX(${100*e}%)`})),a.ZP.createElement("span",{className:"seekline-thumb"},a.ZP.createElement("i",{style:`transform: translateX(${100*e}%)`})))}const T=(0,a.X$)((({theme:e,message:t,senderTitle:n,uploadProgress:T,origin:M,date:S,lastSyncTime:x,className:L,isSelectable:$,isSelected:F,isDownloading:A,onPlay:O,onReadMedia:R,onCancelUpload:D,onDateClick:U})=>{const{content:{audio:B,voice:V,video:X},isMediaUnread:K}=t,j=Boolean(V||X),z=(0,a.sO)(!1),q=(0,a.sO)(!1),H=(0,a.sO)(null),Y=(0,Z.Z)(),{isRtl:J}=Y,W=(0,r.uC)(),[_,G]=(0,a.eJ)(!1),Q=x,ee=(0,c.Ti)(t,"pictogram"),te=(0,E.Z)(ee,!1,s.IU.BlobUrl),ne=(0,E.Z)((0,c.Ti)(t,"inline"),!Q,(0,c.kG)(t,"inline")),{loadProgress:ae}=(0,h.Z)((0,c.Ti)(t,"download"),!A),re=(0,a.I4)((()=>{G(!0),O(t.id,t.chatId)}),[t,O]),se=(0,a.I4)((()=>{G(!1)}),[]),{isBuffered:ie,bufferedProgress:oe,bufferingHandlers:le,checkBuffering:ce}=(0,v.Z)(),{isPlaying:de,playProgress:ue,playPause:me,play:he,pause:fe,setCurrentTime:ve,duration:pe}=(0,p.Z)((0,P.An)(t),(0,c.XV)(t),j?"voice":"audio",ne,le,void 0,ce,_,re,se,(0,c.CI)(t)),Ze=(0,c.B4)(t),ge=function(e,t,n=0,r=!1){const s=(0,a.sO)(null),{data:i,peak:o}=(0,a.Ye)((()=>{if(!t)return;const{waveform:e,duration:n}=t;if(!e)return{data:new Array(Math.min(n,30)).fill(0),peak:0};const a=Math.min(n/10,1),r=Math.round(w+(k-w)*a);return function(e,t){let n=0;const a=new Array(t),r=e.length/t,s=e[0],i=e[e.length-1];for(let d=0;d>n&31}const s=Math.floor(5*(n-1)/8),i=Math.floor(5*(n-1)%8),o=r[s]+(r[s+1]<<8);return a[n-1]=o>>i&31,a}(new Uint8Array(e)),r)}),[t])||{};return(0,a.bt)((()=>{const t=s.current;t&&i&&void 0!==o&&function(e,t,n,{peak:a,fillStyle:r,progressFillStyle:s}){const i=4*t.length;e.width=2*i,e.height=46,e.style.width=`${i}px`,e.style.height="23px";const o=e.getContext("2d");o.scale(2,2),t.forEach(((e,i)=>{o.globalAlpha=i/t.length>=n?.5:1,o.fillStyle=n>i/t.length?s:r;const l=Math.max(2,e/Math.max(1,a)*23);!function(e,t,n,a,r,s){2<2*s&&(s=1),r<2*s&&(s=r/2),e.beginPath(),e.moveTo(t+s,n),e.arcTo(t+2,n,t+2,n-r,s),e.arcTo(t+2,n-r,t,n-r,s),e.arcTo(t,n-r,t,n,s),e.arcTo(t,n,t+2,n,s),e.closePath()}(o,4*i,23,0,l,1),o.fill()}))}(t,i,n,{peak:o,fillStyle:r?"dark"===e?"#B7ABED":"#AEDFA4":"dark"===e?"#494A78":"#ADD3F7",progressFillStyle:r?"dark"===e?"#FFFFFF":"#4FAE4E":"dark"===e?"#8774E1":"#3390EC"})}),[r,o,n,i,e]),s}(e,V,K&&!Ze?1:ue,Ze),Ee=de||ue>0&&ue<1;(0,a.d4)((()=>{G(de)}),[de]);const Pe=_&&!ie,{isUploading:ye,isTransferring:Ce,transferProgress:be}=(0,c.Sc)(t,T||ae,Pe||A),{shouldRender:Ne,transitionClassNames:we}=(0,f.Z)(Ce),ke=Ne&&(Pe||ye),Ie=(0,a.I4)((()=>{ye?null==D||D():(de||O(t.id,t.chatId),(0,r.uC)().setAudioPlayerOrigin({origin:M}),G(!_),me())}),[ye,de,_,me,D,O,t.id,t.chatId,M]);(0,a.d4)((()=>{R&&K&&(de||A)&&R()}),[de,K,R,A]);const Te=(0,a.I4)((()=>{A?W.cancelMessageMediaDownload({message:t}):W.downloadMessageMedia({message:t})}),[W,A,t]),Me=(0,a.I4)((e=>{if(z.current&&H.current){const{width:t,left:n}=H.current.getBoundingClientRect(),a=e instanceof MouseEvent?e.clientX:e.targetTouches[0].clientX;e.stopPropagation(),ve(Math.max(Math.min(pe*((a-n)/t),pe-.1),.001))}}),[pe,ve]),Se=(0,a.I4)((e=>{e instanceof MouseEvent&&2===e.button||(z.current=!0,q.current=de,fe(),Me(e))}),[Me,fe,de]),xe=(0,a.I4)((()=>{z.current=!1,q.current&&he()}),[he]),Le=(0,a.I4)((()=>{U(t.id,t.chatId)}),[U,t.id,t.chatId]);function $e(){if(j)return n||"Voice";const{title:e,fileName:t}=B;return e||t}(0,a.d4)((()=>{if(H.current&&Ee)return(0,g.s)(H.current,{onCapture:Se,onRelease:xe,onClick:xe,onDrag:Me})}),[Ee,Se,Me,xe]);const Fe=(0,d.Z)("Audio",L,Ze&&M===i.Cr.Inline&&"own",(M===i.Cr.Search||M===i.Cr.SharedMedia)&&"bigger",F&&"audio-is-selected"),Ae=["toggle-play"];ke?Ae.push("loading"):de?Ae.push("pause"):de||Ae.push("play");const Oe=(0,d.Z)("content",Ee&&"with-seekline");function Re(){return a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("div",{className:Oe},a.ZP.createElement("div",{className:"content-row"},a.ZP.createElement("p",{className:"title",dir:"auto",title:$e()},(0,u.Z)($e())),a.ZP.createElement("div",{className:"message-date"},S&&a.ZP.createElement(N.Z,{className:"date",onClick:Le},(0,l.VX)(Y,1e3*S)))),Ee&&a.ZP.createElement("div",{className:"meta search-result",dir:J?"rtl":void 0},a.ZP.createElement("span",{className:"duration with-seekline",dir:"auto"},ue<1&&`${(0,l.k9)(pe*ue,pe)}`),I(ue,oe,H)),!Ee&&function(){if(j)return a.ZP.createElement("div",{className:"meta",dir:J?"rtl":void 0},(0,l.k9)((V||X).duration));const{performer:e}=B;return a.ZP.createElement("div",{className:"meta",dir:J?"rtl":void 0},(0,l.k9)(pe),a.ZP.createElement("span",{className:"bullet"},"•"),e&&a.ZP.createElement("span",{className:"performer",title:e},(0,u.Z)(e)),e&&n&&a.ZP.createElement("span",{className:"bullet"},"•"),n&&a.ZP.createElement("span",{title:n},(0,u.Z)(n)))}()))}return a.ZP.createElement("div",{className:Fe,dir:Y.isRtl?"rtl":"ltr"},$&&a.ZP.createElement("div",{className:"message-select-control"},F&&a.ZP.createElement("i",{className:"icon-select"})),a.ZP.createElement(C.Z,{round:!0,ripple:!o.wB,size:"smaller",color:te?"translucent-white":"primary",className:Ae.join(" "),ariaLabel:de?"Pause audio":"Play audio",onClick:Ie,isRtl:Y.isRtl,backgroundImage:te},a.ZP.createElement("i",{className:"icon-play"}),a.ZP.createElement("i",{className:"icon-pause"})),Ne&&a.ZP.createElement("div",{className:(0,d.Z)("media-loading",we,ke&&"interactive")},a.ZP.createElement(b.Z,{progress:be,transparent:!0,size:"m",onClick:ke?Ie:void 0,noCross:!ke})),B&&!ye&&a.ZP.createElement(C.Z,{round:!0,size:"tiny",className:"download-button",ariaLabel:A?"Cancel download":"Download",onClick:Te},a.ZP.createElement("i",{className:A?"icon-close":"icon-arrow-down"})),M===i.Cr.Search&&Re(),M!==i.Cr.Search&&B&&function(e,t,n,r,s,i,o,c,d,h,f){const{title:v,performer:p,fileName:Z}=t,g=r||s>0&&s<1,{isRtl:E}=y.i0;return a.ZP.createElement("div",{className:"content"},a.ZP.createElement("p",{className:"title",dir:"auto",title:v},(0,u.Z)(v||Z)),g&&a.ZP.createElement("div",{className:"meta",dir:E?"rtl":void 0},a.ZP.createElement("span",{className:"duration with-seekline",dir:"auto"},(0,l.k9)(n*s,n)),I(s,i,o)),!g&&c&&a.ZP.createElement("div",{className:"meta",dir:E?"rtl":void 0},h?`${(0,m.yW)(t.size*h)} / `:void 0,(0,m.yW)(t.size)),!g&&!c&&a.ZP.createElement("div",{className:"meta",dir:E?"rtl":void 0},a.ZP.createElement("span",{className:"duration",dir:"auto"},(0,l.k9)(n)),a.ZP.createElement("span",{className:"bullet"},"•"),a.ZP.createElement("span",{className:"performer",dir:"auto",title:p},(0,u.Z)(p||"Unknown")),d&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("span",{className:"bullet"},"•"),a.ZP.createElement(N.Z,{className:"date",onClick:f},(0,l.ZK)(e,1e3*d,!0)))))}(Y,B,pe,de,ue,oe,H,A||ye,S,be,U?Le:void 0),M===i.Cr.SharedMedia&&(V||X)&&Re(),M===i.Cr.Inline&&V&&function(e,t,n,r,s){return a.ZP.createElement("div",{className:"content"},a.ZP.createElement("div",{className:"waveform",draggable:!1,ref:t},a.ZP.createElement("canvas",{ref:n})),a.ZP.createElement("p",{className:(0,d.Z)("voice-duration",s&&"unread"),dir:"auto"},0===r?(0,l.k9)(e.duration):(0,l.k9)(e.duration*r)))}(V,H,ge,ue,K))}))},180:(e,t,n)=>{n.d(t,{Z:()=>f});var a=n(4050),r=n(5116),s=n(1638),i=n(2858),o=n(2340),l=n(782),c=n(4319),d=n(6272),u=n(9107),m=n(1876),h=n(3321);const f=(0,a.X$)((0,r.c$)(((e,{chatOrUserId:t})=>{const{lastSyncTime:n,countryList:{phoneCodes:a}}=e,r=t?(0,s.Z1)(e,t):void 0,o=(0,i.YC)(t)?(0,s.dy)(e,t):void 0,l=r&&(0,i.i4)(r,(0,s.dZ)(e),(0,s.NJ)(e));return{lastSyncTime:n,phoneCodeList:a,chat:r,user:o,canInviteUsers:r&&!o&&(!(0,i.eA)(r)&&!(0,i.Mg)(r,"inviteUsers")||(0,i.VE)(r,"inviteUsers")),isMuted:l}}),((e,t)=>(0,l.ei)(t,["loadFullUser","updateChatMutedState","showNotification"])))((({lastSyncTime:e,user:t,chat:n,forceShowSelf:r,canInviteUsers:s,isMuted:l,phoneCodeList:f,loadFullUser:v,showNotification:p,updateChatMutedState:Z})=>{const{id:g,fullInfo:E,username:P,phoneNumber:y,isSelf:C}=t||{},{id:b}=n||{},N=(0,u.Z)();(0,a.d4)((()=>{e&&g&&v({userId:g})}),[v,g,e]);const w=(0,a.I4)((()=>{Z({chatId:b,isMuted:!l})}),[b,l,Z]);if(!n||n.isRestricted||C&&!r)return;function k(e,t){(0,c.TE)(e),p({message:`${t} was copied`})}const I=y&&(0,d.WZ)(f,y),T=(0,i.hu)(n),M=(null==E?void 0:E.bio)||(0,i.GM)(n);return a.ZP.createElement("div",{className:"ChatExtra"},I&&!!I.length&&a.ZP.createElement(m.Z,{icon:"phone",multiline:!0,narrow:!0,ripple:!0,onClick:()=>k(I,N("Phone"))},a.ZP.createElement("span",{className:"title",dir:"auto"},I),a.ZP.createElement("span",{className:"subtitle"},N("Phone"))),P&&a.ZP.createElement(m.Z,{icon:"mention",multiline:!0,narrow:!0,ripple:!0,onClick:()=>k(`@${P}`,N("Username"))},a.ZP.createElement("span",{className:"title",dir:"auto"},(0,o.Z)(P)),a.ZP.createElement("span",{className:"subtitle"},N("Username"))),M&&!!M.length&&a.ZP.createElement(m.Z,{icon:"info",multiline:!0,narrow:!0,isStatic:!0},a.ZP.createElement("span",{className:"title",dir:"auto"},(0,o.Z)(M,["br","links","emoji"])),a.ZP.createElement("span",{className:"subtitle"},N(g?"UserBio":"Info"))),(s||!P)&&T&&a.ZP.createElement(m.Z,{icon:"mention",multiline:!0,narrow:!0,ripple:!0,onClick:()=>k(T,N("SetUrlPlaceholder"))},a.ZP.createElement("div",{className:"title"},T),a.ZP.createElement("span",{className:"subtitle"},N("SetUrlPlaceholder"))),!r&&a.ZP.createElement(m.Z,{icon:"unmute",ripple:!0,onClick:w},a.ZP.createElement("span",null,N("Notifications")),a.ZP.createElement(h.Z,{id:"group-notifications",label:g?"Toggle User Notifications":"Toggle Chat Notifications",checked:!l,inactive:!0})))})))},329:(e,t,n)=>{n.d(t,{Z:()=>h});var a=n(4050),r=n(5116),s=n(1638),i=n(2858),o=n(782),l=n(9107),c=n(2340),d=n(172),u=n(3103),m=n(231);const h=(0,a.X$)((0,r.c$)(((e,{chat:t})=>{const n=(0,i.YC)(t.id),a=(0,s.FM)(e,t.id),r=n&&(0,s.dy)(e,(0,i.zX)(t)),o=r&&(0,i.cS)(r)&&!t.isSupport,l=n&&!a&&!o,c=n?(0,i.Vl)((0,s.dy)(e,(0,i.zX)(t))):void 0;return{isPrivateChat:n,isChatWithSelf:a,isBot:o,isChannel:(0,i.eA)(t),isBasicGroup:(0,i.G9)(t),isSuperGroup:(0,i.ZV)(t),currentUserId:e.currentUserId,canDeleteForAll:l,contactName:c}}),((e,t)=>(0,o.ei)(t,["leaveChannel","deleteHistory","deleteChannel","deleteChatUser","blockContact"])))((({isOpen:e,chat:t,isChannel:n,isPrivateChat:r,isChatWithSelf:s,isBot:o,isBasicGroup:h,isSuperGroup:f,currentUserId:v,canDeleteForAll:p,contactName:Z,onClose:g,onCloseAnimationEnd:E,leaveChannel:P,deleteHistory:y,deleteChannel:C,deleteChatUser:b,blockContact:N})=>{const w=(0,l.Z)(),k=(0,i.U)(w,t),I=(0,a.I4)((()=>{y({chatId:t.id,shouldDeleteForAll:!0}),g()}),[y,t.id,g]),T=(0,a.I4)((()=>{y({chatId:t.id,shouldDeleteForAll:!0}),N({contactId:t.id,accessHash:t.accessHash}),g()}),[y,t.id,t.accessHash,N,g]),M=(0,a.I4)((()=>{r?y({chatId:t.id,shouldDeleteForAll:!1}):h?(b({chatId:t.id,userId:v}),y({chatId:t.id,shouldDeleteForAll:!1})):!n&&!f||t.isCreator?(n||f)&&t.isCreator&&C({chatId:t.id}):P({chatId:t.id}),g()}),[r,h,n,f,v,t.isCreator,t.id,g,y,b,P,C]);return a.ZP.createElement(u.Z,{isOpen:e,className:"DeleteChatModal",header:a.ZP.createElement("div",{className:"modal-header",dir:w.isRtl?"rtl":void 0},a.ZP.createElement(d.Z,{size:"tiny",chat:t,isSavedMessages:s}),a.ZP.createElement("h3",{className:"modal-title"},w(n&&!t.isCreator?"LeaveChannel":n&&t.isCreator?"ChannelDelete":h||f?"Group.LeaveGroup":"DeleteChatUser"))),onClose:g,onCloseAnimationEnd:E},n&&t.isCreator?a.ZP.createElement("p",null,(0,c.Z)(w("ChatList.DeleteAndLeaveGroupConfirmation",k),["simple_markdown"])):n&&!t.isCreator||h||f?a.ZP.createElement("p",null,(0,c.Z)(w("ChannelLeaveAlertWithName",k),["simple_markdown"])):a.ZP.createElement("p",null,(0,c.Z)(w("ChatList.DeleteChatConfirmation",Z),["simple_markdown"])),o&&a.ZP.createElement(m.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:T},w("DeleteAndStop")),p&&a.ZP.createElement(m.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:I},Z?(0,c.Z)(w("ChatList.DeleteForEveryone",Z)):w("DeleteForAll")),a.ZP.createElement(m.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:M},w(n&&!t.isCreator?"LeaveChannel":n&&t.isCreator?"Chat.Input.Delete":h||f?"Group.LeaveGroup":p?"ChatList.DeleteForCurrentUser":"Delete")),a.ZP.createElement(m.Z,{className:"confirm-dialog-button",isText:!0,onClick:g},w("Cancel")))})))},2535:(e,t,n)=>{n.d(t,{Z:()=>m});var a=n(4050),r=n(5116),s=n(5376),i=n(2858),o=n(3657),l=n(2566),c=n(6202),d=n(706),u=n(7002);const m=(0,a.X$)((({message:e,observeIntersection:t,smaller:n,canAutoLoad:m,autoLoadFileMaxSizeMb:h,uploadProgress:f,withDate:v,datetime:p,className:Z,sender:g,isSelected:E,isSelectable:P,onCancelUpload:y,onMediaClick:C,onDateClick:b,isDownloading:N})=>{const w=(0,r.uC)(),k=(0,a.sO)(null),I=e.content.document,{fileName:T,size:M,timestamp:S}=I,x=(0,s.K2)(I)||"",L=(0,o.Op)(k,t),[$,F]=(0,d.Z)();(0,a.d4)((()=>{L&&F()}),[L,F]);const[A,O]=(0,a.eJ)(m&&(!h||M<=1048576*h)),R=Boolean(N||A&&$),D=(0,i.Ti)(e,"download"),{loadProgress:U,mediaData:B}=(0,l.Z)(D,!R,void 0,void 0,void 0,!0),V=Boolean(B),{isUploading:X,isTransferring:K,transferProgress:j}=(0,i.Sc)(e,f||U,R&&!V),z=(0,s.v6)(I),q=z?(0,i.DH)(e):void 0,H=z?I.previewBlobUrl:void 0,Y=(0,c.Z)((0,i.Ti)(e,"pictogram"),!L),J=C&&Boolean(I.mediaType),W=(0,a.I4)((()=>{X?y&&y():N?w.cancelMessageMediaDownload({message:e}):K?O(!1):J?C():w.downloadMessageMedia({message:e})}),[X,N,K,J,y,w,e,C]),_=(0,a.I4)((()=>{b(e.id,e.chatId)}),[b,e.id,e.chatId]);return a.ZP.createElement(u.Z,{ref:k,name:T,extension:x,size:M,timestamp:v?p||S:void 0,thumbnailDataUri:q,previewData:H||Y,smaller:n,isTransferring:K,isUploading:X,transferProgress:j,className:Z,sender:g,isSelectable:P,isSelected:E,actionIcon:J?(0,i.hC)(e)?"icon-play":"icon-eye":"icon-download",onClick:W,onDateClick:b?_:void 0})}))},7002:(e,t,n)=>{n.d(t,{Z:()=>f});var a=n(4050),r=n(1212),s=n(692),i=n(6752),o=n(790),l=n(5376),c=n(4399),d=n(2340),u=n(9107),m=n(9196),h=n(8033);const f=(0,a.X$)((({ref:e,name:t,size:n,extension:f="",timestamp:v,sender:p,thumbnailDataUri:Z,previewData:g,className:E,smaller:P,isTransferring:y,isUploading:C,isSelectable:b,isSelected:N,transferProgress:w,actionIcon:k,onClick:I,onDateClick:T})=>{const M=(0,u.Z)();let S=(0,a.sO)(null);e&&(S=e);const x=(0,s.Z)(g),{shouldRender:L,transitionClassNames:$}=(0,r.Z)(y,void 0,!0),F=(0,l.Oh)(f),A=(0,l.yW)(n),{width:O,height:R}=(0,c.lE)(P),D=(0,i.Z)("File",E,P&&"smaller",I&&!C&&"interactive",N&&"file-is-selected");return a.ZP.createElement("div",{ref:S,className:D,dir:M.isRtl?"rtl":void 0},b&&a.ZP.createElement("div",{className:"message-select-control"},N&&a.ZP.createElement("i",{className:"icon-select"})),a.ZP.createElement("div",{className:"file-icon-container",onClick:C?void 0:I},Z||g?a.ZP.createElement("div",{className:"file-preview media-inner"},a.ZP.createElement("img",{src:Z,width:O,height:R,className:"thumbnail",alt:""}),a.ZP.createElement("img",{src:g,className:(0,i.Z)("full-media",x),width:O,height:R,alt:""})):a.ZP.createElement("div",{className:`file-icon ${F}`},f.length<=4&&a.ZP.createElement("span",{className:"file-ext",dir:"auto"},f)),L&&a.ZP.createElement("div",{className:(0,i.Z)("file-progress",F,$)},a.ZP.createElement(m.Z,{progress:w,size:P?"s":"m",onClick:C?I:void 0})),I&&a.ZP.createElement("i",{className:(0,i.Z)("action-icon",k||"icon-download",L&&"hidden")})),a.ZP.createElement("div",{className:"file-info"},a.ZP.createElement("div",{className:"file-title",dir:"auto"},(0,d.Z)(t)),a.ZP.createElement("div",{className:"file-subtitle",dir:"auto"},a.ZP.createElement("span",null,y&&w?`${Math.round(100*w)}%`:A),p&&a.ZP.createElement("span",{className:"file-sender"},(0,d.Z)(p)),!p&&v&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("span",{className:"bullet"}),a.ZP.createElement(h.Z,{onClick:T},(0,o.ZK)(M,1e3*v,!0))))),p&&v&&a.ZP.createElement(h.Z,{onClick:T},(0,o.VX)(M,1e3*v)))}))},8799:(e,t,n)=>{n.d(t,{Z:()=>f});var a=n(4050),r=n(5116),s=n(1713),i=n(2858),o=n(1638),l=n(2340),c=n(782),d=n(9107),u=n(172),m=n(9411),h=n(8729);const f=(0,a.X$)((0,r.c$)(((e,{chatId:t})=>{const{lastSyncTime:n}=e,a=(0,o.Z1)(e,t);return{lastSyncTime:n,chat:a,onlineCount:a?(0,o.YK)(e,a):void 0,areMessagesLoaded:Boolean((0,o.Zw)(e,t))}}),((e,t)=>(0,c.ei)(t,["loadFullChat","openMediaViewer"])))((({typingStatus:e,avatarSize:t="medium",withMediaViewer:n,withUsername:r,withFullInfo:o,withUpdatingStatus:c,withChatType:f,noRtl:v,chat:p,onlineCount:Z,areMessagesLoaded:g,lastSyncTime:E,loadFullChat:P,openMediaViewer:y})=>{const C=p&&(0,i.ZV)(p),{id:b,isMin:N,isRestricted:w}=p||{};(0,a.d4)((()=>{b&&!N&&o&&E&&P({chatId:b})}),[b,N,E,o,P,C]);const k=(0,a.I4)(((e,n)=>{p&&n&&(e.stopPropagation(),y({avatarOwnerId:p.id,origin:"jumbo"===t?s.bZ.ProfileAvatar:s.bZ.MiddleHeaderAvatar}))}),[p,t,y]),I=(0,d.Z)();if(p)return a.ZP.createElement("div",{className:"ChatInfo",dir:!v&&I.isRtl?"rtl":void 0},a.ZP.createElement(u.Z,{key:p.id,size:t,chat:p,onClick:n?k:void 0}),a.ZP.createElement("div",{className:"info"},a.ZP.createElement("div",{className:"title"},a.ZP.createElement("h3",{dir:"auto"},(0,l.Z)((0,i.U)(I,p))),p.isVerified&&a.ZP.createElement(m.Z,null)),function(){if(c&&!g&&!w)return a.ZP.createElement("span",{className:"status",dir:"auto"},I("Updating"));if(!p)return;if(e)return a.ZP.createElement(h.Z,{typingStatus:e});if(f)return a.ZP.createElement("div",{className:"status",dir:"auto"},I((0,i.l6)(p)));const t=r?p.username:void 0,n=function(e,t){const n=e((0,i.l6)(t)),{membersCount:a}=t;return t.isRestricted?"Channel"===n?"channel is inaccessible":"group is inaccessible":a?e("Channel"===n?"Subscribers":"Members",a,"i"):n}(I,p),s=Z?`, ${I("OnlineCount",Z,"i")}`:void 0;return a.ZP.createElement("div",{className:"status"},t&&a.ZP.createElement("span",{className:"handle"},t),a.ZP.createElement("span",{className:"group-status"},n),s&&a.ZP.createElement("span",{className:"online-status"},s))}()))})))},6844:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(4050),r=n(790),s=n(9107),i=n(8018);const o=(0,a.X$)((({message:e,outgoingStatus:t})=>{const n=(0,s.Z)();return a.ZP.createElement("div",{className:"LastMessageMeta"},t&&a.ZP.createElement(i.Z,{status:t}),a.ZP.createElement("span",{className:"time"},(0,r.VX)(n,1e3*e.date)))}))},3709:(e,t,n)=>{n.d(t,{Z:()=>c});var a=n(4050),r=n(790),s=n(2858),i=n(6752),o=n(6202),l=n(692);const c=(0,a.X$)((({message:e,idPrefix:t="shared-media",onClick:n})=>{const c=(0,a.I4)((()=>{n(e.id,e.chatId)}),[e.id,e.chatId,n]),d=(0,s.DH)(e),u=(0,o.Z)((0,s.Ti)(e,"pictogram")),m=(0,l.Z)(u),h=(0,s.b7)(e);return a.ZP.createElement("div",{id:`${t}${e.id}`,className:"Media scroll-item",onClick:n?c:void 0},a.ZP.createElement("img",{src:d,alt:""}),a.ZP.createElement("img",{src:u,className:(0,i.Z)("full-media",m),alt:""}),h&&a.ZP.createElement("span",{className:"video-duration"},h.isGif?"GIF":(0,r.k9)(h.duration)))}))},8018:(e,t,n)=>{n.d(t,{Z:()=>i});var a,r=n(4050),s=n(2255);!function(e){e[e.failed=0]="failed",e[e.pending=1]="pending",e[e.succeeded=2]="succeeded",e[e.read=3]="read"}(a||(a={}));const i=(0,r.X$)((({status:e})=>r.ZP.createElement("div",{className:"MessageOutgoingStatus"},r.ZP.createElement(s.Z,{name:"reveal",activeKey:a[e]},(()=>r.ZP.createElement("i",{className:`icon-message-${e}`}))))))},7262:(e,t,n)=>{n.d(t,{Z:()=>l});var a=n(4050),r=n(6752),s=n(1212),i=n(2340),o=n(9107);const l=(0,a.X$)((({text:e="Nothing found.",description:t})=>{const n=(0,o.Z)(),{transitionClassNames:l}=(0,s.Z)(!0);return a.ZP.createElement("div",{className:(0,r.Z)("NothingFound",l,t&&"with-description")},e,t&&a.ZP.createElement("p",{className:"description"},(0,i.Z)(n(t),["br"])))}))},1820:(e,t,n)=>{n.d(t,{Z:()=>v});var a=n(4050),r=n(2858),s=n(1273),i=n(4605),o=n(7687),l=n(1876),c=n(6058),d=n(8799),u=n(9187),m=n(7407),h=n(9107),f=n(4288);const v=(0,a.X$)((({itemIds:e,selectedIds:t,filterValue:n,filterPlaceholder:v,notFoundText:p,searchInputId:Z,isLoading:g,noScrollRestore:E,onSelectedIdsChange:P,onFilterChange:y,onLoadMore:C})=>{const b=(0,a.sO)(null),N=t.length>10;(0,a.d4)((()=>{setTimeout((()=>{requestAnimationFrame((()=>{b.current.focus()}))}),500)}),[]);const w=(0,a.I4)((e=>{const n=[...t];n.includes(e)?n.splice(n.indexOf(e),1):n.push(e),P(n),y("")}),[t,P,y]),k=(0,a.I4)((e=>{const{value:t}=e.currentTarget;y(t)}),[y]),[I,T]=(0,m.Z)(C,e,Boolean(n)),M=(0,h.Z)();return a.ZP.createElement("div",{className:"Picker"},a.ZP.createElement("div",{className:"picker-header custom-scroll",dir:M.isRtl?"rtl":void 0},t.map(((e,n)=>a.ZP.createElement(u.Z,{chatOrUserId:e,isMinimized:N&&na.ZP.createElement(l.Z,{key:e,className:"chat-item-clickable picker-list-item",onClick:()=>w(e),ripple:!0},a.ZP.createElement(i.Z,{label:"",checked:t.includes(e)}),(0,r.YC)(e)?a.ZP.createElement(c.Z,{userId:e}):a.ZP.createElement(d.Z,{chatId:e}))))):g||!I||I.length?a.ZP.createElement(f.Z,null):a.ZP.createElement("p",{className:"no-results"},p||"Sorry, nothing found."))}))},9187:(e,t,n)=>{n.d(t,{Z:()=>u});var a=n(4050),r=n(5116),s=n(1638),i=n(2858),o=n(2340),l=n(6752),c=n(9107),d=n(172);const u=(0,a.X$)((0,r.c$)(((e,{chatOrUserId:t})=>t?{chat:t?(0,s.Z1)(e,t):void 0,user:(0,i.YC)(t)?(0,s.dy)(e,t):void 0}:{}))((({icon:e,title:t,isMinimized:n,canClose:r,onClick:s,clickArg:u,chat:m,user:h,className:f})=>{const v=(0,c.Z)();let p,Z;if(e&&t)p=a.ZP.createElement("div",{className:"item-icon"},a.ZP.createElement("i",{className:`icon-${e}`})),Z=t;else if(m||h){p=a.ZP.createElement(d.Z,{chat:m,user:h,size:"small",isSavedMessages:null==h?void 0:h.isSelf});const e=!m||h&&!h.isSelf?(0,i.Vl)(h):(0,i.U)(v,m,h);Z=e?(0,o.Z)(e):void 0}const g=(0,l.Z)("PickerSelectedItem",f,n&&"minimized",r&&"closeable");return a.ZP.createElement("div",{className:g,onClick:()=>s(u),title:n?Z:void 0,dir:v.isRtl?"rtl":void 0},p,!n&&a.ZP.createElement("div",{className:"item-name",dir:"auto"},Z),r&&a.ZP.createElement("div",{className:"item-remove"},a.ZP.createElement("i",{className:"icon-close"})))})))},6058:(e,t,n)=>{n.d(t,{Z:()=>f});var a=n(4050),r=n(5116),s=n(1713),i=n(1638),o=n(2858),l=n(2340),c=n(782),d=n(9107),u=n(172),m=n(9411),h=n(8729);const f=(0,a.X$)((0,r.c$)(((e,{userId:t,forceShowSelf:n})=>{const{lastSyncTime:a,serverTimeOffset:r}=e,s=(0,i.dy)(e,t);return{lastSyncTime:a,user:s,isSavedMessages:!n&&s&&s.isSelf,areMessagesLoaded:Boolean((0,i.Zw)(e,t)),serverTimeOffset:r}}),((e,t)=>(0,c.ei)(t,["loadFullUser","openMediaViewer"])))((({typingStatus:e,avatarSize:t="medium",status:n,withMediaViewer:r,withUsername:i,withFullInfo:c,withUpdatingStatus:f,noStatusOrTyping:v,noRtl:p,user:Z,isSavedMessages:g,areMessagesLoaded:E,lastSyncTime:P,serverTimeOffset:y,loadFullUser:C,openMediaViewer:b})=>{const{id:N}=Z||{},w=(0,o.Js)(Z);(0,a.d4)((()=>{c&&P&&N&&C({userId:N})}),[N,C,P,c]);const k=(0,a.I4)(((e,n)=>{Z&&n&&(e.stopPropagation(),b({avatarOwnerId:Z.id,origin:"jumbo"===t?s.bZ.ProfileAvatar:s.bZ.MiddleHeaderAvatar}))}),[Z,t,b]),I=(0,d.Z)();if(Z)return a.ZP.createElement("div",{className:"ChatInfo",dir:!p&&I.isRtl?"rtl":void 0},a.ZP.createElement(u.Z,{key:Z.id,size:t,user:Z,isSavedMessages:g,onClick:r?k:void 0}),a.ZP.createElement("div",{className:"info"},g?a.ZP.createElement("div",{className:"title"},a.ZP.createElement("h3",null,I("SavedMessages"))):a.ZP.createElement("div",{className:"title"},a.ZP.createElement("h3",{dir:"auto"},w&&(0,l.Z)(w)),(null==Z?void 0:Z.isVerified)&&a.ZP.createElement(m.Z,null)),(n||!g&&!v)&&(n?a.ZP.createElement("span",{className:"status",dir:"auto"},n):f&&!E?a.ZP.createElement("span",{className:"status",dir:"auto"},I("Updating")):Z?e?a.ZP.createElement(h.Z,{typingStatus:e}):a.ZP.createElement("div",{className:"status "+((0,o.kM)(Z)?"online":"")},i&&Z.username&&a.ZP.createElement("span",{className:"handle"},Z.username),a.ZP.createElement("span",{className:"user-status",dir:"auto"},(0,o.Tq)(I,Z,y))):void 0)))})))},787:(e,t,n)=>{n.d(t,{Z:()=>N});var a=n(4050),r=n(5116),s=n(1713),i=n(7361),o=n(1638),l=n(2858),c=n(2340),d=n(782),u=n(1174),m=n(6752),h=n(6137),f=n(647),v=n(9107),p=n(9411),Z=n(2155),g=n(6202),E=n(2937),P=n(7204),y=n(9204);const C=(0,a.X$)((({chat:e,user:t,photo:n,isFirstPhoto:r,isSavedMessages:s,lastSyncTime:i,onClick:o})=>{const d=(0,v.Z)(),u=t&&(0,l.NB)(t),f=e&&(0,l.pK)(e.id);function p(a,r){if(n&&!r)return`photo${n.id}?size=c`;let i;return s||u||f||(t?i=(0,l.RT)(t,a):e&&(i=(0,l.RT)(e,a))),i}const C=(0,g.Z)(p("big"),!1,h.IU.BlobUrl,i),b=r&&!C?p("normal",!0):void 0,N=(0,g.Z)(b,!1,h.IU.BlobUrl,i),w=(0,E.Z)(!C&&n&&n.thumbnail&&n.thumbnail.dataUri),k=C||N||w,I=(0,P.Z)(k);let T="";if(s)T=a.ZP.createElement("i",{className:"icon-avatar-saved-messages"});else if(u)T=a.ZP.createElement("i",{className:"icon-avatar-deleted-account"});else if(f)T=a.ZP.createElement("i",{className:"icon-reply-filled"});else if(k)T=a.ZP.createElement("img",{src:k,className:"avatar-media",alt:"",decoding:"async"});else if(!k&&t){const e=(0,l.Js)(t);T=e?(0,Z.Xv)(e,2):void 0}else if(!k&&e){const t=(0,l.U)(d,e);T=t&&(0,Z.Xv)(t,(0,l.YC)(e.id)?2:1)}else T=a.ZP.createElement("div",{className:"spinner-wrapper"},a.ZP.createElement(y.Z,{color:"white"}));const M=(0,m.Z)("ProfilePhoto",`color-bg-${(0,l.Rs)(t||e)}`,s&&"saved-messages",u&&"deleted-account",f&&"replies-bot-account",!s&&!k&&"no-photo");return a.ZP.createElement("div",{className:M,onClick:k?o:void 0},I&&k&&I!==k&&a.ZP.createElement("img",{src:I,className:"prev-avatar-media",alt:"",decoding:"async"}),"string"==typeof T?(0,c.Z)(T,["hq_emoji"]):T)}));var b=n(2255);const N=(0,a.X$)((0,r.c$)(((e,{userId:t,forceShowSelf:n})=>{const{connectionState:a,serverTimeOffset:r}=e,s=(0,o.dy)(e,t),i=(0,o.Z1)(e,t),l=!n&&s&&s.isSelf,{animationLevel:c}=e.settings.byKey;return{connectionState:a,user:s,chat:i,isSavedMessages:l,animationLevel:c,serverTimeOffset:r}}),((e,t)=>(0,d.ei)(t,["loadFullUser","openMediaViewer"])))((({forceShowSelf:e,user:t,chat:n,isSavedMessages:r,connectionState:o,animationLevel:d,serverTimeOffset:Z,loadFullUser:g,openMediaViewer:E})=>{var P;const{id:y}=t||{},{id:N}=n||{},w=t?(0,l.Js)(t):n?n.title:"",k=(null==t?void 0:t.photos)||(null==n?void 0:n.photos)||[],I=d>=1?"slide":"none",[T,M]=(0,a.eJ)(0),S=r||k.length<=1||0===T,x=r||k.length<=1||T===k.length-1;(0,a.d4)((()=>{T>k.length&&M(Math.max(0,k.length-1))}),[T,k.length]);const L=(0,v.Z)();(0,a.d4)((()=>{"connectionStateReady"===o&&y&&!e&&g({userId:y})}),[y,g,o,e]),function(e,t,n){(0,a.d4)((()=>{t.slice(n,n+4).forEach((e=>{f.UV(`photo${e.id}?size=c`)||f.he(`photo${e.id}?size=c`,h.IU.BlobUrl)}))}),[n,t])}(0,k,T);const $=(0,a.I4)((()=>{E({avatarOwnerId:y||N,profilePhotoIndex:T,origin:e?s.bZ.SettingsAvatar:s.bZ.ProfileAvatar})}),[E,y,N,T,e]),F=(0,a.I4)((()=>{S||M(T-1)}),[T,S]),A=(0,a.I4)((()=>{x||M(T+1)}),[T,x]);if((0,a.d4)((()=>{const e=document.querySelector(".photo-wrapper");if(e)return(0,u.s)(e,{selectorToPreventScroll:".Profile, .settings-content",onSwipe:i.$b?(e,t)=>t===u.e.Right?(F(),!0):t===u.e.Left&&(A(),!0):void 0})}),[A,F]),!t&&!n)return;function O(){const e=!r&&k&&k.length>0?k[T]:void 0;return a.ZP.createElement(C,{key:T,user:t,chat:n,photo:e,isSavedMessages:r,isFirstPhoto:S,onClick:$})}const R=null===(P=t||n)||void 0===P?void 0:P.isVerified;return a.ZP.createElement("div",{className:(0,m.Z)("ProfileInfo",e&&"self"),dir:L.isRtl?"rtl":void 0},a.ZP.createElement("div",{className:"photo-wrapper"},function(){if(!(r||!k||k.length<=1))return a.ZP.createElement("div",{className:"photo-dashes"},k.map(((e,t)=>a.ZP.createElement("span",{className:"photo-dash "+(t===T?"current":"")}))))}(),a.ZP.createElement(b.Z,{activeKey:T,name:I,className:"profile-slide-container"},O),!S&&a.ZP.createElement("button",{type:"button",className:"navigation prev","aria-label":L("AccDescrPrevious"),onClick:F}),!x&&a.ZP.createElement("button",{type:"button",className:"navigation next","aria-label":L("Next"),onClick:A})),a.ZP.createElement("div",{className:"info",dir:L.isRtl?"rtl":"auto"},r?a.ZP.createElement("div",{className:"title"},a.ZP.createElement("h3",{dir:"auto"},L("SavedMessages"))):a.ZP.createElement("div",{className:"title"},a.ZP.createElement("h3",{dir:"auto"},w&&(0,c.Z)(w)),R&&a.ZP.createElement(p.Z,null)),!r&&(t?a.ZP.createElement("div",{className:"status "+((0,l.kM)(t)?"online":"")},a.ZP.createElement("span",{className:"user-status",dir:"auto"},(0,l.Tq)(L,t,Z))):a.ZP.createElement("span",{className:"status",dir:"auto"},(0,l.eA)(n)?L("Subscribers",null!==(D=n.membersCount)&&void 0!==D?D:0,"i"):L("Members",null!==(U=n.membersCount)&&void 0!==U?U:0,"i")))));var D,U})))},3547:(e,t,n)=>{n.d(t,{Z:()=>h});var a=n(4050),r=n(6137),s=n(3657),i=n(6202),o=n(1212),l=n(706),c=n(6752),d=n(386),u=n(7799),m=n(231);const h=(0,a.X$)((({sticker:e,size:t,observeIntersection:n,noAnimate:h,title:f,className:v,onClick:p,clickArg:Z,onUnfaveClick:g})=>{const E=(0,a.sO)(null),P=`sticker${e.id}`,y=`sticker-button-${e.id}`,C=(0,s.Op)(E,n),b=e.thumbnail?e.thumbnail.dataUri:void 0,N=(0,i.Z)(`${P}?size=m`,!C,r.IU.BlobUrl),w=C&&!h,k=(0,i.Z)(e.isAnimated&&P,!w,r.IU.Lottie),[I,T,M]=(0,l.Z)(Boolean(k)),S=I&&w,{transitionClassNames:x}=(0,o.Z)(Boolean(N||S),void 0,void 0,"slow");(0,a.d4)((()=>{w||M()}),[M,w]);const L=(0,c.Z)("StickerButton",p&&"interactive",e.isAnimated&&"animated",y,v),$=b&&!S?`background-image: url('${b}');`:"";return a.ZP.createElement("div",{ref:E,className:L,title:f||(null==e?void 0:e.emoji),style:$,"data-sticker-id":e.id,onMouseDown:d.b,onClick:function(){p&&p(Z)}},!S&&a.ZP.createElement("img",{src:N,className:x}),w&&k&&a.ZP.createElement(u.Z,{id:P,animationData:k,play:!0,size:t,isLowPriority:!0,onLoad:T}),g&&a.ZP.createElement(m.Z,{className:"sticker-unfave-button",color:"dark",round:!0,onClick:function(t){t.stopPropagation(),t.preventDefault(),g(e)}},a.ZP.createElement("i",{className:"icon-close"})))}))},4851:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(9203),s=n(8778);const i=(0,a.X$)((e=>{const{isOpen:t}=e,n=(0,s.Z)(r.gl.Extra,"StickerSetModal",!t);return n?a.ZP.createElement(n,e):void 0}))},8729:(e,t,n)=>{n.d(t,{Z:()=>c});var a=n(4050),r=n(5116),s=n(1638),i=n(2858),o=n(2340),l=n(9107);const c=(0,a.X$)((0,r.c$)(((e,{typingStatus:t})=>t.userId?{typingUser:(0,s.dy)(e,t.userId)}:{}))((({typingStatus:e,typingUser:t})=>{const n=(0,l.Z)(),r=t&&!t.isSelf&&(0,i.Vl)(t);return a.ZP.createElement("p",{className:"typing-status",dir:n.isRtl?"rtl":"auto"},r&&a.ZP.createElement("span",{className:"sender-name",dir:"auto"},(0,o.Z)(r)),n(e.action).replace("{user}","").trim(),a.ZP.createElement("span",{className:"ellipsis"}))})))},9411:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(4050);const r=()=>a.ZP.createElement("span",{className:"VerifiedIcon"})},5418:(e,t,n)=>{n.d(t,{Z:()=>h});var a=n(4050),r=n(2858),s=n(6752),i=n(8035),o=n(2340),l=n(790),c=n(9107),d=n(3709),u=n(8033),m=n(88);const h=(0,a.X$)((({message:e,senderTitle:t,onMessageClick:n})=>{const h=(0,c.Z)();let f=(0,r.s1)(e);if(!f){const t=(0,r.T7)(e);if(t){const{url:n,domain:a}=t,s=(0,r.MK)(h,e);f={siteName:a.replace(/^www./,""),url:n.includes("://")?n:n.includes("@")?`mailto:${n}`:`http://${n}`,description:s!==n?s:void 0}}}const v=(0,a.I4)((()=>{n(e.id,e.chatId)}),[n,e.id,e.chatId]);if(!f)return;const{siteName:p,url:Z,displayUrl:g,title:E,description:P,photo:y,video:C}=f,b=!t&&(0,i.Z)(P,170),N=(0,s.Z)("WebLink scroll-item",!y&&!C&&"without-media");return a.ZP.createElement("div",{className:N,"data-initial":(p||g)[0],dir:h.isRtl?"rtl":void 0},y&&a.ZP.createElement(d.Z,{message:e}),a.ZP.createElement("div",{className:"content"},a.ZP.createElement(u.Z,{isRtl:h.isRtl,className:"site-title",onClick:v},(0,o.Z)(E||p||g)),b&&a.ZP.createElement(u.Z,{isRtl:h.isRtl,className:"site-description",onClick:v},(0,o.Z)(b)),a.ZP.createElement(m.Z,{url:Z,className:"site-name",text:"",isRtl:h.isRtl},Z.replace("mailto:","")||g),t&&a.ZP.createElement("div",{className:"sender-name"},(0,o.Z)(t))),t&&a.ZP.createElement("div",{className:"message-date"},a.ZP.createElement(u.Z,{className:"date",onClick:v,isRtl:h.isRtl},(0,l.VX)(h,1e3*e.date))))}))},4399:(e,t,n)=>{n.d(t,{L6:()=>o,Gw:()=>l,Rj:()=>c,vY:()=>d,wB:()=>u,kc:()=>p,fM:()=>g,Eh:()=>E,GC:()=>P,W7:()=>y,lE:()=>C,Wr:()=>b,PA:()=>N,jg:()=>w});var a=n(3716),r=n(7361),s=n(3858),i=n(2858);const o="(max-height: 640px)",l=parseInt(getComputedStyle(document.documentElement).fontSize,10),c=240,d={width:640,height:640},u="1258816259753933",m={width:100,height:100};let h,f,v;function p(e,t,n,a){const i=t||n?1.625:0;return(function(e,t){const n=e?30:29;if(!r.wB)return n;const{width:a}=s.Z.get();return h||(h=Math.min(30,a/l-4.5)),f||(f=Math.min(29,a/l-7)),v||(v=Math.min(29,a/l-4.5)),e?h:t?v:f}(e,a)-i)*l}function Z({width:e,height:t,fromOwnMessage:n,isForwarded:a,isWebPagePhoto:r,isGif:s,noAvatars:i}){const o=t/e,c=p(n,a,r,i),d=function(e,t){return e&&t&&t>=.75&&t<=1.25?20*l:27*l}(s,o),u=s?Math.max(300,e):e;return w(c,d,u,s?t*(u/e):t)}function g(e,t){const n=window.matchMedia(o),{width:a,height:r}=s.Z.get();let i=t&&n.matches?10:8.25;return e&&(i=n.matches?10:15),{width:a,height:r-i*l}}function E(e,t,n,a,r){const{width:s,height:o}=(0,i.HV)(e)||m;return Z({width:s,height:o,fromOwnMessage:t,isForwarded:n,isWebPagePhoto:a,noAvatars:r})}function P(e,t,n,a){const{width:r,height:s}=(0,i.jC)(e)||m;return Z({width:r,height:s,fromOwnMessage:t,isForwarded:n,isGif:e.isGif,noAvatars:a})}function y(){return{width:2*l,height:2*l}}function C(e){return e?{width:3*l,height:3*l}:{width:3.375*l,height:3.375*l}}function b(e){const{width:t}=e;let{height:n}=e;e.id===u&&(n=t);const s=n&&t&&n/t,i=l*(r.wB?a.w7:a.K7),o=s?i*s:i;return s&&o>i?{width:Math.round(i/s),height:i}:{width:i,height:o}}function N({width:e,height:t},n,a=!1){const{width:r,height:s}=g(n,a);return w(r,s,e,t)}function w(e,t,n,a){const r=a/n,s=Math.min(n,e);return Math.round(s*r)>t?{width:Math.round(t/r),height:t}:{width:s,height:Math.round(s*r)}}},935:(e,t,n)=>{n.d(t,{X:()=>d,H:()=>h});var a=n(4050),r=n(5116),s=n(6137),i=n(2858),o=n(2340),l=n(7373),c=n(88);function d(e,t,n){const a=e.content.text;if(!a||!a.text){const t=(0,i.UD)(e);return t?[t]:void 0}const{text:r,entities:s}=a;return h(r,s,t,n)}function u(e,t,n,a){const{offset:r,length:s}=e,i=new Set([t]);if(a.has(t))return;const o=[];return n.filter(((e,n)=>n>t&&e.offset>=r&&e.offsetu(e,n.indexOf(e),n,a))).filter(Boolean).forEach((e=>{let t=!1;e.organizedIndexes.forEach((e=>{t||i.has(e)||(t=!0),i.add(e)})),t&&o.push(e)})),{entity:e,organizedIndexes:i,nestedEntities:o}}function m(e){const t=new Set,n=[];return e.forEach(((a,r)=>{if(t.has(r))return;const s=u(a,r,e,t);s&&(s.organizedIndexes.forEach((e=>{t.add(e)})),n.push(s))})),n}function h(e,t,n,r,i){if(!t||!t.length)return f(e,n,r,i);const d=[];let u=!1;const h=m(t);function g(t,d,m,h){const E=[],{entity:P,nestedEntities:y}=m,{offset:C,length:b,type:N}=P;let w=e.substring(t,C);const k=w.length;w&&(u&&w.length>0&&"\n"===w[0]&&(w=w.substr(1),u=!1),w&&E.push(...f(w,n,r,i)));const I=t+k,T=I+b;let M=e.substring(C,C+b);const S=[];if(u&&M.length>0&&"\n"===M[0]&&(M=M.substr(1),u=!1),N===s.Vv.Pre&&(u=!0),y.length){let e=I;y.forEach(((t,n)=>{const{renderResult:a,entityEndIndex:r}=g(e,T,t,n===y.length-1);S.push(...a),e=r}))}const x=i?function(e,t,n){const a="string"==typeof t&&t,r=n.length?n.join(""):(0,o.Z)(t,["escape_html","emoji_html","br_html"]).join("");if(!a)return r;switch(e.type){case s.Vv.Bold:return`${r}`;case s.Vv.Italic:return`${r}`;case s.Vv.Underline:return`${r}`;case s.Vv.Code:return`${r}`;case s.Vv.Pre:return`\`\`\`
${r}
\`\`\``;case s.Vv.Strike:return`${r}`;case s.Vv.MentionName:return`${r}`;case s.Vv.Url:case s.Vv.TextUrl:return`${r}`;default:return r}}(P,M,S):function(e,t,n){const r="string"==typeof t&&t,i=n.length?n:t;if(!r)return f(i);switch(e.type){case s.Vv.Bold:return a.ZP.createElement("strong",null,f(i));case s.Vv.Blockquote:return a.ZP.createElement("blockquote",null,f(i));case s.Vv.BotCommand:return a.ZP.createElement("a",{onClick:p,className:"text-entity-link",dir:"auto"},f(i));case s.Vv.Hashtag:case s.Vv.Cashtag:return a.ZP.createElement("a",{onClick:Z,className:"text-entity-link",dir:"auto"},f(i));case s.Vv.Code:return a.ZP.createElement("code",{className:"text-entity-code"},f(i));case s.Vv.Email:return a.ZP.createElement("a",{href:`mailto:${r}`,target:"_blank",rel:"noopener noreferrer",className:"text-entity-link",dir:"auto"},f(i));case s.Vv.Italic:return a.ZP.createElement("em",null,f(i));case s.Vv.MentionName:return a.ZP.createElement(l.Z,{userId:e.userId},f(i));case s.Vv.Mention:return a.ZP.createElement(l.Z,{username:r},f(i));case s.Vv.Phone:return a.ZP.createElement("a",{href:`tel:${r}`,className:"text-entity-link",dir:"auto"},f(i));case s.Vv.Pre:return a.ZP.createElement("pre",{className:"text-entity-pre"},f(i));case s.Vv.Strike:return a.ZP.createElement("del",null,f(i));case s.Vv.TextUrl:case s.Vv.Url:return a.ZP.createElement(c.Z,{url:v(r,e),text:r},f(i));case s.Vv.Underline:return a.ZP.createElement("ins",null,f(i));default:return f(i)}}(P,M,S);if(Array.isArray(x)?E.push(...x):E.push(x),h&&T0&&"\n"===t[0]&&(t=t.substring(1)),t&&E.push(...f(t,n,r,i))}return{renderResult:E,entityEndIndex:T}}let E=0;return h.forEach(((t,n)=>{const{renderResult:a,entityEndIndex:r}=g(E,e.length,t,n===h.length-1);d.push(...a),E=r})),d}function f(e,t,n,a){if(Array.isArray(e)){const r=[];return e.forEach((e=>{r.push(...f(e,t,n,a))})),r}if(a)return(0,o.Z)(e,["escape_html","emoji_html","br_html"]);const r=n?"hq_emoji":"emoji";return t?(0,o.Z)(e,[r,"br","highlight"],{highlight:t}):(0,o.Z)(e,[r,"br"])}function v(e,t){const{type:n,url:a}=t;return n===s.Vv.TextUrl&&a?a:e}function p(e){(0,r.uC)().sendBotCommand({command:e.currentTarget.innerText})}function Z(e){(0,r.uC)().setLocalTextSearchQuery({query:e.currentTarget.innerText}),(0,r.uC)().searchTextMessagesLocal()}},742:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(9203),s=n(8778);const i=(0,a.X$)((e=>{const{isOpen:t}=e,n=(0,s.Z)(r.gl.Extra,"ChatFolderModal",!t);return n?a.ZP.createElement(n,e):void 0}))},1080:(e,t,n)=>{n.d(t,{Z:()=>X});var a=n(4050),r=n(5116),s=n(3716),i=n(7361),o=n(7204),l=n(782),c=n(2858),d=n(1638),u=n(7407);let m;!function(e){e[e.Move=0]="Move",e[e.Opacity=1]="Opacity",e[e.None=2]="None"}(m||(m={}));var h=n(1273),f=n(4288),v=n(9107),p=n(6137),Z=n(8005),g=n(2340),E=n(9118),P=n(6752),y=n(5790),C=n(1470),b=n(706),N=n(6202),w=n(172),k=n(9411),I=n(8729),T=n(6844),M=n(329),S=n(1876),x=n(2155),L=n(126);const $=(0,a.X$)((({chat:e,isPinned:t,isMuted:n})=>{const r=Boolean(e.unreadCount||e.hasUnreadMark||t),s=(0,P.Z)("Badge",n&&"muted",t&&"pinned",Boolean(e.unreadCount||e.hasUnreadMark)&&"unread");function i(){return e.unreadCount?e.unreadMentionsCount?a.ZP.createElement("div",{className:"Badge-wrapper"},a.ZP.createElement("div",{className:"Badge mention"},a.ZP.createElement("i",{className:"icon-mention"})),a.ZP.createElement("div",{className:s},(0,x.bi)(e.unreadCount))):a.ZP.createElement("div",{className:s},(0,x.bi)(e.unreadCount)):e.hasUnreadMark?a.ZP.createElement("div",{className:s}):t?a.ZP.createElement("div",{className:s},a.ZP.createElement("i",{className:"icon-pinned-chat"})):void 0}return a.ZP.createElement(L.Z,{isCustom:!0,className:"Badge-transition",isOpen:r},i)}));var F=n(742);const A=(0,a.X$)((({isSelected:e,isActive:t})=>a.ZP.createElement("div",{className:(0,P.Z)("ChatCallStatus",t&&"active",e&&!i.wB&&"selected")},a.ZP.createElement("div",{className:"indicator"},a.ZP.createElement("div",null),a.ZP.createElement("div",null),a.ZP.createElement("div",null))))),O=(0,a.X$)((0,r.c$)(((e,{chatId:t})=>{const n=(0,d.Z1)(e,t);if(!n||!n.lastMessage)return{};const{senderId:a,replyToMessageId:r,isOutgoing:s}=n.lastMessage,i=a?(0,d.dy)(e,a):void 0,o=(0,c.N5)(n.lastMessage),l=o&&r?(0,d.hj)(e,n.id,r):void 0,{targetUserIds:u,targetChatId:m}=o||{},h=(0,c.zX)(n),{byId:f}=e.users,{chatId:v,threadId:Z,type:g}=(0,d.Bt)(e)||{},E=t===v&&Z===p._f;return{chat:n,isMuted:(0,c.i4)(n,(0,d.dZ)(e),(0,d.NJ)(e)),lastMessageSender:i,actionTargetUserIds:u,actionTargetChatId:m,actionTargetMessage:l,draft:(0,d.Ms)(e,t,p._f),animationLevel:e.settings.byKey.animationLevel,isSelected:E,canScrollDown:E&&"thread"===g,lastSyncTime:e.lastSyncTime,...s&&{lastMessageOutgoingStatus:(0,d.dT)(e,n.lastMessage)},...h&&{privateChatUser:(0,d.dy)(e,h)},...u&&{usersById:f}}}),((e,t)=>(0,l.ei)(t,["openChat","focusLastMessage"])))((({style:e,chatId:t,folderId:n,orderDiff:r,animationType:o,isPinned:l,chat:d,isMuted:u,privateChatUser:h,actionTargetUserIds:f,usersById:p,lastMessageSender:x,lastMessageOutgoingStatus:L,actionTargetMessage:O,actionTargetChatId:R,draft:D,animationLevel:U,isSelected:B,canScrollDown:V,lastSyncTime:X,openChat:K,focusLastMessage:j})=>{const z=(0,a.sO)(null),[q,H,Y]=(0,b.Z)(),[J,W,_]=(0,b.Z)(),[G,Q,ee]=(0,b.Z)(),[te,ne,ae]=(0,b.Z)(),{lastMessage:re,typingStatus:se}=d||{},ie=re&&(0,c.Lo)(re);(0,y.Z)(t,ie?re.replyToMessageId:void 0,O);const oe=re&&!(0,c.bf)(re)?(0,c.DH)(re):void 0,le=(0,N.Z)(re?(0,c.Ti)(re,"micro"):void 0),ce=Boolean(re&&(0,c.Y5)(re)),de=(0,a.Ye)((()=>f?f.map((e=>null==p?void 0:p[e])).filter(Boolean):void 0),[f,p]);(0,a.bt)((()=>{const e=z.current;if(0!==U&&e){if(o===m.Opacity)e.style.opacity="0",(0,E.T2)((()=>{e.classList.add("animate-opacity"),e.style.opacity="1"}));else{if(o!==m.Move)return;e.style.transform=`translate3d(0, ${100*-r}%, 0)`,(0,E.T2)((()=>{e.classList.add("animate-transform"),e.style.transform=""}))}setTimeout((()=>{(0,E.T2)((()=>{e.classList.remove("animate-opacity","animate-transform"),e.style.opacity="",e.style.transform=""}))}),200+s.fK)}}),[U,r,o]);const ue=(0,a.I4)((()=>{K({id:t,shouldReplaceHistory:!0}),B&&V&&j()}),[B,V,K,t,j]),me=(0,C.Z)({chat:d,privateChatUser:h,handleDelete:function(){Q(),H()},handleChatFolderChange:function(){ne(),W()},folderId:n,isPinned:l,isMuted:u}),he=(0,v.Z)();if(!d)return;const fe=(0,P.Z)("Chat chat-item-clickable",(0,c.YC)(t)?"private":"group",B&&"selected");return a.ZP.createElement(S.Z,{ref:z,className:fe,style:e,ripple:!i.wB,contextActions:me,onClick:ue},a.ZP.createElement("div",{className:"status"},a.ZP.createElement(w.Z,{chat:d,user:h,withOnlineStatus:!0,isSavedMessages:null==h?void 0:h.isSelf,lastSyncTime:X}),d.isCallActive&&d.isCallNotEmpty&&a.ZP.createElement(A,{isSelected:B,isActive:0!==U})),a.ZP.createElement("div",{className:"info"},a.ZP.createElement("div",{className:"title"},a.ZP.createElement("h3",null,(0,g.Z)((0,c.U)(he,d,h))),d.isVerified&&a.ZP.createElement(k.Z,null),u&&a.ZP.createElement("i",{className:"icon-muted"}),d.lastMessage&&a.ZP.createElement(T.Z,{message:d.lastMessage,outgoingStatus:L})),a.ZP.createElement("div",{className:"subtitle"},function(){if(se&&re&&se.timestamp>1e3*re.date)return a.ZP.createElement(I.Z,{typingStatus:se});if(null!=D&&D.text.length)return a.ZP.createElement("p",{className:"last-message",dir:he.isRtl?"auto":"ltr"},a.ZP.createElement("span",{className:"draft"},he("Draft")),(0,g.Z)(D.text));if(!re)return;if(ie){const e=d&&((0,c.eA)(d)||re.senderId===re.chatId)?d:x;return a.ZP.createElement("p",{className:"last-message",dir:he.isRtl?"auto":"ltr"},(0,g.Z)((0,Z.D)(he,re,e,de,O,R,{asPlain:!0})))}const e=(0,c.zF)(he,t,x);return a.ZP.createElement("p",{className:"last-message",dir:he.isRtl?"auto":"ltr"},e&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("span",{className:"sender-name"},(0,g.Z)(e)),a.ZP.createElement("span",{className:"colon"},":")),function(e,t,n,r){return n?a.ZP.createElement("span",{className:"media-preview"},a.ZP.createElement("img",{src:n,alt:"",className:r?"round":void 0}),(0,c.b7)(t)&&a.ZP.createElement("i",{className:"icon-play"}),(0,g.Z)((0,c.MK)(e,t,!0))):(0,g.Z)((0,c.MK)(e,t))}(he,re,le||oe,ce))}(),a.ZP.createElement($,{chat:d,isPinned:l,isMuted:u}))),G&&a.ZP.createElement(M.Z,{isOpen:q,onClose:Y,onCloseAnimationEnd:ee,chat:d}),te&&a.ZP.createElement(F.Z,{isOpen:J,onClose:_,onCloseAnimationEnd:ae,chatId:t}))})));var R=n(1713),D=n(231),U=n(7854);const B=(0,a.X$)((0,r.c$)(((e,{folderId:t,folderType:n})=>({chatFolder:t&&"folder"===n?(0,d.Mw)(e,t):void 0,animatedEmoji:(0,d.zB)(e,"📂")})))((({chatFolder:e,animatedEmoji:t,foldersDispatch:n,onScreenSelect:r})=>{const s=(0,v.Z)(),o=(0,a.I4)((()=>{n({type:"editFolder",payload:e}),r(R.MT.FoldersEditFolderFromChatList)}),[e,n,r]);return a.ZP.createElement("div",{className:"EmptyFolder"},a.ZP.createElement("div",{className:"sticker"},t&&a.ZP.createElement(U.Z,{sticker:t})),a.ZP.createElement("h3",{className:"title",dir:"auto"},s("FilterNoChatsToDisplay")),a.ZP.createElement("p",{className:"description",dir:"auto"},s(e?"ChatList.EmptyChatListFilterText":"Chat.EmptyChat")),e&&n&&r&&a.ZP.createElement(D.Z,{ripple:!i.wB,fluid:!0,pill:!0,onClick:o,size:"smaller",isRtl:s.isRtl},a.ZP.createElement("i",{className:"icon-settings"}),s("ChatList.EmptyChatListEditFilter")))})));var V;!function(e){e.all="active",e.archived="archived"}(V||(V={}));const X=(0,a.X$)((0,r.c$)(((e,{folderType:t,folderId:n})=>{const{chats:{listIds:a,byId:r,orderedPinnedIds:s},users:{byId:i},lastSyncTime:o}=e,l="folder"!==t?V[t]:void 0,c=n?(0,d.Mw)(e,n):void 0;return{chatsById:r,usersById:i,lastSyncTime:o,notifySettings:(0,d.dZ)(e),notifyExceptions:(0,d.NJ)(e),...l?{listIds:a[l],orderedPinnedIds:s[l]}:{chatFolder:c}}}),((e,t)=>(0,l.ei)(t,["loadMoreChats","preloadTopChatMessages","preloadArchivedChats","openChat","openNextChat"])))((({folderType:e,folderId:t,isActive:n,chatFolder:r,chatsById:d,usersById:v,listIds:p,orderedPinnedIds:Z,lastSyncTime:g,foldersDispatch:E,notifySettings:P,notifyExceptions:y,onScreenSelect:C,loadMoreChats:b,preloadTopChatMessages:N,preloadArchivedChats:w,openChat:k,openNextChat:I})=>{const[T,M]=(0,a.Ye)((()=>"folder"===e&&r?(0,c.P4)(d,v,r,P,y):[p,Z]),[e,r,d,v,P,y,p,Z]),[S,x,L]=(0,a.Ye)((()=>{if(!T||"folder"===e&&!r)return[];const t=(0,c.O)(d,T,M,e),n=[].concat(t.pinnedChats,t.otherChats),a=n.map((({id:e})=>e));return[n.reduce(((e,t,n)=>(e[t.id]=n,e)),{}),a,t]}),[T,M,e,r,d]),$=(0,o.Z)(S),F=(0,a.Ye)((()=>S&&$?(0,l.Q8)(S,((e,t)=>e-(void 0!==$[t]?$[t]:1/0))):{}),[S,$]),A=(0,a.I4)((()=>{b({listType:"archived"===e?"archived":"active"})}),[b,e]),[R,D]=(0,u.Z)(g?A:void 0,x,void 0,s.t_,"all"===e&&!s.NM),U=(0,a.Ye)((()=>{if(R&&L)return(0,c.wG)(L,R)}),[L,R]);(0,a.d4)((()=>{g&&"all"===e&&(N(),w())}),[g,e,N,w]);const V=function(e){const t=(0,a.I4)((t=>e[t]<0),[e]),n=(0,a.I4)((t=>e[t]>0),[e]),r=Object.keys(e),s=r.filter(t).length,i=r.filter(n).length;return(0,a.I4)((a=>{const r=e[a];return 0===r?m.None:r===1/0||r===-1/0||s<=i&&t(a)||i{const e=e=>{if(n&&x){if(i.fl&&(i.jm&&e.metaKey||!i.jm&&e.ctrlKey)&&e.code.startsWith("Digit")){const[,t]=e.code.match(/Digit(\d)/)||[];if(!t)return;const n=Number(t)-1;if(n>x.length-1)return;k({id:x[n],shouldReplaceHistory:!0})}if(e.altKey){const t="ArrowDown"===e.key?1:"ArrowUp"===e.key?-1:void 0;if(!t)return;e.preventDefault(),I({targetIndexDelta:t,orderedIds:x})}}};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}})),a.ZP.createElement(h.Z,{className:"chat-list custom-scroll",items:R,onLoadMore:D,preloadBackwards:s.t_,noFastList:!0,noScrollRestore:!0},null!=R&&R.length&&U?function(){const e=x.indexOf(R[0]),n=e+U.pinnedChats.length;return a.ZP.createElement("div",{className:"scroll-container",style:i.wZ?`height: ${x.length*s.rS}px`:void 0,teactFastList:!0},U.pinnedChats.map((({id:n},r)=>a.ZP.createElement(O,{key:n,teactOrderKey:r,chatId:n,isPinned:!0,folderId:t,animationType:V(n),orderDiff:F[n],style:`top: ${(e+r)*s.rS}px;`}))),U.otherChats.map(((e,r)=>a.ZP.createElement(O,{key:e.id,teactOrderKey:(0,c.OE)(e),chatId:e.id,folderId:t,animationType:V(e.id),orderDiff:F[e.id],style:`top: ${(n+r)*s.rS}px;`}))))}():R&&!R.length?a.ZP.createElement(B,{folderId:t,folderType:e,foldersDispatch:E,onScreenSelect:C}):a.ZP.createElement(f.Z,{key:"loading"}))})))},91:(e,t,n)=>{n.d(t,{F:()=>r});var a=n(2858);function r(e,t,n,r){const{senderId:s}=t;if(!s)return;const i=(0,a.YC)(s)?r[s]:n[s];let o=(0,a.OU)(e,i);const l=n[t.chatId];return l&&((0,a.YC)(s)&&i.isSelf?o=`${e("FromYou")} → ${(0,a.U)(e,l)}`:(0,a.Bf)(l)&&(o+=` → ${(0,a.U)(e,l)}`)),o}},2420:(e,t,n)=>{n.d(t,{t:()=>d,Z:()=>u});var a=n(4050),r=n(1212),s=n(6752),i=n(3989),o=n(7204),l=n(706);const c=(0,a.X$)((({isQuick:e,onFileSelect:t})=>{const[n,r,i]=(0,l.Z)(),o=(0,s.Z)("DropTarget",n&&"hovered");return a.ZP.createElement("div",{className:o,onDrop:t,onDragEnter:()=>{r()},onDragLeave:e=>{const{relatedTarget:t}=e;t&&e.stopPropagation(),i()}},a.ZP.createElement("div",{className:"target-content"},a.ZP.createElement("div",{className:"icon icon-"+(e?"photo":"document")}),a.ZP.createElement("div",{className:"title"},"Drop files here to send them"),a.ZP.createElement("div",{className:"description"},e?"in a quick way":"without compression")))}));let d;!function(e){e.None="none",e.Document="document",e.QuickFile="quick_file"}(d||(d={}));const u=(0,a.X$)((({isOpen:e,withQuick:t,onHide:n,onFileSelect:l})=>{const d=(0,a.sO)(null),u=(0,o.Z)(t),{shouldRender:m,transitionClassNames:h}=(0,r.Z)(e);(0,a.d4)((()=>e?(0,i.Z)(n):void 0),[e,n]);const f=(0,a.I4)((e=>{const{dataTransfer:t}=e;t.files&&t.files.length>0&&(n(),l(Array.from(t.files),!1))}),[l,n]),v=(0,a.I4)((e=>{const{dataTransfer:t}=e;t.files&&t.files.length>0&&(n(),l(Array.from(t.files),!0))}),[l,n]),p=(0,a.I4)((e=>{e.stopPropagation();const{target:t,relatedTarget:a}=e;t.matches(".DropTarget, .DropArea")&&!a&&(d.current=window.setTimeout((()=>{n()}),150))}),[n]);if(!m)return;const Z=(0,s.Z)("DropArea",h);return a.ZP.createElement("div",{className:Z,onDragLeave:p,onDragOver:()=>{d.current&&window.clearTimeout(d.current)},onDrop:n},a.ZP.createElement(c,{onFileSelect:f}),(t||u)&&a.ZP.createElement(c,{onFileSelect:v,isQuick:!0}))}))},9830:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(9203),s=n(8778);const i=(0,a.X$)((e=>{const{isOpen:t}=e,n=(0,s.Z)(r.gl.Extra,"EmojiTooltip",!t);return n?a.ZP.createElement(n,e):void 0}))},3616:(e,t,n)=>{n.d(t,{Z:()=>y});var a=n(4050),r=n(5116),s=n(3716),i=n(1638),o=n(9118),l=n(5723),c=n(6752),d=n(782),u=n(7361),m=n(517),h=n(2645),f=n(706),v=n(4784),p=n(6391),Z=n(9107),g=n(2340),E=n(3283);const P=u.wB?256:416,y=(0,a.X$)((0,r.c$)((e=>{const{chatId:t,threadId:n}=(0,i.Bt)(e)||{},{messageSendKeyCombo:a}=e.settings.byKey;return{currentChatId:t,messageSendKeyCombo:a,replyingToId:t&&n?(0,i.Yy)(e,t,n):void 0,noTabCapture:e.isPollModalOpen||e.payment.isPaymentModalOpen}}),((e,t)=>(0,d.ei)(t,["editLastMessage","replyToNextMessage"])))((({id:e,isAttachmentModalInput:t,editableInputId:n,html:r,placeholder:i,forcedPlaceholder:d,shouldSetFocus:y,shouldSuppressFocus:C,shouldSuppressTextFormatter:b,onUpdate:N,onSuppressedFocus:w,onSend:k,currentChatId:I,replyingToId:T,noTabCapture:M,messageSendKeyCombo:S,editLastMessage:x,replyToNextMessage:L})=>{const $=(0,a.sO)(null),F=(0,a.sO)(null),A=(0,Z.Z)(),O=(0,a.sO)(!1),[R,D,U]=(0,f.Z)(),[B,V]=(0,a.eJ)(),[X,K]=(0,a.eJ)();(0,a.d4)((()=>{t&&Y(!1)}),[t]),(0,h.Z)((([e])=>{r!==$.current.innerHTML&&($.current.innerHTML=r),r!==F.current.innerHTML&&(F.current.innerHTML=r),void 0!==e&&e!==r&&Y(!r.length)}),[r]);const j=(0,a.I4)((()=>{$.current.closest(".from, .to")?setTimeout(j,350):(0,l.Z)($.current)}),[]),z=(0,a.I4)((()=>{U(),function(){const e=window.getSelection();e&&(e.removeAllRanges?e.removeAllRanges():e.empty&&e.empty())}()}),[U]);function q(){if(u.cj)return!1;const e=window.getSelection();if(!e||!e.rangeCount||O.current)return U(),!1;const t=e.getRangeAt(0),a=t.toString().trim();return!(b||!(0,p.R)(t,n||s.R2)||!a||(0,v.Z)(a)||!t.START_TO_END)||(U(),!1)}function H(){if(!q())return;const e=window.getSelection().getRangeAt(0),t=e.getBoundingClientRect(),n=$.current.getBoundingClientRect();let a=t.left+t.width/2-n.left;a<90?a=90:a>n.width-90&&(a=n.width-90),V({x:a,y:t.top-n.top}),K(e),D()}function Y(e=!1){const t=$.current,n=F.current,a=Number(t.style.height.replace("px","")),r=Math.min(n.scrollHeight,P);if(r===a)return;const s=Math.round(50*Math.log(Math.abs(r-a))),i=()=>{t.style.height=`${r}px`,t.style.transitionDuration=`${s}ms`,t.classList.toggle("overflown",n.scrollHeight>P)};e?requestAnimationFrame(i):i()}(0,a.d4)((()=>{u.$b||y&&j()}),[I,j,T,y]),(0,a.d4)((()=>{if(M)return;const e=(0,o.Ds)((e=>{"Tab"===e.key&&(e.preventDefault(),requestAnimationFrame(j))}),2e3,!0,!1);return(0,m.Z)({onTab:e})}),[j,M]),(0,a.d4)((()=>{const e=$.current;function t(){e.blur()}return C&&e.addEventListener("focus",t),()=>{e.removeEventListener("focus",t)}}),[C]);const J=(0,c.Z)("form-control custom-scroll",r.length>0&&"touched",C&&"focus-disabled");return a.ZP.createElement("div",{id:e,onClick:C?w:void 0,dir:A.isRtl?"rtl":void 0},a.ZP.createElement("div",{ref:$,id:n||s.R2,className:J,contentEditable:!0,dir:"auto",onClick:j,onChange:function(e){const{innerHTML:t,textContent:n}=e.currentTarget;if(N("
"===t?"":t),!u.$b&&(!n||!n.length)&&(u.op||!t.includes("emoji-small"))){const e=window.getSelection();e&&($.current.blur(),e.removeAllRanges(),(0,l.Z)($.current,!0))}},onKeyDown:function(e){if(!r.length&&(e.metaKey||e.ctrlKey)){const t="ArrowDown"===e.key?1:"ArrowUp"===e.key?-1:void 0;if(t)return e.preventDefault(),void L({targetIndexDelta:t})}"Enter"!==e.key||e.shiftKey?"ArrowUp"!==e.key||r.length||e.metaKey||e.ctrlKey||e.altKey?e.target.addEventListener("keyup",(function t(){H(),e.target.removeEventListener("keyup",t)})):(e.preventDefault(),x()):u.cj||u.wZ||!("enter"===S&&!e.shiftKey||"ctrl-enter"===S&&(e.ctrlKey||e.metaKey))||(e.preventDefault(),U(),k())},onMouseDown:function(e){2===e.button?!0!==O.current&&(O.current=!0,document.addEventListener("mousedown",(function e(){setTimeout((()=>{O.current=!1}),100),window.removeEventListener("mouseup",e)})),document.addEventListener("keydown",(function e(t){"Esc"!==t.key&&"Escape"!==t.key||(setTimeout((()=>{O.current=!1}),100),window.removeEventListener("keydown",e))}))):e.target.addEventListener("mouseup",(function t(){H(),e.target.removeEventListener("mouseup",t)}))},onContextMenu:u.wZ?function(e){q()&&(e.preventDefault(),e.stopPropagation())}:void 0,onTouchCancel:u.wZ?H:void 0}),a.ZP.createElement("div",{ref:F,className:(0,c.Z)(J,"clone"),dir:"auto"}),!d&&a.ZP.createElement("span",{className:"placeholder-text",dir:"auto"},i),a.ZP.createElement(E.Z,{isOpen:R,anchorPosition:B,selectedRange:X,setSelectedRange:K,onClose:z}),d&&a.ZP.createElement("span",{className:"forced-placeholder"},(0,g.Z)(d)))})))},3283:(e,t,n)=>{n.d(t,{Z:()=>v});var a=n(4050),r=n(3716),s=n(6752),i=n(1396),o=n(3989),l=n(1212),c=n(8758),d=n(706),u=n(9107),m=n(231);const h={B:"bold",STRONG:"bold",I:"italic",EM:"italic",U:"underline",DEL:"strikethrough",CODE:"monospace"},f=document.createElement("div"),v=(0,a.X$)((({isOpen:e,anchorPosition:t,selectedRange:n,setSelectedRange:v,onClose:p})=>{const Z=(0,a.sO)(null),g=(0,a.sO)(null),{shouldRender:E,transitionClassNames:P}=(0,l.Z)(e),[y,C,b]=(0,d.Z)(),[N,w]=(0,a.eJ)(""),[k,I]=(0,a.eJ)(!1),[T,M]=(0,a.eJ)(),[S,x]=(0,a.eJ)({});(0,a.d4)((()=>e?(0,o.Z)(p):void 0),[e,p]),(0,c.Z)(e,Z,p),(0,a.d4)((()=>{y?g.current.focus():(w(""),I(!1))}),[y]),(0,a.d4)((()=>{E||(b(),x({}),M(void 0))}),[b,E]),(0,a.d4)((()=>{if(!e||!n)return;const t={};let{parentElement:a}=n.commonAncestorContainer;for(;a&&a.id!==r.R2;){const e=h[a.tagName];e&&(t[e]=!0),a=a.parentElement}x(t)}),[e,n,C]);const L=(0,a.I4)((()=>{const e=window.getSelection();e&&v(e.getRangeAt(0))}),[v]),$=(0,a.I4)((()=>{if(n)return f.innerText=n.toString(),f.innerHTML}),[n]),F=(0,a.I4)((()=>{if(n)return n.commonAncestorContainer.parentElement}),[n]);function A(){const e=g.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 O(e){if(S[e])return"active";if("monospace"===e||"strikethrough"===e){if(Object.keys(S).some((t=>t!==e&&!!S[t])))return"disabled"}else if(S.monospace||S.strikethrough)return"disabled"}const R=(0,a.I4)((()=>{x((e=>(document.execCommand(e.bold?"removeFormat":"bold"),Object.keys(e).forEach((t=>{"italic"!==t&&"underline"!==t||!e[t]||document.execCommand(t)})),L(),{...e,bold:!e.bold})))}),[L]),D=(0,a.I4)((()=>{document.execCommand("italic"),L(),x((e=>({...e,italic:!e.italic})))}),[L]),U=(0,a.I4)((()=>{document.execCommand("underline"),L(),x((e=>({...e,underline:!e.underline})))}),[L]),B=(0,a.I4)((()=>{if(S.strikethrough){const e=F();if(!n||!e||"DEL"!==e.tagName||!e.textContent)return;return e.replaceWith(e.textContent),void x((e=>({...e,strikethrough:!1})))}const e=$();document.execCommand("insertHTML",!1,`${e}`),p()}),[F,$,p,n,S.strikethrough]),V=(0,a.I4)((()=>{if(S.monospace){const e=F();if(!n||!e||"CODE"!==e.tagName||!e.textContent)return;return e.replaceWith(e.textContent),void x((e=>({...e,monospace:!1})))}const e=$();document.execCommand("insertHTML",!1,`${e}`),p()}),[F,$,p,n,S.monospace]);function X(){const e=encodeURI((0,i.X)(N)||"");if(k){const t=F();if(!t||"A"!==t.tagName)return;return t.href=e,void p()}const t=$();!function(){if(!n)return;const e=window.getSelection();e&&(e.removeAllRanges(),e.addRange(n))}(),document.execCommand("insertHTML",!1,`${t}`),p()}const K=(0,a.I4)((e=>{const t={KeyK:C,KeyB:R,KeyU:U,KeyI:D,KeyM:V,KeyS:B}[e.code];!e.altKey&&(e.ctrlKey||e.metaKey)&&t&&(e.preventDefault(),e.stopPropagation(),t())}),[R,D,U,V,B,C]);(0,a.d4)((()=>(e&&document.addEventListener("keydown",K),()=>document.removeEventListener("keydown",K))),[e,K]);const j=(0,u.Z)();if(!E)return;const z=(0,s.Z)("TextFormatter",P,y&&"link-control-shown"),q=(0,s.Z)("TextFormatter-link-url-confirm",!!N.length&&"shown"),H=t?`left: ${t.x}px; top: ${t.y}px;--text-formatter-left: ${t.x}px;`:"";return a.ZP.createElement("div",{ref:Z,className:z,style:H,onKeyDown:function(e){"Enter"===e.key&&y&&(X(),e.preventDefault())}},a.ZP.createElement("div",{className:"TextFormatter-buttons"},a.ZP.createElement(m.Z,{color:"translucent",ariaLabel:"Bold text",className:O("bold"),onClick:R},a.ZP.createElement("i",{className:"icon-bold"})),a.ZP.createElement(m.Z,{color:"translucent",ariaLabel:"Italic text",className:O("italic"),onClick:D},a.ZP.createElement("i",{className:"icon-italic"})),a.ZP.createElement(m.Z,{color:"translucent",ariaLabel:"Underlined text",className:O("underline"),onClick:U},a.ZP.createElement("i",{className:"icon-underlined"})),a.ZP.createElement(m.Z,{color:"translucent",ariaLabel:"Strikethrough text",className:O("strikethrough"),onClick:B},a.ZP.createElement("i",{className:"icon-strikethrough"})),a.ZP.createElement(m.Z,{color:"translucent",ariaLabel:"Monospace text",className:O("monospace"),onClick:V},a.ZP.createElement("i",{className:"icon-monospace"})),a.ZP.createElement("div",{className:"TextFormatter-divider"}),a.ZP.createElement(m.Z,{color:"translucent",ariaLabel:j("TextFormat.AddLinkTitle"),onClick:C},a.ZP.createElement("i",{className:"icon-link"}))),a.ZP.createElement("div",{className:"TextFormatter-link-control"},a.ZP.createElement("div",{className:"TextFormatter-buttons"},a.ZP.createElement(m.Z,{color:"translucent",ariaLabel:j("Cancel"),onClick:b},a.ZP.createElement("i",{className:"icon-arrow-left"})),a.ZP.createElement("div",{className:"TextFormatter-divider"}),a.ZP.createElement("div",{className:(0,s.Z)("TextFormatter-link-url-input-wrapper",T)},a.ZP.createElement("input",{ref:g,className:"TextFormatter-link-url-input",type:"text",value:N,placeholder:"Enter URL...",autoComplete:"off",inputMode:"url",dir:"auto",onChange:function(e){w(e.target.value),A()},onScroll:A})),a.ZP.createElement("div",{className:q},a.ZP.createElement("div",{className:"TextFormatter-divider"}),a.ZP.createElement(m.Z,{color:"translucent",ariaLabel:j("Save"),className:"color-primary",onClick:X},a.ZP.createElement("i",{className:"icon-check"}))))))}))},2400:(e,t,n)=>{n.d(t,{_:()=>o});const a=/(
|)/g,r=/( |\u00A0)/g,s=/(
|<\/div>)/gi,i=/\n$/i;function o(e){return e.replace(r," ").replace(a,"\n").replace(s,"").replace(i,"")}},6391:(e,t,n)=>{function a(e,t){const{commonAncestorContainer:n}=e;let a=n,r=1;for(;a&&a.id!==t&&r<5;)a=a.parentElement,r++;return Boolean(a&&a.id===t)}n.d(t,{R:()=>a})},8353:(e,t,n)=>{n.d(t,{Z:()=>v});var a=n(4050),r=n(3716),s=n(735),i=n(2400),o=n(4284),l=n(5723),c=n(782),d=n(706);let u,m,h,f;try{f=new RegExp("(^|\\s):[-+_:\\p{L}\\p{N}]*$","gui")}catch(e){f=new RegExp("(^|\\s):[-+_:\\d\\wа-яё]*$","gi")}function v(e,t,v,p=r.R2,Z,g,E,P=!1){const[y,C,b]=(0,d.Z)(),[N,w]=(0,a.eJ)(),[k,I]=(0,a.eJ)(),[T,M]=(0,a.eJ)({}),[S,x]=(0,a.eJ)(),[L,$]=(0,a.eJ)({}),[F,A]=(0,a.eJ)(!1),[O,R]=(0,a.eJ)(s.D),D=(0,a.Ye)((()=>N&&v.length?Object.values((0,c.q0)(N,v)):[]),[N,v]);(0,a.d4)((()=>{if(P)return;const e=()=>{w(h.emojis)};h?e():async function(){return u||(u=n.e(501).then(n.t.bind(n,7501,19)),m=(await u).default,h=(0,o.NM)(m)),u}().then(e)}),[P]),(0,a.d4)((()=>{if(!N||P)return;const e=Object.values(N),t=(0,c.ee)(e,"native"),n=g?(0,c.Q8)(g,(e=>Object.values((0,c.q0)(t,e)))):{},a=E?(0,c.Q8)(E,(e=>Object.values((0,c.q0)(t,e)))):{};M({...n,...a}),I([...Object.keys(n),...Object.keys(a)]);const r=e.reduce(((e,t)=>(t.names.forEach((n=>{e[n]||(e[n]=[]),e[n].push(t)})),e)),{});$(r),x(Object.keys(r))}),[P,g,N,E]),(0,a.d4)((()=>{if(!(e&&t&&N&&k&&k.length))return void b();const n=t.includes(":")&&function(e){const t=(0,i._)(e).match(f);return t?t[0].trim():void 0}(t);if(!n)return R(s.D),void b();const a=n.length>2&&n.endsWith(":"),r=n.substr(1,a?n.length-2:void 0);let o=[];if(A(a),r){if(r.length>=2){const e=k.filter((e=>e.startsWith(r))).sort();o=o.concat((0,c.xH)(Object.values((0,c.q0)(T,e))));const t=S.filter((e=>e.startsWith(r)));o=o.concat((0,c.xH)(Object.values((0,c.q0)(L,t)))),o=(0,c.Tw)(o)}}else o=D;o.length?(a||C(),R(o.slice(0,36))):b()}),[N,T,k,L,S,t,e,C,D,b,A]);const U=(0,a.I4)(((e,n)=>{const a=t.lastIndexOf(":",n?t.lastIndexOf(":")-1:void 0);if(-1!==a){Z(`${t.substr(0,a)}${e}`);const n=document.getElementById(p);requestAnimationFrame((()=>{(0,l.Z)(n,!0)}))}b()}),[t,p,Z,b]);return(0,a.d4)((()=>{y&&F&&O.length&&U(O[0].native,!0)}),[O,U,y,F]),{isEmojiTooltipOpen:y,closeEmojiTooltip:b,filteredEmojis:O,insertEmoji:U}}},2365:(e,t,n)=>{n.d(t,{Z:()=>v});var a=n(4050),r=n(6137),s=n(3716),i=n(2858),o=n(5765);function l(e,t){const n=t.username.toLowerCase(),a=(0,i.Js)(t),r=a&&a.toLowerCase(),s=e.toLowerCase();return n.startsWith(s)||r&&(0,o.Z)(r,s)}var c=n(2400),d=n(5723),u=n(706),m=n(782);const h=(0,n(9118).P2)((e=>e()),500,!0);let f;try{f=new RegExp("(^|\\s)@[-_\\p{L}\\p{M}\\p{N}]*$","gui")}catch(e){f=new RegExp("(^|\\s)@[-_\\d\\wа-яё]*$","gi")}function v(e,t,n,o=s.R2,v,p,Z,g){const[E,P,y]=(0,u.Z)(),[C,b]=(0,a.eJ)(),N=(0,a.Ye)((()=>(p||[]).map((e=>null==g?void 0:g[e])).filter(Boolean)),[p,g]),w=(0,a.I4)(((e,t)=>{(v||p)&&g?h((()=>{const n=(t?N:[]).filter((t=>!e||l(e,t))),a=(v||[]).map((({userId:e})=>g[e])).filter((t=>!(!t||t.id===Z)&&(!e||l(e,t))));b((0,m.Tw)(n.concat(a)))})):b(void 0)}),[Z,v,p,N,g]);(0,a.d4)((()=>{if(!e||!t.length)return void y();const n=t.includes("@")&&function(e){const t=(0,c._)(e).match(f);return t?t[0].trim():void 0}(t);if(n){const e=n?n.substr(1):"";w(e,function(e){return e.startsWith("@")}(t))}else y()}),[e,t,w,P,y]),(0,a.d4)((()=>{null!=C&&C.length?P():y()}),[P,y,C]);const k=(0,a.I4)(((e,a=!1)=>{if(!e.username&&!(0,i.Vl)(e))return;const s=e.username?`@${e.username}`:`${(0,i.Vl)(e)}`,l=t.lastIndexOf("@");if(-1!==l){n(`${t.substr(0,l)}${s} `);const e=document.getElementById(o);requestAnimationFrame((()=>{(0,d.Z)(e,a)}))}y()}),[t,o,n,y]);return{isMentionTooltipOpen:E,closeMentionTooltip:y,insertMention:k,mentionFilteredUsers:C}}},7891:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(9290),s=n(5326);function i(e,t){const n=void 0===t,i=(0,a.sO)(n),o=(0,a.sO)(),l=(0,s.Z)();return(0,r.Z)((()=>{n||(i.current=!1,o.current&&(clearTimeout(o.current),o.current=void 0))}),e),(0,a.d4)((()=>{if(n||i.current)return;const e=()=>{i.current=!0,l()};t>0?o.current=window.setTimeout(e,t):e()}),e),i.current}},1218:(e,t,n)=>{n.d(t,{Z:()=>s});var a=n(4050),r=n(4605);const s=(0,a.X$)((({id:e,options:t,selected:n=[],disabled:s,round:i,loadingOptions:o,onChange:l})=>{const[c,d]=(0,a.eJ)(n||[]),u=(0,a.I4)((e=>{const{value:t,checked:n}=e.currentTarget;let a;a=n?[...c,t]:c.filter((e=>e!==t)),d(a),l(a)}),[l,c]);return a.ZP.createElement("div",{id:e,className:"radio-group"},t.map((e=>a.ZP.createElement(r.Z,{label:e.label,subLabel:e.subLabel,value:e.value,checked:-1!==n.indexOf(e.value),disabled:s,round:i,isLoading:o?-1!==o.indexOf(e.value):void 0,onChange:u}))))}))},1151:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(6752),s=n(231);const i=({isShown:e,className:t,color:n="primary",ariaLabel:i,disabled:o,onClick:l,children:c})=>{const d=(0,r.Z)("FloatingActionButton",e&&"revealed",t);return a.ZP.createElement(s.Z,{className:d,color:n,round:!0,disabled:o,onClick:e&&!o?l:void 0,ariaLabel:i,tabIndex:-1},c)}},1876:(e,t,n)=>{n.d(t,{Z:()=>f});var a=n(4050),r=n(7361),s=n(9118),i=n(6752),o=n(7240),l=n(3394),c=n(706),d=n(9107),u=n(8512),m=n(2328),h=n(8964);const f=e=>{const{ref:t,buttonRef:n,icon:f,className:v,style:p,children:Z,disabled:g,ripple:E,narrow:P,inactive:y,focus:C,destructive:b,multiline:N,isStatic:w,contextActions:k,onMouseDown:I,onClick:T}=e;let M=(0,a.sO)(null);t&&(M=t);const[S,x,L]=(0,c.Z)(),{isContextMenuOpen:$,contextMenuPosition:F,handleBeforeContextMenu:A,handleContextMenu:O,handleContextMenuClose:R,handleContextMenuHide:D}=(0,o.Z)(M,!k),U=(0,a.I4)((()=>M.current),[]),B=(0,a.I4)((()=>M.current.closest(".custom-scroll")),[]),V=(0,a.I4)((()=>M.current.querySelector(".ListItem-context-menu .bubble")),[]),{positionX:X,positionY:K,style:j}=(0,l.Z)(F,U,B,V),z=(0,a.I4)((e=>{!g&&T&&(T(e),r.$b&&!E&&(x(),(0,s.T2)(L)))}),[g,x,T,E,L]),q=(0,a.I4)((e=>{y||r.$b||(!k||2!==e.button&&T||A(e),0===e.button&&(T?z(e):O(e)))}),[y,k,T,A,O,z]),H=(0,d.Z)(),Y=(0,i.Z)("ListItem",v,!w&&"no-selection",E&&"has-ripple",P&&"narrow",g&&"disabled",y&&"inactive",F&&"has-menu-open",C&&"focus",b&&"destructive",N&&"multiline",w&&"is-static");return a.ZP.createElement("div",{ref:M,className:Y,dir:H.isRtl?"rtl":void 0,style:p,onMouseDown:I},a.ZP.createElement("div",{className:(0,i.Z)("ListItem-button",S&&"active"),role:"button",ref:n,tabIndex:0,onClick:!y&&r.$b?z:void 0,onMouseDown:q,onContextMenu:!y&&k?O:void 0},f&&a.ZP.createElement("i",{className:`icon-${f}`}),N&&a.ZP.createElement("div",{className:"multiline-item"},Z),!N&&Z,!g&&!y&&E&&a.ZP.createElement(u.Z,null)),k&&void 0!==F&&a.ZP.createElement(m.Z,{isOpen:$,positionX:X,positionY:K,style:j,className:"ListItem-context-menu",autoClose:!0,onClose:R,onCloseAnimationEnd:D},k.map((e=>a.ZP.createElement(h.Z,{key:e.title,icon:e.icon,destructive:e.destructive,disabled:!e.handler,onClick:e.handler},e.title)))))}},6937:(e,t,n)=>{n.d(t,{Z:()=>c});var a=n(4050),r=n(3716),s=n(1212),i=n(6752),o=n(3989),l=n(2898);const c=({message:e,duration:t=3e3,containerId:n,onDismiss:c})=>{const[d,u]=(0,a.eJ)(!0),m=(0,a.sO)(null),{transitionClassNames:h}=(0,s.Z)(d),f=(0,a.I4)((()=>{u(!1),setTimeout(c,150+r.fK)}),[c]);(0,a.d4)((()=>d?(0,o.Z)(f):void 0),[d,f]),(0,a.d4)((()=>(m.current=window.setTimeout(f,t),()=>{m.current&&(clearTimeout(m.current),m.current=void 0)})),[t,f]);const v=(0,a.I4)((()=>{m.current&&(clearTimeout(m.current),m.current=void 0)}),[]),p=(0,a.I4)((()=>{m.current=window.setTimeout(f,t)}),[t,f]);return a.ZP.createElement(l.Z,{className:"Notification-container",containerId:n},a.ZP.createElement("div",{className:(0,i.Z)("Notification",h),onClick:f,onMouseEnter:v,onMouseLeave:p},a.ZP.createElement("div",{className:"content"},e)))}},9196:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(6752);const s={s:22,m:25,l:28,xl:20},i=(0,a.X$)((({progress:e=0,size:t="l",square:n,transparent:i,noCross:o,onClick:l})=>{const c=s[t],d=c-4,u=c-1,m=2*d*Math.PI,h=(0,a.sO)(null);(0,a.d4)((()=>{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,u,d,e]);const f=(0,r.Z)(`ProgressSpinner size-${t}`,i&&"transparent",n&&"square",o&&"no-cross");return a.ZP.createElement("div",{ref:h,className:f,onClick:l})}))},4434:(e,t,n)=>{n.d(t,{Z:()=>l});var a=n(4050),r=n(6752),s=n(9107),i=n(9204);const o=(0,a.X$)((({id:e,label:t,subLabel:n,value:o,name:l,checked:c,disabled:d,hidden:u,isLoading:m,onChange:h})=>{const f=(0,s.Z)(),v=(0,r.Z)("Radio",d&&"disabled",u&&"hidden-widget",m&&"loading");return a.ZP.createElement("label",{className:v,dir:f.isRtl?"rtl":void 0},a.ZP.createElement("input",{type:"radio",name:l,value:o,id:e,checked:c,onChange:h,disabled:d||u}),a.ZP.createElement("div",{className:"Radio-main"},a.ZP.createElement("span",{className:"label",dir:f.isRtl?"auto":void 0},t),n&&a.ZP.createElement("span",{className:"subLabel",dir:f.isRtl?"auto":void 0},n)),m&&a.ZP.createElement(i.Z,null))})),l=(0,a.X$)((({id:e,name:t,options:n,selected:r,disabled:s,loadingOption:i,onChange:l})=>{const c=(0,a.I4)((e=>{const{value:t}=e.currentTarget;l(t)}),[l]);return a.ZP.createElement("div",{id:e,className:"radio-group"},n.map((e=>a.ZP.createElement(o,{name:t,label:e.label,subLabel:e.subLabel,value:e.value,checked:e.value===r,hidden:e.hidden,disabled:s,isLoading:i?i===e.value:void 0,onChange:c}))))}))},8051:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(6752),s=n(9107);const i=(0,a.X$)((({options:e,min:t=0,max:n=(e?e.length-1:100),step:i=1,label:o,value:l,renderValue:c,disabled:d,onChange:u})=>{const m=(0,s.Z)(),h=(0,a.I4)((e=>{u(Number(e.currentTarget.value))}),[u]),f=(0,r.Z)("RangeSlider",d&&"disabled"),v=(0,a.Ye)((()=>e?l/(e.length-1)*100:(l-t)/((n-t)/i)*100),[e,l,n,t,i]);return a.ZP.createElement("div",{className:f},o&&a.ZP.createElement("div",{className:"slider-top-row",dir:m.isRtl?"rtl":void 0},a.ZP.createElement("span",{className:"label",dir:"auto"},o),!e&&a.ZP.createElement("span",{className:"value",dir:"auto"},c?c(l):l)),a.ZP.createElement("div",{className:"slider-main"},a.ZP.createElement("div",{className:"slider-fill-track",style:`width: ${v}%`}),a.ZP.createElement("input",{min:t,max:n,value:l,step:i,type:"range",onChange:h}),e&&a.ZP.createElement("div",{className:"slider-options"},e.map(((e,t)=>a.ZP.createElement("div",{className:(0,r.Z)("slider-option no-selection",t===l&&"active"),onClick:()=>u(t)},e))))))}))},9589:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(4050),r=n(6752),s=n(706),i=n(9107),o=n(2515),l=n(4288),c=n(231);const d=(0,a.X$)((({ref:e,children:t,parentContainerClassName:n,value:d,inputId:u,className:m,focused:h,isLoading:f,placeholder:v,disabled:p,autoComplete:Z,canClose:g,autoFocusSearch:E,onChange:P,onReset:y,onFocus:C,onBlur:b})=>{let N=(0,a.sO)(null);e&&(N=e);const[w,k,I]=(0,s.Z)(h);(0,o.Z)(N,E,I),(0,a.d4)((()=>{N.current&&(h?N.current.focus():N.current.blur())}),[h,v]);const T=(0,i.Z)(),M=(0,a.I4)((e=>{if("ArrowDown"===e.key||"Enter"===e.key){const e=document.querySelector(`.${n} .ListItem-button`);e&&e.focus()}}),[n]);return a.ZP.createElement("div",{className:(0,r.Z)("SearchInput",m,w&&"has-focus"),dir:T.isRtl?"rtl":void 0},t,a.ZP.createElement("input",{ref:N,id:u,type:"text",dir:"auto",placeholder:v||T("Search"),className:"form-control",value:d,disabled:p,autoComplete:Z,onChange:function(e){const{currentTarget:t}=e;P(t.value)},onFocus:function(){k(),C&&C()},onBlur:function(){I(),b&&b()},onKeyDown:M}),a.ZP.createElement("i",{className:"icon-search"}),f&&a.ZP.createElement(l.Z,null),!f&&(d||g)&&y&&a.ZP.createElement(c.Z,{round:!0,size:"tiny",color:"translucent",onClick:y},a.ZP.createElement("span",{className:"icon-close"})))}))},126:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(4050),r=n(1212),s=n(7204),i=n(6752);const o=({isOpen:e,isCustom:t,id:n,className:o,onClick:l,children:c})=>{const{shouldRender:d,transitionClassNames:u}=(0,r.Z)(e,void 0,void 0,!t&&void 0),m=(0,s.Z)(e),h=(0,s.Z)(c),f=(0,a.sO)();return m&&!e&&(f.current=h),d&&a.ZP.createElement("div",{id:n,className:(0,i.Z)(o,u),onClick:l},e?c():f.current())}},3321:(e,t,n)=>{n.d(t,{Z:()=>s});var a=n(4050),r=n(6752);const s=(0,a.X$)((({id:e,name:t,value:n,label:s,checked:i=!1,disabled:o,inactive:l,noAnimation:c,onChange:d,onCheck:u})=>{const m=(0,a.I4)((e=>{d&&d(e),u&&u(e.currentTarget.checked)}),[d,u]),h=(0,r.Z)("Switcher",o&&"disabled",l&&"inactive",c&&"no-animation");return a.ZP.createElement("label",{className:h,title:s},a.ZP.createElement("input",{type:"checkbox",id:e,name:t,value:n,checked:i,disabled:o,onChange:m}),a.ZP.createElement("span",{className:"widget"}))}))},3133:(e,t,n)=>{n.d(t,{Z:()=>u});var a=n(4050),r=n(1367),s=n(7204),i=n(8781),o=n(9107),l=n(6752),c=n(2340);const d=(0,a.X$)((({className:e,title:t,active:n,badgeCount:r,isBadgeActive:s,previousActiveTab:i,onClick:o,clickArg:d})=>{const u=(0,a.sO)(null);return(0,a.bt)((()=>{if(!n||void 0===i)return;const e=u.current,t=e.querySelector("i"),a=e.parentElement.children[i];if(!a)return;const r=a.querySelector("i");r.classList.remove("animate"),t.classList.remove("animate");const s=r.parentElement.offsetLeft-t.parentElement.offsetLeft,o=r.clientWidth/t.clientWidth;t.style.transform=`translate3d(${s}px, 0, 0) scale3d(${o}, 1, 1)`,requestAnimationFrame((()=>{requestAnimationFrame((()=>{requestAnimationFrame((()=>{t.classList.add("animate"),t.style.transform="none"}))}))}))}),[n,i]),a.ZP.createElement("button",{type:"button",className:(0,l.Z)("Tab",e,n&&"active"),onClick:()=>o(d),ref:u},a.ZP.createElement("span",null,(0,c.Z)(t),!!r&&a.ZP.createElement("span",{className:(0,l.Z)("badge",s&&"active")},r),a.ZP.createElement("i",null)))})),u=(0,a.X$)((({tabs:e,activeTab:t,big:n,onSwitchTab:l})=>{const c=(0,a.sO)(null),u=(0,s.Z)(t);(0,i.Z)(c.current),(0,a.d4)((()=>{const e=c.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;(0,r.Z)(e,n)}}),[t]);const m=(0,o.Z)();return a.ZP.createElement("div",{className:"TabList no-selection no-scrollbar "+(n?"big":""),ref:c,dir:m.isRtl?"rtl":void 0},e.map(((e,n)=>a.ZP.createElement(d,{key:e.title,title:m(e.title),active:n===t,badgeCount:e.badgeCount,isBadgeActive:e.isBadgeActive,previousActiveTab:u,onClick:l,clickArg:n}))))}))},2255:(e,t,n)=>{n.d(t,{Z:()=>u});var a=n(4050),r=n(5116),s=n(5326),i=n(7204),o=n(6752),l=n(8674),c=n(1279);const d=Symbol("CLEANED_UP"),u=({ref:e,activeKey:t,name:n,direction:u="auto",renderCount:m,shouldRestoreHeight:h,shouldCleanup:f,cleanupExceptionKey:v,id:p,className:Z,onStart:g,onStop:E,children:P})=>{const{animationLevel:y}=(0,r.Rd)().settings.byKey,C=(0,a.sO)();let b=(0,a.sO)(null);e&&(b=e);const N=(0,a.sO)({}),w=(0,i.Z)(t),k=(0,s.Z)(),I=void 0!==w&&t!==w;!m&&I&&(N.current={[w]:N.current[w]}),N.current[t]=P,(0,a.bt)((()=>{function e(){!f||void 0!==v&&v===w||(N.current={[w]:d},k())}const a=b.current,r=a.children;if(1===r.length&&!I)return void r[0].classList.add("active");const s=Array.from(a.childNodes);if(!I||!s.length)return;const i=-1===u||"auto"===u&&w>t||"inverse"===u&&w{e instanceof HTMLElement&&(e.classList.remove("from","through","to"),e.classList.toggle("active",t===Z))})),void e();let P;s.forEach(((e,t)=>{e instanceof HTMLElement&&(e.classList.remove("active"),e.classList.toggle("from",t===p),e.classList.toggle("through",t>p&&tZ),e.classList.toggle("to",t===Z))})),y>0&&(P=(0,l.YW)()),requestAnimationFrame((()=>{var r;function o(){requestAnimationFrame((()=>{if(t===C.current){if(a.classList.remove("animating","backwards"),s.forEach(((e,t)=>{e instanceof HTMLElement&&(e.classList.remove("from","through","to"),e.classList.toggle("active",t===Z))})),h){const e=a.querySelector(".active");e&&(e.style.height="auto",a.style.height=`${e.clientHeight}px`)}P&&P(),e(),E&&E()}}))}a.classList.add("animating"),g&&g();const l="mv-slide"===n?null===(r=s[Z])||void 0===r?void 0:r.firstChild:"reveal"===n&&i?s[p]:s[Z];C.current=t,y>0&&l?(0,c.f)(l,o):o()}))}),[t,w,I,u,n,g,E,m,h,f,v,y,k]),(0,a.bt)((()=>{if(h){const e=b.current,t=e.querySelector(".active")||e.querySelector(".from");t&&(t.style.height="auto",e.style.height=`${t.clientHeight}px`,e.style.flexBasis=`${t.clientHeight}px`)}}),[h,P]);const T=N.current,M=Object.keys(m?new Array(m).fill(void 0):T).map(Number).map((e=>{const n=T[e];return"function"==typeof n?a.ZP.createElement("div",{key:e},n(e===t,e===w,t)):void 0})),S=(0,o.Z)("Transition",Z,n);return a.ZP.createElement("div",{ref:b,id:p,className:S},M)}},3455:(e,t,n)=>{n.d(t,{fi:()=>s,Yy:()=>i,vb:()=>c,ZP:()=>h});var a=n(1090),r=n(782);const s=[{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"}],i=[{icon:"mute",title:"FilterMuted",key:"excludeMuted"},{icon:"archive",title:"FilterArchived",key:"excludeArchived"},{icon:"readchats",title:"FilterRead",key:"excludeRead"}],o=["includedChatIds","bots","channels","groups","contacts","nonContacts"],l=["excludedChatIds","excludeArchived","excludeMuted","excludeRead"];function c(e,t,n){let a=[],s=[];if("included"===t){const{includedChatIds:t,...i}=n?e.includeFilters||{}:(0,r.ei)(e.folder,o);a=t||[],s=Object.keys(i).filter((e=>Boolean(i[e])))}else{const{excludedChatIds:t,...i}=n?e.excludeFilters||{}:(0,r.ei)(e.folder,l);a=t||[],s=Object.keys(i).filter((e=>Boolean(i[e])))}return{selectedChatIds:a,selectedChatTypes:s}}function d(e){if(e){const{includedChatIds:t,...n}=e;if(Object.values(n).filter(Boolean).length>1||null!=t&&t.length)return"";if(n.bots)return"Bots";if(n.groups)return"Groups";if(n.channels)return"Channels";if(n.contacts)return"Contacts";if(n.nonContacts)return"Non-Contacts"}return""}const u={mode:"create",chatFilter:"",folder:{title:"",includedChatIds:[],excludedChatIds:[]}},m=(e,t)=>{switch(t.type){case"setTitle":return{...e,folder:{...e.folder,title:t.payload},isTouched:!0};case"editIncludeFilters":return{...e,includeFilters:(0,r.ei)(e.folder,o)};case"editExcludeFilters":return{...e,excludeFilters:(0,r.ei)(e.folder,l)};case"setIncludeFilters":return{...e,includeFilters:t.payload,chatFilter:""};case"setExcludeFilters":return{...e,excludeFilters:t.payload,chatFilter:""};case"saveFilters":return e.includeFilters?{...e,folder:{...(0,r.CE)(e.folder,o),title:e.folder.title?e.folder.title:d(e.includeFilters),...e.includeFilters},includeFilters:void 0,chatFilter:"",isTouched:!0}:e.excludeFilters?{...e,folder:{...(0,r.CE)(e.folder,l),...e.excludeFilters},excludeFilters:void 0,chatFilter:"",isTouched:!0}:e;case"editFolder":{const{id:e,description:n,...a}=t.payload;return{mode:"edit",folderId:e,folder:a,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 u;default:return e}},h=()=>(0,a.Z)(m,u)},3186:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(4050),r=n(5116),s=n(396),i=n(274),o=n(5266),l=n(9290),c=n(4532);const d=(e,t,n,d,u,m,h,f=!1,v,p,Z=!1,g=!1)=>{const E=(0,a.sO)(null),[P,y]=(0,a.eJ)(!1);let C=P;const[b,N]=(0,a.eJ)(0),w=(0,a.I4)((()=>{y(!1),p&&p()}),[p]);(0,l.Z)((()=>{E.current=(0,s.z2)(e,n,((e,a)=>{var s;switch(e){case"onPlay":{const{setVolume:e,setPlaybackRate:t,toggleMuted:a,proxy:s}=E.current;y(!0),(0,c.N)(m,function(e){let t={};if(e&&e.current){const{play:n,pause:a,setCurrentTime:s,proxy:i,requestNextTrack:o,requestPreviousTrack:l,isFirst:c,isLast:d}=e.current;t={play:()=>{n(i.src)},pause:()=>{a()},stop:()=>{a(),s(0),(0,r.uC)().closeAudioPlayer()},seekbackward:e=>{const t=e.seekOffset||10;s(Math.max(i.currentTime-t,0))},seekforward:e=>{const t=e.seekOffset||10;s(Math.min(i.currentTime+t,i.duration))},seekTo:e=>{e.seekTime&&s(e.seekTime)}},d()||(t.nexttrack=()=>{o()}),c()||(t.previoustrack=()=>{l()})}return t}(E)),(0,c.pC)("playing"),e((0,r.Rd)().audioPlayer.volume),a(!!(0,r.Rd)().audioPlayer.isMuted),"voice"===n&&t((0,r.Rd)().audioPlayer.playbackRate),(0,c.NS)({duration:s.duration||0,playbackRate:s.playbackRate,position:s.currentTime});break}case"onRateChange":{const{proxy:e}=E.current;(0,c.NS)({duration:e.duration||0,playbackRate:e.playbackRate,position:e.currentTime});break}case"onPause":y(!1),(0,c.pC)("paused");break;case"onTimeUpdate":{const{proxy:e}=E.current,n=e.duration&&Number.isFinite(e.duration)?e.duration:t;g||N(e.currentTime/n);break}case"onEnded":(0,c.pC)("paused")}null==u||null===(s=u[e])||void 0===s||s.call(u,a)}),v,w);const{proxy:a}=E.current;P||a.paused||(y(!0),C=!0),h&&h(a)}),[e]),(0,a.d4)((()=>{P&&m&&(0,c.Ym)(m)}),[m,P]);const{play:k,pause:I,setCurrentTime:T,proxy:M,destroy:S,setVolume:x,stop:L,isFirst:$,isLast:F,requestNextTrack:A,requestPreviousTrack:O,setPlaybackRate:R,toggleMuted:D}=E.current,U=M.duration&&Number.isFinite(M.duration)?M.duration:t;(0,a.d4)((()=>{!U||(0,o.z)(M)||g||N(M.currentTime/U)}),[U,b,M,g]),(0,a.d4)((()=>()=>{S(Z)}),[S,Z]),(0,i.Z)((([e,t])=>{e===f&&d===t||M.src&&M.paused||f&&d&&!P&&k(d)}),[f,d,P,k,M.src,M.paused]);const B=(0,a.I4)((()=>{d&&k(d)}),[d,k]),V=(0,a.I4)((()=>{P?I():B()}),[I,B,P]),X=(0,a.I4)((e=>{T(e),U&&N(M.currentTime/U)}),[U,M,T]);return{isPlaying:C,playProgress:b,playPause:V,pause:I,play:B,stop:L,setCurrentTime:X,setVolume:x,audioProxy:M,duration:U,requestNextTrack:A,requestPreviousTrack:O,isFirst:$,isLast:F,setPlaybackRate:R,toggleMuted:D}}},2937:(e,t,n)=>{n.d(t,{Z:()=>c});var a=n(4050),r=n(6264),s=n(9290),i=n(1394),o=n(5326);const l=new Map;function c(e){const t=(0,a.sO)();let n=!1;(0,s.Z)((()=>{if(n=!0,t.current=void 0,!e)return;const a=new Image;if(a.src=e,!a.width)return;const s=(0,i.ao)(a);(0,r.Z)(s.getContext("2d"),0,0,s.width,s.height,2,2),t.current=s.toDataURL()}),[e]);const c=function(e,t=!1,n){const s=(0,a.sO)(e?l.get(e):void 0),c=(0,a.sO)(),d=(0,o.Z)();return c.current&&t&&(clearTimeout(c.current),c.current=void 0),(0,a.d4)((()=>{if(!e||s.current||t)return;const a=new Image;a.onload=()=>{const t=(0,i.ao)(a);(0,r.Z)(t.getContext("2d"),0,0,t.width,t.height,2,2);const n=t.toDataURL();s.current=n,d(),l.size>=1e3&&l.clear(),l.set(e,n)},n?c.current=window.setTimeout((()=>{a.src=e}),n):a.src=e}),[e,n,d,t]),s.current}(e||void 0,Boolean(t.current));return t.current||!n&&c||e||void 0}},2019:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(9118),s=n(5266);const i=(e=!1)=>{const[t,n]=(0,a.eJ)(!e),[i,o]=(0,a.eJ)(0),l=(0,a.Ye)((()=>(0,r.Ds)(n,200,!1,!0)),[]),c=(0,a.I4)((e=>{const t=e.currentTarget;(0,s.z)(t)||(t.buffered.length&&o(t.buffered.end(0)/t.duration),l(t.readyState>=3||t.currentTime>0))}),[l]);return{isBuffered:t,bufferedProgress:i,bufferingHandlers:{onLoadedData:c,onPlaying:c,onLoadStart:c,onPause:c,onTimeUpdate:c,onProgress:c},checkBuffering(e){l(e.readyState>=3)}}}},5866:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(4050),r=n(6264),s=n(5326),i=n(7361);function o(e,t=!1,n){const o=(0,a.sO)(null),l=(0,s.Z)();return(0,a.d4)((()=>{const a=o.current;if(!e||!a||t)return;const s=new Image,l=()=>{a.width=s.width,a.height=s.height;const e=a.getContext("2d",{alpha:!1});i.vX&&(e.filter="blur(2px)"),e.drawImage(s,-4,-4,a.width+8,a.height+8),i.vX||(0,r.Z)(e,0,0,a.width,a.height,2,2)};s.onload=()=>{n?requestAnimationFrame(l):l()},s.src=e}),[o,e,l,t,n]),o}},1470:(e,t,n)=>{n.d(t,{Z:()=>l});var a=n(4050),r=n(5116),s=n(2858),i=n(782),o=n(9107);const l=({chat:e,privateChatUser:t,handleDelete:n,handleChatFolderChange:l,folderId:c,isPinned:d,isMuted:u},m=!1)=>{const h=(0,o.Z)(),{isSelf:f}=t||{};return(0,a.Ye)((()=>{if(!e)return;const{toggleChatPinned:t,updateChatMutedState:a,toggleChatArchived:o,toggleChatUnread:v}=(0,r.uC)(),p={title:h("ChatList.Filter.AddToFolder"),icon:"folder",handler:l},Z=d?{title:h("UnpinFromTop"),icon:"unpin",handler:()=>t({id:e.id,folderId:c})}:{title:h("PinToTop"),icon:"pin",handler:()=>t({id:e.id,folderId:c})};if(m)return[Z,p];const g=e.unreadCount||e.hasUnreadMark?{title:h("MarkAsRead"),icon:"readchats",handler:()=>v({id:e.id})}:{title:h("MarkAsUnread"),icon:"unread",handler:()=>v({id:e.id})},E=u?{title:h("ChatList.Unmute"),icon:"unmute",handler:()=>a({chatId:e.id,isMuted:!1})}:{title:h("ChatList.Mute"),icon:"mute",handler:()=>a({chatId:e.id,isMuted:!0})},P=(0,s.pE)(e)?{title:h("Unarchive"),icon:"unarchive",handler:()=>o({id:e.id})}:{title:h("Archive"),icon:"archive",handler:()=>o({id:e.id})},y={title:(0,s.YC)(e.id)?h("Delete"):h((0,s.cc)(e)?"DeleteChat":(0,s.eA)(e)?"LeaveChannel":"Group.LeaveGroup"),icon:"delete",destructive:!0,handler:n},C=void 0!==c;return(0,i.oA)([p,g,Z,!f&&E,!f&&!C&&P,y])}),[e,h,l,d,m,u,n,c,f])}},7240:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(7361);function s(e){e.stopImmediatePropagation(),e.preventDefault(),e.stopPropagation()}const i=(e,t,n,i)=>{const[o,l]=(0,a.eJ)(!1),[c,d]=(0,a.eJ)(void 0),u=(0,a.I4)((e=>{t||2!==e.button||document.body.classList.add("no-selection")}),[t]),m=(0,a.I4)((e=>{document.body.classList.remove("no-selection"),t||n&&e.target.matches("a[href]")||(e.preventDefault(),c||(l(!0),d({x:e.clientX,y:e.clientY})))}),[t,n,c]),h=(0,a.I4)((()=>{l(!1)}),[]),f=(0,a.I4)((()=>{d(void 0),document.body.classList.remove("no-selection")}),[]);return(0,a.d4)((()=>{if(t||!r.$b||i)return;const a=e.current;if(!a)return;let o;const u=()=>{o&&(clearTimeout(o),o=void 0)},m=e=>{t||r.wB&&window.document.body.classList.contains("enable-symbol-menu-transforms")||(u(),o=window.setTimeout((()=>(e=>{u();const{clientX:t,clientY:i,target:o}=e.touches[0];c||n&&o.matches("a[href]")||(a.addEventListener("touchend",(function e(t){a.removeEventListener("touchend",e,!0),s(t)}),!0),r.fl&&r.cj&&a.addEventListener("mousedown",(function e(t){a.removeEventListener("mousedown",e,!0),s(t)}),!0),document.body.classList.add("no-selection"),l(!0),d({x:t,y:i}))})(e)),200))};return a.addEventListener("touchstart",m,{passive:!0}),a.addEventListener("touchcancel",u,!0),a.addEventListener("touchend",u,!0),a.addEventListener("touchmove",u,{passive:!0}),()=>{u(),a.removeEventListener("touchstart",m),a.removeEventListener("touchcancel",u,!0),a.removeEventListener("touchend",u,!0),a.removeEventListener("touchmove",u)}}),[c,t,i,e,n]),{isContextMenuOpen:o,contextMenuPosition:c,handleBeforeContextMenu:u,handleContextMenu:m,handleContextMenuClose:h,handleContextMenuHide:f}}},3394:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(4050);const r=(e,t,n,r,s=0,i=0)=>{const[o,l]=(0,a.eJ)("right"),[c,d]=(0,a.eJ)("bottom"),[u,m]=(0,a.eJ)(!1),[h,f]=(0,a.eJ)(""),[v,p]=(0,a.eJ)("");return(0,a.d4)((()=>{const a=t();if(!e||!a)return;let{x:o,y:c}=e;const u={width:0,left:0,height:0,top:0},h=r(),v=n(),Z=a.getBoundingClientRect(),g=h?{width:h.offsetWidth,height:h.offsetHeight}:u,E=v?v.getBoundingClientRect():u;let P;o+g.width+s0?(P="right",o-=3):(P="left",o=16),l(P),c+g.height{n.d(t,{Z:()=>s});var a=n(4050),r=n(9118);function s(e,t,n){return(0,a.Ye)((()=>(0,r.Ds)((e=>e()),e,t,n)),[e,t,n])}},5790:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(5116),s=n(9118);const i=(e,t,n,i)=>{const{loadMessage:o}=(0,r.uC)(),l=(0,a.Ye)((()=>{const n=(0,s.P2)(o,500,!0);return()=>{n({chatId:e,messageId:t,replyOriginForId:i})}}),[o,e,t,i]);(0,a.d4)((()=>{t&&!n&&l()}))}},8781:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(4050);const r=(e,t)=>{(0,a.d4)((()=>{if(e)return e.addEventListener("wheel",t,{passive:!0}),()=>{e.removeEventListener("wheel",t)};function t(t){t.deltaX||(e.scrollLeft+=t.deltaY/4)}}),[e,t])}},2515:(e,t,n)=>{n.d(t,{Z:()=>s});var a=n(4050),r=n(7361);function s(e,t,n){(0,a.d4)((()=>{t?r.wB||setTimeout((()=>{requestAnimationFrame((()=>{e.current&&e.current.focus()}))}),500):(e.current&&e.current.blur(),n&&setTimeout(n,300))}),[e,t,n])}},3657:(e,t,n)=>{n.d(t,{S1:()=>i,_N:()=>o,Op:()=>l});var a=n(4050),r=n(9118),s=n(8674);function i({rootRef:e,throttleMs:t,debounceMs:n,shouldSkipFirst:i,margin:o,threshold:l,isDisabled:c,noAutoFreeze:d=!1},u){const m=(0,a.sO)(),h=(0,a.sO)(),f=(0,a.sO)(0),v=(0,a.sO)(),p=(0,a.sO)();h.current=u;const Z=(0,a.I4)((()=>{f.current&&(f.current--,!f.current&&p.current&&(p.current(),p.current=void 0))}),[]),g=(0,a.I4)((()=>{f.current++,d||(v.current&&(clearTimeout(v.current),v.current=void 0),v.current=window.setTimeout((()=>{v.current=void 0,f.current&&(f.current=1,Z())}),2e3))}),[d,Z]);return(0,s.ZP)(g,Z),(0,a.d4)((()=>{if(!c)return()=>{m.current&&(m.current.observer.disconnect(),m.current.callbacks.clear(),m.current=void 0)}}),[c]),{observe:(0,a.I4)(((a,s)=>{m.current||function(){const a=new Map,s=new Map,c=()=>{const e=Array.from(s.values());e.forEach((t=>{const n=a.get(t.target);n&&n(t,e)})),h.current&&h.current(e),s.clear()},d=t?r.P2:n?r.Ds:void 0,u=d?d(c,t||n,!i):c,v=new IntersectionObserver((e=>{e.forEach((e=>{s.set(e.target,e)})),f.current?p.current=()=>{u()}:u()}),{root:e.current,rootMargin:o?`${o}px`:void 0,threshold:l});m.current={observer:v,callbacks:a}}();const c=m.current;return c.observer.observe(a),s&&c.callbacks.set(a,s),()=>{s&&c.callbacks.delete(a),c.observer.unobserve(a)}}),[c]),freeze:g,unfreeze:Z}}function o(e,t,n){(0,a.d4)((()=>t?t(e.current,n):void 0),[])}function l(e,t,n){const[r,s]=(0,a.eJ)(!t);return o(e,t,(e=>{s(e.isIntersecting),n&&n(e)})),r}},2645:(e,t,n)=>{n.d(t,{Z:()=>s});var a=n(4050),r=n(7204);const s=(e,t,n)=>{const s=(0,r.Z)(t);return(0,a.bt)((()=>e(s||[])),t,n)}},692:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(1212);function r(e){const t=Boolean(e),{transitionClassNames:n}=(0,a.Z)(t,void 0,t,"slow");return n}},2566:(e,t,n)=>{n.d(t,{Z:()=>u});var a=n(4050),r=n(7361),s=n(6137),i=n(9118),o=n(647),l=n(5326),c=n(6926);const d={};function u(e,t=!1,n=s.IU.BlobUrl,u,m,h=!1){const f=e?o.UV(e):void 0,v=n===s.IU.Stream||r.I_&&n===s.IU.Progressive,p=(0,l.Z)(),Z=(()=>{const e=(0,a.sO)();return e.current||(e.current=(0,c.Z)(d),d[e.current]=!0),e.current})(),[g,E]=(0,a.eJ)(f&&!v?1:0),P=(0,a.sO)(),y=(0,a.Ye)((()=>(0,i.P2)((e=>{P.current&&(!m||Date.now()-P.current>m)&&E(e)}),500,!0)),[m]);return(0,a.d4)((()=>{!t&&e&&(f?v&&setTimeout((()=>{E(.75)}),1500):(E(0),P.current&&o.cC(y),P.current=Date.now(),o.he(e,n,h,y,Z).then((()=>{const e=Date.now()-P.current;P.current=void 0,!m||e>=m?p():setTimeout(p,m-e)}))))}),[t,e,f,n,u,p,v,m,y,h,Z]),(0,a.d4)((()=>{t&&P.current&&(o.cC(y),E(0),P.current=void 0)}),[y,t]),(0,a.d4)((()=>()=>{e&&o.Iq(e,Z)}),[Z,e]),{mediaData:f,loadProgress:g}}},6503:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(7361);let s;function i(e,t,n=250,i=!1){const o=(0,a.sO)(!1);return(0,a.d4)((()=>{s&&(clearTimeout(s),s=void 0),!e||r.$b||i||(s=window.setTimeout((()=>{o.current||t()}),2*n))}),[i,e,n,t]),[(0,a.I4)((()=>{o.current=!0}),[]),(0,a.I4)((()=>{o.current=!1,s&&(clearTimeout(s),s=void 0),s=window.setTimeout((()=>{o.current||t()}),n)}),[n,t])]}},2678:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(4050),r=n(7204),s=n(5326),i=n(9290);function o(e,t){const n=(0,r.Z)(e,!0),o=(0,a.sO)(),l=(0,s.Z)(),c=null!=e,d=null!=n;return c&&o.current&&(clearTimeout(o.current),o.current=void 0),(0,i.Z)((()=>{t&&!c&&d&&!o.current&&(o.current=window.setTimeout((()=>{o.current=void 0,l()}),t))}),[e]),o.current&&t&&!c?n:e}},1090:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(4050);function r(e,t){const n=(0,a.sO)(e),[r,s]=(0,a.eJ)(t);return[r,(0,a.I4)((e=>{s((t=>n.current(t,e)))}),[])]}},6898:(e,t,n)=>{n.d(t,{Z:()=>s});var a=n(4050),r=n(9118);function s(e,t){(0,a.d4)((()=>{const t=e.current;return()=>{t&&(0,r.T2)((()=>{t.pause(),t.src="",t.load()}))}}),t)}},6264:(e,t,n)=>{n.d(t,{Z:()=>s});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 s(e,t,n,s,i,o,l){if(Number.isNaN(o)||o<1)return;o|=0,Number.isNaN(l)&&(l=1),(l|=0)>3&&(l=3),l<1&&(l=1);const c=e.getImageData(t,n,s,i),d=c.data;let u,m,h,f,v,p,Z,g,E,P,y,C,b=s-1,N=i-1,w=o+1,k=[],I=[],T=[],M=a[o],S=r[o],x=[],L=[];for(;l-- >0;){for(C=y=0,v=0;vb?b:p)<<2),u+=d[Z++],m+=d[Z++],h+=d[Z++];for(f=0;f0?Z<<2:0),g=C+x[f],E=C+L[f],u+=d[g++]-d[E++],m+=d[g++]-d[E++],h+=d[g++]-d[E++],y++;C+=s<<2}for(f=0;fN?0:s,u+=k[P],m+=I[P],h+=T[P];for(y=f<<2,v=0;v>>S,d[y+1]=m*M>>>S,d[y+2]=h*M>>>S,0==f&&(x[v]=((Z=v+w)0?Z*s:0),g=f+x[v],E=f+L[v],u+=k[g]-k[E],m+=I[g]-I[E],h+=T[g]-T[E],y+=s<<2}}e.putImageData(c,t,n)}},396:(e,t,n)=>{n.d(t,{Es:()=>p,z2:()=>Z,An:()=>E});var a=n(5116),r=n(1713),s=n(7361),i=n(4753),o=n(5266),l=n(2858),c=n(9118),d=n(1638);const u=new Map;let m,h=[],f=[];function v(e,t){const n=m&&u.get(m);n&&(n.audio.pause(),n.audio.currentTime=0,n.onTrackChange&&n.onTrackChange());const s=g(e,(0,a.Rd)().audioPlayer.origin||r.Cr.Inline,t);if(!s)return;if(!u.has(s))return void(0,a.uC)().openAudioPlayer((0,l.Ak)(P(s).messageKey));const o=u.get(s);o.onForcePlay&&o.onForcePlay(),m=s,o.audio.src&&(0,i.Z)(o.audio)}function p(){const e=m&&u.get(m);e&&e.audio.pause()}function Z(e,t,n,p,Z){if(!u.has(e)){const n=function(e,t,n,a){const r=new Audio;function s(t){return n=>{u.has(e)&&((0,o.z)(r)||u.get(e).handlers.forEach((e=>{e(t,n)})))}}return r.addEventListener("timeupdate",s("onTimeUpdate")),r.addEventListener("play",s("onPlay")),r.addEventListener("pause",s("onPause")),r.addEventListener("loadstart",s("onLoadStart")),r.addEventListener("loadeddata",s("onLoadedData")),r.addEventListener("playing",s("onPlaying")),r.addEventListener("ended",(()=>{u.has(e)&&((0,o.z)(r)||v(e))})),{audio:r,type:t,proxy:new Proxy(r,{get:(e,t)=>e[t]}),handlers:[],onForcePlay:n,onTrackChange:a}}(e,t,p,Z);u.set(e,n),function(e,t){"audio"!==e.type||f.includes(t)||(f.push(t),f.sort(y)),"voice"!==e.type||h.includes(t)||(h.push(t),h.sort(y))}(n,e)}const{audio:E,proxy:C,handlers:b}=u.get(e);return b.push(n),{play(n){if(!E.paused)return;const c=m&&u.get(m);c&&m!==e&&(c.audio.pause(),c.audio.currentTime=0,(0,o.z)(c.audio)&&(c.audio.dataset.preventPlayAfterPatch="true"),c.onTrackChange&&c.onTrackChange()),m=e,E.src||(E.src=n,E.preload="auto",n.includes("/progressive/")&&s.s$&&(delete E.dataset.preventPlayAfterPatch,(0,o.B)(E))),(0,i.Z)(E),function(e,t){var n;if((0,a.Rd)().globalSearch.currentContent===r.nJ.Music)return;const{chatId:s}=(0,l.Ak)(P(t).messageKey),i=null===(n=(0,d.Bt)((0,a.Rd)()))||void 0===n?void 0:n.chatId,o=e=>e.startsWith(`msg${s}`)||i&&e.startsWith(`msg${i}`);"audio"===e&&(f=f.filter(o)),"voice"===e&&(h=h.filter(o))}(t,e)},pause(){m===e&&E.pause()},stop(){if(m===e){const e=E.src;E.pause(),(0,c.T2)((()=>{E.src="",E.src=e}))}},setCurrentTime(t){m===e&&(E.fastSeek?E.fastSeek(t):E.currentTime=t)},setVolume(t){m===e&&(E.volume=t,E.muted=!1)},setPlaybackRate(t){m===e&&(E.playbackRate=t)},toggleMuted(e){E.muted=void 0===e?!E.muted:e},proxy:C,requestNextTrack(){v(e)},isLast:()=>!g(e,(0,a.Rd)().audioPlayer.origin),isFirst:()=>!g(e,(0,a.Rd)().audioPlayer.origin,!0),requestPreviousTrack(){v(e,!0)},destroy(t=!1){const a=u.get(e);a&&(a.handlers=a.handlers.filter((e=>e!==n)),a.handlers.length||(a.audio.pause(),u.delete(e),t&&function(e,t){const n=e=>e!==t;"audio"===e.type&&(f=f.filter(n)),"voice"===e.type&&(h=h.filter(n))}(a,e),e===m&&(m=void 0)))}}}function g(e,t=r.Cr.Inline,n){const a=function(e){switch(e.type){case"audio":return f;case"voice":return h;default:return}}(u.get(e));if(!a)return;if(t===r.Cr.Search){const t=a.indexOf(e);if(t<0)return;return a[t+(n?-1:1)]}const{chatId:s}=(0,l.Ak)(P(e).messageKey),i=a.filter((e=>e.startsWith(`msg${s}`))),o=i.indexOf(e);if(o<0)return;let c=t===r.Cr.Inline?-1:1;return n&&(c*=-1),i[o+c]}function E(e){return`${(0,l.Tp)(e)}-${e.date}`}function P(e){return{messageKey:e.match(/^msg(-?\d+)-(\d+)/)[0],date:Number(e.split("-").pop())}}function y(e,t){if(!e||!t)return 0;const{date:n,messageKey:a}=P(e),{date:r,messageKey:s}=P(t),i=r-n;return 0===i?s.localeCompare(a):i}},1174:(e,t,n)=>{n.d(t,{e:()=>r,s:()=>s});var a=n(7361);let r;function s(e,t){let n,s,i=!1,o=!1;function l(e){if(!t.excludedClosestSelector||!e.target.matches(t.excludedClosestSelector)&&!e.target.closest(t.excludedClosestSelector)){if(n=e,"mousedown"===e.type)document.addEventListener("mousemove",d),document.addEventListener("mouseup",c);else if("touchstart"===e.type){const t=e.target;t.addEventListener("touchmove",d,{passive:!0}),t.addEventListener("touchend",c),t.addEventListener("touchcancel",c),"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 c(e){n&&(t.withCursor&&document.body.classList.remove("cursor-grabbing"),document.body.classList.remove("no-selection"),document.removeEventListener("mouseup",c),document.removeEventListener("mousemove",d),n.target.removeEventListener("touchcancel",c),n.target.removeEventListener("touchend",c),n.target.removeEventListener("touchmove",d),n=void 0,a.cj&&t.selectorToPreventScroll&&Array.from(document.querySelectorAll(t.selectorToPreventScroll)).forEach((e=>{e.style.overflow=""})),i?t.onRelease&&t.onRelease(e):!t.onClick||"button"in e&&0!==e.button||t.onClick(e)),i=!1,o=!1,s=void 0}function d(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 l=e.pageX-n.pageX,c=e.pageY-n.pageY;(Math.abs(l)>=15||Math.abs(c)>=15)&&(i=!0);let d=!1;t.onDrag&&(t.onDrag(e,n,{dragOffsetX:l,dragOffsetY:c}),d=!0),t.onSwipe&&!o&&(o=function(e,n,i){if(a.cj){const t=e.touches[0].pageX;if(t<=20||t>=window.innerWidth-20)return!1}const o=Math.abs(n),l=Math.abs(i);if(n&&i&&Math.max(o,l)/Math.min(o,l)<2)return!1;let c;if(o>=50?c="x":l>=50&&(c="y"),!c)return!1;if(s){if(s!==c)return!1}else s=c;return function(e,t,n,a,s){return"x"===t?s(e,n<0?r.Left:r.Right):"y"===t&&s(e,a<0?r.Up:r.Down)}(e,c,n,i,t.onSwipe)}(e,l,c),d=o),a.cj&&d&&t.selectorToPreventScroll&&Array.from(document.querySelectorAll(t.selectorToPreventScroll)).forEach((e=>{e.style.overflow="hidden"}))}}return e.addEventListener("mousedown",l),e.addEventListener("touchstart",l,{passive:!0}),()=>{e.removeEventListener("mousedown",l),e.removeEventListener("touchstart",l)}}!function(e){e[e.Up=0]="Up",e[e.Down=1]="Down",e[e.Left=2]="Left",e[e.Right=3]="Right"}(r||(r={}))},1279:(e,t,n)=>{function a(e,t,n){s("transitionend",e,t,n)}function r(e,t,n){s("animationend",e,t,n)}function s(e,t,n,a){let r=!1;t.addEventListener(e,(function s(i){r||i.target!==i.currentTarget||a&&(i instanceof TransitionEvent&&i.propertyName===a||i instanceof AnimationEvent&&i.animationName===a)||(r=!0,t.removeEventListener(e,s),setTimeout((()=>{n()}),50))}))}n.d(t,{L:()=>a,f:()=>r})},3570:(e,t,n)=>{function a(e,t){return t-Math.floor(t/e)*e}n.d(t,{Z:()=>a})},539:(e,t,n)=>{n.d(t,{Z:()=>c,N:()=>d});var a=n(5116),r=n(1713),s=n(3716),i=n(8674),o=n(9933);let l=!1;function c(e,t,n,i=0,o=s.V$,l,c,d){const m=function(e,t,n=s.V$,a){const{offsetTop:i}=t,{scrollTop:o}=e;if(void 0===a){const t=i-e.scrollTop;if(t<-n)return o+(t+n);if(t>n)return o+(t-n)}else{if(a===r.fo.Up)return i+n;if(a===r.fo.Down)return Math.max(0,i-n)}return o}(e,t,o,l);l!==r.fo.Static?((0,a.Rd)().settings.byKey.animationLevel===s.oB&&(c=0),u(e,t,m,n,i,c,d)):u(e,t,m,n,i,0)}function d(){return l}function u(e,t,n,a,r=0,c,d){const{offsetTop:u,offsetHeight:f}=t,{scrollTop:v,offsetHeight:p,scrollHeight:Z}=e,g=d&&e.dataset.normalHeight?Number(e.dataset.normalHeight):p;let E;switch(v!==n&&(e.scrollTop=n),a){case"start":E=u-r-n;break;case"end":E=u+f+r-(n+g);break;case"nearest":case"center":case"centerOrTop":E=f0){const e=Z-(n+g);E=Math.min(E,e)}if(0===E)return;const P=n+E;if(0===c)return void(e.scrollTop=P);l=!0;const y=Math.abs(E),C=y{const t=Math.min((Date.now()-N)/b,1),n=E*(1-C(t));return e.scrollTop=Math.round(P-n),l=t<1,l||w(),l}))}function m(e){return 1-(1-e)**5}function h(e){return 1-(1-e)**3.5}},1367:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(5116),r=n(3716),s=n(7361),i=n(9933);function o(e,t,n=300){(0,a.Rd)().settings.byKey.animationLevel===r.oB&&(n=0),s.cj?function(e,t,n){const{scrollLeft:a,offsetWidth:r,scrollWidth:s}=e;let o=t-a;if(o<0){const e=-a;o=Math.max(o,e)}else if(o>0){const e=s-(a+r);o=Math.min(o,e)}if(0===o)return;const l=a+o;if(0===n)return void(e.scrollLeft=l);const c=Date.now();(0,i.j)((()=>{const t=Math.min((Date.now()-c)/n,1),a=o*(1-function(e){return 1-(1-e)**3.5}(t));return e.scrollLeft=Math.round(l-a),t<1}))}(e,t,n):e.scrollTo({left:t,...n&&{behavior:"smooth"}})}},5723:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(7361);function r(e,t){if(!t&&e===document.activeElement)return;const n=window.getSelection(),r=document.createRange(),s=e.lastChild||e;a.$b||s&&s.nodeValue?(r.selectNodeContents(s),r.collapse(!1),n.removeAllRanges(),n.addRange(r)):e.focus()}},4532:(e,t,n)=>{n.d(t,{N:()=>r,Ym:()=>s,Ay:()=>o,pC:()=>l,NS:()=>c,Of:()=>d});const a={play:void 0,pause:void 0,seekbackward:void 0,seekforward:void 0,previoustrack:void 0,nexttrack:void 0,stop:void 0,seekTo:void 0};function r(e,t){const{mediaSession:n}=window.navigator;n?(e&&s(e),t&&i(t)):console.warn("MediaSession API not supported in this browser")}function s(e){const{mediaSession:t}=window.navigator;t&&(t.metadata=null!=e?e:null)}function i(e){const{mediaSession:t}=window.navigator;t&&Object.entries({...a,...e}).forEach((([e,n])=>{try{t.setActionHandler(e,n)}catch(e){}}))}function o(){const{mediaSession:e}=window.navigator;var t;e&&(e.metadata=null,i(a),e.playbackState&&(e.playbackState="none"),null===(t=e.setPositionState)||void 0===t||t.call(e))}function l(e="none"){const{mediaSession:t}=window.navigator;t&&t.playbackState&&(t.playbackState=e)}function c(e){var t;if(!e||void 0===e.position||void 0===e.duration)return;e.position=Math.min(e.position,e.duration);const{mediaSession:n}=window.navigator;null==n||null===(t=n.setPositionState)||void 0===t||t.call(n,e)}function d({title:e,artist:t,album:n,artwork:a}){if("MediaMetadata"in window)return new window.MediaMetadata({title:e,artist:t,album:n,artwork:a})}},3099:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(6137),r=n(7361);const s={B:a.Vv.Bold,STRONG:a.Vv.Bold,I:a.Vv.Italic,EM:a.Vv.Italic,U:a.Vv.Underline,S:a.Vv.Strike,STRIKE:a.Vv.Strike,DEL:a.Vv.Strike,CODE:a.Vv.Code,PRE:a.Vv.Pre,BLOCKQUOTE:a.Vv.Blockquote};function i(e){const t=document.createElement("div");t.innerHTML=function(e){let t=e.slice(0);return r.op||(t=t.replace(/]+alt="([^"]+)"[^>]*>/gm,"$1")),t=t.replace(/<\/?span([^>]*)?>/g,""),t=t.replace(/ /g," "),t=t.replace(/
]*)?><\/div>/g,"\n"),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(/[_]{2}([^*\n]+)[_]{2}/g,"$1"),t=t.replace(/[~]{2}([^~\n]+)[~]{2}/g,"$1"),t}(e);const n=t.innerText.trim().replace(/\u200b+/g,"");let i=0,o=0;const l=[];function c(e){const{index:t,entity:r}=function(e,t,n){const r=function(e){if(s[e.nodeName])return s[e.nodeName];if("A"===e.nodeName){const t=e;return t.dataset.entityType===a.Vv.MentionName?a.Vv.MentionName:t.dataset.entityType===a.Vv.Url?a.Vv.Url:t.href.startsWith("mailto:")?a.Vv.Email:t.href.startsWith("tel:")?a.Vv.Phone:t.href!==t.textContent?a.Vv.TextUrl:a.Vv.Url}return"SPAN"===e.nodeName?e.dataset.entityType:void 0}(e);if(!r||!e.textContent)return{index:n,entity:void 0};const i=t.indexOf(e.textContent,n),o=i>=0?i:n,l=t.substring(0,o).length,{length:c}=t.substring(o,o+e.textContent.length);let d,u;return r===a.Vv.TextUrl&&(d=e.href),r===a.Vv.MentionName&&(u=e.dataset.userId),{index:o,entity:{type:r,offset:l,length:c,...d&&{url:d},...u&&{userId:u}}}}(e,n,i);r?(i=t,l.push(r)):e.textContent&&(i+=e.textContent.length),e.hasChildNodes()&&o<=3&&(o+=1,Array.from(e.childNodes).forEach(c))}return Array.from(t.childNodes).forEach((e=>{o=1,c(e)})),{text:n,entities:l.length?l:void 0}}},5266:(e,t,n)=>{function a(e){e.dataset.patchedForSafari||(e.addEventListener("play",(()=>{const t=e.currentTime;e.dataset.patchForSafariInProgress="true",e.addEventListener("progress",(function n(){e.buffered.length&&(e.currentTime=e.duration-1,e.addEventListener("progress",(()=>{delete e.dataset.patchForSafariInProgress,e.currentTime=t,e.paused&&!e.dataset.preventPlayAfterPatch&&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:()=>a,z:()=>r})}}]); +//# sourceMappingURL=435.15d3c1acaf8d2000388e.js.map \ No newline at end of file diff --git a/dist/435.15d3c1acaf8d2000388e.js.map b/dist/435.15d3c1acaf8d2000388e.js.map new file mode 100644 index 000000000..232fec684 --- /dev/null +++ b/dist/435.15d3c1acaf8d2000388e.js.map @@ -0,0 +1 @@ +{"version":3,"file":"435.15d3c1acaf8d2000388e.js","mappings":"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AAI,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,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,GAA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","sources":["webpack://telegram-t/./src/components/common/AnimatedEmoji.tsx","webpack://telegram-t/./src/components/common/Audio.tsx","webpack://telegram-t/./src/components/common/helpers/waveform.ts","webpack://telegram-t/./src/util/waveform.ts","webpack://telegram-t/./src/components/common/ChatExtra.tsx","webpack://telegram-t/./src/components/common/DeleteChatModal.tsx","webpack://telegram-t/./src/components/common/Document.tsx","webpack://telegram-t/./src/components/common/File.tsx","webpack://telegram-t/./src/components/common/GroupChatInfo.tsx","webpack://telegram-t/./src/components/common/LastMessageMeta.tsx","webpack://telegram-t/./src/components/common/Media.tsx","webpack://telegram-t/./src/components/common/MessageOutgoingStatus.tsx","webpack://telegram-t/./src/components/common/NothingFound.tsx","webpack://telegram-t/./src/components/common/Picker.tsx","webpack://telegram-t/./src/components/common/PickerSelectedItem.tsx","webpack://telegram-t/./src/components/common/PrivateChatInfo.tsx","webpack://telegram-t/./src/components/common/ProfilePhoto.tsx","webpack://telegram-t/./src/components/common/ProfileInfo.tsx","webpack://telegram-t/./src/components/common/hooks/usePhotosPreload.ts","webpack://telegram-t/./src/components/common/StickerButton.tsx","webpack://telegram-t/./src/components/common/StickerSetModal.async.tsx","webpack://telegram-t/./src/components/common/TypingStatus.tsx","webpack://telegram-t/./src/components/common/VerifiedIcon.tsx","webpack://telegram-t/./src/components/common/WebLink.tsx","webpack://telegram-t/./src/components/common/helpers/mediaDimensions.ts","webpack://telegram-t/./src/components/common/helpers/renderMessageText.tsx","webpack://telegram-t/./src/components/left/ChatFolderModal.async.tsx","webpack://telegram-t/./src/components/left/main/hooks/useChatAnimationType.ts","webpack://telegram-t/./src/components/left/main/Badge.tsx","webpack://telegram-t/./src/components/left/main/ChatCallStatus.tsx","webpack://telegram-t/./src/components/left/main/Chat.tsx","webpack://telegram-t/./src/components/left/main/EmptyFolder.tsx","webpack://telegram-t/./src/components/left/main/ChatList.tsx","webpack://telegram-t/./src/components/left/search/helpers/getSenderName.ts","webpack://telegram-t/./src/components/middle/composer/DropTarget.tsx","webpack://telegram-t/./src/components/middle/composer/DropArea.tsx","webpack://telegram-t/./src/components/middle/composer/EmojiTooltip.async.tsx","webpack://telegram-t/./src/components/middle/composer/MessageInput.tsx","webpack://telegram-t/./src/components/middle/composer/TextFormatter.tsx","webpack://telegram-t/./src/components/middle/composer/helpers/prepareForRegExp.ts","webpack://telegram-t/./src/components/middle/composer/helpers/selection.ts","webpack://telegram-t/./src/components/middle/composer/hooks/useEmojiTooltip.ts","webpack://telegram-t/./src/components/middle/composer/helpers/searchUserName.ts","webpack://telegram-t/./src/components/middle/composer/hooks/useMentionTooltip.ts","webpack://telegram-t/./src/components/right/hooks/useAsyncRendering.ts","webpack://telegram-t/./src/components/ui/CheckboxGroup.tsx","webpack://telegram-t/./src/components/ui/FloatingActionButton.tsx","webpack://telegram-t/./src/components/ui/ListItem.tsx","webpack://telegram-t/./src/components/ui/Notification.tsx","webpack://telegram-t/./src/components/ui/ProgressSpinner.tsx","webpack://telegram-t/./src/components/ui/Radio.tsx","webpack://telegram-t/./src/components/ui/RadioGroup.tsx","webpack://telegram-t/./src/components/ui/RangeSlider.tsx","webpack://telegram-t/./src/components/ui/SearchInput.tsx","webpack://telegram-t/./src/components/ui/ShowTransition.tsx","webpack://telegram-t/./src/components/ui/Switcher.tsx","webpack://telegram-t/./src/components/ui/Tab.tsx","webpack://telegram-t/./src/components/ui/TabList.tsx","webpack://telegram-t/./src/components/ui/Transition.tsx","webpack://telegram-t/./src/hooks/reducers/useFoldersReducer.ts","webpack://telegram-t/./src/hooks/useAudioPlayer.ts","webpack://telegram-t/./src/hooks/useBlur.ts","webpack://telegram-t/./src/hooks/useBlurSync.ts","webpack://telegram-t/./src/hooks/useBuffering.ts","webpack://telegram-t/./src/hooks/useCanvasBlur.ts","webpack://telegram-t/./src/hooks/useChatContextActions.ts","webpack://telegram-t/./src/hooks/useContextMenuHandlers.ts","webpack://telegram-t/./src/hooks/useContextMenuPosition.ts","webpack://telegram-t/./src/hooks/useDebounce.ts","webpack://telegram-t/./src/hooks/useEnsureMessage.ts","webpack://telegram-t/./src/hooks/useHorizontalScroll.ts","webpack://telegram-t/./src/hooks/useInputFocusOnOpen.ts","webpack://telegram-t/./src/hooks/useIntersectionObserver.ts","webpack://telegram-t/./src/hooks/useLayoutEffectWithPrevDeps.ts","webpack://telegram-t/./src/hooks/useMediaTransition.ts","webpack://telegram-t/./src/hooks/useUniqueId.ts","webpack://telegram-t/./src/hooks/useMediaWithLoadProgress.ts","webpack://telegram-t/./src/hooks/useMouseInside.ts","webpack://telegram-t/./src/hooks/usePrevDuringAnimation.ts","webpack://telegram-t/./src/hooks/useReducer.ts","webpack://telegram-t/./src/hooks/useVideoCleanup.ts","webpack://telegram-t/./src/lib/fastBlur.js","webpack://telegram-t/./src/util/audioPlayer.ts","webpack://telegram-t/./src/util/captureEvents.ts","webpack://telegram-t/./src/util/cssAnimationEndListeners.ts","webpack://telegram-t/./src/util/cycleRestrict.ts","webpack://telegram-t/./src/util/fastSmoothScroll.ts","webpack://telegram-t/./src/util/fastSmoothScrollHorizontal.ts","webpack://telegram-t/./src/util/focusEditableElement.ts","webpack://telegram-t/./src/util/mediaSession.ts","webpack://telegram-t/./src/util/parseMessageInput.ts","webpack://telegram-t/./src/util/patchSafariProgressiveAudio.ts"],"sourcesContent":["import React, {\n FC, useCallback, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiSticker } from '../../api/types';\n\nimport { LIKE_STICKER_ID } from './helpers/mediaDimensions';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useMediaTransition from '../../hooks/useMediaTransition';\nimport useFlag from '../../hooks/useFlag';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './AnimatedEmoji.scss';\n\ntype OwnProps = {\n sticker: ApiSticker;\n observeIntersection?: ObserveFn;\n size?: 'large' | 'medium' | 'small';\n lastSyncTime?: number;\n forceLoadPreview?: boolean;\n};\n\nconst QUALITY = 1;\nconst WIDTH = {\n large: 160,\n medium: 128,\n small: 104,\n};\n\nconst AnimatedEmoji: FC = ({\n sticker,\n size = 'medium',\n observeIntersection,\n lastSyncTime,\n forceLoadPreview,\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 thumbDataUri = sticker.thumbnail?.dataUri;\n const previewBlobUrl = useMedia(\n `${localMediaHash}?size=m`,\n !isIntersecting && !forceLoadPreview,\n ApiMediaFormat.BlobUrl,\n lastSyncTime,\n );\n const transitionClassNames = useMediaTransition(previewBlobUrl);\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 const width = WIDTH[size];\n const style = `width: ${width}px; height: ${width}px;`;\n\n return (\n \n {!isAnimationLoaded && thumbDataUri && (\n \"\"\n )}\n {!isAnimationLoaded && previewBlobUrl && (\n \"\"\n )}\n {isMediaLoaded && (\n \n )}\n
\n );\n};\n\nexport default AnimatedEmoji;\n","import React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState,\n} from '../../lib/teact/teact';\nimport { getDispatch } from '../../lib/teact/teactn';\n\nimport {\n ApiAudio, ApiMediaFormat, ApiMessage, ApiVoice,\n} from '../../api/types';\nimport { AudioOrigin, ISettings } from '../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { formatMediaDateTime, formatMediaDuration, formatPastTimeShort } from '../../util/dateFormat';\nimport {\n getMediaDuration,\n getMediaTransferState,\n getMessageMediaFormat,\n getMessageMediaHash,\n isMessageLocal,\n isOwnMessage,\n} from '../../modules/helpers';\nimport { MAX_EMPTY_WAVEFORM_POINTS, renderWaveform } from './helpers/waveform';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from './helpers/renderText';\nimport { getFileSizeString } from './helpers/documentInfo';\nimport { decodeWaveform, interpolateArray } from '../../util/waveform';\nimport useMediaWithLoadProgress from '../../hooks/useMediaWithLoadProgress';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useBuffering from '../../hooks/useBuffering';\nimport useAudioPlayer from '../../hooks/useAudioPlayer';\nimport useLang, { LangFn } from '../../hooks/useLang';\nimport { captureEvents } from '../../util/captureEvents';\nimport useMedia from '../../hooks/useMedia';\nimport { makeTrackId } from '../../util/audioPlayer';\nimport { getTranslation } from '../../util/langProvider';\n\nimport Button from '../ui/Button';\nimport ProgressSpinner from '../ui/ProgressSpinner';\nimport Link from '../ui/Link';\n\nimport './Audio.scss';\n\ntype OwnProps = {\n theme: ISettings['theme'];\n message: ApiMessage;\n senderTitle?: string;\n uploadProgress?: number;\n origin: AudioOrigin;\n date?: number;\n lastSyncTime?: number;\n className?: string;\n isSelectable?: boolean;\n isSelected?: boolean;\n isDownloading: boolean;\n onPlay: (messageId: number, chatId: string) => void;\n onReadMedia?: () => void;\n onCancelUpload?: () => void;\n onDateClick?: (messageId: number, chatId: string) => void;\n};\n\nconst AVG_VOICE_DURATION = 10;\nconst MIN_SPIKES = IS_SINGLE_COLUMN_LAYOUT ? 20 : 25;\nconst MAX_SPIKES = IS_SINGLE_COLUMN_LAYOUT ? 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 origin,\n date,\n lastSyncTime,\n className,\n isSelectable,\n isSelected,\n isDownloading,\n onPlay,\n onReadMedia,\n onCancelUpload,\n onDateClick,\n}) => {\n const { content: { audio, voice, video }, isMediaUnread } = message;\n const isVoice = Boolean(voice || video);\n const isSeeking = useRef(false);\n const playStateBeforeSeeking = useRef(false);\n // eslint-disable-next-line no-null/no-null\n const seekerRef = useRef(null);\n const lang = useLang();\n const { isRtl } = lang;\n const dispatch = getDispatch();\n\n const [isActivated, setIsActivated] = useState(false);\n const shouldLoad = (isActivated || PRELOAD) && lastSyncTime;\n const coverHash = getMessageMediaHash(message, 'pictogram');\n const coverBlobUrl = useMedia(coverHash, false, ApiMediaFormat.BlobUrl);\n\n const mediaData = useMedia(\n getMessageMediaHash(message, 'inline'),\n !shouldLoad,\n getMessageMediaFormat(message, 'inline'),\n );\n\n const { loadProgress: downloadProgress } = useMediaWithLoadProgress(\n getMessageMediaHash(message, 'download'),\n !isDownloading,\n );\n\n const handleForcePlay = useCallback(() => {\n setIsActivated(true);\n onPlay(message.id, message.chatId);\n }, [message, onPlay]);\n\n const handleTrackChange = useCallback(() => {\n setIsActivated(false);\n }, []);\n\n const {\n isBuffered, bufferedProgress, bufferingHandlers, checkBuffering,\n } = useBuffering();\n\n const {\n isPlaying, playProgress, playPause, play, pause, setCurrentTime, duration,\n } = useAudioPlayer(\n makeTrackId(message),\n getMediaDuration(message)!,\n isVoice ? 'voice' : 'audio',\n mediaData,\n bufferingHandlers,\n undefined,\n checkBuffering,\n isActivated,\n handleForcePlay,\n handleTrackChange,\n isMessageLocal(message),\n );\n\n const isOwn = isOwnMessage(message);\n const waveformCanvasRef = useWaveformCanvas(theme, voice, (isMediaUnread && !isOwn) ? 1 : playProgress, isOwn);\n\n const withSeekline = isPlaying || (playProgress > 0 && playProgress < 1);\n\n useEffect(() => {\n setIsActivated(isPlaying);\n }, [isPlaying]);\n\n const isLoadingForPlaying = isActivated && !isBuffered;\n\n const {\n isUploading, isTransferring, transferProgress,\n } = getMediaTransferState(\n message,\n uploadProgress || downloadProgress,\n isLoadingForPlaying || isDownloading,\n );\n\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring);\n\n const shouldRenderCross = shouldRenderSpinner && (isLoadingForPlaying || isUploading);\n\n const handleButtonClick = useCallback(() => {\n if (isUploading) {\n onCancelUpload?.();\n return;\n }\n\n if (!isPlaying) {\n onPlay(message.id, message.chatId);\n }\n\n getDispatch().setAudioPlayerOrigin({ origin });\n setIsActivated(!isActivated);\n playPause();\n }, [isUploading, isPlaying, isActivated, playPause, onCancelUpload, onPlay, message.id, message.chatId, origin]);\n\n useEffect(() => {\n if (onReadMedia && isMediaUnread && (isPlaying || isDownloading)) {\n onReadMedia();\n }\n }, [isPlaying, isMediaUnread, onReadMedia, isDownloading]);\n\n const handleDownloadClick = useCallback(() => {\n if (isDownloading) {\n dispatch.cancelMessageMediaDownload({ message });\n } else {\n dispatch.downloadMessageMedia({ message });\n }\n }, [dispatch, isDownloading, message]);\n\n const handleSeek = useCallback((e: MouseEvent | TouchEvent) => {\n if (isSeeking.current && seekerRef.current) {\n const { width, left } = seekerRef.current.getBoundingClientRect();\n const clientX = e instanceof MouseEvent ? e.clientX : e.targetTouches[0].clientX;\n e.stopPropagation(); // Prevent Slide-to-Reply activation\n // Prevent track skipping while seeking near end\n setCurrentTime(Math.max(Math.min(duration * ((clientX - left) / width), duration - 0.1), 0.001));\n }\n }, [duration, setCurrentTime]);\n\n const handleStartSeek = useCallback((e: MouseEvent | TouchEvent) => {\n if (e instanceof MouseEvent && e.button === 2) return;\n isSeeking.current = true;\n playStateBeforeSeeking.current = isPlaying;\n pause();\n handleSeek(e);\n }, [handleSeek, pause, isPlaying]);\n\n const handleStopSeek = useCallback(() => {\n isSeeking.current = false;\n if (playStateBeforeSeeking.current) play();\n }, [play]);\n\n const handleDateClick = useCallback(() => {\n onDateClick!(message.id, message.chatId);\n }, [onDateClick, message.id, message.chatId]);\n\n useEffect(() => {\n if (!seekerRef.current || !withSeekline) return undefined;\n return captureEvents(seekerRef.current, {\n onCapture: handleStartSeek,\n onRelease: handleStopSeek,\n onClick: handleStopSeek,\n onDrag: handleSeek,\n });\n }, [withSeekline, handleStartSeek, handleSeek, handleStopSeek]);\n\n function renderFirstLine() {\n if (isVoice) {\n return senderTitle || 'Voice';\n }\n\n const { title, fileName } = audio!;\n\n return title || fileName;\n }\n\n function renderSecondLine() {\n if (isVoice) {\n return (\n
\n {formatMediaDuration((voice || video)!.duration)}\n
\n );\n }\n\n const { performer } = audio!;\n\n return (\n
\n {formatMediaDuration(duration)}\n \n {performer && {renderText(performer)}}\n {performer && senderTitle && }\n {senderTitle && {renderText(senderTitle)}}\n
\n );\n }\n\n const fullClassName = buildClassName(\n 'Audio',\n className,\n isOwn && origin === AudioOrigin.Inline && 'own',\n (origin === AudioOrigin.Search || origin === AudioOrigin.SharedMedia) && 'bigger',\n isSelected && 'audio-is-selected',\n );\n\n const buttonClassNames = ['toggle-play'];\n if (shouldRenderCross) {\n buttonClassNames.push('loading');\n } else if (isPlaying) {\n buttonClassNames.push('pause');\n } else if (!isPlaying) {\n buttonClassNames.push('play');\n }\n\n const contentClassName = buildClassName('content', withSeekline && 'with-seekline');\n\n function renderWithTitle() {\n return (\n <>\n
\n
\n

{renderText(renderFirstLine())}

\n\n
\n {date && (\n \n {formatPastTimeShort(lang, date * 1000)}\n \n )}\n
\n
\n\n {withSeekline && (\n
\n \n {playProgress < 1 && `${formatMediaDuration(duration * playProgress, duration)}`}\n \n {renderSeekline(playProgress, bufferedProgress, seekerRef)}\n
\n )}\n {!withSeekline && renderSecondLine()}\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 {audio && !isUploading && (\n \n \n \n )}\n {origin === AudioOrigin.Search && renderWithTitle()}\n {origin !== AudioOrigin.Search && audio && renderAudio(\n lang, audio, duration, isPlaying, playProgress, bufferedProgress, seekerRef,\n (isDownloading || isUploading), date, transferProgress, onDateClick ? handleDateClick : undefined,\n )}\n {origin === AudioOrigin.SharedMedia && (voice || video) && renderWithTitle()}\n {origin === AudioOrigin.Inline && voice && (\n renderVoice(voice, seekerRef, waveformCanvasRef, playProgress, isMediaUnread)\n )}\n
\n );\n};\n\nfunction renderAudio(\n lang: LangFn,\n audio: ApiAudio,\n duration: number,\n isPlaying: boolean,\n playProgress: number,\n bufferedProgress: number,\n seekerRef: React.Ref,\n showProgress?: boolean,\n date?: number,\n progress?: number,\n handleDateClick?: NoneToVoidFunction,\n) {\n const {\n title, performer, fileName,\n } = audio;\n const showSeekline = isPlaying || (playProgress > 0 && playProgress < 1);\n const { isRtl } = getTranslation;\n\n return (\n
\n

{renderText(title || fileName)}

\n {showSeekline && (\n
\n \n {formatMediaDuration(duration * playProgress, duration)}\n \n {renderSeekline(playProgress, bufferedProgress, seekerRef)}\n
\n )}\n {!showSeekline && showProgress && (\n
\n {progress ? `${getFileSizeString(audio!.size * progress)} / ` : undefined}{getFileSizeString(audio!.size)}\n
\n )}\n {!showSeekline && !showProgress && (\n
\n {formatMediaDuration(duration)}\n \n {renderText(performer || 'Unknown')}\n {date && (\n <>\n \n \n {formatMediaDateTime(lang, date * 1000, true)}\n \n \n )}\n
\n )}\n
\n );\n}\n\nfunction renderVoice(\n voice: ApiVoice,\n seekerRef: React.Ref,\n waveformCanvasRef: React.Ref,\n playProgress: number,\n isMediaUnread?: boolean,\n) {\n return (\n
\n \n \n
\n

\n {playProgress === 0 ? formatMediaDuration(voice.duration) : formatMediaDuration(voice.duration * playProgress)}\n

\n
\n );\n}\n\nfunction useWaveformCanvas(\n theme: ISettings['theme'],\n voice?: ApiVoice,\n playProgress = 0,\n isOwn = false,\n) {\n // eslint-disable-next-line no-null/no-null\n const canvasRef = useRef(null);\n\n const { data: spikes, peak } = useMemo(() => {\n if (!voice) {\n return undefined;\n }\n\n const { waveform, duration } = voice;\n if (!waveform) {\n return {\n data: new Array(Math.min(duration, MAX_EMPTY_WAVEFORM_POINTS)).fill(0),\n peak: 0,\n };\n }\n\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\n return interpolateArray(decodedWaveform, spikesCount);\n }, [voice]) || {};\n\n useLayoutEffect(() => {\n const canvas = canvasRef.current;\n\n if (!canvas || !spikes || peak === undefined) {\n return;\n }\n\n const fillColor = theme === 'dark' ? '#494A78' : '#ADD3F7';\n const fillOwnColor = theme === 'dark' ? '#B7ABED' : '#AEDFA4';\n const progressFillColor = theme === 'dark' ? '#8774E1' : '#3390EC';\n const progressFillOwnColor = theme === 'dark' ? '#FFFFFF' : '#4FAE4E';\n\n renderWaveform(canvas, spikes, playProgress, {\n peak,\n fillStyle: isOwn ? fillOwnColor : fillColor,\n progressFillStyle: isOwn ? progressFillOwnColor : progressFillColor,\n });\n }, [isOwn, peak, playProgress, spikes, theme]);\n\n return canvasRef;\n}\n\nfunction renderSeekline(\n playProgress: number,\n bufferedProgress: number,\n seekerRef: React.Ref,\n) {\n return (\n }\n >\n \n \n \n \n \n \n \n \n \n
\n );\n}\n\nexport default memo(Audio);\n","type IWaveformProps = {\n peak: number;\n fillStyle: string;\n progressFillStyle: string;\n};\n\nexport const MAX_EMPTY_WAVEFORM_POINTS = 30;\nconst SPIKE_WIDTH = 2;\nconst SPIKE_STEP = 4;\nconst SPIKE_RADIUS = 1;\nconst HEIGHT = 23;\n\nexport function renderWaveform(\n canvas: HTMLCanvasElement,\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 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\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","/* 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","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 { ApiChat, ApiCountryCode, ApiUser } from '../../api/types';\n\nimport {\n selectChat, selectNotifyExceptions, selectNotifySettings, selectUser,\n} from '../../modules/selectors';\nimport {\n getChatDescription, getChatLink, getHasAdminRight, isChatChannel, isUserId, isUserRightBanned, selectIsChatMuted,\n} from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport { copyTextToClipboard } from '../../util/clipboard';\nimport { formatPhoneNumberWithCode } from '../../util/phoneNumber';\nimport useLang from '../../hooks/useLang';\n\nimport ListItem from '../ui/ListItem';\nimport Switcher from '../ui/Switcher';\n\ntype OwnProps = {\n chatOrUserId: string;\n forceShowSelf?: boolean;\n};\n\ntype StateProps = {\n user?: ApiUser;\n chat?: ApiChat;\n canInviteUsers?: boolean;\n isMuted?: boolean;\n phoneCodeList: ApiCountryCode[];\n} & Pick;\n\ntype DispatchProps = Pick;\n\nconst ChatExtra: FC = ({\n lastSyncTime,\n user,\n chat,\n forceShowSelf,\n canInviteUsers,\n isMuted,\n phoneCodeList,\n loadFullUser,\n showNotification,\n updateChatMutedState,\n}) => {\n const {\n id: userId,\n fullInfo,\n username,\n phoneNumber,\n isSelf,\n } = user || {};\n const { id: chatId } = chat || {};\n const lang = useLang();\n\n useEffect(() => {\n if (lastSyncTime && userId) {\n loadFullUser({ userId });\n }\n }, [loadFullUser, userId, lastSyncTime]);\n\n const handleNotificationChange = useCallback(() => {\n updateChatMutedState({ chatId, isMuted: !isMuted });\n }, [chatId, isMuted, updateChatMutedState]);\n\n if (!chat || chat.isRestricted || (isSelf && !forceShowSelf)) {\n return undefined;\n }\n\n function copy(text: string, entity: string) {\n copyTextToClipboard(text);\n showNotification({ message: `${entity} was copied` });\n }\n\n const formattedNumber = phoneNumber && formatPhoneNumberWithCode(phoneCodeList, phoneNumber);\n const link = getChatLink(chat);\n const description = (fullInfo?.bio) || getChatDescription(chat);\n\n return (\n
\n {formattedNumber && !!formattedNumber.length && (\n copy(formattedNumber, lang('Phone'))}>\n {formattedNumber}\n {lang('Phone')}\n \n )}\n {username && (\n copy(`@${username}`, lang('Username'))}\n >\n {renderText(username)}\n {lang('Username')}\n \n )}\n {description && !!description.length && (\n \n \n {renderText(description, ['br', 'links', 'emoji'])}\n \n {lang(userId ? 'UserBio' : 'Info')}\n \n )}\n {(canInviteUsers || !username) && link && (\n copy(link, lang('SetUrlPlaceholder'))}>\n
{link}
\n {lang('SetUrlPlaceholder')}\n
\n )}\n {!forceShowSelf && (\n \n {lang('Notifications')}\n \n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatOrUserId }): StateProps => {\n const { lastSyncTime, countryList: { phoneCodes: phoneCodeList } } = global;\n\n const chat = chatOrUserId ? selectChat(global, chatOrUserId) : undefined;\n const user = isUserId(chatOrUserId) ? selectUser(global, chatOrUserId) : undefined;\n const isMuted = chat && selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global));\n\n const canInviteUsers = chat && !user && (\n (!isChatChannel(chat) && !isUserRightBanned(chat, 'inviteUsers'))\n || getHasAdminRight(chat, 'inviteUsers')\n );\n\n return {\n lastSyncTime, phoneCodeList, chat, user, canInviteUsers, isMuted,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadFullUser', 'updateChatMutedState', 'showNotification',\n ]),\n)(ChatExtra));\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 isUserId,\n isUserBot,\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';\nimport renderText from './helpers/renderText';\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 onCloseAnimationEnd?: () => void;\n};\n\ntype StateProps = {\n isChannel: boolean;\n isChatWithSelf?: boolean;\n isBot?: boolean;\n isPrivateChat: boolean;\n isBasicGroup: boolean;\n isSuperGroup: boolean;\n currentUserId: string | undefined;\n canDeleteForAll?: boolean;\n contactName?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst DeleteChatModal: FC = ({\n isOpen,\n chat,\n isChannel,\n isPrivateChat,\n isChatWithSelf,\n isBot,\n isBasicGroup,\n isSuperGroup,\n currentUserId,\n canDeleteForAll,\n contactName,\n onClose,\n onCloseAnimationEnd,\n leaveChannel,\n deleteHistory,\n deleteChannel,\n deleteChatUser,\n blockContact,\n}) => {\n const lang = useLang();\n const chatTitle = getChatTitle(lang, chat);\n\n const handleDeleteMessageForAll = useCallback(() => {\n deleteHistory({ chatId: chat.id, shouldDeleteForAll: true });\n\n onClose();\n }, [deleteHistory, chat.id, onClose]);\n\n const handleDeleteAndStop = useCallback(() => {\n deleteHistory({ chatId: chat.id, shouldDeleteForAll: true });\n blockContact({ contactId: chat.id, accessHash: chat.accessHash });\n\n onClose();\n }, [deleteHistory, chat.id, chat.accessHash, blockContact, onClose]);\n\n const handleDeleteChat = useCallback(() => {\n if (isPrivateChat) {\n deleteHistory({ chatId: chat.id, shouldDeleteForAll: false });\n } else if (isBasicGroup) {\n deleteChatUser({ chatId: chat.id, userId: currentUserId });\n deleteHistory({ chatId: chat.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 currentUserId,\n chat.isCreator,\n chat.id,\n onClose,\n deleteHistory,\n deleteChatUser,\n leaveChannel,\n deleteChannel,\n ]);\n\n function renderHeader() {\n return (\n
\n \n

{lang(renderTitle())}

\n
\n );\n }\n\n function renderTitle() {\n if (isChannel && !chat.isCreator) {\n return 'LeaveChannel';\n }\n\n if (isChannel && chat.isCreator) {\n return 'ChannelDelete';\n }\n\n if (isBasicGroup || isSuperGroup) {\n return 'Group.LeaveGroup';\n }\n\n return 'DeleteChatUser';\n }\n\n function renderMessage() {\n if (isChannel && chat.isCreator) {\n return

{renderText(lang('ChatList.DeleteAndLeaveGroupConfirmation', chatTitle), ['simple_markdown'])}

;\n }\n\n if ((isChannel && !chat.isCreator) || isBasicGroup || isSuperGroup) {\n return

{renderText(lang('ChannelLeaveAlertWithName', chatTitle), ['simple_markdown'])}

;\n }\n\n return

{renderText(lang('ChatList.DeleteChatConfirmation', contactName), ['simple_markdown'])}

;\n }\n\n function renderActionText() {\n if (isChannel && !chat.isCreator) {\n return 'LeaveChannel';\n }\n if (isChannel && chat.isCreator) {\n return 'Chat.Input.Delete';\n }\n\n if (isBasicGroup || isSuperGroup) {\n return 'Group.LeaveGroup';\n }\n\n return canDeleteForAll ? 'ChatList.DeleteForCurrentUser' : 'Delete';\n }\n\n return (\n \n {renderMessage()}\n {isBot && (\n \n )}\n {canDeleteForAll && (\n \n )}\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chat }): StateProps => {\n const isPrivateChat = isUserId(chat.id);\n const isChatWithSelf = selectIsChatWithSelf(global, chat.id);\n const user = isPrivateChat && selectUser(global, getPrivateChatUserId(chat)!);\n const isBot = user && isUserBot(user) && !chat.isSupport;\n const canDeleteForAll = (isPrivateChat && !isChatWithSelf && !isBot);\n const contactName = isPrivateChat\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n return {\n isPrivateChat,\n isChatWithSelf,\n isBot,\n isChannel: isChatChannel(chat),\n isBasicGroup: isChatBasicGroup(chat),\n isSuperGroup: isChatSuperGroup(chat),\n currentUserId: global.currentUserId,\n canDeleteForAll,\n contactName,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions,\n ['leaveChannel', 'deleteHistory', 'deleteChannel', 'deleteChatUser', 'blockContact']),\n)(DeleteChatModal));\n","import React, {\n FC, useCallback, memo, useRef, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { getDispatch } from '../../lib/teact/teactn';\n\nimport { ApiMediaFormat, ApiMessage } from '../../api/types';\n\nimport { getDocumentExtension, getDocumentHasPreview } from './helpers/documentInfo';\nimport {\n getMediaTransferState,\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n isMessageDocumentVideo,\n} from '../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMediaWithLoadProgress from '../../hooks/useMediaWithLoadProgress';\nimport useMedia from '../../hooks/useMedia';\nimport useFlag from '../../hooks/useFlag';\n\nimport File from './File';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n smaller?: boolean;\n isSelected?: boolean;\n isSelectable?: boolean;\n canAutoLoad?: boolean;\n uploadProgress?: number;\n withDate?: boolean;\n datetime?: number;\n className?: string;\n sender?: string;\n autoLoadFileMaxSizeMb?: number;\n isDownloading: boolean;\n onCancelUpload?: () => void;\n onMediaClick?: () => void;\n onDateClick?: (messageId: number, chatId: string) => void;\n};\n\nconst BYTES_PER_MB = 1024 * 1024;\n\nconst Document: FC = ({\n message,\n observeIntersection,\n smaller,\n canAutoLoad,\n autoLoadFileMaxSizeMb,\n uploadProgress,\n withDate,\n datetime,\n className,\n sender,\n isSelected,\n isSelectable,\n onCancelUpload,\n onMediaClick,\n onDateClick,\n isDownloading,\n}) => {\n const dispatch = getDispatch();\n\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const document = message.content.document!;\n const { fileName, size, timestamp } = document;\n const extension = getDocumentExtension(document) || '';\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n const [wasIntersected, markIntersected] = useFlag();\n useEffect(() => {\n if (isIntersecting) {\n markIntersected();\n }\n }, [isIntersecting, markIntersected]);\n\n // Auto-loading does not use global download manager because requires additional click to save files locally\n const [isLoadAllowed, setIsLoadAllowed] = useState(\n canAutoLoad && (!autoLoadFileMaxSizeMb || size <= autoLoadFileMaxSizeMb * BYTES_PER_MB),\n );\n\n const shouldDownload = Boolean(isDownloading || (isLoadAllowed && wasIntersected));\n\n const documentHash = getMessageMediaHash(message, 'download');\n const { loadProgress: downloadProgress, mediaData } = useMediaWithLoadProgress(\n documentHash, !shouldDownload, undefined, undefined, undefined, true,\n );\n const isLoaded = Boolean(mediaData);\n\n const {\n isUploading, isTransferring, transferProgress,\n } = getMediaTransferState(message, uploadProgress || downloadProgress, shouldDownload && !isLoaded);\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 withMediaViewer = onMediaClick && Boolean(document.mediaType);\n\n const handleClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload();\n }\n return;\n }\n\n if (isDownloading) {\n dispatch.cancelMessageMediaDownload({ message });\n return;\n }\n\n if (isTransferring) {\n setIsLoadAllowed(false);\n return;\n }\n\n if (withMediaViewer) {\n onMediaClick!();\n } else {\n dispatch.downloadMessageMedia({ message });\n }\n }, [\n isUploading, isDownloading, isTransferring, withMediaViewer, onCancelUpload, dispatch, message, onMediaClick,\n ]);\n\n const handleDateClick = useCallback(() => {\n onDateClick!(message.id, message.chatId);\n }, [onDateClick, message.id, message.chatId]);\n\n return (\n \n );\n};\n\nexport default memo(Document);\n","import { RefObject } from 'react';\nimport React, { FC, memo, useRef } from '../../lib/teact/teact';\n\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useMediaTransition from '../../hooks/useMediaTransition';\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';\nimport useLang from '../../hooks/useLang';\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 actionIcon?: string;\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 actionIcon,\n onClick,\n onDateClick,\n}) => {\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n let elementRef = useRef(null);\n if (ref) {\n elementRef = ref;\n }\n\n const transitionClassNames = useMediaTransition(previewData);\n const {\n shouldRender: shouldSpinnerRender,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring, undefined, true);\n\n const color = getColorFromExtension(extension);\n const sizeString = getFileSizeString(size);\n\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 \n \n
\n ) : (\n
\n {extension.length <= 4 && (\n {extension}\n )}\n
\n )}\n {shouldSpinnerRender && (\n
\n \n
\n )}\n {onClick && (\n \n )}\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(lang, timestamp * 1000, true)}\n \n )}\n
\n
\n {sender && timestamp && (\n {formatPastTimeShort(lang, timestamp * 1000)}\n )}\n
\n );\n};\n\nexport default memo(File);\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: string;\n typingStatus?: ApiTypingStatus;\n avatarSize?: 'small' | 'medium' | 'large' | 'jumbo';\n withMediaViewer?: boolean;\n withUsername?: boolean;\n withFullInfo?: boolean;\n withUpdatingStatus?: boolean;\n withChatType?: boolean;\n noRtl?: 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 withUsername,\n withFullInfo,\n withUpdatingStatus,\n withChatType,\n noRtl,\n chat,\n onlineCount,\n areMessagesLoaded,\n lastSyncTime,\n loadFullChat,\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 }, [chatId, isMin, lastSyncTime, withFullInfo, loadFullChat, isSuperGroup]);\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 = withUsername ? chat.username : undefined;\n const groupStatus = getGroupStatus(lang, chat);\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(lang, chat))}

\n {chat.isVerified && }\n
\n {renderStatusOrTyping()}\n
\n
\n );\n};\n\nfunction getGroupStatus(lang: LangFn, chat: ApiChat) {\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', 'openMediaViewer']),\n)(GroupChatInfo));\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport { ApiMessage, ApiMessageOutgoingStatus } from '../../api/types';\n\nimport { formatPastTimeShort } from '../../util/dateFormat';\nimport useLang from '../../hooks/useLang';\n\nimport MessageOutgoingStatus from './MessageOutgoingStatus';\n\nimport './LastMessageMeta.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n outgoingStatus?: ApiMessageOutgoingStatus;\n};\n\nconst LastMessageMeta: FC = ({ message, outgoingStatus }) => {\n const lang = useLang();\n return (\n
\n {outgoingStatus && (\n \n )}\n {formatPastTimeShort(lang, message.date * 1000)}\n
\n );\n};\n\nexport default memo(LastMessageMeta);\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 buildClassName from '../../util/buildClassName';\nimport useMedia from '../../hooks/useMedia';\nimport useMediaTransition from '../../hooks/useMediaTransition';\n\nimport './Media.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n idPrefix?: string;\n onClick?: (messageId: number, chatId: string) => 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 transitionClassNames = useMediaTransition(mediaBlobUrl);\n\n const video = getMessageVideo(message);\n\n return (\n
\n \"\"\n \"\"\n {video && {video.isGif ? 'GIF' : formatMediaDuration(video.duration)}}\n
\n );\n};\n\nexport default memo(Media);\n","import React, { FC, memo } 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 memo(MessageOutgoingStatus);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport renderText from './helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport './NothingFound.scss';\n\ninterface OwnProps {\n text?: string;\n description?: string;\n}\n\nconst DEFAULT_TEXT = 'Nothing found.';\n\nconst NothingFound: FC = ({ text = DEFAULT_TEXT, description }) => {\n const lang = useLang();\n const { transitionClassNames } = useShowTransition(true);\n\n return (\n
\n {text}\n {description &&

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

}\n
\n );\n};\n\nexport default memo(NothingFound);\n","import React, {\n FC, useCallback, useRef, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport { isUserId } 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: string[];\n selectedIds: string[];\n filterValue?: string;\n filterPlaceholder?: string;\n notFoundText?: string;\n searchInputId?: string;\n isLoading?: boolean;\n noScrollRestore?: boolean;\n onSelectedIdsChange: (ids: 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_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 noScrollRestore,\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: string) => {\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?.length ? (\n \n {viewportIds.map((id) => (\n handleItemClick(id)}\n ripple\n >\n \n {isUserId(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, { 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, isUserId } 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?: string;\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 const lang = 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(lang, 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 dir={lang.isRtl ? 'rtl' : 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 = isUserId(chatOrUserId) ? selectUser(global, chatOrUserId) : undefined;\n\n return {\n chat,\n user,\n };\n },\n)(PickerSelectedItem));\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: string;\n typingStatus?: ApiTypingStatus;\n avatarSize?: 'tiny' | 'small' | 'medium' | 'large' | 'jumbo';\n forceShowSelf?: boolean;\n status?: string;\n withMediaViewer?: boolean;\n withUsername?: boolean;\n withFullInfo?: boolean;\n withUpdatingStatus?: boolean;\n noStatusOrTyping?: boolean;\n noRtl?: boolean;\n};\n\ntype StateProps = {\n user?: ApiUser;\n isSavedMessages?: boolean;\n areMessagesLoaded: boolean;\n serverTimeOffset: number;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nconst PrivateChatInfo: FC = ({\n typingStatus,\n avatarSize = 'medium',\n status,\n withMediaViewer,\n withUsername,\n withFullInfo,\n withUpdatingStatus,\n noStatusOrTyping,\n noRtl,\n user,\n isSavedMessages,\n areMessagesLoaded,\n lastSyncTime,\n serverTimeOffset,\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 {withUsername && user.username && {user.username}}\n {getUserStatus(lang, user, serverTimeOffset)}\n
\n );\n }\n\n return (\n
\n \n
\n {isSavedMessages ? (\n
\n

{lang('SavedMessages')}

\n
\n ) : (\n
\n

{fullName && renderText(fullName)}

\n {user?.isVerified && }\n
\n )}\n {(status || (!isSavedMessages && !noStatusOrTyping)) && renderStatusOrTyping()}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { userId, forceShowSelf }): StateProps => {\n const { lastSyncTime, serverTimeOffset } = 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, serverTimeOffset,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFullUser', 'openMediaViewer']),\n)(PrivateChatInfo));\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport {\n ApiChat, ApiMediaFormat, ApiPhoto, ApiUser,\n} from '../../api/types';\n\nimport {\n getChatAvatarHash,\n getChatTitle,\n getUserColorKey,\n getUserFullName,\n isUserId,\n isChatWithRepliesBot,\n isDeletedUser,\n} from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport buildClassName from '../../util/buildClassName';\nimport { getFirstLetters } from '../../util/textFormat';\nimport useMedia from '../../hooks/useMedia';\nimport useBlurSync from '../../hooks/useBlurSync';\nimport usePrevious from '../../hooks/usePrevious';\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from '../ui/Spinner';\n\nimport './ProfilePhoto.scss';\n\ntype OwnProps = {\n chat?: ApiChat;\n user?: ApiUser;\n isFirstPhoto?: boolean;\n isSavedMessages?: boolean;\n photo?: ApiPhoto;\n lastSyncTime?: number;\n onClick: NoneToVoidFunction;\n};\n\nconst ProfilePhoto: FC = ({\n chat,\n user,\n photo,\n isFirstPhoto,\n isSavedMessages,\n lastSyncTime,\n onClick,\n}) => {\n const lang = useLang();\n const isDeleted = user && isDeletedUser(user);\n const isRepliesChat = chat && isChatWithRepliesBot(chat.id);\n\n function getMediaHash(size: 'normal' | 'big', forceAvatar?: boolean) {\n if (photo && !forceAvatar) {\n return `photo${photo.id}?size=c`;\n }\n\n let hash: string | undefined;\n if (!isSavedMessages && !isDeleted && !isRepliesChat) {\n if (user) {\n hash = getChatAvatarHash(user, size);\n } else if (chat) {\n hash = getChatAvatarHash(chat, size);\n }\n }\n\n return hash;\n }\n\n const photoBlobUrl = useMedia(getMediaHash('big'), false, ApiMediaFormat.BlobUrl, lastSyncTime);\n const avatarMediaHash = isFirstPhoto && !photoBlobUrl ? getMediaHash('normal', true) : undefined;\n const avatarBlobUrl = useMedia(avatarMediaHash, false, ApiMediaFormat.BlobUrl, lastSyncTime);\n const thumbDataUri = useBlurSync(!photoBlobUrl && photo && photo.thumbnail && photo.thumbnail.dataUri);\n const imageSrc = photoBlobUrl || avatarBlobUrl || thumbDataUri;\n const prevImageSrc = usePrevious(imageSrc);\n\n let content: string | undefined = '';\n\n if (isSavedMessages) {\n content = ;\n } else if (isDeleted) {\n content = ;\n } else if (isRepliesChat) {\n content = ;\n } else if (imageSrc) {\n content = \"\";\n } else if (!imageSrc && user) {\n const userFullName = getUserFullName(user);\n content = userFullName ? getFirstLetters(userFullName, 2) : undefined;\n } else if (!imageSrc && chat) {\n const title = getChatTitle(lang, chat);\n content = title && getFirstLetters(title, isUserId(chat.id) ? 2 : 1);\n } else {\n content = (\n
\n \n
\n );\n }\n\n const fullClassName = buildClassName(\n 'ProfilePhoto',\n `color-bg-${getUserColorKey(user || chat)}`,\n isSavedMessages && 'saved-messages',\n isDeleted && 'deleted-account',\n isRepliesChat && 'replies-bot-account',\n (!isSavedMessages && !(imageSrc)) && 'no-photo',\n );\n\n return (\n
\n {prevImageSrc && imageSrc && prevImageSrc !== imageSrc && (\n \"\"\n )}\n {typeof content === 'string' ? renderText(content, ['hq_emoji']) : content}\n
\n );\n};\n\nexport default memo(ProfilePhoto);\n","import React, {\n FC, useEffect, useCallback, memo, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser, ApiChat } from '../../api/types';\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport { selectChat, selectUser } from '../../modules/selectors';\nimport {\n getUserFullName, getUserStatus, isChatChannel, isUserOnline,\n} from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../util/captureEvents';\nimport buildClassName from '../../util/buildClassName';\nimport usePhotosPreload from './hooks/usePhotosPreload';\nimport useLang from '../../hooks/useLang';\n\nimport VerifiedIcon from './VerifiedIcon';\nimport ProfilePhoto from './ProfilePhoto';\nimport Transition from '../ui/Transition';\n\nimport './ProfileInfo.scss';\n\ntype OwnProps = {\n userId: string;\n forceShowSelf?: boolean;\n};\n\ntype StateProps = {\n user?: ApiUser;\n chat?: ApiChat;\n isSavedMessages?: boolean;\n animationLevel: 0 | 1 | 2;\n serverTimeOffset: number;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nconst ProfileInfo: FC = ({\n forceShowSelf,\n user,\n chat,\n isSavedMessages,\n connectionState,\n animationLevel,\n serverTimeOffset,\n loadFullUser,\n openMediaViewer,\n}) => {\n const { id: userId } = user || {};\n const { id: chatId } = chat || {};\n const fullName = user ? getUserFullName(user) : (chat ? chat.title : '');\n const photos = user?.photos || chat?.photos || [];\n const slideAnimation = animationLevel >= 1 ? 'slide' : 'none';\n\n const [currentPhotoIndex, setCurrentPhotoIndex] = useState(0);\n const isFirst = isSavedMessages || photos.length <= 1 || currentPhotoIndex === 0;\n const isLast = isSavedMessages || photos.length <= 1 || currentPhotoIndex === photos.length - 1;\n\n // Deleting the last profile photo may result in an error\n useEffect(() => {\n if (currentPhotoIndex > photos.length) {\n setCurrentPhotoIndex(Math.max(0, photos.length - 1));\n }\n }, [currentPhotoIndex, photos.length]);\n\n const lang = useLang();\n\n useEffect(() => {\n if (connectionState === 'connectionStateReady' && userId && !forceShowSelf) {\n loadFullUser({ userId });\n }\n }, [userId, loadFullUser, connectionState, forceShowSelf]);\n\n usePhotosPreload(user || chat, photos, currentPhotoIndex);\n\n const handleProfilePhotoClick = useCallback(() => {\n openMediaViewer({\n avatarOwnerId: userId || chatId,\n profilePhotoIndex: currentPhotoIndex,\n origin: forceShowSelf ? MediaViewerOrigin.SettingsAvatar : MediaViewerOrigin.ProfileAvatar,\n });\n }, [openMediaViewer, userId, chatId, currentPhotoIndex, forceShowSelf]);\n\n const selectPreviousMedia = useCallback(() => {\n if (isFirst) {\n return;\n }\n\n setCurrentPhotoIndex(currentPhotoIndex - 1);\n }, [currentPhotoIndex, isFirst]);\n\n const selectNextMedia = useCallback(() => {\n if (isLast) {\n return;\n }\n\n setCurrentPhotoIndex(currentPhotoIndex + 1);\n }, [currentPhotoIndex, isLast]);\n\n // Support for swipe gestures and closing on click\n useEffect(() => {\n const element = document.querySelector('.photo-wrapper');\n if (!element) {\n return undefined;\n }\n\n return captureEvents(element, {\n selectorToPreventScroll: '.Profile, .settings-content',\n onSwipe: IS_TOUCH_ENV ? (e, direction) => {\n if (direction === SwipeDirection.Right) {\n selectPreviousMedia();\n return true;\n } else if (direction === SwipeDirection.Left) {\n selectNextMedia();\n return true;\n }\n\n return false;\n } : undefined,\n });\n }, [selectNextMedia, selectPreviousMedia]);\n\n if (!user && !chat) {\n return undefined;\n }\n\n function renderPhotoTabs() {\n if (isSavedMessages || !photos || photos.length <= 1) {\n return undefined;\n }\n\n return (\n
\n {photos.map((_, i) => (\n \n ))}\n
\n );\n }\n\n function renderPhoto() {\n const photo = !isSavedMessages && photos && photos.length > 0 ? photos[currentPhotoIndex] : undefined;\n\n return (\n \n );\n }\n\n function renderStatus() {\n if (user) {\n return (\n
\n {getUserStatus(lang, user, serverTimeOffset)}\n
\n );\n }\n\n return (\n {\n isChatChannel(chat!)\n ? lang('Subscribers', chat!.membersCount ?? 0, 'i')\n : lang('Members', chat!.membersCount ?? 0, 'i')\n }\n \n );\n }\n\n const isVerifiedIconShown = (user || chat)?.isVerified;\n\n return (\n
\n
\n {renderPhotoTabs()}\n \n {renderPhoto}\n \n\n {!isFirst && (\n \n )}\n {!isLast && (\n \n )}\n
\n\n
\n {isSavedMessages ? (\n
\n

{lang('SavedMessages')}

\n
\n ) : (\n
\n

{fullName && renderText(fullName)}

\n {isVerifiedIconShown && }\n
\n )}\n {!isSavedMessages && renderStatus()}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { userId, forceShowSelf }): StateProps => {\n const { connectionState, serverTimeOffset } = global;\n const user = selectUser(global, userId);\n const chat = selectChat(global, userId);\n const isSavedMessages = !forceShowSelf && user && user.isSelf;\n const { animationLevel } = global.settings.byKey;\n\n return {\n connectionState,\n user,\n chat,\n isSavedMessages,\n animationLevel,\n serverTimeOffset,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFullUser', 'openMediaViewer']),\n)(ProfileInfo));\n","import {\n ApiChat, ApiMediaFormat, ApiPhoto, ApiUser,\n} from '../../../api/types';\nimport { useEffect } from '../../../lib/teact/teact';\nimport * as mediaLoader from '../../../util/mediaLoader';\n\nconst PHOTOS_TO_PRELOAD = 4;\n\nexport default function usePhotosPreload(\n profile: ApiUser | ApiChat | undefined,\n photos: ApiPhoto[],\n currentIndex: number,\n) {\n useEffect(() => {\n photos.slice(currentIndex, currentIndex + PHOTOS_TO_PRELOAD).forEach((photo) => {\n const mediaData = mediaLoader.getFromMemory(`photo${photo.id}?size=c`);\n if (!mediaData) {\n mediaLoader.fetch(`photo${photo.id}?size=c`, ApiMediaFormat.BlobUrl);\n }\n });\n }, [currentIndex, photos]);\n}\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 useShowTransition from '../../hooks/useShowTransition';\nimport useFlag from '../../hooks/useFlag';\nimport buildClassName from '../../util/buildClassName';\nimport { preventMessageInputBlurWithBubbling } from '../middle/helpers/preventMessageInputBlur';\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 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(sticker.isAnimated && localMediaHash, !shouldPlay, ApiMediaFormat.Lottie);\n const [isAnimationLoaded, markLoaded, unmarkLoaded] = useFlag(Boolean(lottieData));\n const canAnimatedPlay = isAnimationLoaded && shouldPlay;\n\n const { transitionClassNames: previewTransitionClassNames } = useShowTransition(\n Boolean(previewBlobUrl || canAnimatedPlay),\n undefined,\n undefined,\n 'slow',\n );\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 onClick && 'interactive',\n sticker.isAnimated && 'animated',\n stickerSelector,\n className,\n );\n\n const style = thumbDataUri && !canAnimatedPlay ? `background-image: url('${thumbDataUri}');` : '';\n\n return (\n \n {!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, { FC, memo } 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 memo(StickerSetModalAsync);\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';\nimport useLang from '../../hooks/useLang';\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 lang = useLang();\n const typingUserName = typingUser && !typingUser.isSelf && getUserFirstOrLastName(typingUser);\n\n return (\n

\n {typingUserName && (\n {renderText(typingUserName)}\n )}\n {/* fix for translation \"username _is_ typing\" */}\n {lang(typingStatus.action).replace('{user}', '').trim()}\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 } from '../../lib/teact/teact';\n\nimport './VerifiedIcon.scss';\n\nconst VerifiedIcon: FC = () => {\n return (\n \n );\n};\n\nexport default VerifiedIcon;\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';\nimport useLang from '../../hooks/useLang';\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: string) => void;\n};\n\nconst WebLink: FC = ({\n message, senderTitle, onMessageClick,\n}) => {\n const lang = useLang();\n\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(lang, 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 video,\n } = linkData;\n\n const truncatedDescription = !senderTitle && trimText(description, MAX_TEXT_LENGTH);\n\n const className = buildClassName(\n 'WebLink scroll-item',\n (!photo && !video) && 'without-media',\n );\n\n return (\n \n {photo && (\n \n )}\n
\n \n {renderText(title || siteName || displayUrl)}\n \n {truncatedDescription && (\n \n {renderText(truncatedDescription)}\n \n )}\n \n {url.replace('mailto:', '') || displayUrl}\n \n {senderTitle &&
{renderText(senderTitle)}
}\n
\n {senderTitle && (\n
\n \n {formatPastTimeShort(lang, message.date * 1000)}\n \n
\n )}\n \n );\n};\n\nexport default memo(WebLink);\n","import {\n ApiPhoto, ApiVideo, ApiSticker, ApiDimensions,\n} from '../../../api/types';\n\nimport { STICKER_SIZE_INLINE_DESKTOP_FACTOR, STICKER_SIZE_INLINE_MOBILE_FACTOR } from '../../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport windowSize from '../../../util/windowSize';\nimport { getPhotoInlineDimensions, getVideoDimensions } from '../../../modules/helpers';\n\nexport const MEDIA_VIEWER_MEDIA_QUERY = '(max-height: 640px)';\nexport const REM = parseInt(getComputedStyle(document.documentElement).fontSize, 10);\nexport const ROUND_VIDEO_DIMENSIONS_PX = 240;\nexport const GIF_MIN_WIDTH = 300;\nexport const AVATAR_FULL_DIMENSIONS = { width: 640, height: 640 };\nexport const LIKE_STICKER_ID = '1258816259753933';\n\nconst DEFAULT_MEDIA_DIMENSIONS: ApiDimensions = { width: 100, height: 100 };\nconst MOBILE_SCREEN_NO_AVATARS_MESSAGE_EXTRA_WIDTH_REM = 4.5;\nconst MOBILE_SCREEN_MESSAGE_EXTRA_WIDTH_REM = 7;\nconst MESSAGE_MAX_WIDTH_REM = 29;\nconst MESSAGE_OWN_MAX_WIDTH_REM = 30;\n\nlet cachedMaxWidthOwn: number | undefined;\nlet cachedMaxWidth: number | undefined;\nlet cachedMaxWidthNoAvatar: number | undefined;\n\nfunction getMaxMessageWidthRem(fromOwnMessage: boolean, noAvatars?: boolean) {\n const regularMaxWidth = fromOwnMessage ? MESSAGE_OWN_MAX_WIDTH_REM : MESSAGE_MAX_WIDTH_REM;\n if (!IS_SINGLE_COLUMN_LAYOUT) {\n return regularMaxWidth;\n }\n\n const { width: windowWidth } = windowSize.get();\n\n // @optimization Limitation: changing device screen width not supported\n if (!cachedMaxWidthOwn) {\n cachedMaxWidthOwn = Math.min(\n MESSAGE_OWN_MAX_WIDTH_REM,\n windowWidth / REM - MOBILE_SCREEN_NO_AVATARS_MESSAGE_EXTRA_WIDTH_REM,\n );\n }\n if (!cachedMaxWidth) {\n cachedMaxWidth = Math.min(\n MESSAGE_MAX_WIDTH_REM,\n windowWidth / REM - MOBILE_SCREEN_MESSAGE_EXTRA_WIDTH_REM,\n );\n }\n if (!cachedMaxWidthNoAvatar) {\n cachedMaxWidthNoAvatar = Math.min(\n MESSAGE_MAX_WIDTH_REM,\n windowWidth / REM - MOBILE_SCREEN_NO_AVATARS_MESSAGE_EXTRA_WIDTH_REM,\n );\n }\n\n return fromOwnMessage\n ? cachedMaxWidthOwn\n : (noAvatars ? cachedMaxWidthNoAvatar : cachedMaxWidth);\n}\n\nexport function getAvailableWidth(\n fromOwnMessage: boolean,\n isForwarded?: boolean,\n isWebPagePhoto?: boolean,\n noAvatars?: boolean,\n) {\n const extraPaddingRem = isForwarded || isWebPagePhoto ? 1.625 : 0;\n const availableWidthRem = getMaxMessageWidthRem(fromOwnMessage, noAvatars) - 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 noAvatars,\n}: {\n width: number;\n height: number;\n fromOwnMessage: boolean;\n isForwarded?: boolean;\n isWebPagePhoto?: boolean;\n isGif?: boolean;\n noAvatars?: boolean;\n}): ApiDimensions {\n const aspectRatio = height / width;\n const availableWidth = getAvailableWidth(fromOwnMessage, isForwarded, isWebPagePhoto, noAvatars);\n const availableHeight = getAvailableHeight(isGif, aspectRatio);\n const mediaWidth = isGif ? Math.max(GIF_MIN_WIDTH, width) : width;\n const mediaHeight = isGif ? height * (mediaWidth / width) : height;\n\n return calculateDimensions(availableWidth, availableHeight, mediaWidth, mediaHeight);\n}\n\nexport function getMediaViewerAvailableDimensions(withFooter: boolean, isVideo: boolean): ApiDimensions {\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 noAvatars?: 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 noAvatars,\n });\n}\n\nexport function calculateVideoDimensions(\n video: ApiVideo,\n fromOwnMessage: boolean,\n isForwarded?: boolean,\n noAvatars?: 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 noAvatars,\n });\n}\n\nexport function getPictogramDimensions(): ApiDimensions {\n return {\n width: 2 * REM,\n height: 2 * REM,\n };\n}\n\nexport function getDocumentThumbnailDimensions(smaller?: boolean): ApiDimensions {\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): ApiDimensions {\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 = REM * (\n IS_SINGLE_COLUMN_LAYOUT\n ? STICKER_SIZE_INLINE_MOBILE_FACTOR\n : STICKER_SIZE_INLINE_DESKTOP_FACTOR\n );\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 }: ApiDimensions, withFooter: boolean, isVideo: boolean = false,\n): ApiDimensions {\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): ApiDimensions {\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 { 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: IOrganizedEntity[] = [];\n const parsedNestedEntities = 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 parsedNestedEntities.forEach((parsedEntity) => {\n let isChanged = false;\n\n parsedEntity.organizedIndexes.forEach((organizedIndex) => {\n if (!isChanged && !organizedIndexes.has(organizedIndex)) {\n isChanged = true;\n }\n\n organizedIndexes.add(organizedIndex);\n });\n\n if (isChanged) {\n nestedEntities.push(parsedEntity);\n }\n });\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 organizedEntities = 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 organizedEntities.forEach((entity, arrayIndex) => {\n const { renderResult, entityEndIndex } = renderEntity(\n index,\n text.length,\n entity,\n arrayIndex === organizedEntities.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, ['escape_html', '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, ['escape_html', '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 React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\nimport { OwnProps } from './ChatFolderModal';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst ChatFolderModalAsync: FC = (props) => {\n const { isOpen } = props;\n const ChatFolderModal = useModuleLoader(Bundles.Extra, 'ChatFolderModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ChatFolderModal ? : undefined;\n};\n\nexport default memo(ChatFolderModalAsync);\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: string) => orderDiffById[id] < 0, [orderDiffById]);\n const movesDown = useCallback((id: string) => orderDiffById[id] > 0, [orderDiffById]);\n\n const orderDiffIds = Object.keys(orderDiffById);\n const numberOfUp = orderDiffIds.filter(movesUp).length;\n const numberOfDown = orderDiffIds.filter(movesDown).length;\n\n return useCallback((chatId: string): 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 || (numberOfUp <= numberOfDown && movesUp(chatId))\n || (numberOfDown < numberOfUp && movesDown(chatId))\n ) {\n return ChatAnimationTypes.Opacity;\n }\n\n return ChatAnimationTypes.Move;\n }, [movesDown, movesUp, numberOfDown, numberOfUp, orderDiffById]);\n}\n","import React, { FC, memo } 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 isMuted?: boolean;\n};\n\nconst Badge: FC = ({ chat, isPinned, isMuted }) => {\n const isShown = Boolean(chat.unreadCount || chat.hasUnreadMark || isPinned);\n const className = buildClassName(\n 'Badge',\n 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 memo(Badge);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport buildClassName from '../../../util/buildClassName';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\n\nimport './ChatCallStatus.scss';\n\ntype OwnProps = {\n isSelected?: boolean;\n isActive?: boolean;\n};\n\nconst ChatCallStatus: FC = ({\n isSelected,\n isActive,\n}) => {\n return (\n
\n
\n
\n
\n
\n
\n
\n );\n};\n\nexport default memo(ChatCallStatus);\n","import React, {\n FC, memo, useCallback, useLayoutEffect, useMemo, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport useLang, { LangFn } from '../../../hooks/useLang';\n\nimport { GlobalActions } 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_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport {\n getChatTitle,\n isUserId,\n isActionMessage,\n getPrivateChatUserId,\n getMessageAction,\n getMessageSenderName,\n isChatChannel,\n getMessageMediaHash,\n getMessageSummaryText,\n getMessageMediaThumbDataUri,\n getMessageVideo,\n getMessageSticker,\n selectIsChatMuted,\n getMessageRoundVideo,\n} from '../../../modules/helpers';\nimport {\n selectChat, selectUser, selectChatMessage, selectOutgoingStatus, selectDraft, selectCurrentMessageList,\n selectNotifySettings, selectNotifyExceptions,\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';\nimport ChatFolderModal from '../ChatFolderModal.async';\nimport ChatCallStatus from './ChatCallStatus';\n\nimport './Chat.scss';\n\ntype OwnProps = {\n style?: string;\n chatId: string;\n folderId?: number;\n orderDiff: number;\n animationType: ChatAnimationTypes;\n isPinned?: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n isMuted?: boolean;\n privateChatUser?: ApiUser;\n actionTargetUserIds?: string[];\n usersById?: Record;\n actionTargetMessage?: ApiMessage;\n actionTargetChatId?: string;\n lastMessageSender?: ApiUser;\n lastMessageOutgoingStatus?: ApiMessageOutgoingStatus;\n draft?: ApiFormattedText;\n animationLevel?: number;\n isSelected?: boolean;\n canScrollDown?: boolean;\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 isPinned,\n chat,\n isMuted,\n privateChatUser,\n actionTargetUserIds,\n usersById,\n lastMessageSender,\n lastMessageOutgoingStatus,\n actionTargetMessage,\n actionTargetChatId,\n draft,\n animationLevel,\n isSelected,\n canScrollDown,\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 const [isChatFolderModalOpen, openChatFolderModal, closeChatFolderModal] = useFlag();\n const [shouldRenderDeleteModal, markRenderDeleteModal, unmarkRenderDeleteModal] = useFlag();\n const [shouldRenderChatFolderModal, markRenderChatFolderModal, unmarkRenderChatFolderModal] = 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 const isRoundVideo = Boolean(lastMessage && getMessageRoundVideo(lastMessage));\n\n const actionTargetUsers = useMemo(() => {\n return actionTargetUserIds\n ? actionTargetUserIds.map((userId) => usersById?.[userId]).filter(Boolean as any)\n : undefined;\n }, [actionTargetUserIds, usersById]);\n\n // Sets animation excess values when `orderDiff` changes and then resets excess values to animate.\n useLayoutEffect(() => {\n const element = ref.current;\n\n if (animationLevel === 0 || !element) {\n return;\n }\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, shouldReplaceHistory: true });\n\n if (isSelected && canScrollDown) {\n focusLastMessage();\n }\n }, [\n isSelected,\n canScrollDown,\n openChat,\n chatId,\n focusLastMessage,\n ]);\n\n function handleDelete() {\n markRenderDeleteModal();\n openDeleteModal();\n }\n\n function handleChatFolderChange() {\n markRenderChatFolderModal();\n openChatFolderModal();\n }\n\n const contextActions = useChatContextActions({\n chat,\n privateChatUser,\n handleDelete,\n handleChatFolderChange,\n folderId,\n isPinned,\n isMuted,\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?.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 lang,\n lastMessage,\n actionOrigin,\n actionTargetUsers,\n actionTargetMessage,\n actionTargetChatId,\n { asPlain: true },\n ) as string)}\n

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

\n {senderName && (\n <>\n {renderText(senderName)}\n :\n \n )}\n {renderMessageSummary(lang, lastMessage!, mediaBlobUrl || mediaThumbnail, isRoundVideo)}\n

\n );\n }\n\n const className = buildClassName(\n 'Chat chat-item-clickable',\n isUserId(chatId) ? 'private' : 'group',\n isSelected && 'selected',\n );\n\n return (\n \n
\n \n {chat.isCallActive && chat.isCallNotEmpty && (\n \n )}\n
\n
\n
\n

{renderText(getChatTitle(lang, chat, privateChatUser))}

\n {chat.isVerified && }\n {isMuted && }\n {chat.lastMessage && (\n \n )}\n
\n
\n {renderLastMessageOrTyping()}\n \n
\n
\n {shouldRenderDeleteModal && (\n \n )}\n {shouldRenderChatFolderModal && (\n \n )}\n \n );\n};\n\nfunction renderMessageSummary(lang: LangFn, message: ApiMessage, blobUrl?: string, isRoundVideo?: boolean) {\n if (!blobUrl) {\n return renderText(getMessageSummaryText(lang, message));\n }\n\n return (\n \n \"\"\n {getMessageVideo(message) && }\n {renderText(getMessageSummaryText(lang, 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 { targetUserIds: actionTargetUserIds, targetChatId: actionTargetChatId } = lastMessageAction || {};\n const privateChatUserId = getPrivateChatUserId(chat);\n const { byId: usersById } = global.users;\n const {\n chatId: currentChatId,\n threadId: currentThreadId,\n type: messageListType,\n } = selectCurrentMessageList(global) || {};\n const isSelected = chatId === currentChatId && currentThreadId === MAIN_THREAD_ID;\n\n return {\n chat,\n isMuted: selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global)),\n lastMessageSender,\n actionTargetUserIds,\n actionTargetChatId,\n actionTargetMessage,\n draft: selectDraft(global, chatId, MAIN_THREAD_ID),\n animationLevel: global.settings.byKey.animationLevel,\n isSelected,\n canScrollDown: isSelected && messageListType === 'thread',\n lastSyncTime: global.lastSyncTime,\n ...(isOutgoing && { lastMessageOutgoingStatus: selectOutgoingStatus(global, chat.lastMessage) }),\n ...(privateChatUserId && { privateChatUser: selectUser(global, privateChatUserId) }),\n ...(actionTargetUserIds && { usersById }),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n 'focusLastMessage',\n ]),\n)(Chat));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChatFolder, ApiSticker } from '../../../api/types';\nimport { SettingsScreens } from '../../../types';\nimport { FolderEditDispatch } from '../../../hooks/reducers/useFoldersReducer';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { selectAnimatedEmoji, selectChatFolder } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport AnimatedEmoji from '../../common/AnimatedEmoji';\n\nimport './EmptyFolder.scss';\n\ntype OwnProps = {\n folderId?: number;\n folderType: 'all' | 'archived' | 'folder';\n foldersDispatch?: FolderEditDispatch;\n onScreenSelect?: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n chatFolder?: ApiChatFolder;\n animatedEmoji?: ApiSticker;\n};\n\nconst EmptyFolder: FC = ({\n chatFolder, animatedEmoji, foldersDispatch, onScreenSelect,\n}) => {\n const lang = useLang();\n\n const handleEditFolder = useCallback(() => {\n foldersDispatch!({ type: 'editFolder', payload: chatFolder });\n onScreenSelect!(SettingsScreens.FoldersEditFolderFromChatList);\n }, [chatFolder, foldersDispatch, onScreenSelect]);\n\n return (\n
\n
{animatedEmoji && }
\n

{lang('FilterNoChatsToDisplay')}

\n

\n {lang(chatFolder ? 'ChatList.EmptyChatListFilterText' : 'Chat.EmptyChat')}\n

\n {chatFolder && foldersDispatch && onScreenSelect && (\n \n \n {lang('ChatList.EmptyChatListEditFilter')}\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal((global, { folderId, folderType }): StateProps => {\n const chatFolder = folderId && folderType === 'folder' ? selectChatFolder(global, folderId) : undefined;\n\n return {\n chatFolder,\n animatedEmoji: selectAnimatedEmoji(global, '📂'),\n };\n})(EmptyFolder));\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,\n} from '../../../api/types';\nimport { NotifyException, NotifySettings, SettingsScreens } from '../../../types';\nimport { FolderEditDispatch } from '../../../hooks/reducers/useFoldersReducer';\n\nimport { ALL_CHATS_PRELOAD_DISABLED, CHAT_HEIGHT_PX, CHAT_LIST_SLICE } from '../../../config';\nimport { IS_ANDROID, IS_MAC_OS, IS_PWA } from '../../../util/environment';\nimport usePrevious from '../../../hooks/usePrevious';\nimport { mapValues, pick } from '../../../util/iteratees';\nimport {\n getChatOrder, prepareChatList, prepareFolderListIds, reduceChatList,\n} from '../../../modules/helpers';\nimport {\n selectChatFolder, selectNotifyExceptions, selectNotifySettings,\n} 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';\nimport EmptyFolder from './EmptyFolder';\n\ntype OwnProps = {\n folderType: 'all' | 'archived' | 'folder';\n folderId?: number;\n isActive: boolean;\n onScreenSelect?: (screen: SettingsScreens) => void;\n foldersDispatch?: FolderEditDispatch;\n};\n\ntype StateProps = {\n chatsById: Record;\n usersById: Record;\n chatFolder?: ApiChatFolder;\n listIds?: string[];\n orderedPinnedIds?: string[];\n lastSyncTime?: number;\n notifySettings: NotifySettings;\n notifyExceptions?: Record;\n};\n\ntype DispatchProps = Pick;\n\nenum FolderTypeToListType {\n 'all' = 'active',\n 'archived' = 'archived',\n}\n\nconst ChatList: FC = ({\n folderType,\n folderId,\n isActive,\n chatFolder,\n chatsById,\n usersById,\n listIds,\n orderedPinnedIds,\n lastSyncTime,\n foldersDispatch,\n notifySettings,\n notifyExceptions,\n onScreenSelect,\n loadMoreChats,\n preloadTopChatMessages,\n preloadArchivedChats,\n openChat,\n openNextChat,\n}) => {\n const [currentListIds, currentPinnedIds] = useMemo(() => {\n return folderType === 'folder' && chatFolder\n ? prepareFolderListIds(chatsById, usersById, chatFolder, notifySettings, notifyExceptions)\n : [listIds, orderedPinnedIds];\n }, [folderType, chatFolder, chatsById, usersById, notifySettings, notifyExceptions, listIds, orderedPinnedIds]);\n\n const [orderById, orderedIds, chatArrays] = useMemo(() => {\n if (!currentListIds || (folderType === 'folder' && !chatFolder)) {\n return [];\n }\n\n const newChatArrays = prepareChatList(chatsById, currentListIds, currentPinnedIds, folderType);\n const singleList = ([] as ApiChat[]).concat(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, newChatArrays];\n }, [currentListIds, currentPinnedIds, folderType, chatFolder, chatsById]);\n\n const prevOrderById = usePrevious(orderById);\n\n const orderDiffById = useMemo(() => {\n if (!orderById || !prevOrderById) {\n return {};\n }\n\n return mapValues(orderById, (order, id) => {\n return order - (prevOrderById[id] !== undefined ? prevOrderById[id] : Infinity);\n });\n }, [orderById, prevOrderById]);\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 const viewportChatArrays = useMemo(() => {\n if (!viewportIds || !chatArrays) {\n return undefined;\n }\n\n return reduceChatList(chatArrays, viewportIds);\n }, [chatArrays, viewportIds]);\n\n useEffect(() => {\n if (lastSyncTime && folderType === 'all') {\n preloadTopChatMessages();\n preloadArchivedChats();\n }\n }, [lastSyncTime, folderType, preloadTopChatMessages, preloadArchivedChats]);\n\n const getAnimationType = useChatAnimationType(orderDiffById);\n\n function renderChats() {\n const viewportOffset = orderedIds!.indexOf(viewportIds![0]);\n const pinnedOffset = viewportOffset + viewportChatArrays!.pinnedChats.length;\n\n return (\n \n {viewportChatArrays!.pinnedChats.map(({ id }, i) => (\n \n ))}\n {viewportChatArrays!.otherChats.map((chat, i) => (\n \n ))}\n
\n );\n }\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (isActive && orderedIds) {\n if (IS_PWA && ((IS_MAC_OS && e.metaKey) || (!IS_MAC_OS && e.ctrlKey)) && e.code.startsWith('Digit')) {\n const [, digit] = e.code.match(/Digit(\\d)/) || [];\n if (!digit) return;\n\n const position = Number(digit) - 1;\n if (position > orderedIds.length - 1) return;\n\n openChat({ id: orderedIds[position], shouldReplaceHistory: true });\n }\n\n if (e.altKey) {\n const targetIndexDelta = e.key === 'ArrowDown' ? 1 : e.key === 'ArrowUp' ? -1 : undefined;\n if (!targetIndexDelta) return;\n\n e.preventDefault();\n openNextChat({ targetIndexDelta, orderedIds });\n }\n }\n };\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n });\n\n return (\n \n {viewportIds?.length && viewportChatArrays ? (\n renderChats()\n ) : viewportIds && !viewportIds.length ? (\n (\n \n )\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 listType = folderType !== 'folder' ? FolderTypeToListType[folderType] : undefined;\n const chatFolder = folderId ? selectChatFolder(global, folderId) : undefined;\n\n return {\n chatsById,\n usersById,\n lastSyncTime,\n notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\n ...(listType ? {\n listIds: listIds[listType],\n orderedPinnedIds: orderedPinnedIds[listType],\n } : {\n chatFolder,\n }),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadMoreChats',\n 'preloadTopChatMessages',\n 'preloadArchivedChats',\n 'openChat',\n 'openNextChat',\n ]),\n)(ChatList));\n","import { ApiChat, ApiMessage, ApiUser } from '../../../../api/types';\nimport {\n getChatTitle,\n getSenderTitle,\n isUserId,\n isChatGroup,\n} from '../../../../modules/helpers';\nimport { LangFn } from '../../../../hooks/useLang';\n\nexport function getSenderName(\n lang: LangFn, message: ApiMessage, chatsById: Record, usersById: Record,\n) {\n const { senderId } = message;\n if (!senderId) {\n return undefined;\n }\n\n const sender = isUserId(senderId) ? usersById[senderId] : chatsById[senderId];\n\n let senderName = getSenderTitle(lang, sender);\n\n const chat = chatsById[message.chatId];\n if (chat) {\n if (isUserId(senderId) && (sender as ApiUser).isSelf) {\n senderName = `${lang('FromYou')} → ${getChatTitle(lang, chat)}`;\n } else if (isChatGroup(chat)) {\n senderName += ` → ${getChatTitle(lang, chat)}`;\n }\n }\n\n return senderName;\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 React, { FC, memo } 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 memo(EmojiTooltipAsync);\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_EMOJI_SUPPORTED, IS_IOS, IS_SINGLE_COLUMN_LAYOUT, 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';\nimport useLang from '../../../hooks/useLang';\nimport renderText from '../../common/helpers/renderText';\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;\nconst TRANSITION_DURATION_FACTOR = 50;\n\ntype OwnProps = {\n id: string;\n isAttachmentModalInput?: boolean;\n editableInputId?: string;\n html: string;\n placeholder: string;\n forcedPlaceholder?: string;\n shouldSetFocus: boolean;\n shouldSuppressFocus?: boolean;\n shouldSuppressTextFormatter?: boolean;\n onUpdate: (html: string) => void;\n onSuppressedFocus?: () => void;\n onSend: () => void;\n};\n\ntype StateProps = {\n currentChatId?: string;\n replyingToId?: number;\n noTabCapture?: boolean;\n messageSendKeyCombo?: ISettings['messageSendKeyCombo'];\n};\n\ntype DispatchProps = Pick;\n\nconst MAX_INPUT_HEIGHT = IS_SINGLE_COLUMN_LAYOUT ? 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 isAttachmentModalInput,\n editableInputId,\n html,\n placeholder,\n forcedPlaceholder,\n shouldSetFocus,\n shouldSuppressFocus,\n shouldSuppressTextFormatter,\n onUpdate,\n onSuppressedFocus,\n onSend,\n currentChatId,\n replyingToId,\n noTabCapture,\n messageSendKeyCombo,\n editLastMessage,\n replyToNextMessage,\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 lang = useLang();\n const isContextMenuOpenRef = useRef(false);\n const [isTextFormatterOpen, openTextFormatter, closeTextFormatter] = useFlag();\n const [textFormatterAnchorPosition, setTextFormatterAnchorPosition] = useState();\n const [selectedRange, setSelectedRange] = useState();\n\n useEffect(() => {\n if (!isAttachmentModalInput) return;\n updateInputHeight(false);\n }, [isAttachmentModalInput]);\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(!html.length);\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 false;\n }\n\n const selection = window.getSelection();\n if (!selection || !selection.rangeCount || isContextMenuOpenRef.current) {\n closeTextFormatter();\n return false;\n }\n\n const selectionRange = selection.getRangeAt(0);\n const selectedText = selectionRange.toString().trim();\n if (\n shouldSuppressTextFormatter\n || !isSelectionInsideInput(selectionRange, editableInputId || EDITABLE_INPUT_ID)\n || !selectedText\n || parseEmojiOnlyString(selectedText)\n || !selectionRange.START_TO_END\n ) {\n closeTextFormatter();\n return false;\n }\n\n return true;\n }\n\n function processSelection() {\n if (!checkSelection()) {\n return;\n }\n\n const selectionRange = window.getSelection()!.getRangeAt(0);\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 processSelection();\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 processSelection();\n\n e.target.removeEventListener('keyup', handleKeyUp);\n }\n\n if (!html.length && (e.metaKey || e.ctrlKey)) {\n const targetIndexDelta = e.key === 'ArrowDown' ? 1 : e.key === 'ArrowUp' ? -1 : undefined;\n if (targetIndexDelta) {\n e.preventDefault();\n\n replyToNextMessage({ targetIndexDelta });\n return;\n }\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 && !e.metaKey && !e.ctrlKey && !e.altKey) {\n e.preventDefault();\n editLastMessage();\n } else {\n e.target.addEventListener('keyup', handleKeyUp);\n }\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 (\n !IS_TOUCH_ENV\n && (!textContent || !textContent.length)\n // When emojis are not supported, innerHTML contains an emoji img tag that doesn't exist in the textContext\n && !(!IS_EMOJI_SUPPORTED && innerHTML.includes('emoji-small'))\n ) {\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 (!checkSelection()) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n function updateInputHeight(willSend = false) {\n const input = inputRef.current!;\n const clone = cloneRef.current!;\n const currentHeight = Number(input.style.height.replace('px', ''));\n const newHeight = Math.min(clone.scrollHeight, MAX_INPUT_HEIGHT);\n if (newHeight === currentHeight) {\n return;\n }\n\n const transitionDuration = Math.round(\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\n );\n\n const exec = () => {\n input.style.height = `${newHeight}px`;\n input.style.transitionDuration = `${transitionDuration}ms`;\n input.classList.toggle('overflown', clone.scrollHeight > MAX_INPUT_HEIGHT);\n };\n\n if (willSend) {\n // Sync with sending animation\n requestAnimationFrame(exec);\n } else {\n exec();\n }\n }\n\n useEffect(() => {\n if (IS_TOUCH_ENV) {\n return;\n }\n\n if (shouldSetFocus) {\n focusInput();\n }\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 suppressFocus() {\n input.blur();\n }\n\n if (shouldSuppressFocus) {\n input.addEventListener('focus', suppressFocus);\n }\n\n return () => {\n input.removeEventListener('focus', suppressFocus);\n };\n }, [shouldSuppressFocus]);\n\n const className = buildClassName(\n 'form-control custom-scroll',\n html.length > 0 && 'touched',\n shouldSuppressFocus && 'focus-disabled',\n );\n\n return (\n
\n \n
\n {!forcedPlaceholder && {placeholder}}\n \n {forcedPlaceholder && {renderText(forcedPlaceholder!)}}\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', 'replyToNextMessage']),\n)(MessageInput));\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 { ensureProtocol } from '../../../util/ensureProtocol';\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 setSelectedRange: (range: Range) => void;\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};\nconst fragmentEl = document.createElement('div');\n\nconst TextFormatter: FC = ({\n isOpen,\n anchorPosition,\n selectedRange,\n setSelectedRange,\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 updateSelectedRange = useCallback(() => {\n const selection = window.getSelection();\n if (selection) {\n setSelectedRange(selection.getRangeAt(0));\n }\n }, [setSelectedRange]);\n\n const getSelectedText = useCallback(() => {\n if (!selectedRange) {\n return undefined;\n }\n fragmentEl.innerText = selectedRange.toString();\n\n return fragmentEl.innerHTML;\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 updateSelectedRange();\n return {\n ...selectedFormats,\n bold: !selectedFormats.bold,\n };\n });\n }, [updateSelectedRange]);\n\n const handleItalicText = useCallback(() => {\n document.execCommand('italic');\n updateSelectedRange();\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n italic: !selectedFormats.italic,\n }));\n }, [updateSelectedRange]);\n\n const handleUnderlineText = useCallback(() => {\n document.execCommand('underline');\n updateSelectedRange();\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n underline: !selectedFormats.underline,\n }));\n }, [updateSelectedRange]);\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 = encodeURI(ensureProtocol(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(\n 'insertHTML',\n false,\n `${text}`,\n );\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","const RE_BR = /(
|)/g;\nconst RE_SPACE = /( |\\u00A0)/g;\nconst RE_CLEAN_HTML = /(
|<\\/div>)/gi;\nconst RE_EXTRA_NEW_LINE = /\\n$/i;\n\nexport function prepareForRegExp(html: string) {\n return html\n .replace(RE_SPACE, ' ')\n .replace(RE_BR, '\\n')\n .replace(RE_CLEAN_HTML, '')\n .replace(RE_EXTRA_NEW_LINE, '');\n}\n","const MAX_NESTING_PARENTS = 5;\n\nexport function isSelectionInsideInput(selectionRange: Range, inputId: string) {\n const { commonAncestorContainer } = selectionRange;\n let parentNode: HTMLElement | null = commonAncestorContainer as HTMLElement;\n let iterations = 1;\n while (parentNode && parentNode.id !== inputId && iterations < MAX_NESTING_PARENTS) {\n parentNode = parentNode.parentElement;\n iterations++;\n }\n\n return Boolean(parentNode && parentNode.id === inputId);\n}\n","import {\n useCallback, useEffect, useMemo, useState,\n} from '../../../../lib/teact/teact';\n\nimport { EDITABLE_INPUT_ID } from '../../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../../util/memo';\nimport { prepareForRegExp } from '../helpers/prepareForRegExp';\nimport {\n EmojiData, EmojiModule, EmojiRawData, uncompressEmoji,\n} from '../../../../util/emoji';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport {\n buildCollectionByKey, flatten, mapValues, pickTruthy, unique,\n} from '../../../../util/iteratees';\nimport useFlag from '../../../../hooks/useFlag';\n\nlet emojiDataPromise: Promise;\nlet emojiRawData: EmojiRawData;\nlet emojiData: EmojiData;\n\nlet RE_EMOJI_SEARCH: RegExp;\nconst EMOJIS_LIMIT = 36;\nconst FILTER_MIN_LENGTH = 2;\n\ntry {\n RE_EMOJI_SEARCH = new RegExp('(^|\\\\s):[-+_:\\\\p{L}\\\\p{N}]*$', 'gui');\n} catch (e) {\n // Support for older versions of firefox\n RE_EMOJI_SEARCH = new RegExp('(^|\\\\s):[-+_:\\\\d\\\\wа-яё]*$', 'gi');\n}\n\nexport default function useEmojiTooltip(\n isAllowed: boolean,\n html: string,\n recentEmojiIds: string[],\n inputId = EDITABLE_INPUT_ID,\n onUpdateHtml: (html: string) => void,\n baseEmojiKeywords?: Record,\n emojiKeywords?: Record,\n isDisabled = false,\n) {\n const [isOpen, markIsOpen, unmarkIsOpen] = useFlag();\n\n const [byId, setById] = useState | undefined>();\n const [keywords, setKeywords] = useState();\n const [byKeyword, setByKeyword] = useState>({});\n const [names, setNames] = useState();\n const [byName, setByName] = useState>({});\n const [shouldForceInsertEmoji, setShouldForceInsertEmoji] = useState(false);\n\n const [filteredEmojis, setFilteredEmojis] = useState(MEMO_EMPTY_ARRAY);\n\n const recentEmojis = useMemo(\n () => {\n if (!byId || !recentEmojiIds.length) {\n return [];\n }\n\n return Object.values(pickTruthy(byId, recentEmojiIds));\n },\n [byId, recentEmojiIds],\n );\n\n // Initialize data on first render.\n useEffect(() => {\n if (isDisabled) return;\n const exec = () => {\n setById(emojiData.emojis);\n };\n\n if (emojiData) {\n exec();\n } else {\n ensureEmojiData()\n .then(exec);\n }\n }, [isDisabled]);\n\n useEffect(() => {\n if (!byId || isDisabled) {\n return;\n }\n\n const emojis = Object.values(byId);\n\n const byNative = buildCollectionByKey(emojis, 'native');\n const baseEmojisByKeyword = baseEmojiKeywords\n ? mapValues(baseEmojiKeywords, (natives) => {\n return Object.values(pickTruthy(byNative, natives));\n })\n : {};\n const emojisByKeyword = emojiKeywords\n ? mapValues(emojiKeywords, (natives) => {\n return Object.values(pickTruthy(byNative, natives));\n })\n : {};\n\n setByKeyword({ ...baseEmojisByKeyword, ...emojisByKeyword });\n setKeywords([...Object.keys(baseEmojisByKeyword), ...Object.keys(emojisByKeyword)]);\n\n const emojisByName = emojis.reduce((result, emoji) => {\n emoji.names.forEach((name) => {\n if (!result[name]) {\n result[name] = [];\n }\n\n result[name].push(emoji);\n });\n\n return result;\n }, {} as Record);\n setByName(emojisByName);\n setNames(Object.keys(emojisByName));\n }, [isDisabled, baseEmojiKeywords, byId, emojiKeywords]);\n\n useEffect(() => {\n if (!isAllowed || !html || !byId || !keywords || !keywords.length) {\n unmarkIsOpen();\n return;\n }\n\n const code = html.includes(':') && getEmojiCode(html);\n if (!code) {\n setFilteredEmojis(MEMO_EMPTY_ARRAY);\n unmarkIsOpen();\n return;\n }\n\n const forceSend = code.length > 2 && code.endsWith(':');\n const filter = code.substr(1, forceSend ? code.length - 2 : undefined);\n let matched: Emoji[] = [];\n\n setShouldForceInsertEmoji(forceSend);\n\n if (!filter) {\n matched = recentEmojis;\n } else if (filter.length >= FILTER_MIN_LENGTH) {\n const matchedKeywords = keywords.filter((keyword) => keyword.startsWith(filter)).sort();\n matched = matched.concat(flatten(Object.values(pickTruthy(byKeyword, matchedKeywords))));\n\n // Also search by names, which is useful for non-English languages\n const matchedNames = names.filter((name) => name.startsWith(filter));\n matched = matched.concat(flatten(Object.values(pickTruthy(byName, matchedNames))));\n\n matched = unique(matched);\n }\n\n if (matched.length) {\n if (!forceSend) {\n markIsOpen();\n }\n setFilteredEmojis(matched.slice(0, EMOJIS_LIMIT));\n } else {\n unmarkIsOpen();\n }\n }, [\n byId, byKeyword, keywords, byName, names, html, isAllowed, markIsOpen,\n recentEmojis, unmarkIsOpen, setShouldForceInsertEmoji,\n ]);\n\n const insertEmoji = useCallback((textEmoji: string, isForce?: boolean) => {\n const atIndex = html.lastIndexOf(':', isForce ? html.lastIndexOf(':') - 1 : undefined);\n if (atIndex !== -1) {\n onUpdateHtml(`${html.substr(0, atIndex)}${textEmoji}`);\n const messageInput = document.getElementById(inputId)!;\n requestAnimationFrame(() => {\n focusEditableElement(messageInput, true);\n });\n }\n\n unmarkIsOpen();\n }, [html, inputId, onUpdateHtml, unmarkIsOpen]);\n\n useEffect(() => {\n if (isOpen && shouldForceInsertEmoji && filteredEmojis.length) {\n insertEmoji(filteredEmojis[0].native, true);\n }\n }, [filteredEmojis, insertEmoji, isOpen, shouldForceInsertEmoji]);\n\n return {\n isEmojiTooltipOpen: isOpen,\n closeEmojiTooltip: unmarkIsOpen,\n filteredEmojis,\n insertEmoji,\n };\n}\n\nfunction getEmojiCode(html: string) {\n const emojis = prepareForRegExp(html).match(RE_EMOJI_SEARCH);\n\n return emojis ? emojis[0].trim() : undefined;\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","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","import {\n useCallback, useEffect, useState, useMemo,\n} 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 { prepareForRegExp } from '../helpers/prepareForRegExp';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport useFlag from '../../../../hooks/useFlag';\nimport { unique } from '../../../../util/iteratees';\nimport { throttle } from '../../../../util/schedulers';\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\nlet RE_USERNAME_SEARCH: RegExp;\n\ntry {\n RE_USERNAME_SEARCH = new RegExp('(^|\\\\s)@[-_\\\\p{L}\\\\p{M}\\\\p{N}]*$', 'gui');\n} catch (e) {\n // Support for older versions of firefox\n RE_USERNAME_SEARCH = new RegExp('(^|\\\\s)@[-_\\\\d\\\\wа-яё]*$', 'gi');\n}\n\nexport default function useMentionTooltip(\n canSuggestMembers: boolean | undefined,\n html: string,\n onUpdateHtml: (html: string) => void,\n inputId: string = EDITABLE_INPUT_ID,\n groupChatMembers?: ApiChatMember[],\n topInlineBotIds?: string[],\n currentUserId?: string,\n usersById?: Record,\n) {\n const [isOpen, markIsOpen, unmarkIsOpen] = useFlag();\n const [usersToMention, setUsersToMention] = useState();\n\n const topInlineBots = useMemo(() => {\n return (topInlineBotIds || []).map((id) => usersById?.[id]).filter(Boolean as any);\n }, [topInlineBotIds, usersById]);\n\n const getFilteredUsers = useCallback((filter, withInlineBots: boolean) => {\n if (!(groupChatMembers || topInlineBotIds) || !usersById) {\n setUsersToMention(undefined);\n\n return;\n }\n runThrottled(() => {\n const inlineBots = (withInlineBots ? topInlineBots : []).filter((inlineBot) => {\n return !filter || searchUserName(filter, inlineBot);\n });\n\n const chatMembers = (groupChatMembers || [])\n .map(({ userId }) => usersById[userId])\n .filter((user) => {\n if (!user || user.id === currentUserId) {\n return false;\n }\n\n return !filter || searchUserName(filter, user);\n });\n\n setUsersToMention(unique(inlineBots.concat(chatMembers)));\n });\n }, [currentUserId, groupChatMembers, topInlineBotIds, topInlineBots, usersById]);\n\n useEffect(() => {\n if (!canSuggestMembers || !html.length) {\n unmarkIsOpen();\n return;\n }\n\n const usernameFilter = html.includes('@') && getUsernameFilter(html);\n\n if (usernameFilter) {\n const filter = usernameFilter ? usernameFilter.substr(1) : '';\n getFilteredUsers(filter, canSuggestInlineBots(html));\n } else {\n unmarkIsOpen();\n }\n }, [canSuggestMembers, html, getFilteredUsers, markIsOpen, unmarkIsOpen]);\n\n useEffect(() => {\n if (usersToMention?.length) {\n markIsOpen();\n } else {\n unmarkIsOpen();\n }\n }, [markIsOpen, unmarkIsOpen, usersToMention]);\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 requestAnimationFrame(() => {\n focusEditableElement(messageInput, forceFocus);\n });\n }\n\n unmarkIsOpen();\n }, [html, inputId, onUpdateHtml, unmarkIsOpen]);\n\n return {\n isMentionTooltipOpen: isOpen,\n closeMentionTooltip: unmarkIsOpen,\n insertMention,\n mentionFilteredUsers: usersToMention,\n };\n}\n\nfunction getUsernameFilter(html: string) {\n const username = prepareForRegExp(html).match(RE_USERNAME_SEARCH);\n\n return username ? username[0].trim() : undefined;\n}\n\nfunction canSuggestInlineBots(html: string) {\n return html.startsWith('@');\n}\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 { 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(selected || []);\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, { 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 { RefObject } from 'react';\nimport React, { FC, useRef, useCallback } from '../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport { fastRaf } from '../../util/schedulers';\nimport buildClassName from '../../util/buildClassName';\nimport useContextMenuHandlers from '../../hooks/useContextMenuHandlers';\nimport useContextMenuPosition from '../../hooks/useContextMenuPosition';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\n\nimport RippleEffect from './RippleEffect';\nimport Menu from './Menu';\nimport MenuItem from './MenuItem';\n\nimport './ListItem.scss';\n\ninterface MenuItemContextAction {\n title: string;\n icon: string;\n destructive?: boolean;\n handler?: () => void;\n}\n\ninterface OwnProps {\n ref?: RefObject;\n buttonRef?: 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 multiline?: boolean;\n isStatic?: boolean;\n contextActions?: MenuItemContextAction[];\n onMouseDown?: (e: React.MouseEvent) => void;\n onClick?: (e: React.MouseEvent) => void;\n}\n\nconst ListItem: FC = (props) => {\n const {\n ref,\n buttonRef,\n icon,\n className,\n style,\n children,\n disabled,\n ripple,\n narrow,\n inactive,\n focus,\n destructive,\n multiline,\n isStatic,\n contextActions,\n onMouseDown,\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 const [isTouched, markIsTouched, unmarkIsTouched] = useFlag();\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\n if (IS_TOUCH_ENV && !ripple) {\n markIsTouched();\n fastRaf(unmarkIsTouched);\n }\n }, [disabled, markIsTouched, onClick, ripple, unmarkIsTouched]);\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 lang = useLang();\n\n const fullClassName = buildClassName(\n 'ListItem',\n className,\n !isStatic && 'no-selection',\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 multiline && 'multiline',\n isStatic && 'is-static',\n );\n\n return (\n \n \n {icon && (\n \n )}\n {multiline && (
{children}
)}\n {!multiline && 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 React, {\n FC,\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 containerId?: string;\n message: TextPart[];\n duration?: number;\n onDismiss: () => void;\n};\n\nconst DEFAULT_DURATION = 3000;\nconst ANIMATION_DURATION = 150;\n\nconst Notification: FC = ({\n message, duration = DEFAULT_DURATION, containerId, onDismiss,\n}) => {\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 Notification;\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 { ChangeEvent } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\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 lang = useLang();\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';\n\nimport Radio from './Radio';\n\nexport type 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 { ChangeEvent } from 'react';\nimport React, {\n FC, useCallback, useMemo, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport './RangeSlider.scss';\n\ntype OwnProps = {\n options?: string[];\n min?: number;\n max?: number;\n step?: number;\n label?: string;\n value: number;\n renderValue?: (value: number) => string;\n disabled?: boolean;\n onChange: (value: number) => void;\n};\n\nconst RangeSlider: FC = ({\n options,\n min = 0,\n max = options ? options.length - 1 : 100,\n step = 1,\n label,\n value,\n renderValue,\n disabled,\n onChange,\n}) => {\n const lang = useLang();\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 {\n const possibleValuesLength = (max - min) / step;\n return ((value - min) / possibleValuesLength) * 100;\n }\n }, [options, value, max, min, step]);\n\n return (\n
\n {label && (\n
\n {label}\n {!options && (\n {renderValue ? renderValue(value) : 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 { RefObject } from 'react';\nimport React, {\n FC, useRef, useEffect, memo, useCallback,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\nimport useInputFocusOnOpen from '../../hooks/useInputFocusOnOpen';\n\nimport Loading from './Loading';\nimport Button from './Button';\n\nimport './SearchInput.scss';\n\ntype OwnProps = {\n ref?: RefObject;\n children?: any;\n parentContainerClassName?: string;\n className?: string;\n inputId?: string;\n value?: string;\n focused?: boolean;\n isLoading?: boolean;\n placeholder?: string;\n disabled?: boolean;\n autoComplete?: string;\n canClose?: boolean;\n autoFocusSearch?: 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 parentContainerClassName,\n value,\n inputId,\n className,\n focused,\n isLoading,\n placeholder,\n disabled,\n autoComplete,\n canClose,\n autoFocusSearch,\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 useInputFocusOnOpen(inputRef, autoFocusSearch, unmarkInputFocused);\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 const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'ArrowDown' || e.key === 'Enter') {\n const element = document.querySelector(`.${parentContainerClassName} .ListItem-button`) as HTMLElement;\n if (element) {\n element.focus();\n }\n }\n }, [parentContainerClassName]);\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 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 { 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 inactive?: boolean;\n noAnimation?: 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 inactive,\n noAnimation,\n onChange,\n onCheck,\n}) => {\n const handleChange = useCallback((e: ChangeEvent) => {\n if (onChange) {\n onChange(e);\n }\n\n if (onCheck) {\n onCheck(e.currentTarget.checked);\n }\n }, [onChange, onCheck]);\n\n const className = buildClassName(\n 'Switcher',\n disabled && 'disabled',\n inactive && 'inactive',\n noAnimation && 'no-animation',\n );\n\n return (\n \n );\n};\n\nexport default memo(Switcher);\n","import React, {\n FC, useLayoutEffect, useRef, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport renderText from '../common/helpers/renderText';\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 prevTab = tab.parentElement!.children[previousActiveTab];\n if (!prevTab) {\n return;\n }\n const currentIndicator = prevTab.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 {renderText(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 big?: boolean;\n onSwitchTab: (index: number) => void;\n};\n\nconst TAB_SCROLL_THRESHOLD_PX = 16;\n\nconst TabList: FC = ({\n tabs, activeTab, big, onSwitchTab,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const previousActiveTab = usePrevious(activeTab);\n\n useHorizontalScroll(containerRef.current);\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 { RefObject } from 'react';\nimport React, {\n FC, useLayoutEffect, useRef,\n} from '../../lib/teact/teact';\nimport { getGlobal } from '../../lib/teact/teactn';\n\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport usePrevious from '../../hooks/usePrevious';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport { waitForAnimationEnd } from '../../util/cssAnimationEndListeners';\n\nimport './Transition.scss';\n\ntype ChildrenFn = (isActive: boolean, isFrom: boolean, currentKey: number) => any;\ntype OwnProps = {\n ref?: RefObject;\n activeKey: number;\n name: (\n 'none' | 'slide' | 'slide-reversed' | 'mv-slide' | 'slide-fade' | 'zoom-fade' | 'slide-layers'\n | 'fade' | 'push-slide' | 'reveal'\n );\n direction?: 'auto' | 'inverse' | 1 | -1;\n renderCount?: number;\n shouldRestoreHeight?: boolean;\n shouldCleanup?: boolean;\n cleanupExceptionKey?: number;\n id?: string;\n className?: string;\n onStart?: () => void;\n onStop?: () => void;\n children: ChildrenFn;\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 cleanupExceptionKey,\n id,\n className,\n onStart,\n onStop,\n children,\n}) => {\n // No need for a container to update on change\n const { animationLevel } = getGlobal().settings.byKey;\n const currentKeyRef = useRef();\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 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 || (cleanupExceptionKey !== undefined && cleanupExceptionKey === prevActiveKey)) {\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 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 let dispatchHeavyAnimationStop: NoneToVoidFunction;\n if (animationLevel > 0) {\n dispatchHeavyAnimationStop = dispatchHeavyAnimationEvent();\n }\n\n requestAnimationFrame(() => {\n container.classList.add('animating');\n\n if (onStart) {\n onStart();\n }\n\n function onAnimationEnd() {\n requestAnimationFrame(() => {\n if (activeKey !== currentKeyRef.current) {\n return;\n }\n\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 (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 if (dispatchHeavyAnimationStop) {\n dispatchHeavyAnimationStop();\n }\n\n cleanup();\n\n if (onStop) {\n onStop();\n }\n });\n }\n\n const watchedNode = name === 'mv-slide'\n ? childNodes[activeIndex]?.firstChild\n : name === 'reveal' && isBackwards\n ? childNodes[prevActiveIndex]\n : childNodes[activeIndex];\n\n currentKeyRef.current = activeKey;\n\n if (animationLevel > 0 && watchedNode) {\n waitForAnimationEnd(watchedNode, onAnimationEnd);\n } else {\n onAnimationEnd();\n }\n });\n }, [\n activeKey,\n prevActiveKey,\n activeKeyChanged,\n direction,\n name,\n onStart,\n onStop,\n renderCount,\n shouldRestoreHeight,\n shouldCleanup,\n cleanupExceptionKey,\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 container.style.flexBasis = `${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'\n ?
{render(key === activeKey, key === prevActiveKey, activeKey)}
\n : undefined\n );\n });\n\n const fullClassName = buildClassName(\n 'Transition',\n className,\n name,\n );\n\n return (\n
\n {contents}\n
\n );\n};\n\nexport default Transition;\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: string[] = [];\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?.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 {\n useCallback, useEffect, useRef, useState,\n} from '../lib/teact/teact';\nimport { getDispatch, getGlobal } from '../lib/teact/teactn';\n\nimport { register, Track, TrackId } from '../util/audioPlayer';\nimport useEffectWithPrevDeps from './useEffectWithPrevDeps';\nimport { isSafariPatchInProgress } from '../util/patchSafariProgressiveAudio';\nimport useOnChange from './useOnChange';\nimport {\n MediaSessionHandlers, registerMediaSession, setPlaybackState, setPositionState, updateMetadata,\n} from '../util/mediaSession';\n\ntype Handler = (e: Event) => void;\n\nconst DEFAULT_SKIP_TIME = 10;\n\nexport default (\n trackId: TrackId,\n originalDuration: number, // Sometimes incorrect for voice messages\n trackType: Track['type'],\n src?: string,\n handlers?: Record,\n metadata?: MediaMetadata,\n onInit?: (element: HTMLAudioElement) => void,\n shouldPlay = false,\n onForcePlay?: NoneToVoidFunction,\n onTrackChange?: NoneToVoidFunction,\n noPlaylist = false,\n noProgressUpdates = 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 const handleTrackChange = useCallback(() => {\n setIsPlaying(false);\n if (onTrackChange) onTrackChange();\n }, [onTrackChange]);\n\n useOnChange(() => {\n controllerRef.current = register(trackId, trackType, (eventName, e) => {\n switch (eventName) {\n case 'onPlay': {\n const {\n setVolume, setPlaybackRate, toggleMuted, proxy,\n } = controllerRef.current!;\n setIsPlaying(true);\n\n registerMediaSession(metadata, makeMediaHandlers(controllerRef));\n setPlaybackState('playing');\n setVolume(getGlobal().audioPlayer.volume);\n toggleMuted(!!getGlobal().audioPlayer.isMuted);\n if (trackType === 'voice') {\n setPlaybackRate(getGlobal().audioPlayer.playbackRate);\n }\n\n setPositionState({\n duration: proxy.duration || 0,\n playbackRate: proxy.playbackRate,\n position: proxy.currentTime,\n });\n break;\n }\n case 'onRateChange': {\n const { proxy } = controllerRef.current!;\n setPositionState({\n duration: proxy.duration || 0,\n playbackRate: proxy.playbackRate,\n position: proxy.currentTime,\n });\n break;\n }\n case 'onPause':\n setIsPlaying(false);\n setPlaybackState('paused');\n break;\n case 'onTimeUpdate': {\n const { proxy } = controllerRef.current!;\n const duration = proxy.duration && Number.isFinite(proxy.duration) ? proxy.duration : originalDuration;\n if (!noProgressUpdates) setPlayProgress(proxy.currentTime / duration);\n break;\n }\n case 'onEnded': {\n setPlaybackState('paused');\n break;\n }\n }\n\n handlers?.[eventName]?.(e);\n }, onForcePlay, handleTrackChange);\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 useEffect(() => {\n if (isPlaying && metadata) updateMetadata(metadata);\n }, [metadata, isPlaying]);\n\n const {\n play,\n pause,\n setCurrentTime,\n proxy,\n destroy,\n setVolume,\n stop,\n isFirst,\n isLast,\n requestNextTrack,\n requestPreviousTrack,\n setPlaybackRate,\n toggleMuted,\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) && !noProgressUpdates) {\n setPlayProgress(proxy.currentTime / duration);\n }\n }, [duration, playProgress, proxy, noProgressUpdates]);\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 playIfPresent = useCallback(() => {\n if (src) {\n play(src);\n }\n }, [src, play]);\n\n const playPause = useCallback(() => {\n if (isPlaying) {\n pause();\n } else {\n playIfPresent();\n }\n }, [pause, playIfPresent, isPlaying]);\n\n const setTime = useCallback((time: number) => {\n setCurrentTime(time);\n if (duration) {\n setPlayProgress(proxy.currentTime / duration);\n }\n }, [duration, proxy, setCurrentTime]);\n\n return {\n isPlaying: isPlayingSync,\n playProgress,\n playPause,\n pause,\n play: playIfPresent,\n stop,\n setCurrentTime: setTime,\n setVolume,\n audioProxy: proxy,\n duration,\n requestNextTrack,\n requestPreviousTrack,\n isFirst,\n isLast,\n setPlaybackRate,\n toggleMuted,\n };\n};\n\nfunction makeMediaHandlers(controllerRef: React.RefObject>) {\n let mediaHandlers: MediaSessionHandlers = {};\n if (controllerRef && controllerRef.current) {\n const {\n play, pause, setCurrentTime, proxy, requestNextTrack, requestPreviousTrack, isFirst, isLast,\n } = controllerRef.current;\n mediaHandlers = {\n play: () => {\n play(proxy.src);\n },\n pause: () => {\n pause();\n },\n stop: () => {\n pause();\n setCurrentTime(0);\n getDispatch().closeAudioPlayer();\n },\n seekbackward: (event) => {\n const skipTime = event.seekOffset || DEFAULT_SKIP_TIME;\n setCurrentTime(Math.max(proxy.currentTime - skipTime, 0));\n },\n seekforward: (event) => {\n const skipTime = event.seekOffset || DEFAULT_SKIP_TIME;\n setCurrentTime(Math.min(proxy.currentTime + skipTime, proxy.duration));\n },\n seekTo: (event) => {\n if (event.seekTime) {\n setCurrentTime(event.seekTime);\n }\n },\n };\n\n if (!isLast()) {\n mediaHandlers.nexttrack = () => {\n requestNextTrack();\n };\n }\n if (!isFirst()) {\n mediaHandlers.previoustrack = () => {\n requestPreviousTrack();\n };\n }\n }\n return mediaHandlers;\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 { 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, { 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","import { useEffect, useRef } from '../lib/teact/teact';\n\nimport fastBlur from '../lib/fastBlur';\nimport useForceUpdate from './useForceUpdate';\nimport { IS_CANVAS_FILTER_SUPPORTED } from '../util/environment';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\n\nexport default function useCanvasBlur(dataUri?: string, isDisabled = false, withRaf?: boolean) {\n // eslint-disable-next-line no-null/no-null\n const canvasRef = useRef(null);\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n const canvas = canvasRef.current;\n\n if (!dataUri || !canvas || isDisabled) {\n return;\n }\n\n const img = new Image();\n\n const processBlur = () => {\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d', { alpha: false })!;\n\n if (IS_CANVAS_FILTER_SUPPORTED) {\n ctx.filter = `blur(${RADIUS}px)`;\n }\n\n ctx.drawImage(img, -RADIUS * 2, -RADIUS * 2, canvas.width + RADIUS * 4, canvas.height + RADIUS * 4);\n\n if (!IS_CANVAS_FILTER_SUPPORTED) {\n fastBlur(ctx, 0, 0, canvas.width, canvas.height, RADIUS, ITERATIONS);\n }\n };\n\n img.onload = () => {\n if (withRaf) {\n requestAnimationFrame(processBlur);\n } else {\n processBlur();\n }\n };\n\n img.src = dataUri;\n }, [canvasRef, dataUri, forceUpdate, isDisabled, withRaf]);\n\n return canvasRef;\n}\n","import { useMemo } from '../lib/teact/teact';\nimport { getDispatch } from '../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../api/types';\n\nimport {\n isChatArchived, getCanDeleteChat, isUserId, isChatChannel,\n} from '../modules/helpers';\nimport { compact } from '../util/iteratees';\nimport useLang from './useLang';\n\nexport default ({\n chat,\n privateChatUser,\n handleDelete,\n handleChatFolderChange,\n folderId,\n isPinned,\n isMuted,\n}: {\n chat: ApiChat | undefined;\n privateChatUser: ApiUser | undefined;\n handleDelete: () => void;\n handleChatFolderChange: () => void;\n folderId?: number;\n isPinned?: boolean;\n isMuted?: boolean;\n}, isInSearch = false) => {\n const lang = useLang();\n\n const { isSelf } = privateChatUser || {};\n\n return useMemo(() => {\n if (!chat) {\n return undefined;\n }\n\n const {\n toggleChatPinned,\n updateChatMutedState,\n toggleChatArchived,\n toggleChatUnread,\n } = getDispatch();\n\n const actionAddToFolder = {\n title: lang('ChatList.Filter.AddToFolder'),\n icon: 'folder',\n handler: handleChatFolderChange,\n };\n\n const actionPin = isPinned\n ? {\n title: lang('UnpinFromTop'),\n icon: 'unpin',\n handler: () => toggleChatPinned({ id: chat.id, folderId }),\n }\n : { title: lang('PinToTop'), icon: 'pin', handler: () => toggleChatPinned({ id: chat.id, folderId }) };\n\n if (isInSearch) {\n return [actionPin, actionAddToFolder];\n }\n\n const actionUnreadMark = chat.unreadCount || chat.hasUnreadMark\n ? { title: lang('MarkAsRead'), icon: 'readchats', handler: () => toggleChatUnread({ id: chat.id }) }\n : { title: lang('MarkAsUnread'), icon: 'unread', handler: () => toggleChatUnread({ id: chat.id }) };\n\n const actionMute = isMuted\n ? {\n title: lang('ChatList.Unmute'),\n icon: 'unmute',\n handler: () => updateChatMutedState({ chatId: chat.id, isMuted: false }),\n }\n : {\n title: lang('ChatList.Mute'),\n icon: 'mute',\n handler: () => updateChatMutedState({ chatId: chat.id, isMuted: true }),\n };\n\n const actionArchive = isChatArchived(chat)\n ? { title: lang('Unarchive'), icon: 'unarchive', handler: () => toggleChatArchived({ id: chat.id }) }\n : { title: lang('Archive'), icon: 'archive', handler: () => toggleChatArchived({ id: chat.id }) };\n\n const actionDelete = {\n title: isUserId(chat.id)\n ? lang('Delete')\n : lang(getCanDeleteChat(chat)\n ? 'DeleteChat'\n : (isChatChannel(chat) ? 'LeaveChannel' : 'Group.LeaveGroup')),\n icon: 'delete',\n destructive: true,\n handler: handleDelete,\n };\n\n const isInFolder = folderId !== undefined;\n\n return compact([\n actionAddToFolder,\n actionUnreadMark,\n actionPin,\n !isSelf && actionMute,\n !isSelf && !isInFolder && actionArchive,\n actionDelete,\n ]);\n }, [chat, lang, handleChatFolderChange, isPinned, isInSearch, isMuted, handleDelete, folderId, isSelf]);\n};\n","import { RefObject } from 'react';\nimport { useState, useEffect, useCallback } from '../lib/teact/teact';\n\nimport { IAnchorPosition } from '../types';\nimport {\n IS_TOUCH_ENV, IS_SINGLE_COLUMN_LAYOUT, IS_PWA, IS_IOS,\n} from '../util/environment';\n\nconst LONG_TAP_DURATION_MS = 200;\n\nfunction checkIsDisabledForMobile() {\n return IS_SINGLE_COLUMN_LAYOUT\n && window.document.body.classList.contains('enable-symbol-menu-transforms');\n}\n\nfunction stopEvent(e: Event) {\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n}\n\nexport default (\n elementRef: RefObject,\n isMenuDisabled?: boolean,\n shouldDisableOnLink?: boolean,\n shouldDisableOnLongTap?: 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 document.body.classList.remove('no-selection');\n\n if (isMenuDisabled || (shouldDisableOnLink && (e.target as HTMLElement).matches('a[href]'))) {\n return;\n }\n e.preventDefault();\n\n if (contextMenuPosition) {\n return;\n }\n\n setIsContextMenuOpen(true);\n setContextMenuPosition({ x: e.clientX, y: e.clientY });\n }, [isMenuDisabled, shouldDisableOnLink, 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\n // Support context menu on touch-devices\n useEffect(() => {\n if (isMenuDisabled || !IS_TOUCH_ENV || shouldDisableOnLongTap) {\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, target } = originalEvent.touches[0];\n\n if (contextMenuPosition || (shouldDisableOnLink && (target as HTMLElement).matches('a[href]'))) {\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 stopEvent(e);\n }, true);\n\n // On iOS15, in PWA mode, the context menu immediately closes after opening\n if (IS_PWA && IS_IOS) {\n element.addEventListener('mousedown', function cancelClickOnce(e) {\n element.removeEventListener('mousedown', cancelClickOnce, true);\n stopEvent(e);\n }, true);\n }\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, shouldDisableOnLongTap, elementRef, shouldDisableOnLink]);\n\n return {\n isContextMenuOpen,\n contextMenuPosition,\n handleBeforeContextMenu,\n handleContextMenu,\n handleContextMenuClose,\n handleContextMenuHide,\n };\n};\n","import { useState, useEffect } from '../lib/teact/teact';\nimport { IAnchorPosition } from '../types';\n\nconst MENU_POSITION_VISUAL_COMFORT_SPACE_PX = 16;\nconst MENU_POSITION_BOTTOM_MARGIN = 12;\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 [withScroll, setWithScroll] = useState(false);\n const [style, setStyle] = useState('');\n const [menuStyle, setMenuStyle] = 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 let horizontalPostition: 'left' | 'right';\n if (x + menuRect.width + extraPaddingX < rootRect.width + rootRect.left) {\n x += 3;\n horizontalPostition = 'left';\n } else if (x - menuRect.width > 0) {\n horizontalPostition = 'right';\n x -= 3;\n } else {\n horizontalPostition = 'left';\n x = 16;\n }\n setPositionX(horizontalPostition);\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 + rootRect.height;\n }\n }\n\n const left = horizontalPostition === 'left'\n ? Math.min(x - triggerRect.left, rootRect.width - menuRect.width - MENU_POSITION_VISUAL_COMFORT_SPACE_PX)\n : Math.max((x - triggerRect.left), menuRect.width + MENU_POSITION_VISUAL_COMFORT_SPACE_PX);\n const top = Math.min(\n rootRect.height - triggerRect.top + triggerRect.height - MENU_POSITION_BOTTOM_MARGIN,\n y - triggerRect.top,\n );\n const menuMaxHeight = rootRect.height - MENU_POSITION_BOTTOM_MARGIN;\n\n setWithScroll(menuMaxHeight < menuRect.height);\n setMenuStyle(`max-height: ${menuMaxHeight}px;`);\n setStyle(`left: ${left}px; top: ${top}px`);\n }, [\n anchor, extraPaddingX, extraTopPadding,\n getMenuElement, getRootElement, getTriggerElement,\n ]);\n\n return {\n positionX,\n positionY,\n style,\n menuStyle,\n withScroll,\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 { 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: string,\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 { useEffect } from '../lib/teact/teact';\n\nexport default (container: HTMLElement | null, isDisabled?: boolean) => {\n useEffect(() => {\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 }, [container, isDisabled]);\n};\n","import { RefObject } from 'react';\nimport { useEffect } from '../lib/teact/teact';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../util/environment';\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\nexport default function useInputFocusOnOpen(\n inputRef: RefObject,\n isOpen?: boolean,\n onClose?: NoneToVoidFunction,\n) {\n useEffect(() => {\n if (isOpen) {\n if (!IS_SINGLE_COLUMN_LAYOUT) {\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 if (onClose) {\n setTimeout(onClose, MODAL_HIDE_DELAY_MS);\n }\n }\n }, [inputRef, isOpen, onClose]);\n}\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\nconst AUTO_UNFREEZE_TIMEOUT = 2000;\n\nexport function useIntersectionObserver({\n rootRef,\n throttleMs,\n debounceMs,\n shouldSkipFirst,\n margin,\n threshold,\n isDisabled,\n noAutoFreeze = false,\n}: {\n rootRef: RefObject;\n throttleMs?: number;\n debounceMs?: number;\n shouldSkipFirst?: boolean;\n margin?: number;\n threshold?: number | number[];\n isDisabled?: boolean;\n noAutoFreeze?: boolean;\n}, rootCallback?: RootCallback): Response {\n const controllerRef = useRef();\n const rootCallbackRef = useRef();\n const freezeFlagsRef = useRef(0);\n const autoUnfreezeTimeoutRef = useRef();\n const onUnfreezeRef = useRef();\n\n rootCallbackRef.current = rootCallback;\n\n const unfreeze = useCallback(() => {\n if (!freezeFlagsRef.current) {\n return;\n }\n\n freezeFlagsRef.current--;\n\n if (!freezeFlagsRef.current && onUnfreezeRef.current) {\n onUnfreezeRef.current();\n onUnfreezeRef.current = undefined;\n }\n }, []);\n\n const freeze = useCallback(() => {\n freezeFlagsRef.current++;\n\n if (noAutoFreeze) {\n return;\n }\n\n if (autoUnfreezeTimeoutRef.current) {\n clearTimeout(autoUnfreezeTimeoutRef.current);\n autoUnfreezeTimeoutRef.current = undefined;\n }\n\n // Make sure to unfreeze even if unfreeze callback was not called (which was some hardly-reproducible bug)\n autoUnfreezeTimeoutRef.current = window.setTimeout(() => {\n autoUnfreezeTimeoutRef.current = undefined;\n\n if (!freezeFlagsRef.current) {\n return;\n }\n\n freezeFlagsRef.current = 1;\n unfreeze();\n }, AUTO_UNFREEZE_TIMEOUT);\n }, [noAutoFreeze, unfreeze]);\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 (freezeFlagsRef.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 { useLayoutEffect } from '../lib/teact/teact';\nimport usePrevious from './usePrevious';\n\nexport default (cb: (args: PT) => void, dependencies: T, debugKey?: string) => {\n const prevDeps = usePrevious(dependencies);\n return useLayoutEffect(() => {\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, debugKey);\n};\n","import useShowTransition from './useShowTransition';\n\nexport default function useMediaTransition(mediaData?: any) {\n const isMediaReady = Boolean(mediaData);\n const { transitionClassNames } = useShowTransition(isMediaReady, undefined, isMediaReady, 'slow');\n\n return transitionClassNames;\n}\n","import { useRef } from '../lib/teact/teact';\nimport generateIdFor from '../util/generateIdFor';\n\nconst store: Record = {};\n\nexport default () => {\n const idRef = useRef();\n\n if (!idRef.current) {\n idRef.current = generateIdFor(store);\n store[idRef.current] = true;\n }\n\n return idRef.current;\n};\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';\nimport useUniqueId from './useUniqueId';\n\nconst STREAMING_PROGRESS = 0.75;\nconst STREAMING_TIMEOUT = 1500;\nconst PROGRESS_THROTTLE = 500;\n\nexport default function useMediaWithLoadProgress(\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 isHtmlAllowed = 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 id = useUniqueId();\n const [loadProgress, setLoadProgress] = useState(mediaData && !isStreaming ? 1 : 0);\n const startedAtRef = useRef();\n\n const handleProgress = useMemo(() => {\n return throttle((progress: number) => {\n if (startedAtRef.current && (!delay || (Date.now() - startedAtRef.current > delay))) {\n setLoadProgress(progress);\n }\n }, PROGRESS_THROTTLE, true);\n }, [delay]);\n\n useEffect(() => {\n if (!noLoad && mediaHash) {\n if (!mediaData) {\n setLoadProgress(0);\n\n if (startedAtRef.current) {\n mediaLoader.cancelProgress(handleProgress);\n }\n\n startedAtRef.current = Date.now();\n\n mediaLoader.fetch(mediaHash, mediaFormat, isHtmlAllowed, handleProgress, id).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 setLoadProgress(STREAMING_PROGRESS);\n }, STREAMING_TIMEOUT);\n }\n }\n }, [\n noLoad, mediaHash, mediaData, mediaFormat, cacheBuster, forceUpdate, isStreaming, delay, handleProgress,\n isHtmlAllowed, id,\n ]);\n\n useEffect(() => {\n if (noLoad && startedAtRef.current) {\n mediaLoader.cancelProgress(handleProgress);\n setLoadProgress(0);\n startedAtRef.current = undefined;\n }\n }, [handleProgress, noLoad]);\n\n useEffect(() => {\n return () => {\n if (mediaHash) {\n mediaLoader.removeCallback(mediaHash, id);\n }\n };\n }, [id, mediaHash]);\n\n return { mediaData, loadProgress };\n}\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, isDisabled = false,\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 && !isDisabled) {\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n onClose();\n }\n }, menuCloseTimeout * 2);\n }\n }, [isDisabled, 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 { useRef } from '../lib/teact/teact';\n\nimport usePrevious from './usePrevious';\nimport useForceUpdate from './useForceUpdate';\nimport useOnChange from './useOnChange';\n\nexport default function usePrevDuringAnimation(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 // eslint-disable-next-line no-null/no-null\n const isPrevPresent = prev !== undefined && prev !== 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 && isPrevPresent && !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 { 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 { 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","/* 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 { getDispatch, getGlobal } from '../lib/teact/teactn';\n\nimport { AudioOrigin, GlobalSearchContent } from '../types';\nimport { ApiMessage } from '../api/types';\n\nimport { IS_SAFARI } from './environment';\nimport safePlay from './safePlay';\nimport { patchSafariProgressiveAudio, isSafariPatchInProgress } from './patchSafariProgressiveAudio';\nimport { getMessageKey, MessageKey, parseMessageKey } from '../modules/helpers';\nimport { fastRaf } from './schedulers';\nimport { selectCurrentMessageList } from '../modules/selectors';\n\ntype Handler = (eventName: string, e: Event) => void;\nexport type TrackId = `${MessageKey}-${number}`;\n\nexport interface Track {\n audio: HTMLAudioElement;\n proxy: HTMLAudioElement;\n type: 'voice' | 'audio';\n handlers: Handler[];\n onForcePlay?: NoneToVoidFunction;\n onTrackChange?: NoneToVoidFunction;\n}\n\nconst tracks = new Map();\nlet voiceQueue: TrackId[] = [];\nlet musicQueue: TrackId[] = [];\n\nlet currentTrackId: TrackId | undefined;\n\nfunction createAudio(\n trackId: TrackId,\n type: Track['type'],\n onForcePlay?: NoneToVoidFunction,\n onTrackChange?: NoneToVoidFunction,\n): Track {\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 (!tracks.has(trackId)) {\n return;\n }\n\n if (isSafariPatchInProgress(audio)) {\n return;\n }\n\n playNext(trackId);\n });\n\n return {\n audio,\n type,\n proxy: new Proxy(audio, {\n get: (target, key: keyof HTMLAudioElement) => target[key],\n }),\n handlers: [],\n onForcePlay,\n onTrackChange,\n };\n}\n\nfunction playNext(trackId: TrackId, isReverseOrder?: boolean) {\n const currentTrack = currentTrackId && tracks.get(currentTrackId);\n if (currentTrack) {\n currentTrack.audio.pause();\n currentTrack.audio.currentTime = 0;\n if (currentTrack.onTrackChange) currentTrack.onTrackChange();\n }\n\n const origin = getGlobal().audioPlayer.origin || AudioOrigin.Inline;\n\n const nextTrackId = findNextInQueue(trackId, origin, isReverseOrder);\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(splitTrackId(nextTrackId).messageKey));\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\nexport function stopCurrentAudio() {\n const currentTrack = currentTrackId && tracks.get(currentTrackId);\n if (currentTrack) {\n currentTrack.audio.pause();\n }\n}\n\nexport function register(\n trackId: TrackId,\n trackType: Track['type'],\n handler: Handler,\n onForcePlay?: NoneToVoidFunction,\n onTrackChange?: NoneToVoidFunction,\n) {\n if (!tracks.has(trackId)) {\n const track = createAudio(trackId, trackType, onForcePlay, onTrackChange);\n tracks.set(trackId, track);\n addTrackToQueue(track, trackId);\n }\n const { audio, proxy, handlers } = tracks.get(trackId)!;\n\n handlers.push(handler);\n\n return {\n play(src: string) {\n if (!audio.paused) return;\n const currentTrack = currentTrackId && tracks.get(currentTrackId);\n if (currentTrack && currentTrackId !== trackId) {\n currentTrack.audio.pause();\n currentTrack.audio.currentTime = 0;\n if (isSafariPatchInProgress(currentTrack.audio)) {\n currentTrack.audio.dataset.preventPlayAfterPatch = 'true';\n }\n if (currentTrack.onTrackChange) currentTrack.onTrackChange();\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 delete audio.dataset.preventPlayAfterPatch;\n patchSafariProgressiveAudio(audio);\n }\n }\n\n safePlay(audio);\n cleanUpQueue(trackType, trackId);\n },\n\n pause() {\n if (currentTrackId === trackId) {\n audio.pause();\n }\n },\n\n stop() {\n if (currentTrackId === trackId) {\n // Hack, reset src to remove default media session notification\n const prevSrc = audio.src;\n audio.pause();\n // onPause not called otherwise, but required to sync UI\n fastRaf(() => {\n audio.src = '';\n audio.src = prevSrc;\n });\n }\n },\n\n setCurrentTime(time: number) {\n if (currentTrackId === trackId) {\n if (audio.fastSeek) {\n audio.fastSeek(time);\n } else {\n audio.currentTime = time;\n }\n }\n },\n\n setVolume(volume: number) {\n if (currentTrackId === trackId) {\n audio.volume = volume;\n audio.muted = false;\n }\n },\n\n setPlaybackRate(rate: number) {\n if (currentTrackId === trackId) {\n audio.playbackRate = rate;\n }\n },\n\n toggleMuted(muted?: boolean) {\n if (muted === undefined) {\n audio.muted = !audio.muted;\n } else {\n audio.muted = muted;\n }\n },\n\n proxy,\n\n requestNextTrack() {\n playNext(trackId);\n },\n\n isLast() {\n return !findNextInQueue(trackId, getGlobal().audioPlayer.origin);\n },\n\n isFirst() {\n return !findNextInQueue(trackId, getGlobal().audioPlayer.origin, true);\n },\n\n requestPreviousTrack() {\n playNext(trackId, true);\n },\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 removeFromQueue(track, trackId);\n }\n\n if (trackId === currentTrackId) {\n currentTrackId = undefined;\n }\n }\n },\n };\n}\n\nfunction getTrackQueue(track: Track) {\n switch (track.type) {\n case 'audio': return musicQueue;\n case 'voice': return voiceQueue;\n default: return undefined;\n }\n}\n\nfunction addTrackToQueue(track: Track, trackId: TrackId) {\n if (track.type === 'audio' && !musicQueue.includes(trackId)) {\n musicQueue.push(trackId);\n musicQueue.sort(trackIdComparator);\n }\n\n if (track.type === 'voice' && !voiceQueue.includes(trackId)) {\n voiceQueue.push(trackId);\n voiceQueue.sort(trackIdComparator);\n }\n}\n\nfunction removeFromQueue(track: Track, trackId: TrackId) {\n const trackIdFilter = (el: TrackId) => el !== trackId;\n if (track.type === 'audio') {\n musicQueue = musicQueue.filter(trackIdFilter);\n }\n\n if (track.type === 'voice') {\n voiceQueue = voiceQueue.filter(trackIdFilter);\n }\n}\n\nfunction cleanUpQueue(type: Track['type'], trackId: TrackId) {\n if (getGlobal().globalSearch.currentContent === GlobalSearchContent.Music) return;\n const { chatId } = parseMessageKey(splitTrackId(trackId).messageKey);\n const openedChatId = selectCurrentMessageList(getGlobal())?.chatId;\n const queueFilter = (id: string) => (\n id.startsWith(`msg${chatId}`) || (openedChatId && id.startsWith(`msg${openedChatId}`))\n );\n\n if (type === 'audio') {\n musicQueue = musicQueue.filter(queueFilter);\n }\n\n if (type === 'voice') {\n voiceQueue = voiceQueue.filter(queueFilter);\n }\n}\n\nfunction findNextInQueue(currentId: TrackId, origin = AudioOrigin.Inline, isReverseOrder?: boolean) {\n const track = tracks.get(currentId)!;\n const queue = getTrackQueue(track);\n if (!queue) return undefined;\n\n if (origin === AudioOrigin.Search) {\n const index = queue.indexOf(currentId);\n if (index < 0) return undefined;\n const direction = isReverseOrder ? -1 : 1;\n return queue[index + direction];\n }\n\n const { chatId } = parseMessageKey(splitTrackId(currentId).messageKey);\n const chatAudio = queue.filter((id) => id.startsWith(`msg${chatId}`));\n const index = chatAudio.indexOf(currentId);\n if (index < 0) return undefined;\n let direction = origin === AudioOrigin.Inline ? -1 : 1;\n if (isReverseOrder) direction *= -1;\n return chatAudio[index + direction];\n}\n\nexport function makeTrackId(message: ApiMessage): TrackId {\n return `${getMessageKey(message)}-${message.date}`;\n}\n\nfunction splitTrackId(trackId: TrackId) {\n const messageKey = trackId.match(/^msg(-?\\d+)-(\\d+)/)![0] as MessageKey;\n const date = Number(trackId.split('-').pop());\n return {\n messageKey,\n date,\n };\n}\n\n// Descending order by date\nfunction trackIdComparator(one?: TrackId, two?: TrackId) {\n if (!one || !two) return 0;\n const { date: dateOne, messageKey: keyOne } = splitTrackId(one);\n const { date: dateTwo, messageKey: keyTwo } = splitTrackId(two);\n const diff = dateTwo - dateOne;\n return diff === 0 ? keyTwo.localeCompare(keyOne) : diff;\n}\n","import { IS_IOS } from './environment';\n\nexport 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) => boolean;\n onClick?: (e: MouseEvent | TouchEvent) => void;\n excludedClosestSelector?: string;\n selectorToPreventScroll?: 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\ntype TSwipeAxis =\n 'x'\n | 'y'\n | undefined;\n\nconst IOS_SCREEN_EDGE_THRESHOLD = 20;\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 let hasSwiped = false;\n let initialSwipeAxis: TSwipeAxis | undefined;\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 // We need to always listen on `touchstart` target:\n // https://stackoverflow.com/questions/33298828/touch-move-event-dont-fire-after-touch-start-target-is-removed\n const target = e.target as HTMLElement;\n target.addEventListener('touchmove', onMove, { passive: true });\n target.addEventListener('touchend', onRelease);\n target.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 (captureEvent.target as HTMLElement).removeEventListener('touchcancel', onRelease);\n (captureEvent.target as HTMLElement).removeEventListener('touchend', onRelease);\n (captureEvent.target as HTMLElement).removeEventListener('touchmove', onMove);\n\n captureEvent = undefined;\n\n if (IS_IOS && options.selectorToPreventScroll) {\n Array.from(document.querySelectorAll(options.selectorToPreventScroll)).forEach((scrollable) => {\n scrollable.style.overflow = '';\n });\n }\n\n if (hasMoved) {\n if (options.onRelease) {\n options.onRelease(e);\n }\n } else if (options.onClick && (!('button' in e) || e.button === 0)) {\n options.onClick(e);\n }\n }\n\n hasMoved = false;\n hasSwiped = false;\n initialSwipeAxis = undefined;\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 let shouldPreventScroll = false;\n\n if (options.onDrag) {\n options.onDrag(e, captureEvent, { dragOffsetX, dragOffsetY });\n shouldPreventScroll = true;\n }\n\n if (options.onSwipe && !hasSwiped) {\n hasSwiped = onSwipe(e, dragOffsetX, dragOffsetY);\n shouldPreventScroll = hasSwiped;\n }\n\n if (IS_IOS && shouldPreventScroll && options.selectorToPreventScroll) {\n Array.from(document.querySelectorAll(options.selectorToPreventScroll)).forEach((scrollable) => {\n scrollable.style.overflow = 'hidden';\n });\n }\n }\n }\n\n function onSwipe(e: MouseEvent | RealTouchEvent, dragOffsetX: number, dragOffsetY: number) {\n // Avoid conflicts with swipe-to-back gestures\n if (IS_IOS) {\n const x = (e as RealTouchEvent).touches[0].pageX;\n if (x <= IOS_SCREEN_EDGE_THRESHOLD || x >= window.innerWidth - IOS_SCREEN_EDGE_THRESHOLD) {\n return false;\n }\n }\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 false;\n }\n }\n\n let axis: TSwipeAxis | undefined;\n if (xAbs >= SWIPE_THRESHOLD) {\n axis = 'x';\n } else if (yAbs >= SWIPE_THRESHOLD) {\n axis = 'y';\n }\n\n if (!axis) {\n return false;\n }\n\n if (!initialSwipeAxis) {\n initialSwipeAxis = axis;\n } else if (initialSwipeAxis !== axis) {\n // Prevent horizontal swipe after vertical to prioritize scroll\n return false;\n }\n\n return processSwipe(e, axis, dragOffsetX, dragOffsetY, options.onSwipe!);\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,\n currentSwipeAxis: TSwipeAxis,\n dragOffsetX: number,\n dragOffsetY: number,\n onSwipe: (e: Event, direction: SwipeDirection) => boolean,\n) {\n if (currentSwipeAxis === 'x') {\n if (dragOffsetX < 0) {\n return onSwipe(e, SwipeDirection.Left);\n } else {\n return onSwipe(e, SwipeDirection.Right);\n }\n } else if (currentSwipeAxis === 'y') {\n if (dragOffsetY < 0) {\n return onSwipe(e, SwipeDirection.Up);\n } else {\n return onSwipe(e, SwipeDirection.Down);\n }\n }\n\n return false;\n}\n","// Sometimes event is fired earlier than animation completes\nconst ANIMATION_END_DELAY = 50;\n\nexport function waitForTransitionEnd(node: Node, handler: NoneToVoidFunction, propertyName?: string) {\n waitForEndEvent('transitionend', node, handler, propertyName);\n}\n\nexport function waitForAnimationEnd(node: Node, handler: NoneToVoidFunction, animationName?: string) {\n waitForEndEvent('animationend', node, handler, animationName);\n}\n\nfunction waitForEndEvent(\n eventType: 'transitionend' | 'animationend',\n node: Node,\n handler: NoneToVoidFunction,\n detailedName?: string,\n) {\n let isHandled = false;\n\n node.addEventListener(eventType, function handleAnimationEnd(e: TransitionEvent | AnimationEvent) {\n if (isHandled || e.target !== e.currentTarget) {\n return;\n }\n\n if (detailedName && (\n (e instanceof TransitionEvent && e.propertyName === detailedName)\n || (e instanceof AnimationEvent && e.animationName === detailedName)\n )) {\n return;\n }\n\n isHandled = true;\n\n node.removeEventListener(eventType, handleAnimationEnd as EventListener);\n\n setTimeout(() => {\n handler();\n }, ANIMATION_END_DELAY);\n } as EventListener);\n}\n","export default function cycleRestrict(length: number, index: number) {\n return index - Math.floor(index / length) * length;\n}\n","import { getGlobal } from '../lib/teact/teactn';\n\nimport { FocusDirection } from '../types';\n\nimport {\n ANIMATION_LEVEL_MIN,\n FAST_SMOOTH_MAX_DISTANCE, FAST_SMOOTH_MAX_DURATION, FAST_SMOOTH_MIN_DURATION,\n FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE,\n} from '../config';\nimport { dispatchHeavyAnimationEvent } from '../hooks/useHeavyAnimationCheck';\nimport { animateSingle } from './animation';\n\nlet isAnimating = false;\n\nexport default function fastSmoothScroll(\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition | 'centerOrTop',\n margin = 0,\n maxDistance = FAST_SMOOTH_MAX_DISTANCE,\n forceDirection?: FocusDirection,\n forceDuration?: number,\n forceNormalContainerHeight?: boolean,\n) {\n const scrollFrom = calculateScrollFrom(container, element, maxDistance, forceDirection);\n\n if (forceDirection === FocusDirection.Static) {\n scrollWithJs(container, element, scrollFrom, position, margin, 0);\n return;\n }\n\n if (getGlobal().settings.byKey.animationLevel === ANIMATION_LEVEL_MIN) {\n forceDuration = 0;\n }\n\n scrollWithJs(container, element, scrollFrom, position, margin, forceDuration, forceNormalContainerHeight);\n}\n\nexport function isAnimatingScroll() {\n return isAnimating;\n}\n\nfunction calculateScrollFrom(\n container: HTMLElement,\n element: HTMLElement,\n maxDistance = FAST_SMOOTH_MAX_DISTANCE,\n forceDirection?: FocusDirection,\n) {\n const { offsetTop: elementTop } = element;\n const { scrollTop } = container;\n\n if (forceDirection === undefined) {\n const offset = elementTop - container.scrollTop;\n\n if (offset < -maxDistance) {\n return scrollTop + (offset + maxDistance);\n } else if (offset > maxDistance) {\n return scrollTop + (offset - maxDistance);\n }\n } else if (forceDirection === FocusDirection.Up) {\n return elementTop + maxDistance;\n } else if (forceDirection === FocusDirection.Down) {\n return Math.max(0, elementTop - maxDistance);\n }\n\n return scrollTop;\n}\n\nfunction scrollWithJs(\n container: HTMLElement,\n element: HTMLElement,\n scrollFrom: number,\n position: ScrollLogicalPosition | 'centerOrTop',\n margin = 0,\n forceDuration?: number,\n forceNormalContainerHeight?: boolean,\n) {\n const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\n const { scrollTop: currentScrollTop, offsetHeight: containerHeight, scrollHeight } = container;\n const targetContainerHeight = forceNormalContainerHeight && container.dataset.normalHeight\n ? Number(container.dataset.normalHeight)\n : containerHeight;\n\n if (currentScrollTop !== scrollFrom) {\n container.scrollTop = scrollFrom;\n }\n\n let path!: number;\n\n switch (position) {\n case 'start':\n path = (elementTop - margin) - scrollFrom;\n break;\n case 'end':\n path = (elementTop + elementHeight + margin) - (scrollFrom + targetContainerHeight);\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n case 'centerOrTop':\n path = elementHeight < targetContainerHeight\n ? (elementTop + elementHeight / 2) - (scrollFrom + targetContainerHeight / 2)\n : (elementTop - margin) - scrollFrom;\n break;\n }\n\n if (path < 0) {\n const remainingPath = -scrollFrom;\n path = Math.max(path, remainingPath);\n } else if (path > 0) {\n const remainingPath = scrollHeight - (scrollFrom + targetContainerHeight);\n path = Math.min(path, remainingPath);\n }\n\n if (path === 0) {\n return;\n }\n\n const target = scrollFrom + path;\n\n if (forceDuration === 0) {\n container.scrollTop = target;\n return;\n }\n\n isAnimating = true;\n\n const absPath = Math.abs(path);\n const transition = absPath < FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE ? shortTransition : longTransition;\n const duration = forceDuration || (\n FAST_SMOOTH_MIN_DURATION\n + (absPath / FAST_SMOOTH_MAX_DISTANCE) * (FAST_SMOOTH_MAX_DURATION - FAST_SMOOTH_MIN_DURATION)\n );\n const startAt = Date.now();\n const onHeavyAnimationStop = dispatchHeavyAnimationEvent();\n\n animateSingle(() => {\n const t = Math.min((Date.now() - startAt) / duration, 1);\n const currentPath = path * (1 - transition(t));\n\n container.scrollTop = Math.round(target - currentPath);\n\n isAnimating = t < 1;\n\n if (!isAnimating) {\n onHeavyAnimationStop();\n }\n\n return isAnimating;\n });\n}\n\nfunction longTransition(t: number) {\n return 1 - ((1 - t) ** 5);\n}\n\nfunction shortTransition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n","import { getGlobal } from '../lib/teact/teactn';\n\nimport { ANIMATION_LEVEL_MIN } from '../config';\nimport { IS_IOS } from './environment';\nimport { animate } from './animation';\n\nconst DEFAULT_DURATION = 300;\n\nexport default function fastSmoothScrollHorizontal(container: HTMLElement, left: number, duration = DEFAULT_DURATION) {\n if (getGlobal().settings.byKey.animationLevel === ANIMATION_LEVEL_MIN) {\n duration = 0;\n }\n\n // Native way seems to be smoother in Chrome\n if (!IS_IOS) {\n container.scrollTo({\n left,\n ...(duration && { behavior: 'smooth' }),\n });\n } else {\n scrollWithJs(container, left, duration);\n }\n}\n\nfunction scrollWithJs(container: HTMLElement, left: number, duration: 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 if (path === 0) {\n return;\n }\n\n const target = scrollLeft + path;\n\n if (duration === 0) {\n container.scrollLeft = target;\n return;\n }\n\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_TOUCH_ENV } from './environment';\n\nexport default function focusEditableElement(element: HTMLElement, force?: boolean) {\n if (!force && element === document.activeElement) {\n return;\n }\n\n const selection = window.getSelection()!;\n const range = document.createRange();\n const lastChild = element.lastChild || element;\n\n if (!IS_TOUCH_ENV && (!lastChild || !lastChild.nodeValue)) {\n element.focus();\n return;\n }\n\n range.selectNodeContents(lastChild);\n // `false` means collapse to the end rather than the start\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n}\n","export type MediaSessionHandlers = {\n play?: () => void;\n pause?: () => void;\n stop?: () => void;\n\n previoustrack?: () => void;\n nexttrack?: () => void;\n\n togglemicrophone?: () => void;\n togglecamera?: () => void;\n hangup?: () => void;\n\n seekbackward?: (details: MediaSessionActionDetails) => void;\n seekforward?: (details: MediaSessionActionDetails) => void;\n seekTo?: ((details: MediaSessionActionDetails) => void);\n};\n\ninterface MediaMetadataParameters {\n title?: string;\n artist?: string;\n album?: string;\n artwork?: MediaImage[];\n}\n\nconst DEFAULT_HANDLERS = {\n play: undefined,\n pause: undefined,\n seekbackward: undefined,\n seekforward: undefined,\n previoustrack: undefined,\n nexttrack: undefined,\n stop: undefined,\n seekTo: undefined,\n};\n\nexport function registerMediaSession(metadata?: MediaMetadata, handlers?: MediaSessionHandlers) {\n const { mediaSession } = window.navigator;\n if (mediaSession) {\n if (metadata) updateMetadata(metadata);\n if (handlers) setMediaSessionHandlers(handlers);\n } else {\n // eslint-disable-next-line no-console\n console.warn('MediaSession API not supported in this browser');\n }\n}\n\nexport function updateMetadata(metadata?: MediaMetadata) {\n const { mediaSession } = window.navigator;\n if (mediaSession) {\n // eslint-disable-next-line no-null/no-null\n mediaSession.metadata = metadata ?? null;\n }\n}\n\nexport function setMediaSessionHandlers(handlers: MediaSessionHandlers) {\n const { mediaSession } = window.navigator;\n if (mediaSession) {\n Object.entries({ ...DEFAULT_HANDLERS, ...handlers }).forEach(([key, handler]) => {\n try {\n // @ts-ignore API not standardized yet\n mediaSession.setActionHandler(key, handler);\n } catch (err) {\n // Handler not supported, ignoring\n }\n });\n }\n}\n\nexport function clearMediaSession() {\n const { mediaSession } = window.navigator;\n if (mediaSession) {\n // eslint-disable-next-line no-null/no-null\n mediaSession.metadata = null;\n setMediaSessionHandlers(DEFAULT_HANDLERS);\n if (mediaSession.playbackState) mediaSession.playbackState = 'none';\n mediaSession.setPositionState?.();\n }\n}\n\nexport function setPlaybackState(state: 'none' | 'paused' | 'playing' = 'none') {\n const { mediaSession } = window.navigator;\n if (mediaSession && mediaSession.playbackState) {\n mediaSession.playbackState = state;\n }\n}\n\nexport function setPositionState(state?: MediaPositionState) {\n if (!state || state.position === undefined || state.duration === undefined) return;\n state.position = Math.min(state.position, state.duration);\n\n const { mediaSession } = window.navigator;\n mediaSession?.setPositionState?.(state);\n}\n\nexport function setMicrophoneActive(active: boolean) {\n const { mediaSession } = window.navigator;\n // @ts-ignore typings not updated yet\n mediaSession?.setMicrophoneActive?.(active);\n}\n\nexport function setCameraActive(active: boolean) {\n const { mediaSession } = window.navigator;\n // @ts-ignore typings not updated yet\n mediaSession?.setCameraActive?.(active);\n}\n\nexport function buildMediaMetadata({\n title, artist, album, artwork,\n}: MediaMetadataParameters) {\n if ('MediaMetadata' in window) {\n return new window.MediaMetadata({\n title,\n artist,\n album,\n artwork,\n });\n }\n return undefined;\n}\n","import { ApiMessageEntity, ApiMessageEntityTypes, ApiFormattedText } from '../api/types';\nimport { IS_EMOJI_SUPPORTED } from './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;\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, '');\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\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 (new line in Safari)\n parsedHtml = parsedHtml.replace(/
]*)?><\\/div>/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(/[_]{2}([^*\\n]+)[_]{2}/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: string | undefined;\n if (type === ApiMessageEntityTypes.TextUrl) {\n url = (node as HTMLAnchorElement).href;\n }\n if (type === ApiMessageEntityTypes.MentionName) {\n userId = (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.dataset.entityType === ApiMessageEntityTypes.Url) {\n return ApiMessageEntityTypes.Url;\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","/*\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 audioEl.dataset.patchForSafariInProgress = 'true';\n function onProgress() {\n if (!audioEl.buffered.length) {\n return;\n }\n audioEl.currentTime = audioEl.duration - 1;\n audioEl.addEventListener('progress', () => {\n delete audioEl.dataset.patchForSafariInProgress;\n audioEl.currentTime = t;\n if (audioEl.paused && !audioEl.dataset.preventPlayAfterPatch) {\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"],"names":["WIDTH","large","medium","small","sticker","size","observeIntersection","lastSyncTime","forceLoadPreview","ref","useRef","isAnimationLoaded","markAnimationLoaded","useFlag","localMediaHash","id","isIntersecting","useIsIntersecting","thumbDataUri","thumbnail","dataUri","previewBlobUrl","useMedia","ApiMediaFormat","transitionClassNames","useMediaTransition","mediaData","isMediaLoaded","Boolean","playKey","setPlayKey","useState","String","Math","random","handleClick","useCallback","width","style","className","onClick","src","LIKE_STICKER_ID","undefined","alt","key","animationData","quality","play","noLoop","onLoad","MIN_SPIKES","IS_SINGLE_COLUMN_LAYOUT","MAX_SPIKES","renderSeekline","playProgress","bufferedProgress","seekerRef","memo","theme","message","senderTitle","uploadProgress","origin","date","isSelectable","isSelected","isDownloading","onPlay","onReadMedia","onCancelUpload","onDateClick","content","audio","voice","video","isMediaUnread","isVoice","isSeeking","playStateBeforeSeeking","lang","useLang","isRtl","dispatch","getDispatch","isActivated","setIsActivated","shouldLoad","coverHash","getMessageMediaHash","coverBlobUrl","getMessageMediaFormat","loadProgress","downloadProgress","useMediaWithLoadProgress","handleForcePlay","chatId","handleTrackChange","isBuffered","bufferingHandlers","checkBuffering","useBuffering","isPlaying","playPause","pause","setCurrentTime","duration","useAudioPlayer","makeTrackId","getMediaDuration","isMessageLocal","isOwn","isOwnMessage","waveformCanvasRef","canvasRef","data","spikes","peak","useMemo","waveform","Array","min","fill","durationFactor","spikesCount","round","fitCount","newData","springFactor","length","leftFiller","rightFiller","i","idx","floor","val","interpolateArray","encoded5bit","bitsCount","valuesCount","result","bitsData","l","byteIndex","bitShift","value","lastByteIndex","lastBitShift","lastValue","decodeWaveform","Uint8Array","useLayoutEffect","canvas","current","progress","fillStyle","progressFillStyle","height","ctx","getContext","scale","forEach","item","globalAlpha","spikeHeight","max","x","y","radius","beginPath","moveTo","arcTo","closePath","roundedRectangle","renderWaveform","useWaveformCanvas","withSeekline","useEffect","isLoadingForPlaying","isUploading","isTransferring","transferProgress","getMediaTransferState","shouldRender","shouldRenderSpinner","spinnerClassNames","useShowTransition","shouldRenderCross","handleButtonClick","setAudioPlayerOrigin","handleDownloadClick","cancelMessageMediaDownload","downloadMessageMedia","handleSeek","e","left","getBoundingClientRect","clientX","MouseEvent","targetTouches","stopPropagation","handleStartSeek","button","handleStopSeek","handleDateClick","renderFirstLine","title","fileName","captureEvents","onCapture","onRelease","onDrag","fullClassName","buildClassName","AudioOrigin","buttonClassNames","push","contentClassName","renderWithTitle","dir","renderText","Link","formatPastTimeShort","formatMediaDuration","performer","renderSecondLine","Button","ripple","color","join","ariaLabel","backgroundImage","ProgressSpinner","transparent","noCross","showProgress","showSeekline","getTranslation","getFileSizeString","formatMediaDateTime","renderAudio","draggable","renderVoice","withGlobal","global","chatOrUserId","countryList","phoneCodes","phoneCodeList","chat","selectChat","user","isUserId","selectUser","isMuted","selectIsChatMuted","selectNotifySettings","selectNotifyExceptions","canInviteUsers","isChatChannel","isUserRightBanned","getHasAdminRight","setGlobal","actions","pick","forceShowSelf","loadFullUser","showNotification","updateChatMutedState","userId","fullInfo","username","phoneNumber","isSelf","handleNotificationChange","isRestricted","copy","text","entity","copyTextToClipboard","formattedNumber","formatPhoneNumberWithCode","link","getChatLink","description","bio","getChatDescription","icon","multiline","narrow","isStatic","label","checked","inactive","isPrivateChat","isChatWithSelf","selectIsChatWithSelf","getPrivateChatUserId","isBot","isUserBot","isSupport","canDeleteForAll","contactName","getUserFirstOrLastName","isChannel","isBasicGroup","isChatBasicGroup","isSuperGroup","isChatSuperGroup","currentUserId","isOpen","onClose","onCloseAnimationEnd","leaveChannel","deleteHistory","deleteChannel","deleteChatUser","blockContact","chatTitle","getChatTitle","handleDeleteMessageForAll","shouldDeleteForAll","handleDeleteAndStop","contactId","accessHash","handleDeleteChat","isCreator","header","isSavedMessages","isText","smaller","canAutoLoad","autoLoadFileMaxSizeMb","withDate","datetime","sender","onMediaClick","document","timestamp","extension","getDocumentExtension","wasIntersected","markIntersected","isLoadAllowed","setIsLoadAllowed","shouldDownload","documentHash","isLoaded","hasPreview","getDocumentHasPreview","getMessageMediaThumbDataUri","localBlobUrl","previewData","withMediaViewer","mediaType","name","thumbnailDataUri","actionIcon","isMessageDocumentVideo","elementRef","shouldSpinnerRender","getColorFromExtension","sizeString","getDocumentThumbnailDimensions","onlineCount","selectChatOnlineCount","areMessagesLoaded","selectChatMessages","typingStatus","avatarSize","withUsername","withFullInfo","withUpdatingStatus","withChatType","noRtl","loadFullChat","openMediaViewer","isMin","handleAvatarViewerOpen","hasPhoto","avatarOwnerId","MediaViewerOrigin","isVerified","getChatTypeString","handle","groupStatus","chatTypeString","membersCount","getGroupStatus","onlineStatus","renderStatusOrTyping","outgoingStatus","status","idPrefix","mediaBlobUrl","getMessageVideo","isGif","Keys","activeKey","itemIds","selectedIds","filterValue","filterPlaceholder","notFoundText","searchInputId","isLoading","noScrollRestore","onSelectedIdsChange","onFilterChange","onLoadMore","inputRef","shouldMinimize","setTimeout","requestAnimationFrame","focus","handleItemClick","newSelectedIds","includes","splice","indexOf","handleFilterChange","currentTarget","viewportIds","getMore","useInfiniteScroll","map","isMinimized","canClose","clickArg","onChange","placeholder","items","iconElement","titleText","serverTimeOffset","noStatusOrTyping","fullName","getUserFullName","isUserOnline","getUserStatus","photo","isFirstPhoto","isDeleted","isDeletedUser","isRepliesChat","isChatWithRepliesBot","getMediaHash","forceAvatar","hash","getChatAvatarHash","photoBlobUrl","avatarMediaHash","avatarBlobUrl","useBlurSync","imageSrc","prevImageSrc","usePrevious","decoding","userFullName","getFirstLetters","Spinner","getUserColorKey","connectionState","animationLevel","settings","byKey","photos","slideAnimation","currentPhotoIndex","setCurrentPhotoIndex","isFirst","isLast","profile","currentIndex","slice","mediaLoader","usePhotosPreload","handleProfilePhotoClick","profilePhotoIndex","selectPreviousMedia","selectNextMedia","element","querySelector","selectorToPreventScroll","onSwipe","IS_TOUCH_ENV","direction","SwipeDirection","renderPhoto","isVerifiedIconShown","_","renderPhotoTabs","Transition","type","VerifiedIcon","noAnimate","onUnfaveClick","stickerSelector","shouldPlay","lottieData","isAnimated","markLoaded","unmarkLoaded","canAnimatedPlay","previewTransitionClassNames","emoji","onMouseDown","preventMessageInputBlurWithBubbling","isLowPriority","preventDefault","props","StickerSetModal","useModuleLoader","Bundles","typingUser","typingUserName","action","replace","trim","onMessageClick","linkData","getMessageWebPage","getFirstLinkInMessage","url","domain","messageText","getMessageSummaryText","siteName","handleMessageClick","displayUrl","truncatedDescription","trimText","MEDIA_VIEWER_MEDIA_QUERY","REM","parseInt","getComputedStyle","documentElement","fontSize","ROUND_VIDEO_DIMENSIONS_PX","AVATAR_FULL_DIMENSIONS","DEFAULT_MEDIA_DIMENSIONS","cachedMaxWidthOwn","cachedMaxWidth","cachedMaxWidthNoAvatar","getAvailableWidth","fromOwnMessage","isForwarded","isWebPagePhoto","noAvatars","extraPaddingRem","regularMaxWidth","windowWidth","windowSize","getMaxMessageWidthRem","calculateDimensionsForMessageMedia","aspectRatio","availableWidth","availableHeight","getAvailableHeight","mediaWidth","calculateDimensions","getMediaViewerAvailableDimensions","withFooter","isVideo","mql","window","matchMedia","windowHeight","occupiedHeightRem","matches","calculateInlineImageDimensions","getPhotoInlineDimensions","calculateVideoDimensions","getVideoDimensions","getPictogramDimensions","getStickerDimensions","baseWidth","STICKER_SIZE_INLINE_MOBILE_FACTOR","STICKER_SIZE_INLINE_DESKTOP_FACTOR","calculatedHeight","calculateMediaViewerDimensions","mediaHeight","calculatedWidth","renderMessageText","highlight","shouldRenderHqEmoji","formattedText","rawText","getMessageText","entities","renderTextWithEntities","organizeEntity","index","organizedEntityIndexes","offset","organizedIndexes","Set","has","nestedEntities","filter","parsedEntity","isChanged","organizedIndex","add","organizeEntities","organizedEntities","organizedEntity","shouldRenderAsHtml","renderMessagePart","deleteLineBreakAfterPre","renderEntity","textPartStart","textPartEnd","isLastEntity","renderResult","textBefore","substring","textBeforeLength","substr","entityStartIndex","entityEndIndex","entityContent","nestedEntityContent","ApiMessageEntityTypes","nestedIndex","nestedEntity","nestedEntityIndex","nestedResult","nestedEntityEndIndex","newEntity","rawEntityText","renderedContent","getLinkUrl","processEntityAsHtml","entityText","handleBotCommandClick","handleHashtagClick","href","target","rel","processEntity","isArray","textAfter","arrayIndex","c","emojiFilter","sendBotCommand","command","innerText","setLocalTextSearchQuery","query","searchTextMessagesLocal","ChatFolderModal","ChatAnimationTypes","isPinned","isShown","unreadCount","hasUnreadMark","renderContent","unreadMentionsCount","formatIntegerCompact","ShowTransition","isCustom","isActive","lastMessage","senderId","replyToMessageId","isOutgoing","lastMessageSender","lastMessageAction","getMessageAction","actionTargetMessage","selectChatMessage","targetUserIds","actionTargetUserIds","targetChatId","actionTargetChatId","privateChatUserId","byId","usersById","users","currentChatId","threadId","currentThreadId","messageListType","selectCurrentMessageList","MAIN_THREAD_ID","draft","selectDraft","canScrollDown","lastMessageOutgoingStatus","selectOutgoingStatus","privateChatUser","folderId","orderDiff","animationType","openChat","focusLastMessage","isDeleteModalOpen","openDeleteModal","closeDeleteModal","isChatFolderModalOpen","openChatFolderModal","closeChatFolderModal","shouldRenderDeleteModal","markRenderDeleteModal","unmarkRenderDeleteModal","shouldRenderChatFolderModal","markRenderChatFolderModal","unmarkRenderChatFolderModal","isAction","isActionMessage","useEnsureMessage","mediaThumbnail","getMessageSticker","isRoundVideo","getMessageRoundVideo","actionTargetUsers","Opacity","opacity","fastRaf","classList","Move","transform","remove","ANIMATION_END_DELAY","shouldReplaceHistory","contextActions","useChatContextActions","handleDelete","handleChatFolderChange","ListItem","Avatar","withOnlineStatus","isCallActive","isCallNotEmpty","LastMessageMeta","TypingStatus","actionOrigin","renderActionMessageText","asPlain","senderName","getMessageSenderName","blobUrl","renderMessageSummary","renderLastMessageOrTyping","DeleteChatModal","folderType","chatFolder","selectChatFolder","animatedEmoji","selectAnimatedEmoji","foldersDispatch","onScreenSelect","handleEditFolder","payload","SettingsScreens","AnimatedEmoji","fluid","pill","FolderTypeToListType","chats","listIds","chatsById","orderedPinnedIds","listType","notifySettings","notifyExceptions","loadMoreChats","preloadTopChatMessages","preloadArchivedChats","openNextChat","currentListIds","currentPinnedIds","prepareFolderListIds","orderById","orderedIds","chatArrays","newChatArrays","prepareChatList","singleList","concat","pinnedChats","otherChats","newOrderedIds","reduce","acc","prevOrderById","orderDiffById","mapValues","order","Infinity","loadMoreOfType","CHAT_LIST_SLICE","ALL_CHATS_PRELOAD_DISABLED","viewportChatArrays","reduceChatList","getAnimationType","movesUp","movesDown","orderDiffIds","Object","keys","numberOfUp","numberOfDown","None","useChatAnimationType","handleKeyDown","IS_PWA","IS_MAC_OS","metaKey","ctrlKey","code","startsWith","digit","match","position","Number","altKey","targetIndexDelta","addEventListener","removeEventListener","InfiniteScroll","preloadBackwards","noFastList","viewportOffset","pinnedOffset","IS_ANDROID","CHAT_HEIGHT_PX","teactFastList","teactOrderKey","getChatOrder","renderChats","Loading","getSenderName","getSenderTitle","isChatGroup","isQuick","onFileSelect","isHovered","markHovered","unmarkHovered","onDrop","onDragEnter","onDragLeave","relatedTarget","toTarget","DropAreaState","withQuick","onHide","hideTimeoutRef","prevWithQuick","captureEscKeyListener","handleFilesDrop","dataTransfer","dt","files","from","handleQuickFilesDrop","handleDragLeave","fromTarget","onDragOver","clearTimeout","EmojiTooltip","MAX_INPUT_HEIGHT","messageSendKeyCombo","replyingToId","selectReplyingToId","noTabCapture","isPollModalOpen","payment","isPaymentModalOpen","isAttachmentModalInput","editableInputId","html","forcedPlaceholder","shouldSetFocus","shouldSuppressFocus","shouldSuppressTextFormatter","onUpdate","onSuppressedFocus","onSend","editLastMessage","replyToNextMessage","cloneRef","isContextMenuOpenRef","isTextFormatterOpen","openTextFormatter","closeTextFormatter","textFormatterAnchorPosition","setTextFormatterAnchorPosition","selectedRange","setSelectedRange","updateInputHeight","useLayoutEffectWithPrevDeps","prevHtml","innerHTML","focusInput","closest","focusEditableElement","handleCloseTextFormatter","selection","getSelection","removeAllRanges","empty","clearSelection","checkSelection","IS_IOS","rangeCount","selectionRange","getRangeAt","selectedText","toString","isSelectionInsideInput","EDITABLE_INPUT_ID","parseEmojiOnlyString","START_TO_END","processSelection","selectionRect","inputRect","top","willSend","input","clone","currentHeight","newHeight","scrollHeight","transitionDuration","log","abs","exec","toggle","captureFirstTab","debounce","captureKeyboardListeners","onTab","suppressFocus","blur","contentEditable","textContent","IS_EMOJI_SUPPORTED","onKeyDown","shiftKey","handleKeyUp","event","closeContextMenuMouseListener","closeContextMenuKeyListener","handleMouseUp","onContextMenu","onTouchCancel","anchorPosition","TEXT_FORMAT_BY_TAG_NAME","B","STRONG","I","EM","U","DEL","CODE","fragmentEl","createElement","containerRef","linkUrlInputRef","isLinkControlOpen","openLinkControl","closeLinkControl","linkUrl","setLinkUrl","isEditingLink","setIsEditingLink","inputClassName","setInputClassName","selectedTextFormats","setSelectedTextFormats","useVirtualBackdrop","selectedFormats","parentElement","commonAncestorContainer","textFormat","tagName","updateSelectedRange","getSelectedText","getSelectedElement","updateInputStyles","offsetWidth","scrollWidth","scrollLeft","getFormatButtonClassName","some","fKey","monospace","strikethrough","handleBoldText","execCommand","bold","handleItalicText","italic","handleUnderlineText","underline","handleStrikethroughText","replaceWith","handleMonospaceText","handleLinkUrlConfirm","formattedLinkUrl","encodeURI","ensureProtocol","addRange","restoreSelection","handler","KeyK","KeyB","KeyU","KeyI","KeyM","KeyS","linkUrlConfirmClassName","autoComplete","inputMode","onScroll","RE_BR","RE_SPACE","RE_CLEAN_HTML","RE_EXTRA_NEW_LINE","prepareForRegExp","inputId","parentNode","iterations","emojiDataPromise","emojiRawData","emojiData","RE_EMOJI_SEARCH","RegExp","useEmojiTooltip","isAllowed","recentEmojiIds","onUpdateHtml","baseEmojiKeywords","emojiKeywords","isDisabled","markIsOpen","unmarkIsOpen","setById","keywords","setKeywords","byKeyword","setByKeyword","names","setNames","byName","setByName","shouldForceInsertEmoji","setShouldForceInsertEmoji","filteredEmojis","setFilteredEmojis","MEMO_EMPTY_ARRAY","recentEmojis","values","pickTruthy","emojis","async","default","uncompressEmoji","ensureEmojiData","then","byNative","buildCollectionByKey","baseEmojisByKeyword","natives","emojisByKeyword","emojisByName","getEmojiCode","forceSend","endsWith","matched","matchedKeywords","keyword","sort","flatten","matchedNames","unique","insertEmoji","textEmoji","isForce","atIndex","lastIndexOf","messageInput","getElementById","native","isEmojiTooltipOpen","closeEmojiTooltip","searchUserName","usernameLowered","toLowerCase","fullNameLowered","filterLowered","searchWords","runThrottled","throttle","cb","RE_USERNAME_SEARCH","useMentionTooltip","canSuggestMembers","groupChatMembers","topInlineBotIds","usersToMention","setUsersToMention","topInlineBots","getFilteredUsers","withInlineBots","inlineBots","inlineBot","chatMembers","usernameFilter","getUsernameFilter","canSuggestInlineBots","insertMention","forceFocus","insertedHtml","isMentionTooltipOpen","closeMentionTooltip","mentionFilteredUsers","useAsyncRendering","dependencies","delay","shouldRenderRef","timeoutRef","forceUpdate","useForceUpdate","useOnChange","options","selected","disabled","loadingOptions","setValues","handleChange","newValues","v","option","subLabel","children","buttonClassName","tabIndex","buttonRef","destructive","isTouched","markIsTouched","unmarkIsTouched","isContextMenuOpen","contextMenuPosition","handleBeforeContextMenu","handleContextMenu","handleContextMenuClose","handleContextMenuHide","useContextMenuHandlers","getTriggerElement","getRootElement","getMenuElement","positionX","positionY","menuStyle","useContextMenuPosition","handleMouseDown","role","autoClose","containerId","onDismiss","setIsOpen","timerRef","closeAndDismiss","handleMouseEnter","handleMouseLeave","onMouseEnter","onMouseLeave","RADIUSES","s","m","xl","square","circleRadius","STROKE_WIDTH","borderRadius","circumference","PI","container","svg","firstElementChild","strokeDashOffset","setAttribute","hidden","loadingOption","step","renderValue","trackWidth","parentContainerClassName","focused","autoFocusSearch","onReset","onFocus","onBlur","isInputFocused","markInputFocused","unmarkInputFocused","useInputFocusOnOpen","prevIsOpen","prevChildren","fromChildrenRef","noAnimation","onCheck","active","badgeCount","isBadgeActive","previousActiveTab","tabRef","tab","indicator","prevTab","currentIndicator","shiftLeft","offsetLeft","scaleFactor","clientWidth","tabs","activeTab","big","onSwitchTab","useHorizontalScroll","activeTabElement","newLeft","fastSmoothScrollHorizontal","CLEANED_UP","Symbol","renderCount","shouldRestoreHeight","shouldCleanup","cleanupExceptionKey","onStart","onStop","getGlobal","currentKeyRef","rendersRef","prevActiveKey","activeKeyChanged","cleanup","childElements","childNodes","isBackwards","prevActiveIndex","activeIndex","node","HTMLElement","dispatchHeavyAnimationStop","dispatchHeavyAnimationEvent","onAnimationEnd","activeElement","clientHeight","watchedNode","firstChild","waitForAnimationEnd","flexBasis","renders","contents","render","INCLUDED_CHAT_TYPES","EXCLUDED_CHAT_TYPES","INCLUDE_FILTER_FIELDS","EXCLUDE_FILTER_FIELDS","selectChatFilters","state","mode","selectTemp","selectedChatIds","selectedChatTypes","includedChatIds","includeFilters","folder","excludedChatIds","excludeFilters","getSuggestedFolderName","filters","bots","groups","channels","contacts","nonContacts","INITIAL_STATE","chatFilter","foldersReducer","omit","error","useReducer","trackId","originalDuration","trackType","handlers","metadata","onInit","onForcePlay","onTrackChange","noPlaylist","noProgressUpdates","controllerRef","setIsPlaying","isPlayingSync","setPlayProgress","register","eventName","setVolume","setPlaybackRate","toggleMuted","proxy","registerMediaSession","mediaHandlers","requestNextTrack","requestPreviousTrack","stop","closeAudioPlayer","seekbackward","skipTime","seekOffset","currentTime","seekforward","seekTo","seekTime","nexttrack","previoustrack","makeMediaHandlers","setPlaybackState","audioPlayer","volume","playbackRate","setPositionState","isFinite","paused","updateMetadata","destroy","isSafariPatchInProgress","useEffectWithPrevDeps","prevShouldPlay","prevSrc","playIfPresent","setTime","time","audioProxy","cache","Map","blurredRef","img","Image","imgToCanvas","fastBlur","toDataURL","blurredAsync","get","onload","blurredDataUri","clear","set","useBlur","noInitiallyBuffered","setIsBuffered","setBufferedProgress","setIsBufferedDebounced","handleBuffering","media","buffered","end","readyState","onLoadedData","onPlaying","onLoadStart","onPause","onTimeUpdate","onProgress","useCanvasBlur","withRaf","processBlur","alpha","IS_CANVAS_FILTER_SUPPORTED","drawImage","RADIUS","isInSearch","toggleChatPinned","toggleChatArchived","toggleChatUnread","actionAddToFolder","actionPin","actionUnreadMark","actionMute","actionArchive","isChatArchived","actionDelete","getCanDeleteChat","isInFolder","compact","stopEvent","stopImmediatePropagation","isMenuDisabled","shouldDisableOnLink","shouldDisableOnLongTap","setIsContextMenuOpen","setContextMenuPosition","body","clientY","timer","clearLongPressTimer","startLongPressTimer","contains","originalEvent","touches","cancelClickOnce","emulateContextMenuEvent","passive","anchor","extraPaddingX","extraTopPadding","setPositionX","setPositionY","withScroll","setWithScroll","setStyle","setMenuStyle","triggerEl","emptyRect","menuEl","rootEl","triggerRect","menuRect","offsetHeight","rootRect","horizontalPostition","menuMaxHeight","useDebounce","ms","shouldRunFirst","shouldRunLast","messageId","replyOriginForId","loadMessage","loadMessageThrottled","throttled","handleScroll","deltaX","deltaY","useIntersectionObserver","rootRef","throttleMs","debounceMs","shouldSkipFirst","margin","threshold","noAutoFreeze","rootCallback","rootCallbackRef","freezeFlagsRef","autoUnfreezeTimeoutRef","onUnfreezeRef","unfreeze","freeze","useHeavyAnimationCheck","observer","disconnect","callbacks","observe","targetCallback","entriesAccumulator","observerCallbackSync","entries","entry","callback","scheduler","observerCallback","IntersectionObserver","root","rootMargin","initController","controller","delete","unobserve","useOnIntersect","targetRef","setIsIntersecting","debugKey","prevDeps","isMediaReady","store","mediaHash","noLoad","mediaFormat","cacheBuster","isHtmlAllowed","isStreaming","IS_PROGRESSIVE_SUPPORTED","idRef","generateIdFor","useUniqueId","setLoadProgress","startedAtRef","handleProgress","Date","now","spentTime","closeTimeout","useMouseInside","menuCloseTimeout","isMouseInside","usePrevDuringAnimation","prev","isCurrentPresent","isPrevPresent","reducer","initialState","reducerRef","setState","currentState","useVideoCleanup","videoRef","videoEl","load","mul_table","shg_table","boxBlurCanvasRGB","context","top_x","top_y","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","tracks","currentTrackId","voiceQueue","musicQueue","playNext","isReverseOrder","currentTrack","nextTrackId","findNextInQueue","openAudioPlayer","parseMessageKey","splitTrackId","messageKey","nextTrack","safePlay","stopCurrentAudio","track","Audio","handleEvent","Proxy","createAudio","trackIdComparator","addTrackToQueue","dataset","preventPlayAfterPatch","preload","IS_SAFARI","patchSafariProgressiveAudio","globalSearch","currentContent","GlobalSearchContent","openedChatId","queueFilter","cleanUpQueue","fastSeek","muted","rate","shouldRemoveFromQueue","h","trackIdFilter","el","removeFromQueue","currentId","queue","getTrackQueue","chatAudio","getMessageKey","split","pop","one","two","dateOne","keyOne","dateTwo","keyTwo","diff","localeCompare","captureEvent","initialSwipeAxis","hasMoved","hasSwiped","excludedClosestSelector","onMove","pageX","pageY","withCursor","querySelectorAll","scrollable","overflow","dragOffsetX","dragOffsetY","shouldPreventScroll","innerWidth","xAbs","yAbs","axis","currentSwipeAxis","Left","Right","Up","Down","processSwipe","waitForTransitionEnd","propertyName","waitForEndEvent","animationName","eventType","detailedName","isHandled","handleAnimationEnd","TransitionEvent","AnimationEvent","cycleRestrict","isAnimating","fastSmoothScroll","maxDistance","FAST_SMOOTH_MAX_DISTANCE","forceDirection","forceDuration","forceNormalContainerHeight","scrollFrom","offsetTop","elementTop","scrollTop","FocusDirection","calculateScrollFrom","ANIMATION_LEVEL_MIN","scrollWithJs","isAnimatingScroll","elementHeight","currentScrollTop","containerHeight","targetContainerHeight","normalHeight","path","remainingPath","absPath","transition","FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE","shortTransition","longTransition","FAST_SMOOTH_MIN_DURATION","FAST_SMOOTH_MAX_DURATION","startAt","onHeavyAnimationStop","animateSingle","t","currentPath","containerWidth","animate","scrollTo","behavior","force","range","createRange","lastChild","nodeValue","selectNodeContents","collapse","DEFAULT_HANDLERS","mediaSession","navigator","setMediaSessionHandlers","console","warn","setActionHandler","err","clearMediaSession","playbackState","buildMediaMetadata","artist","album","artwork","MediaMetadata","ENTITY_CLASS_BY_NODE_NAME","S","STRIKE","PRE","BLOCKQUOTE","parseMessageInput","fragment","parsedHtml","parseMarkdown","textIndex","recursionDeepness","addEntity","nodeName","entityType","getEntityTypeFromNode","rawIndex","getEntityDataFromNode","hasChildNodes","audioEl","patchedForSafari","patchForSafariInProgress","once"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/524.85ca6db6bb78d08e40d5.js b/dist/524.2a153f6444bb77830f1f.js similarity index 99% rename from dist/524.85ca6db6bb78d08e40d5.js rename to dist/524.2a153f6444bb77830f1f.js index 7eb85b224..ad23ba3db 100644 --- a/dist/524.85ca6db6bb78d08e40d5.js +++ b/dist/524.2a153f6444bb77830f1f.js @@ -1,2 +1,2 @@ (()=>{"use strict";const e="tt-media-progressive",t="tt-assets",s=("undefined"!=typeof window&&window.innerHeight,Math.round(425),new Set(["newMessage","newScheduledMessage","deleteMessages","deleteScheduledMessages","deleteHistory"]),new Set(["image/png","image/gif","image/jpeg"])),n=new Set(["video/mp4"]);new Set([...s,...n]),new Set(["AU","BD","CA","CO","EG","HN","IE","IN","JO","MX","MY","NI","NZ","PH","PK","SA","SV","US"]);const a=e=>new Promise((t=>{setTimeout((()=>t()),e)})),i=524288,o=new Map;async function r(e){const s=await async function(s,n){try{return await Promise.race([a(3e3).then((()=>Promise.reject(new Error("TIMEOUT")))),(async()=>{const s=await self.caches.open(t),n=await s.match(e.request);return{cache:s,cached:n}})()])}catch(e){return void console.error(e)}}(),{cache:n,cached:i}=s||{};if(n&&i){if(i.ok)return i;await n.delete(e.request)}const o=await fetch(e.request);return o.ok&&n&&n.put(e.request,o.clone()),o}var c,d;self.addEventListener("message",(e=>{const{type:t,messageId:s,result:n}=e.data;if("partResponse"===t){const e=o.get(s);e&&e.resolve(n)}})),(d=c||(c={})).True="1",d.False="0";let l=(new Date).valueOf();const u=new Set,f={};function g(e){return e.custom.from_id?e.custom.from_id:e.custom.chat_id||e.custom.channel_id?`-${e.custom.chat_id||e.custom.channel_id}`:void 0}function p(e){if(e.custom.msg_id)return parseInt(e.custom.msg_id,10)}async function w(){const e=new URL(self.registration.scope).origin;return(await self.clients.matchAll({type:"window"})).filter((t=>new URL(t.url).origin===e))}async function m(e){const t=(await w())[0];t&&t.postMessage({type:"playNotificationSound",payload:{id:e}})}function h({chatId:e,messageId:t,body:s,title:n,icon:a}){const i=(new Date).valueOf()-l<1e3,o={body:s,data:{chatId:e,messageId:t,count:1},icon:a||"icon-192x192.png",badge:"icon-192x192.png",tag:String(i?0:e||0),vibrate:[200,100,200]};return Promise.all([m(String(t)||e||""),self.registration.showNotification(n,o)])}async function y(e,t){const{chatId:s,messageId:n}=t;if(s&&(e.postMessage({type:"focusMessage",payload:{chatId:s,messageId:n}}),!e.focused))try{await e.focus()}catch(e){}}self.onsync=()=>{l=(new Date).valueOf()};const I=/[0-9a-f]{20}.*\.(js|css|woff2?|svg|png|jpg|jpeg|json|wasm)$/;self.addEventListener("install",(e=>{e.waitUntil(self.skipWaiting())})),self.addEventListener("activate",(e=>{e.waitUntil(Promise.race([a(3e3),Promise.all([self.caches.delete(t),self.clients.claim()])]))})),self.addEventListener("fetch",(t=>{const{url:s}=t.request;return s.includes("/progressive/")?(t.respondWith(async function(t){const{url:s}=t.request,n=t.request.headers.get("range"),r=/^bytes=(\d+)-(\d+)?$/g.exec(n||""),c=Number(r[1]);let d=Number(r[2]);if((!d||d-c+1>i)&&(d=c+i-1),0===c&&1===d){const e=t.request.url.match(/fileSize=(\d+)&mimeType=([\w/]+)/),s=e&&Number(e[1]),n=null==e?void 0:e[2];if(s&&n)return new Response(new Uint8Array(2).buffer,{status:206,statusText:"Partial Content",headers:[["Content-Range",`bytes 0-1/${s}`],["Accept-Ranges","bytes"],["Content-Length","2"],["Content-Type",n]]})}const l=`${s}?start=${c}&end=${d}`,[u,f]=await async function(t){const s=await self.caches.open(e);return Promise.all([s.match(`${t}&type=arrayBuffer`).then((e=>e?e.arrayBuffer():void 0)),s.match(`${t}&type=headers`).then((e=>e?e.json():void 0))])}(l);if(u)return new Response(u,{status:206,statusText:"Partial Content",headers:f});let g;try{g=await async function(e,t){if(!e.clientId)return;const s=await self.clients.get(e.clientId);if(!s)return;const n=(e=>{let t;do{t=String(Math.random()).replace("0.","id")}while(e.hasOwnProperty(t));return t})(o),i={},r=Promise.race([a(6e4).then((()=>Promise.reject(new Error("ERROR_PART_TIMEOUT")))),new Promise(((e,t)=>{Object.assign(i,{resolve:e,reject:t})}))]);return o.set(n,i),r.catch((()=>{})).finally((()=>{o.delete(n)})),s.postMessage({type:"requestPart",messageId:n,params:t}),r}(t,{url:s,start:c,end:d})}catch(e){}if(!g)return new Response("",{status:500,statusText:"Failed to fetch progressive part"});const{arrayBuffer:p,fullSize:w,mimeType:m}=g,h=Math.min(d-c+1,p.byteLength);d=c+h-1;const y=p.slice(0,h),I=[["Content-Range",`bytes ${c}-${d}/${w}`],["Accept-Ranges","bytes"],["Content-Length",String(h)],["Content-Type",m]];return h<=524288&&d<2097151&&async function(t,s,n){const a=await self.caches.open(e);Promise.all([a.put(new Request(`${t}&type=arrayBuffer`),new Response(s)),a.put(new Request(`${t}&type=headers`),new Response(JSON.stringify(n)))])}(l,y,I),new Response(y,{status:206,statusText:"Partial Content",headers:I})}(t)),!0):!(!s.startsWith("http")||!s.match(I)||(t.respondWith(r(t)),0))})),self.addEventListener("push",(function(e){const t=function(e){try{return e.data.json()}catch(e){return}}(e);if(!t||t.mute===c.True)return;const s=function(e){return{chatId:g(e),messageId:p(e),title:e.title||"Telegram WebZ",body:e.description}}(t);u.has(s.messageId)?u.delete(s.messageId):e.waitUntil(h(s))})),self.addEventListener("notificationclick",(function(e){const t=self.registration.scope;e.notification.close();const{data:s}=e.notification;e.waitUntil((async()=>{const e=await w();if(await Promise.all(e.map((e=>(f[e.id]=s,y(e,s))))),self.clients.openWindow&&!(e.length>0)){f[0]=s;try{const e=await self.clients.openWindow(t);e&&(f[e.id]=s)}catch(e){}}})())})),self.addEventListener("message",(function(e){if(!e.data)return;const t=e.source;if("clientReady"===e.data.type){const s=f[t.id]||f[0];s&&(delete f[t.id],delete f[0],e.waitUntil(y(t,s)))}if("newMessageNotification"===e.data.type){const t=e.data.payload;u.add(t.messageId),e.waitUntil(h(t))}"closeMessageNotifications"===e.data.type&&e.waitUntil(async function({chatId:e,lastReadInboxMessageId:t}){const s=await self.registration.getNotifications(),n=t||Number.MAX_VALUE;s.forEach((t=>{("0"===t.tag||t.data.chatId===e&&t.data.messageId<=n)&&t.close()}))}(e.data.payload))}))})(); -//# sourceMappingURL=524.85ca6db6bb78d08e40d5.js.map \ No newline at end of file +//# sourceMappingURL=524.2a153f6444bb77830f1f.js.map \ No newline at end of file diff --git a/dist/524.85ca6db6bb78d08e40d5.js.map b/dist/524.2a153f6444bb77830f1f.js.map similarity index 99% rename from dist/524.85ca6db6bb78d08e40d5.js.map rename to dist/524.2a153f6444bb77830f1f.js.map index 67da32c28..bcc3f168c 100644 --- a/dist/524.85ca6db6bb78d08e40d5.js.map +++ b/dist/524.2a153f6444bb77830f1f.js.map @@ -1 +1 @@ -{"version":3,"file":"524.85ca6db6bb78d08e40d5.js","mappings":"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","sources":["webpack://telegram-t/./src/config.ts","webpack://telegram-t/./src/util/schedulers.ts","webpack://telegram-t/./src/serviceWorker/progressive.ts","webpack://telegram-t/./src/serviceWorker/assetCache.ts","webpack://telegram-t/./src/serviceWorker/pushNotification.ts","webpack://telegram-t/./src/serviceWorker.ts","webpack://telegram-t/./src/util/generateIdFor.ts"],"sourcesContent":["export const PAGE_TITLE = 'Telegram';\nexport const INACTIVE_MARKER = ' [Inactive]';\n\nexport const APP_NAME = process.env.APP_NAME || 'Telegram WebZ';\nexport const APP_VERSION = process.env.APP_VERSION || 'dev';\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 SESSION_USER_KEY = 'user_auth';\nexport const LEGACY_SESSION_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-v6';\nexport const ASSET_CACHE_NAME = 'tt-assets';\nexport const AUTODOWNLOAD_FILESIZE_MB_LIMITS = [1, 5, 10, 50, 100, 500];\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 MEMBERS_SLICE = 30;\nexport const MEMBERS_LOAD_SLICE = 200;\nexport const PINNED_MESSAGES_LIMIT = 50;\nexport const BLOCKED_LIST_LIMIT = 100;\nexport const PROFILE_PHOTOS_LIMIT = 40;\nexport const PROFILE_SENSITIVE_AREA = 500;\nexport const COMMON_CHATS_LIMIT = 100;\nexport const GROUP_CALL_PARTICIPANTS_LIMIT = 100;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 20;\nexport const ALL_CHATS_PRELOAD_DISABLED = false;\n\nexport const DEFAULT_VOLUME = 1;\nexport const DEFAULT_PLAYBACK_RATE = 1;\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;\nexport const IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 17;\nexport const MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 15;\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;\nexport const TMP_CHAT_ID = '0';\n\nexport const ANIMATION_END_DELAY = 100;\n\nexport const FAST_SMOOTH_MAX_DISTANCE = 1500;\nexport const FAST_SMOOTH_MIN_DURATION = 250;\nexport const FAST_SMOOTH_MAX_DURATION = 600;\nexport const FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE = 500; // px\n\n// Average duration of message sending animation\nexport const API_UPDATE_THROTTLE = Math.round((FAST_SMOOTH_MIN_DURATION + FAST_SMOOTH_MAX_DURATION) / 2);\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\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 STICKER_SIZE_INLINE_BOT_RESULT = 100;\nexport const RECENT_STICKERS_LIMIT = 20;\nexport const MEMOJI_STICKER_ID = 'MEMOJI_STICKER';\n\nexport const BASE_EMOJI_KEYWORD_LANG = 'en';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\n\nexport const VIDEO_MOV_TYPE = 'video/quicktime';\n\nexport const SUPPORTED_IMAGE_CONTENT_TYPES = new Set([\n 'image/png', 'image/gif', 'image/jpeg',\n]);\n\nexport const SUPPORTED_VIDEO_CONTENT_TYPES = new Set([\n 'video/mp4', // video/quicktime added dynamically in environment.ts\n]);\n\nexport const CONTENT_TYPES_WITH_PREVIEW = new Set([\n ...SUPPORTED_IMAGE_CONTENT_TYPES,\n ...SUPPORTED_VIDEO_CONTENT_TYPES,\n]);\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,63})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_MENTION_TEMPLATE = '(@[\\\\w\\\\d_-]+)';\nexport const RE_TG_LINK = /^tg:(\\/\\/)?([?=&\\d\\w_-]+)?/gm;\nexport const RE_TME_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/)/gm;\n\n// eslint-disable-next-line max-len\nexport const COUNTRIES_WITH_12H_TIME_FORMAT = new Set(['AU', 'BD', 'CA', 'CO', 'EG', 'HN', 'IE', 'IN', 'JO', 'MX', 'MY', 'NI', 'NZ', 'PH', 'PK', 'SA', 'SV', 'US']);\n\n// MTProto constants\nexport const SERVICE_NOTIFICATIONS_USER_ID = '777000';\nexport const REPLIES_USER_ID = '1271266957'; // TODO For Test connection ID must be equal to 708513\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_CODE = 'en';\nexport const DEFAULT_LANG_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios', 'tdesktop', 'macos'] as const;\nexport const TIPS_USERNAME = 'TelegramTips';\nexport const LOCALIZED_TIPS = ['ar', 'pt-br', 'id', 'it', 'ko', 'ms', 'pl', 'es', 'tr'];\nexport const FEEDBACK_URL = 'https://bugs.telegram.org/?tag_ids=41&sort=time';\nexport const LIGHT_THEME_BG_COLOR = '#A2AF8E';\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\n// Group calls\nexport const GROUP_CALL_VOLUME_MULTIPLIER = 100;\nexport const GROUP_CALL_DEFAULT_VOLUME = 100 * GROUP_CALL_VOLUME_MULTIPLIER;\nexport const ENABLE_THUMBNAIL_VIDEO = false;\n","type Scheduler =\n typeof requestAnimationFrame\n | typeof onTickEnd\n | 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(fastRafPrimary, 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 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 fastRaf(resolve);\n });\n}\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\nlet fastRafPrimaryCallbacks: NoneToVoidFunction[] | undefined;\n\n// May result in an immediate execution if called from another `requestAnimationFrame` callback\nexport function fastRaf(callback: NoneToVoidFunction, isPrimary = false) {\n if (!fastRafCallbacks) {\n fastRafCallbacks = isPrimary ? [] : [callback];\n fastRafPrimaryCallbacks = isPrimary ? [callback] : [];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n const currentPrimaryCallbacks = fastRafPrimaryCallbacks!;\n fastRafCallbacks = undefined;\n fastRafPrimaryCallbacks = undefined;\n currentPrimaryCallbacks.forEach((cb) => cb());\n currentCallbacks.forEach((cb) => cb());\n });\n } else if (isPrimary) {\n fastRafPrimaryCallbacks!.push(callback);\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nexport function fastRafPrimary(callback: NoneToVoidFunction) {\n fastRaf(callback, true);\n}\n\nlet onTickEndCallbacks: NoneToVoidFunction[] | undefined;\nlet onTickEndPrimaryCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function onTickEnd(callback: NoneToVoidFunction, isPrimary = false) {\n if (!onTickEndCallbacks) {\n onTickEndCallbacks = isPrimary ? [] : [callback];\n onTickEndPrimaryCallbacks = isPrimary ? [callback] : [];\n\n Promise.resolve().then(() => {\n const currentCallbacks = onTickEndCallbacks!;\n const currentPrimaryCallbacks = onTickEndPrimaryCallbacks!;\n onTickEndCallbacks = undefined;\n onTickEndPrimaryCallbacks = undefined;\n currentPrimaryCallbacks.forEach((cb) => cb());\n currentCallbacks.forEach((cb) => cb());\n });\n } else if (isPrimary) {\n onTickEndPrimaryCallbacks!.push(callback);\n } else {\n onTickEndCallbacks.push(callback);\n }\n}\n\nexport function onTickEndPrimary(callback: NoneToVoidFunction) {\n onTickEnd(callback, true);\n}\n\nlet beforeUnloadCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function onBeforeUnload(callback: NoneToVoidFunction, isLast = false) {\n if (!beforeUnloadCallbacks) {\n beforeUnloadCallbacks = [];\n // eslint-disable-next-line no-restricted-globals\n self.addEventListener('beforeunload', () => {\n beforeUnloadCallbacks!.forEach((cb) => cb());\n });\n }\n\n if (isLast) {\n beforeUnloadCallbacks.push(callback);\n } else {\n beforeUnloadCallbacks.unshift(callback);\n }\n\n return () => {\n beforeUnloadCallbacks = beforeUnloadCallbacks!.filter((cb) => cb !== callback);\n };\n}\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 = 60000;\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?.[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","import { ASSET_CACHE_NAME } from '../config';\nimport { pause } from '../util/schedulers';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\n// An attempt to fix freezing UI on iOS\nconst CACHE_TIMEOUT = 3000;\n\nexport async function respondWithCache(e: FetchEvent) {\n const cacheResult = await withTimeout(async () => {\n const cache = await self.caches.open(ASSET_CACHE_NAME);\n const cached = await cache.match(e.request);\n\n return { cache, cached };\n }, CACHE_TIMEOUT);\n\n const { cache, cached } = cacheResult || {};\n\n if (cache && cached) {\n if (cached.ok) {\n return cached;\n } else {\n await cache.delete(e.request);\n }\n }\n\n const remote = await fetch(e.request);\n\n if (remote.ok && cache) {\n cache.put(e.request, remote.clone());\n }\n\n return remote;\n}\n\nasync function withTimeout(cb: () => Promise, timeout: number) {\n try {\n return await Promise.race([\n pause(timeout).then(() => Promise.reject(new Error('TIMEOUT'))),\n cb(),\n ]);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n return undefined;\n }\n}\n\nexport function clearAssetCache() {\n return self.caches.delete(ASSET_CACHE_NAME);\n}\n","import { APP_NAME, DEBUG, DEBUG_MORE } from '../config';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\nenum Boolean {\n True = '1',\n False = '0',\n}\n\ntype PushData = {\n custom: {\n msg_id?: string;\n channel_id?: string;\n chat_id?: string;\n from_id?: string;\n };\n mute: Boolean;\n badge: Boolean;\n loc_key: string;\n loc_args: string[];\n random_id: number;\n title: string;\n description: string;\n};\n\ntype NotificationData = {\n messageId?: number;\n chatId?: string;\n title: string;\n body: string;\n icon?: string;\n};\n\ntype CloseNotificationData = {\n lastReadInboxMessageId?: number;\n chatId: string;\n};\n\nlet lastSyncAt = new Date().valueOf();\nconst shownNotifications = new Set();\nconst clickBuffer: Record = {};\n\nfunction getPushData(e: PushEvent | Notification): PushData | undefined {\n try {\n return 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 undefined;\n }\n}\n\nfunction getChatId(data: PushData) {\n if (data.custom.from_id) {\n return data.custom.from_id;\n }\n\n // Chats and channels have “negative” IDs\n if (data.custom.chat_id || data.custom.channel_id) {\n return `-${data.custom.chat_id || data.custom.channel_id}`;\n }\n\n return undefined;\n}\n\nfunction getMessageId(data: PushData) {\n if (!data.custom.msg_id) return undefined;\n return parseInt(data.custom.msg_id, 10);\n}\n\nfunction getNotificationData(data: PushData): NotificationData {\n return {\n chatId: getChatId(data),\n messageId: getMessageId(data),\n title: data.title || APP_NAME,\n body: data.description,\n };\n}\n\nasync function getClients() {\n const appUrl = new URL(self.registration.scope).origin;\n const clients = await self.clients.matchAll({ type: 'window' }) as WindowClient[];\n return clients.filter((client) => {\n return new URL(client.url).origin === appUrl;\n });\n}\n\nasync function playNotificationSound(id: string) {\n const clients = await getClients();\n const client = clients[0];\n if (!client) return;\n client.postMessage({\n type: 'playNotificationSound',\n payload: { id },\n });\n}\n\nfunction showNotification({\n chatId,\n messageId,\n body,\n title,\n icon,\n}: NotificationData) {\n const isFirstBatch = new Date().valueOf() - lastSyncAt < 1000;\n const tag = String(isFirstBatch ? 0 : chatId || 0);\n const options: NotificationOptions = {\n body,\n data: {\n chatId,\n messageId,\n count: 1,\n },\n icon: icon || 'icon-192x192.png',\n badge: 'icon-192x192.png',\n tag,\n vibrate: [200, 100, 200],\n };\n\n return Promise.all([\n playNotificationSound(String(messageId) || chatId || ''),\n self.registration.showNotification(title, options),\n ]);\n}\n\nasync function closeNotifications({\n chatId,\n lastReadInboxMessageId,\n}: CloseNotificationData) {\n const notifications = await self.registration.getNotifications();\n const lastMessageId = lastReadInboxMessageId || Number.MAX_VALUE;\n notifications.forEach((notification) => {\n if (\n notification.tag === '0'\n || (notification.data.chatId === chatId && notification.data.messageId <= lastMessageId)\n ) {\n notification.close();\n }\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\n const data = getPushData(e);\n\n // Do not show muted notifications\n if (!data || data.mute === Boolean.True) return;\n\n const notification = getNotificationData(data);\n\n // Dont show already triggered notification\n if (shownNotifications.has(notification.messageId)) {\n shownNotifications.delete(notification.messageId);\n return;\n }\n\n e.waitUntil(showNotification(notification));\n}\n\nasync function focusChatMessage(client: WindowClient, data: { chatId?: string; messageId?: number }) {\n const {\n chatId,\n messageId,\n } = data;\n if (!chatId) return;\n client.postMessage({\n type: 'focusMessage',\n payload: {\n chatId,\n messageId,\n },\n });\n if (!client.focused) {\n // Catch \"focus not allowed\" DOM Exceptions\n try {\n await client.focus();\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[SW] ', error);\n }\n }\n }\n}\n\nexport function handleNotificationClick(e: NotificationEvent) {\n const appUrl = self.registration.scope;\n e.notification.close(); // Android needs explicit close.\n const { data } = e.notification;\n const notifyClients = async () => {\n const clients = await getClients();\n await Promise.all(clients.map((client) => {\n clickBuffer[client.id] = data;\n return focusChatMessage(client, data);\n }));\n if (!self.clients.openWindow || clients.length > 0) return undefined;\n // Store notification data for default client (fix for android)\n clickBuffer[0] = data;\n // If there is no opened client we need to open one and wait until it is fully loaded\n try {\n const newClient = await self.clients.openWindow(appUrl);\n if (newClient) {\n // Store notification data until client is fully loaded\n clickBuffer[newClient.id] = data;\n }\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[SW] ', error);\n }\n }\n return undefined;\n };\n e.waitUntil(notifyClients());\n}\n\nexport function handleClientMessage(e: ExtendableMessageEvent) {\n if (DEBUG_MORE) {\n // eslint-disable-next-line no-console\n console.log('[SW] New message from client', e);\n }\n if (!e.data) return;\n const source = e.source as WindowClient;\n if (e.data.type === 'clientReady') {\n // focus on chat message when client is fully ready\n const data = clickBuffer[source.id] || clickBuffer[0];\n if (data) {\n delete clickBuffer[source.id];\n delete clickBuffer[0];\n e.waitUntil(focusChatMessage(source, data));\n }\n }\n if (e.data.type === 'newMessageNotification') {\n // store messageId for already shown notification\n const notification: NotificationData = e.data.payload;\n // mark this notification as shown if it was handled locally\n shownNotifications.add(notification.messageId);\n e.waitUntil(showNotification(notification));\n }\n\n if (e.data.type === 'closeMessageNotifications') {\n e.waitUntil(closeNotifications(e.data.payload));\n }\n}\n\nself.onsync = () => {\n lastSyncAt = new Date().valueOf();\n};\n","import { DEBUG } from './config';\nimport { respondForProgressive } from './serviceWorker/progressive';\nimport { respondWithCache, clearAssetCache } from './serviceWorker/assetCache';\nimport { handlePush, handleNotificationClick, handleClientMessage } from './serviceWorker/pushNotification';\nimport { pause } from './util/schedulers';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\nconst ASSET_CACHE_PATTERN = /[0-9a-f]{20}.*\\.(js|css|woff2?|svg|png|jpg|jpeg|json|wasm)$/;\nconst ACTIVATE_TIMEOUT = 3000;\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 e.waitUntil(\n Promise.race([\n // An attempt to fix freezing UI on iOS\n pause(ACTIVATE_TIMEOUT),\n Promise.all([\n clearAssetCache(),\n // Become available to all pages\n self.clients.claim(),\n ]),\n ]),\n );\n});\n\n// eslint-disable-next-line no-restricted-globals\nself.addEventListener('fetch', (e: FetchEvent) => {\n const { url } = e.request;\n\n if (url.includes('/progressive/')) {\n e.respondWith(respondForProgressive(e));\n return true;\n }\n\n if (url.startsWith('http') && url.match(ASSET_CACHE_PATTERN)) {\n e.respondWith(respondWithCache(e));\n return true;\n }\n\n return false;\n});\n\nself.addEventListener('push', handlePush);\nself.addEventListener('notificationclick', handleNotificationClick);\nself.addEventListener('message', handleClientMessage);\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"],"names":["MEDIA_PROGRESSIVE_CACHE_NAME","ASSET_CACHE_NAME","SUPPORTED_IMAGE_CONTENT_TYPES","window","innerHeight","Math","round","Set","SUPPORTED_VIDEO_CONTENT_TYPES","pause","ms","Promise","resolve","setTimeout","DEFAULT_PART_SIZE","requestStates","Map","async","respondWithCache","e","cacheResult","cb","timeout","race","then","reject","Error","cache","self","caches","open","cached","match","request","err","console","error","withTimeout","ok","delete","remote","fetch","put","clone","Boolean","addEventListener","type","messageId","result","data","requestState","get","lastSyncAt","Date","valueOf","shownNotifications","clickBuffer","getChatId","custom","from_id","chat_id","channel_id","getMessageId","msg_id","parseInt","getClients","appUrl","URL","registration","scope","origin","clients","matchAll","filter","client","url","playNotificationSound","id","postMessage","payload","showNotification","chatId","body","title","icon","isFirstBatch","options","count","badge","tag","String","vibrate","all","focusChatMessage","focused","focus","onsync","ASSET_CACHE_PATTERN","waitUntil","skipWaiting","claim","includes","respondWith","range","headers","bytes","exec","start","Number","end","fileSize","mimeType","Response","Uint8Array","buffer","status","statusText","cacheKey","cachedArrayBuffer","cachedHeaders","r","arrayBuffer","undefined","json","fetchFromCache","partInfo","params","clientId","store","random","replace","hasOwnProperty","generateIdFor","promise","Object","assign","set","catch","finally","requestPart","fullSize","partSize","min","byteLength","arrayBufferPart","slice","Request","JSON","stringify","saveToCache","respondForProgressive","startsWith","getPushData","mute","True","notification","process","description","getNotificationData","has","close","map","openWindow","length","newClient","notifyClients","source","add","lastReadInboxMessageId","notifications","getNotifications","lastMessageId","MAX_VALUE","forEach","closeNotifications"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"524.2a153f6444bb77830f1f.js","mappings":"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","sources":["webpack://telegram-t/./src/config.ts","webpack://telegram-t/./src/util/schedulers.ts","webpack://telegram-t/./src/serviceWorker/progressive.ts","webpack://telegram-t/./src/serviceWorker/assetCache.ts","webpack://telegram-t/./src/serviceWorker/pushNotification.ts","webpack://telegram-t/./src/serviceWorker.ts","webpack://telegram-t/./src/util/generateIdFor.ts"],"sourcesContent":["export const PAGE_TITLE = 'Telegram';\nexport const INACTIVE_MARKER = ' [Inactive]';\n\nexport const APP_NAME = process.env.APP_NAME || 'Telegram WebZ';\nexport const APP_VERSION = process.env.APP_VERSION || 'dev';\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 SESSION_USER_KEY = 'user_auth';\nexport const LEGACY_SESSION_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-v6';\nexport const ASSET_CACHE_NAME = 'tt-assets';\nexport const AUTODOWNLOAD_FILESIZE_MB_LIMITS = [1, 5, 10, 50, 100, 500];\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 MEMBERS_SLICE = 30;\nexport const MEMBERS_LOAD_SLICE = 200;\nexport const PINNED_MESSAGES_LIMIT = 50;\nexport const BLOCKED_LIST_LIMIT = 100;\nexport const PROFILE_PHOTOS_LIMIT = 40;\nexport const PROFILE_SENSITIVE_AREA = 500;\nexport const COMMON_CHATS_LIMIT = 100;\nexport const GROUP_CALL_PARTICIPANTS_LIMIT = 100;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 20;\nexport const ALL_CHATS_PRELOAD_DISABLED = false;\n\nexport const DEFAULT_VOLUME = 1;\nexport const DEFAULT_PLAYBACK_RATE = 1;\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;\nexport const IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 17;\nexport const MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 15;\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;\nexport const TMP_CHAT_ID = '0';\n\nexport const ANIMATION_END_DELAY = 100;\n\nexport const FAST_SMOOTH_MAX_DISTANCE = 1500;\nexport const FAST_SMOOTH_MIN_DURATION = 250;\nexport const FAST_SMOOTH_MAX_DURATION = 600;\nexport const FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE = 500; // px\n\n// Average duration of message sending animation\nexport const API_UPDATE_THROTTLE = Math.round((FAST_SMOOTH_MIN_DURATION + FAST_SMOOTH_MAX_DURATION) / 2);\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\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 STICKER_SIZE_INLINE_BOT_RESULT = 100;\nexport const RECENT_STICKERS_LIMIT = 20;\nexport const MEMOJI_STICKER_ID = 'MEMOJI_STICKER';\n\nexport const BASE_EMOJI_KEYWORD_LANG = 'en';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\n\nexport const VIDEO_MOV_TYPE = 'video/quicktime';\n\nexport const SUPPORTED_IMAGE_CONTENT_TYPES = new Set([\n 'image/png', 'image/gif', 'image/jpeg',\n]);\n\nexport const SUPPORTED_VIDEO_CONTENT_TYPES = new Set([\n 'video/mp4', // video/quicktime added dynamically in environment.ts\n]);\n\nexport const CONTENT_TYPES_WITH_PREVIEW = new Set([\n ...SUPPORTED_IMAGE_CONTENT_TYPES,\n ...SUPPORTED_VIDEO_CONTENT_TYPES,\n]);\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,63})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_MENTION_TEMPLATE = '(@[\\\\w\\\\d_-]+)';\nexport const RE_TG_LINK = /^tg:(\\/\\/)?([?=&\\d\\w_-]+)?/gm;\nexport const RE_TME_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/)/gm;\n\n// eslint-disable-next-line max-len\nexport const COUNTRIES_WITH_12H_TIME_FORMAT = new Set(['AU', 'BD', 'CA', 'CO', 'EG', 'HN', 'IE', 'IN', 'JO', 'MX', 'MY', 'NI', 'NZ', 'PH', 'PK', 'SA', 'SV', 'US']);\n\n// MTProto constants\nexport const SERVICE_NOTIFICATIONS_USER_ID = '777000';\nexport const REPLIES_USER_ID = '1271266957'; // TODO For Test connection ID must be equal to 708513\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_CODE = 'en';\nexport const DEFAULT_LANG_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios', 'tdesktop', 'macos'] as const;\nexport const TIPS_USERNAME = 'TelegramTips';\nexport const LOCALIZED_TIPS = ['ar', 'pt-br', 'id', 'it', 'ko', 'ms', 'pl', 'es', 'tr'];\nexport const FEEDBACK_URL = 'https://bugs.telegram.org/?tag_ids=41&sort=time';\nexport const LIGHT_THEME_BG_COLOR = '#A2AF8E';\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\n// Group calls\nexport const GROUP_CALL_VOLUME_MULTIPLIER = 100;\nexport const GROUP_CALL_DEFAULT_VOLUME = 100 * GROUP_CALL_VOLUME_MULTIPLIER;\nexport const ENABLE_THUMBNAIL_VIDEO = false;\n","type Scheduler =\n typeof requestAnimationFrame\n | typeof onTickEnd\n | 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(fastRafPrimary, 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 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 fastRaf(resolve);\n });\n}\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\nlet fastRafPrimaryCallbacks: NoneToVoidFunction[] | undefined;\n\n// May result in an immediate execution if called from another `requestAnimationFrame` callback\nexport function fastRaf(callback: NoneToVoidFunction, isPrimary = false) {\n if (!fastRafCallbacks) {\n fastRafCallbacks = isPrimary ? [] : [callback];\n fastRafPrimaryCallbacks = isPrimary ? [callback] : [];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n const currentPrimaryCallbacks = fastRafPrimaryCallbacks!;\n fastRafCallbacks = undefined;\n fastRafPrimaryCallbacks = undefined;\n currentPrimaryCallbacks.forEach((cb) => cb());\n currentCallbacks.forEach((cb) => cb());\n });\n } else if (isPrimary) {\n fastRafPrimaryCallbacks!.push(callback);\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nexport function fastRafPrimary(callback: NoneToVoidFunction) {\n fastRaf(callback, true);\n}\n\nlet onTickEndCallbacks: NoneToVoidFunction[] | undefined;\nlet onTickEndPrimaryCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function onTickEnd(callback: NoneToVoidFunction, isPrimary = false) {\n if (!onTickEndCallbacks) {\n onTickEndCallbacks = isPrimary ? [] : [callback];\n onTickEndPrimaryCallbacks = isPrimary ? [callback] : [];\n\n Promise.resolve().then(() => {\n const currentCallbacks = onTickEndCallbacks!;\n const currentPrimaryCallbacks = onTickEndPrimaryCallbacks!;\n onTickEndCallbacks = undefined;\n onTickEndPrimaryCallbacks = undefined;\n currentPrimaryCallbacks.forEach((cb) => cb());\n currentCallbacks.forEach((cb) => cb());\n });\n } else if (isPrimary) {\n onTickEndPrimaryCallbacks!.push(callback);\n } else {\n onTickEndCallbacks.push(callback);\n }\n}\n\nexport function onTickEndPrimary(callback: NoneToVoidFunction) {\n onTickEnd(callback, true);\n}\n\nlet beforeUnloadCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function onBeforeUnload(callback: NoneToVoidFunction, isLast = false) {\n if (!beforeUnloadCallbacks) {\n beforeUnloadCallbacks = [];\n // eslint-disable-next-line no-restricted-globals\n self.addEventListener('beforeunload', () => {\n beforeUnloadCallbacks!.forEach((cb) => cb());\n });\n }\n\n if (isLast) {\n beforeUnloadCallbacks.push(callback);\n } else {\n beforeUnloadCallbacks.unshift(callback);\n }\n\n return () => {\n beforeUnloadCallbacks = beforeUnloadCallbacks!.filter((cb) => cb !== callback);\n };\n}\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 = 60000;\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?.[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","import { ASSET_CACHE_NAME } from '../config';\nimport { pause } from '../util/schedulers';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\n// An attempt to fix freezing UI on iOS\nconst CACHE_TIMEOUT = 3000;\n\nexport async function respondWithCache(e: FetchEvent) {\n const cacheResult = await withTimeout(async () => {\n const cache = await self.caches.open(ASSET_CACHE_NAME);\n const cached = await cache.match(e.request);\n\n return { cache, cached };\n }, CACHE_TIMEOUT);\n\n const { cache, cached } = cacheResult || {};\n\n if (cache && cached) {\n if (cached.ok) {\n return cached;\n } else {\n await cache.delete(e.request);\n }\n }\n\n const remote = await fetch(e.request);\n\n if (remote.ok && cache) {\n cache.put(e.request, remote.clone());\n }\n\n return remote;\n}\n\nasync function withTimeout(cb: () => Promise, timeout: number) {\n try {\n return await Promise.race([\n pause(timeout).then(() => Promise.reject(new Error('TIMEOUT'))),\n cb(),\n ]);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n return undefined;\n }\n}\n\nexport function clearAssetCache() {\n return self.caches.delete(ASSET_CACHE_NAME);\n}\n","import { APP_NAME, DEBUG, DEBUG_MORE } from '../config';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\nenum Boolean {\n True = '1',\n False = '0',\n}\n\ntype PushData = {\n custom: {\n msg_id?: string;\n channel_id?: string;\n chat_id?: string;\n from_id?: string;\n };\n mute: Boolean;\n badge: Boolean;\n loc_key: string;\n loc_args: string[];\n random_id: number;\n title: string;\n description: string;\n};\n\ntype NotificationData = {\n messageId?: number;\n chatId?: string;\n title: string;\n body: string;\n icon?: string;\n};\n\ntype CloseNotificationData = {\n lastReadInboxMessageId?: number;\n chatId: string;\n};\n\nlet lastSyncAt = new Date().valueOf();\nconst shownNotifications = new Set();\nconst clickBuffer: Record = {};\n\nfunction getPushData(e: PushEvent | Notification): PushData | undefined {\n try {\n return 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 undefined;\n }\n}\n\nfunction getChatId(data: PushData) {\n if (data.custom.from_id) {\n return data.custom.from_id;\n }\n\n // Chats and channels have “negative” IDs\n if (data.custom.chat_id || data.custom.channel_id) {\n return `-${data.custom.chat_id || data.custom.channel_id}`;\n }\n\n return undefined;\n}\n\nfunction getMessageId(data: PushData) {\n if (!data.custom.msg_id) return undefined;\n return parseInt(data.custom.msg_id, 10);\n}\n\nfunction getNotificationData(data: PushData): NotificationData {\n return {\n chatId: getChatId(data),\n messageId: getMessageId(data),\n title: data.title || APP_NAME,\n body: data.description,\n };\n}\n\nasync function getClients() {\n const appUrl = new URL(self.registration.scope).origin;\n const clients = await self.clients.matchAll({ type: 'window' }) as WindowClient[];\n return clients.filter((client) => {\n return new URL(client.url).origin === appUrl;\n });\n}\n\nasync function playNotificationSound(id: string) {\n const clients = await getClients();\n const client = clients[0];\n if (!client) return;\n client.postMessage({\n type: 'playNotificationSound',\n payload: { id },\n });\n}\n\nfunction showNotification({\n chatId,\n messageId,\n body,\n title,\n icon,\n}: NotificationData) {\n const isFirstBatch = new Date().valueOf() - lastSyncAt < 1000;\n const tag = String(isFirstBatch ? 0 : chatId || 0);\n const options: NotificationOptions = {\n body,\n data: {\n chatId,\n messageId,\n count: 1,\n },\n icon: icon || 'icon-192x192.png',\n badge: 'icon-192x192.png',\n tag,\n vibrate: [200, 100, 200],\n };\n\n return Promise.all([\n playNotificationSound(String(messageId) || chatId || ''),\n self.registration.showNotification(title, options),\n ]);\n}\n\nasync function closeNotifications({\n chatId,\n lastReadInboxMessageId,\n}: CloseNotificationData) {\n const notifications = await self.registration.getNotifications();\n const lastMessageId = lastReadInboxMessageId || Number.MAX_VALUE;\n notifications.forEach((notification) => {\n if (\n notification.tag === '0'\n || (notification.data.chatId === chatId && notification.data.messageId <= lastMessageId)\n ) {\n notification.close();\n }\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\n const data = getPushData(e);\n\n // Do not show muted notifications\n if (!data || data.mute === Boolean.True) return;\n\n const notification = getNotificationData(data);\n\n // Dont show already triggered notification\n if (shownNotifications.has(notification.messageId)) {\n shownNotifications.delete(notification.messageId);\n return;\n }\n\n e.waitUntil(showNotification(notification));\n}\n\nasync function focusChatMessage(client: WindowClient, data: { chatId?: string; messageId?: number }) {\n const {\n chatId,\n messageId,\n } = data;\n if (!chatId) return;\n client.postMessage({\n type: 'focusMessage',\n payload: {\n chatId,\n messageId,\n },\n });\n if (!client.focused) {\n // Catch \"focus not allowed\" DOM Exceptions\n try {\n await client.focus();\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[SW] ', error);\n }\n }\n }\n}\n\nexport function handleNotificationClick(e: NotificationEvent) {\n const appUrl = self.registration.scope;\n e.notification.close(); // Android needs explicit close.\n const { data } = e.notification;\n const notifyClients = async () => {\n const clients = await getClients();\n await Promise.all(clients.map((client) => {\n clickBuffer[client.id] = data;\n return focusChatMessage(client, data);\n }));\n if (!self.clients.openWindow || clients.length > 0) return undefined;\n // Store notification data for default client (fix for android)\n clickBuffer[0] = data;\n // If there is no opened client we need to open one and wait until it is fully loaded\n try {\n const newClient = await self.clients.openWindow(appUrl);\n if (newClient) {\n // Store notification data until client is fully loaded\n clickBuffer[newClient.id] = data;\n }\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[SW] ', error);\n }\n }\n return undefined;\n };\n e.waitUntil(notifyClients());\n}\n\nexport function handleClientMessage(e: ExtendableMessageEvent) {\n if (DEBUG_MORE) {\n // eslint-disable-next-line no-console\n console.log('[SW] New message from client', e);\n }\n if (!e.data) return;\n const source = e.source as WindowClient;\n if (e.data.type === 'clientReady') {\n // focus on chat message when client is fully ready\n const data = clickBuffer[source.id] || clickBuffer[0];\n if (data) {\n delete clickBuffer[source.id];\n delete clickBuffer[0];\n e.waitUntil(focusChatMessage(source, data));\n }\n }\n if (e.data.type === 'newMessageNotification') {\n // store messageId for already shown notification\n const notification: NotificationData = e.data.payload;\n // mark this notification as shown if it was handled locally\n shownNotifications.add(notification.messageId);\n e.waitUntil(showNotification(notification));\n }\n\n if (e.data.type === 'closeMessageNotifications') {\n e.waitUntil(closeNotifications(e.data.payload));\n }\n}\n\nself.onsync = () => {\n lastSyncAt = new Date().valueOf();\n};\n","import { DEBUG } from './config';\nimport { respondForProgressive } from './serviceWorker/progressive';\nimport { respondWithCache, clearAssetCache } from './serviceWorker/assetCache';\nimport { handlePush, handleNotificationClick, handleClientMessage } from './serviceWorker/pushNotification';\nimport { pause } from './util/schedulers';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\nconst ASSET_CACHE_PATTERN = /[0-9a-f]{20}.*\\.(js|css|woff2?|svg|png|jpg|jpeg|json|wasm)$/;\nconst ACTIVATE_TIMEOUT = 3000;\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 e.waitUntil(\n Promise.race([\n // An attempt to fix freezing UI on iOS\n pause(ACTIVATE_TIMEOUT),\n Promise.all([\n clearAssetCache(),\n // Become available to all pages\n self.clients.claim(),\n ]),\n ]),\n );\n});\n\n// eslint-disable-next-line no-restricted-globals\nself.addEventListener('fetch', (e: FetchEvent) => {\n const { url } = e.request;\n\n if (url.includes('/progressive/')) {\n e.respondWith(respondForProgressive(e));\n return true;\n }\n\n if (url.startsWith('http') && url.match(ASSET_CACHE_PATTERN)) {\n e.respondWith(respondWithCache(e));\n return true;\n }\n\n return false;\n});\n\nself.addEventListener('push', handlePush);\nself.addEventListener('notificationclick', handleNotificationClick);\nself.addEventListener('message', handleClientMessage);\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"],"names":["MEDIA_PROGRESSIVE_CACHE_NAME","ASSET_CACHE_NAME","SUPPORTED_IMAGE_CONTENT_TYPES","window","innerHeight","Math","round","Set","SUPPORTED_VIDEO_CONTENT_TYPES","pause","ms","Promise","resolve","setTimeout","DEFAULT_PART_SIZE","requestStates","Map","async","respondWithCache","e","cacheResult","cb","timeout","race","then","reject","Error","cache","self","caches","open","cached","match","request","err","console","error","withTimeout","ok","delete","remote","fetch","put","clone","Boolean","addEventListener","type","messageId","result","data","requestState","get","lastSyncAt","Date","valueOf","shownNotifications","clickBuffer","getChatId","custom","from_id","chat_id","channel_id","getMessageId","msg_id","parseInt","getClients","appUrl","URL","registration","scope","origin","clients","matchAll","filter","client","url","playNotificationSound","id","postMessage","payload","showNotification","chatId","body","title","icon","isFirstBatch","options","count","badge","tag","String","vibrate","all","focusChatMessage","focused","focus","onsync","ASSET_CACHE_PATTERN","waitUntil","skipWaiting","claim","includes","respondWith","range","headers","bytes","exec","start","Number","end","fileSize","mimeType","Response","Uint8Array","buffer","status","statusText","cacheKey","cachedArrayBuffer","cachedHeaders","r","arrayBuffer","undefined","json","fetchFromCache","partInfo","params","clientId","store","random","replace","hasOwnProperty","generateIdFor","promise","Object","assign","set","catch","finally","requestPart","fullSize","partSize","min","byteLength","arrayBufferPart","slice","Request","JSON","stringify","saveToCache","respondForProgressive","startsWith","getPushData","mute","True","notification","process","description","getNotificationData","has","close","map","openWindow","length","newClient","notifyClients","source","add","lastReadInboxMessageId","notifications","getNotifications","lastMessageId","MAX_VALUE","forEach","closeNotifications"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/757.e669f135f9dce66de020.css b/dist/532.381cf48a5d9ac614b987.css similarity index 98% rename from dist/757.e669f135f9dce66de020.css rename to dist/532.381cf48a5d9ac614b987.css index 025c2ec41..826adc040 100644 --- a/dist/757.e669f135f9dce66de020.css +++ b/dist/532.381cf48a5d9ac614b987.css @@ -5,6 +5,6 @@ .GroupCallParticipant{position:relative;display:flex;flex-direction:row;align-items:center;color:#fff;padding:.5rem .75rem;border-radius:.75rem;transition:.15s ease-out background-color;cursor:pointer}.GroupCallParticipant:hover{background:#2f363e}.GroupCallParticipant audio{display:none}.GroupCallParticipant .Avatar{margin-right:1rem}.GroupCallParticipant .info{min-width:0;display:flex;flex-direction:column}.GroupCallParticipant .info .name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.GroupCallParticipant .info .about{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;color:#848d94;font-size:.75rem}.GroupCallParticipant .info .about.blue{color:#4da6e0}.GroupCallParticipant .info .about.green{color:#57bc6c}.GroupCallParticipant .info .about.red{color:#ff706f}.GroupCallParticipant .microphone{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:2.75rem;height:2.75rem;margin-left:auto;font-size:1.5rem;color:#ff706f}.GroupCallParticipant.can-self-unmute .microphone{color:#848d94}.GroupCallParticipant .streams{cursor:pointer;display:flex} .GroupCallParticipantVideo{border-radius:.75rem;overflow:hidden;position:relative;max-height:12.875rem;width:calc(50% - 0.25rem);transition:.25s ease-out width;cursor:pointer}.GroupCallParticipantVideo .thumbnail-avatar{position:absolute;border-radius:0;width:100%;height:100%;transform:scale(1.1)}.GroupCallParticipantVideo .thumbnail-avatar img{filter:blur(10px);border-radius:0;object-fit:cover}.GroupCallParticipantVideo:last-child:nth-child(odd){width:100%}.GroupCallParticipantVideo::before{box-shadow:0 0 0 3px transparent inset;width:100%;height:100%;position:absolute;display:block;content:"";z-index:5;border-radius:.75rem;transition:.25s ease-out box-shadow}.GroupCallParticipantVideo.active::before{box-shadow:0px 0px 0px 3px #78ee7e inset}.GroupCallParticipantVideo .back-button{position:absolute;z-index:5;top:.75rem;left:.75rem;background:rgba(0,0,0,.3);border:0;color:#fff;border-radius:1rem;padding:.25rem .75rem;display:flex;align-items:center;gap:.25rem;transition:.25s ease-out opacity,.25s ease-out background-color;opacity:0;cursor:pointer;outline:none !important}.GroupCallParticipantVideo .back-button:hover{background:rgba(0,0,0,.4)}.GroupCallParticipantVideo video{display:block;width:100%}.GroupCallParticipantVideo .video{object-fit:contain;height:12.5rem;position:relative}.GroupCallParticipantVideo .thumbnail-wrapper{position:absolute;top:50%;left:50%;z-index:0;width:100%;transform:translate(-50%, -50%) scale(1.5);background:#000}.GroupCallParticipantVideo .thumbnail{filter:blur(10px) brightness(0.5);object-fit:cover}.GroupCallParticipantVideo .info{position:absolute;bottom:0;color:#fff;display:flex;align-items:center;padding:0 .5rem .25rem;width:100%;height:2rem;background:linear-gradient(0deg, #000, transparent);transition:.25s ease-out opacity;opacity:0}.GroupCallParticipantVideo .info .name{margin-left:.5rem}.GroupCallParticipantVideo .info .last-icon{margin-left:auto}.videos:hover .GroupCallParticipantVideo .info{opacity:1}.videos:hover .GroupCallParticipantVideo .back-button{opacity:1} .GroupCall .modal-content{display:flex;flex-direction:column;align-items:center;height:37.5rem}.GroupCall .modal-dialog{max-height:calc(100% - 4rem);background:#181f27}.GroupCall .Menu .bubble{--color-background: #232A34;--color-chat-hover: #2F363E;--color-item-active: #2F363E;--color-text: #fff;box-shadow:0 .25rem .5rem .125rem rgba(16,16,16,.3)}.GroupCall .MenuItem{padding:.75rem 1rem !important}.GroupCall.single-column{opacity:1 !important}.GroupCall.single-column .modal-dialog{max-width:100% !important;border-bottom-left-radius:0;border-bottom-right-radius:0;margin-top:auto;margin-bottom:0;transform:translate3d(0, 100%, 0);transition:transform .3s ease,opacity .3s ease}.GroupCall.single-column .modal-backdrop{opacity:0;transition:opacity .2s ease}.GroupCall.single-column.open .modal-backdrop{opacity:1}.GroupCall.single-column.open .modal-dialog{transform:translate3d(0, 0, 0)}.GroupCall .header{width:100%;display:flex;align-items:center;color:#fff;margin-bottom:.5rem}.GroupCall .header h3{font-size:1.25rem;font-weight:500;margin:0 auto 0 .5rem}.GroupCall .videos{display:flex;flex-wrap:wrap;gap:.5rem}.GroupCall .participants{margin-top:.75rem;background:#222b34;border-radius:.75rem}.GroupCall .participants .Loading{padding:2rem 0}.GroupCall .participants .invite-btn{padding:.25rem .75rem;display:flex;align-items:center;border-radius:.75rem;transition:.15s ease-out background-color;cursor:pointer;color:var(--color-text-secondary)}.GroupCall .participants .invite-btn:hover{background:#2f363e}.GroupCall .participants .invite-btn .text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.GroupCall .participants .invite-btn .icon{display:flex;justify-content:center;align-items:center;width:2.75rem;height:2.75rem;font-size:1.5rem;margin-right:1rem}.GroupCall .scrollable{overflow:auto;padding-bottom:2rem;max-width:37.5rem;width:100%}.GroupCall .buttons{max-width:37.5rem;margin-top:auto;display:flex;align-items:center;justify-content:space-around;width:100%;position:relative;height:8.75rem}.GroupCall .buttons button{cursor:pointer}.GroupCall .buttons::before{position:absolute;content:"";width:100%;height:2rem;background:linear-gradient(0deg, #181F27, rgba(24, 31, 39, 0));z-index:0;top:-2rem}.GroupCall .buttons .button-wrapper{width:4rem;display:flex;flex-direction:column;align-items:center}.GroupCall .buttons .button-wrapper .button-text{white-space:nowrap;font-size:.75rem;margin-top:.5rem;color:#fff}.GroupCall .buttons .button-wrapper.microphone-wrapper{width:6rem}.GroupCall .buttons .button-wrapper.microphone-wrapper .button-text{margin-top:.75rem;font-size:1rem}.GroupCall .buttons .Loading{position:absolute;transform:translate(0, -1.125rem)}.GroupCall .buttons .Loading .Spinner{--spinner-size: 6.5rem}.GroupCall .buttons .video-buttons{display:flex;flex-direction:column;align-items:center}.GroupCall .buttons .small-button,.GroupCall .buttons .smaller-button{outline:none;border:0;background:#15415b;border-radius:50%;width:3rem;height:3rem;color:#fff;font-size:1.375rem;display:flex;align-items:center;justify-content:center;transition:.25s ease-out background-color}.GroupCall .buttons .small-button:hover,.GroupCall .buttons .smaller-button:hover{background:#11364b}.GroupCall .buttons .small-button.camera.active{background:#15415b}.GroupCall .buttons .small-button.camera.active:hover{background:#11364b}.GroupCall .buttons .small-button.speaker{background:#2b3a51}.GroupCall .buttons .small-button.speaker.active{background:#496092}.GroupCall .buttons .small-button.leave{background:#5a2824}.GroupCall .buttons .small-button.leave:hover{background:#49201d}.GroupCall .buttons .smaller-button{width:2.5rem;height:2.5rem;margin-bottom:.5rem;padding:0}.GroupCall.landscape .scrollable{display:flex;flex-direction:row;flex-grow:1;gap:1rem;align-items:flex-start;max-width:100%;max-height:100%}.GroupCall.landscape .GroupCallParticipantVideo{max-height:initial}.GroupCall.landscape .GroupCallParticipantVideo video{height:100%}.GroupCall.landscape .buttons{position:absolute;left:calc(50% - 15.625rem / 2);transform:translateX(-50%);width:auto;gap:1rem;bottom:4rem;background:rgba(0,0,0,.6);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-radius:1rem;z-index:5;padding:.75rem 1rem;height:auto}.GroupCall.landscape .buttons .button-text{display:none}.GroupCall.landscape .buttons .video-buttons{flex-direction:row;gap:1rem}.GroupCall.landscape .buttons .video-buttons .smaller-button{margin-bottom:0}.GroupCall.landscape .buttons .Loading{transform:none}.GroupCall.landscape .buttons .Loading .Spinner{--spinner-size: 3.25rem}.GroupCall.landscape .buttons .MicrophoneButton canvas{width:2rem !important;height:2rem !important}.GroupCall.landscape .buttons .MicrophoneButton,.GroupCall.landscape .buttons .microphone-wrapper{width:3rem;height:3rem}.GroupCall.landscape .buttons .MicrophoneButton .AnimatedSticker,.GroupCall.landscape .buttons .microphone-wrapper .AnimatedSticker{display:flex;align-items:center;justify-content:center}.GroupCall.landscape .buttons::before{display:none}.GroupCall.landscape.no-sidebar .buttons{left:calc(50%)}.GroupCall.landscape .streams{width:100%;height:100%}.GroupCall.landscape .videos{width:100%;height:100%;display:grid;--column-count: 1;grid-template-columns:repeat(var(--column-count), 1fr);grid-auto-rows:1fr}.GroupCall.landscape .videos .GroupCallParticipantVideo{max-height:100%;width:100%}.GroupCall.landscape .videos .GroupCallParticipantVideo .thumbnail-wrapper{height:100%}.GroupCall.landscape .videos.span-last-video .GroupCallParticipantVideo:last-child{grid-column:span var(--column-count)}.GroupCall.landscape .participants{width:15.625rem;margin-top:0} -.ActiveCallHeader{position:absolute;top:0;left:0;height:2rem;width:100%;z-index:1;display:flex;justify-content:center;font-weight:500;font-size:.875rem;color:#fff;align-items:center;padding:0 1rem;background:linear-gradient(90deg, #52ce5d, #00b1c0);transform:translateY(-100%)}.ActiveCallHeader.open{transform:translateY(0)} +.ActiveCallHeader{position:absolute;top:0;left:0;height:2rem;width:100%;z-index:1;display:flex;justify-content:center;font-weight:500;font-size:.875rem;color:#fff;align-items:center;padding:0 1rem;background:linear-gradient(135deg, #3152e8, #8f4aac);transform:translateY(-100%)}.ActiveCallHeader.open{transform:translateY(0)}.ActiveCallHeader span{line-height:100%} -/*# sourceMappingURL=757.e669f135f9dce66de020.css.map*/ \ No newline at end of file +/*# sourceMappingURL=532.381cf48a5d9ac614b987.css.map*/ \ No newline at end of file diff --git a/dist/532.381cf48a5d9ac614b987.css.map b/dist/532.381cf48a5d9ac614b987.css.map new file mode 100644 index 000000000..0f5177dd5 --- /dev/null +++ b/dist/532.381cf48a5d9ac614b987.css.map @@ -0,0 +1 @@ +{"version":3,"file":"532.381cf48a5d9ac614b987.css","mappings":"AAAA,OACE,kBACA,uBAGE,4IACE,gBAKF,gCACE,gBAKF,4BACE,gBAKF,4BACE,gBAIJ,wBACE,eACA,MACA,SACA,OACA,QACA,aACA,uBACA,mBAGF,uBACE,eACA,MACA,QACA,SACA,OACA,WACA,iCAGF,4CACE,6BAGF,qBACE,kBACA,oBACA,sBACA,WACA,gBACA,kBACA,iBACA,yCACA,8DACA,2CACA,mCAEA,+CAEA,4CACE,gBACA,0BAGF,yBApBF,qBAqBI,yCAIJ,0BACE,+BAGF,6BACE,kCAGF,oDACE,oBACA,aACA,mBACA,cAGF,oBACE,kBACA,gBACA,cACA,gBACA,uBAEA,qCACE,mBAIJ,+BAEE,4CAEA,oDACE,kBACA,eACA,WACA,qBACA,iBACA,qBACA,sBACA,eAIJ,sBACE,WACA,YACA,aACA,gBAEA,qDAEE,sBAIJ,kEAGE,uBACA,mBAGF,uBACE,aACA,qBAEA,qEACE,iBAIJ,8BACE,WACA,YACA,iBACA,iBACA,gBACA,qB;AC3JJ,kBACE,aACA,uBACA,mBACA,wBACA,kBACA,WACA,YACA,SACA,wFACA,kBACA,eACA,WACA,gCAEA,0BACE,WACA,cACA,kBACA,WACA,YACA,mBACA,kBACA,kBACA,WACA,oBAEA,sCACE,aAIJ,wBACE,uBAGF,0BACE,wFAEA,kCACE,mBAIJ,iCACE,mFACA,yCACE,mBAIJ,sEACE,mBACA,sFACE,uB;ACpDN,kBACE,kBACA,0BACE,gBACA,gBACA,UACA,uBACA,2BACA,iBACA,WAEA,iCACE,oDACA,gBACA,mCACA,2CACA,oBAIJ,kCACE,YAiCA,kBACA,gBACA,eAjCA,wCACE,oBACA,kBACA,UACA,YACA,aACA,mBACA,mBACA,oBAEA,yDACE,kBAIJ,uCACE,uBAGF,yCACE,uBAGF,yCACE,uBAGF,sCACE,uBCpCJ,oDACE,wBACA,cACA,WACA,cACA,oBACA,uBAEA,0DACE,aAGF,+DACE,WACA,eAEA,uBACA,yBACA,kBAGF,0EACE,wBAGF,uEACE,qBAGF,mFACE,eAGF,+IACE,eDsBF,oDACE,YACA,kBACA,aACA,MACA,wBACA,SACA,UAIA,0EAvBA,YACA,YACA,aACA,8BACA,2CACA,oDACA,0JAqBA,sEA3BA,YACA,YACA,aACA,8BACA,2CACA,oDACA,uJAyBA,+DA/BA,YACA,YACA,aACA,8BACA,2CACA,oDACA,sJ;AEnEN,QACE,mCACA,UACA,mBACA,uBACA,eACA,gBACA,kBACA,wEACA,WACA,iBACA,aACA,mBACA,gEAEA,wBACE,kBAGF,eACE,WACA,YAGF,UACE,iBAEA,4BACE,qBAIJ,mBACE,WACA,YACA,mBAEA,0BACE,eACA,gBAIJ,kBACE,WACA,YACA,kBAEA,yBACE,cACA,eAIJ,mBACE,eACA,gBACA,kBAEA,0BACE,cACA,eAIJ,oBACE,cACA,eACA,oBAEA,2BACE,WACA,YAIJ,mBACE,oBAEA,qBACE,iBAGF,0BACE,gBACA,iBAIJ,mBACE,aACA,cACA,iBAEA,qBACE,eAGF,0BACE,aACA,cAIJ,eACE,kBAEA,sBACE,WACA,cACA,kBACA,cACA,aACA,cACA,eACA,kBACA,yCACA,yBACA,cAIJ,oBACE,eAGF,wBACE,WACA,Y;AChIJ,sBACE,kBACA,aACA,mBACA,mBACA,WACA,qBACA,qBACA,0CACA,eAEA,4BACE,mBAGF,4BACE,aAGF,8BACE,kBAGF,4BACE,YACA,aACA,sBAEA,kCACE,uBACA,mBACA,gBAGF,mCACE,uBACA,mBACA,gBACA,cACA,iBAEA,wCACE,cAGF,yCACE,cAGF,uCACE,cAKN,kCACE,cACA,aACA,mBACA,uBACA,cACA,eACA,iBACA,iBACA,cAIA,kDACE,cAIJ,+BACE,eACA,a;AC3EJ,2BACE,qBACA,gBACA,kBACA,qBACA,0BACA,+BACA,eAEA,6CACE,kBACA,gBACA,WACA,YACA,qBAEA,iDACE,kBACA,gBACA,iBAIJ,qDACE,WAGF,mCACE,uCACA,WACA,YACA,kBACA,cACA,WACA,UACA,qBACA,oCAGF,0CACE,yCAGF,wCACE,kBACA,UACA,WACA,YACA,0BACA,SACA,WACA,mBACA,sBACA,aACA,mBACA,WACA,gEACA,UACA,eACA,wBAEA,8CACE,0BAIJ,iCACE,cACA,WAGF,kCACE,mBACA,eACA,kBAGF,8CACE,kBACA,QACA,SACA,UACA,WACA,2CACA,gBAGF,sCACE,kCACA,iBAGF,iCACE,kBACA,SACA,WACA,aACA,mBACA,uBACA,WACA,YACA,oDACA,iCACA,UAEA,uCACE,kBAGF,4CACE,iBAOJ,+CACE,UAGF,sDACE,U;ACzHF,0BACE,aACA,sBACA,mBACA,eAGF,yBACE,6BACA,mBAGF,yBACE,4BACA,4BACA,6BACA,mBACA,oDAIF,qBACE,+BAGF,yBACE,qBAEA,uCACE,0BACA,4BACA,6BACA,gBACA,gBACA,kCACA,+CAGF,yCACE,UACA,4BAIA,8CACE,UAGF,4CACE,+BAKN,mBACE,WACA,aACA,mBACA,WACA,oBAEA,sBACE,kBACA,gBACA,sBAIJ,mBACE,aACA,eACA,UAGF,yBACE,kBACA,mBACA,qBAEA,kCACE,eAGF,qCACE,sBACA,aACA,mBACA,qBACA,0CACA,eACA,kCAEA,2CACE,mBAGF,2CACE,uBACA,mBACA,gBAGF,2CACE,aACA,uBACA,mBACA,cACA,eACA,iBACA,kBAKN,uBACE,cACA,oBACA,kBACA,WAGF,oBACE,kBACA,gBACA,aACA,mBACA,6BACA,WACA,kBACA,eAEA,2BACE,eAGF,4BACE,kBACA,WACA,WACA,YACA,+DACA,UACA,UAGF,oCACE,WACA,aACA,sBACA,mBAEA,iDACE,mBACA,iBACA,iBACA,WAGF,uDACE,WAEA,oEACE,kBACA,eAKN,6BACE,kBACA,kCAEA,sCACE,uBAIJ,mCACE,aACA,sBACA,mBAGF,sEACE,aACA,SACA,mBACA,kBACA,WACA,YACA,WACA,mBACA,aACA,mBACA,uBACA,0CAEA,kFACE,mBAIJ,gDACE,mBAEA,sDACE,mBAIJ,0CACE,mBAEA,iDACE,mBAIJ,wCACE,mBAEA,8CACE,mBAIJ,oCACE,aACA,cACA,oBACA,UAKJ,iCACE,aACA,mBACA,YACA,SACA,uBACA,eACA,gBAGF,gDACE,mBAEA,sDACE,YAIJ,8BACE,kBACA,+BACA,2BACA,WACA,SACA,YACA,0BACA,8DACA,mBACA,UACA,oBACA,YAEA,2CACE,aAGF,6CACE,mBACA,SAEA,6DACE,gBAIJ,uCACE,eACA,gDACE,wBAKF,uDACE,sBACA,uBAIJ,kGACE,WACA,YAEA,oIACE,aACA,mBACA,uBAIJ,sCACE,aAIJ,yCACE,eAGF,8BACE,WACA,YAGF,6BACE,WACA,YAEA,aACA,kBACA,uDACA,mBAEA,wDACE,gBACA,WAEA,2EACE,YAIJ,mFACE,qCAIJ,mCACE,gBACA,a;ACzVJ,kBACE,kBACA,MACA,OACA,YACA,WACA,UAEA,aACA,uBACA,gBACA,kBACA,WACA,mBACA,eACA,qDACA,4BAEA,uBACE,wBAGF,uBACE,iB","sources":["webpack://telegram-t/./src/components/ui/Modal.scss","webpack://telegram-t/./src/components/calls/group/MicrophoneButton.scss","webpack://telegram-t/./src/components/calls/group/GroupCallParticipantMenu.scss","webpack://telegram-t/./src/styles/_mixins.scss","webpack://telegram-t/./src/components/common/Avatar.scss","webpack://telegram-t/./src/components/calls/group/GroupCallParticipant.scss","webpack://telegram-t/./src/components/calls/group/GroupCallParticipantVideo.scss","webpack://telegram-t/./src/components/calls/group/GroupCall.scss","webpack://telegram-t/./src/components/calls/ActiveCallHeader.scss"],"sourcesContent":[".Modal {\n position: relative;\n z-index: var(--z-modal);\n\n &.delete, &.error, &.confirm, &.pin, &.unpin-all {\n .modal-dialog {\n max-width: 23rem;\n }\n }\n\n &.error {\n .modal-content > div {\n margin-top: 1rem;\n }\n }\n\n &.narrow {\n .modal-dialog {\n max-width: 20rem;\n }\n }\n\n &.report {\n .modal-dialog {\n max-width: 15rem;\n }\n }\n\n .modal-container {\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n .modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n background-color: rgba(0, 0, 0, .25);\n }\n\n &.transparent-backdrop .modal-backdrop {\n background-color: transparent;\n }\n\n .modal-dialog {\n position: relative;\n display: inline-flex;\n flex-direction: column;\n width: 100%;\n max-width: 35rem;\n min-width: 17.5rem;\n margin: 2rem auto;\n background-color: var(--color-background);\n box-shadow: 0 .25rem .5rem .125rem var(--color-default-shadow);\n border-radius: var(--border-radius-default);\n transform: translate3d(0, -1rem, 0);\n\n transition: transform .2s ease, opacity .2s ease;\n\n body.animation-level-0 & {\n transition: none;\n transform: none !important;\n }\n\n @media (max-width: 450px) {\n max-width: calc(100vw - 3rem) !important;\n }\n }\n\n &.open .modal-dialog {\n transform: translate3d(0, 0, 0);\n }\n\n &.closing .modal-dialog {\n transform: translate3d(0, 1rem, 0);\n }\n\n .modal-header {\n padding: 1rem 1rem 0;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n }\n\n .modal-title {\n font-size: 1.25rem;\n font-weight: 500;\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:not(:only-child) {\n margin: 0 1.3125rem;\n }\n }\n\n .modal-header-condensed {\n @extend .modal-header;\n padding: .5rem 1.25rem 0 .9375rem !important;\n\n .modal-action-button {\n font-size: 0.875rem;\n height: 2.25rem;\n width: auto;\n line-height: 1.625rem;\n margin-left: auto;\n padding-left: 1.25rem;\n padding-right: 1.25rem;\n min-width: 5rem;\n }\n }\n\n .modal-content {\n width: 100%;\n flex-grow: 1;\n padding: 1rem;\n overflow-y: auto;\n\n b,\n strong {\n word-break: break-word;\n }\n }\n\n .modal-title,\n .modal-content,\n .modal-content > p {\n unicode-bidi: plaintext;\n text-align: initial;\n }\n\n .dialog-buttons {\n display: flex;\n align-items: flex-end;\n\n .confirm-dialog-button + .confirm-dialog-button {\n margin-left: 1rem;\n }\n }\n\n .confirm-dialog-button {\n width: auto;\n height: auto;\n margin-left: auto;\n text-align: right;\n font-weight: 500;\n white-space: pre-wrap;\n }\n}\n",".MicrophoneButton {\n display: flex;\n justify-content: center;\n align-items: center;\n outline: none !important;\n position: relative;\n width: 6rem;\n height: 6rem;\n border: 0;\n background: radial-gradient(100% 100% at 100% 0%, #00a0b9 0%, #33c659 55%, #33c659 100%);\n border-radius: 50%;\n font-size: 2rem;\n color: #fff;\n transition: 0.25s ease-out filter;\n\n &::before {\n content: \"\";\n display: block;\n position: absolute;\n width: 8rem;\n height: 8rem;\n background: #64C166;\n border-radius: 50%;\n filter: blur(10px);\n opacity: 0.2;\n pointer-events: none;\n\n body.is-ios & {\n display: none;\n }\n }\n\n &:hover {\n filter: brightness(0.9);\n }\n\n &.crossed {\n background: radial-gradient(100% 100% at 100% 0%, #00AFFE 0%, #00AFFE 55%, #007FFF 100%);\n\n &::before {\n background: #00AFFE;\n }\n }\n\n &.muted-by-admin {\n background: radial-gradient(85.5% 103.5% at 87.5% 20.65%, #CE4D74 0%, #3D52DF 100%);\n &::before {\n background: #3D52DF;\n }\n }\n\n &.is-connecting, &.is-connecting:hover {\n background: #222B34;\n &::before {\n background: transparent;\n }\n }\n}\n","@import '../../../styles/mixins';\n\n.participant-menu {\n position: absolute;\n .bubble {\n background: none;\n border-radius: 0;\n padding: 0;\n border: none !important;\n box-shadow: none !important;\n overflow: visible;\n color: #ffffff;\n\n .group {\n box-shadow: 0 0.25rem 0.5rem 0.125rem rgba(16, 16, 16, 0.3);\n overflow: hidden;\n background: var(--color-background);\n border-radius: var(--border-radius-default);\n margin-bottom: 0.5rem;\n }\n }\n\n .volume-control {\n height: 3rem;\n\n .info {\n pointer-events: none;\n position: relative;\n z-index: 1;\n height: 100%;\n display: flex;\n flex-direction: row;\n align-items: center;\n padding: 0.75rem 1rem;\n\n .AnimatedSticker {\n margin-right: 2rem;\n }\n }\n\n &.high {\n --range-color: #4DA6E0;\n }\n\n &.normal {\n --range-color: #57BC6C;\n }\n\n &.medium {\n --range-color: #CAA53B;\n }\n\n &.low {\n --range-color: #CB5757;\n }\n\n position: relative;\n overflow: hidden;\n cursor: pointer;\n\n @mixin thumb-styles() {\n border: none;\n height: 3rem;\n width: 1.5rem;\n background: var(--range-color);\n border-radius: var(--border-radius-default);\n box-shadow: -13.5rem 0 0 12.75rem var(--range-color);\n transition: 0.25s ease-in-out background-color, 0.25s ease-in-out box-shadow;\n }\n\n @include reset-range();\n\n // Apply custom styles\n input[type=\"range\"] {\n height: 3rem;\n position: absolute;\n left: -1.5rem;\n top: 0;\n width: calc(100% + 3rem);\n margin: 0;\n z-index: 0;\n\n // Note that while we're repeating code here, that's necessary as you can't comma-separate these type of selectors.\n // Browsers will drop the entire selector if it doesn't understand a part of it.\n &::-webkit-slider-thumb {\n @include thumb-styles();\n }\n\n &::-moz-range-thumb {\n @include thumb-styles();\n }\n\n &::-ms-thumb {\n @include thumb-styles();\n }\n }\n }\n}\n","// @optimization\n@mixin while-transition() {\n .Transition > div:not(.active) &, body.animating-right-column & {\n @content;\n }\n}\n\n@mixin overflow-y-overlay() {\n @supports (overflow-y: overlay) {\n overflow-y: overlay;\n\n //Workaround for Android <= 9\n overflow-x: hidden;\n }\n}\n\n@mixin reset-range() {\n input[type=\"range\"] {\n -webkit-appearance: none;\n display: block;\n width: 100%;\n height: 0.75rem;\n margin-bottom: 0.5rem;\n background: transparent;\n\n &:focus {\n outline: none;\n }\n\n &::-ms-track {\n width: 100%;\n cursor: pointer;\n\n background: transparent;\n border-color: transparent;\n color: transparent;\n }\n\n &::-webkit-slider-thumb {\n -webkit-appearance: none;\n }\n\n &::-moz-slider-thumb {\n -moz-appearance: none;\n }\n\n &::-webkit-slider-runnable-track {\n cursor: pointer;\n }\n\n &::-moz-range-track, &::-moz-range-progress {\n cursor: pointer;\n }\n }\n}\n",".Avatar {\n --color-user: var(--color-primary);\n flex: none;\n align-items: center;\n justify-content: center;\n width: 3.375rem;\n height: 3.375rem;\n border-radius: 50%;\n background: linear-gradient(var(--color-white) -125%, var(--color-user));\n color: white;\n font-weight: bold;\n display: flex;\n white-space: nowrap;\n user-select: none;\n\n img:not(.emoji) {\n border-radius: 50%;\n }\n\n .emoji {\n width: 1rem;\n height: 1rem;\n }\n\n i {\n font-size: 2.5rem;\n\n &.icon-reply-filled {\n transform: scale(.7);\n }\n }\n\n &.size-micro {\n width: 1rem;\n height: 1rem;\n font-size: 0.5125rem;\n\n .emoji {\n width: .5625rem;\n height: .5625rem;\n }\n }\n\n &.size-tiny {\n width: 2rem;\n height: 2rem;\n font-size: .875rem;\n\n .emoji {\n width: .875rem;\n height: .875rem;\n }\n }\n\n &.size-small {\n width: 2.125rem;\n height: 2.125rem;\n font-size: 0.875rem;\n\n .emoji {\n width: .875rem;\n height: .875rem;\n }\n }\n\n &.size-medium {\n width: 2.75rem;\n height: 2.75rem;\n font-size: 1.1875rem;\n\n .emoji {\n width: 1rem;\n height: 1rem;\n }\n }\n\n &.size-large {\n font-size: 1.3125rem;\n\n i {\n font-size: 3.5rem;\n }\n\n .emoji {\n width: 1.3125rem;\n height: 1.3125rem;\n }\n }\n\n &.size-jumbo {\n width: 7.5rem;\n height: 7.5rem;\n font-size: 3.5rem;\n\n i {\n font-size: 6rem;\n }\n\n .emoji {\n width: 3.5rem;\n height: 3.5rem;\n }\n }\n\n &.online {\n position: relative;\n\n &::after {\n content: '';\n display: block;\n position: absolute;\n bottom: 0.05rem;\n right: 0.05rem;\n width: 0.875rem;\n height: 0.875rem;\n border-radius: 50%;\n border: 2px solid var(--color-background);\n background-color: #0ac630;\n flex-shrink: 0;\n }\n }\n\n &.interactive {\n cursor: pointer;\n }\n\n img:not(.emoji) {\n width: 100%;\n height: 100%;\n }\n}\n",".GroupCallParticipant {\n position: relative;\n display: flex;\n flex-direction: row;\n align-items: center;\n color: #fff;\n padding: 0.5rem 0.75rem;\n border-radius: 0.75rem;\n transition: .15s ease-out background-color;\n cursor: pointer;\n\n &:hover {\n background: #2F363E;\n }\n\n audio {\n display: none;\n }\n\n .Avatar {\n margin-right: 1rem;\n }\n\n .info {\n min-width: 0;\n display: flex;\n flex-direction: column;\n\n .name {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n }\n\n .about {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n color: #848D94;\n font-size: 0.75rem;\n\n &.blue {\n color: #4DA6E0;\n }\n\n &.green {\n color: #57BC6C;\n }\n\n &.red {\n color: #FF706F;\n }\n }\n }\n\n .microphone {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2.75rem;\n height: 2.75rem;\n margin-left: auto;\n font-size: 1.5rem;\n color: #FF706F;\n }\n\n &.can-self-unmute {\n .microphone {\n color: #848D94;\n }\n }\n\n .streams {\n cursor: pointer;\n display: flex;\n }\n}\n",".GroupCallParticipantVideo {\n border-radius: 0.75rem;\n overflow: hidden;\n position: relative;\n max-height: 12.875rem;\n width: calc(50% - 0.25rem);\n transition: 0.25s ease-out width;\n cursor: pointer;\n\n .thumbnail-avatar {\n position: absolute;\n border-radius: 0;\n width: 100%;\n height: 100%;\n transform: scale(1.1);\n\n img {\n filter: blur(10px);\n border-radius: 0;\n object-fit: cover;\n }\n }\n\n &:last-child:nth-child(odd) {\n width: 100%;\n }\n\n &::before {\n box-shadow: 0 0 0 3px transparent inset;\n width: 100%;\n height: 100%;\n position: absolute;\n display: block;\n content: \"\";\n z-index: 5;\n border-radius: 0.75rem;\n transition: 0.25s ease-out box-shadow;\n }\n\n &.active::before {\n box-shadow: 0px 0px 0px 3px #78ee7e inset;\n }\n\n .back-button {\n position: absolute;\n z-index: 5;\n top: 0.75rem;\n left: 0.75rem;\n background: rgba(0, 0, 0, 0.3);\n border: 0;\n color: white;\n border-radius: 1rem;\n padding: 0.25rem 0.75rem;\n display: flex;\n align-items: center;\n gap: 0.25rem;\n transition: 0.25s ease-out opacity, 0.25s ease-out background-color;\n opacity: 0;\n cursor: pointer;\n outline: none !important;\n\n &:hover {\n background: rgba(0, 0, 0, 0.4);\n }\n }\n\n video {\n display: block;\n width: 100%;\n }\n\n .video {\n object-fit: contain;\n height: 12.5rem;\n position: relative;\n }\n\n .thumbnail-wrapper {\n position: absolute;\n top: 50%;\n left: 50%;\n z-index: 0;\n width: 100%;\n transform: translate(-50%, -50%) scale(1.5);\n background: black;\n }\n\n .thumbnail {\n filter: blur(10px) brightness(0.5);\n object-fit: cover;\n }\n\n .info {\n position: absolute;\n bottom: 0;\n color: #fff;\n display: flex;\n align-items: center;\n padding: 0 0.5rem 0.25rem;\n width: 100%;\n height: 2rem;\n background: linear-gradient(0deg, #000, transparent);\n transition: 0.25s ease-out opacity;\n opacity: 0;\n\n .name {\n margin-left: 0.5rem;\n }\n\n .last-icon {\n margin-left: auto;\n }\n }\n}\n\n.videos:hover .GroupCallParticipantVideo {\n\n .info {\n opacity: 1;\n }\n\n .back-button {\n opacity: 1;\n }\n}\n",".GroupCall {\n .modal-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 37.5rem;\n }\n\n .modal-dialog {\n max-height: calc(100% - 4rem);\n background: #181F27;\n }\n\n .Menu .bubble {\n --color-background: #232A34;\n --color-chat-hover: #2F363E;\n --color-item-active: #2F363E;\n --color-text: #fff;\n box-shadow: 0 0.25rem 0.5rem 0.125rem rgba(16, 16, 16, 0.3);\n }\n\n // Compact menu items\n .MenuItem {\n padding: 0.75rem 1rem !important;\n }\n\n &.single-column {\n opacity: 1 !important;\n\n .modal-dialog {\n max-width: 100% !important;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n margin-top: auto;\n margin-bottom: 0;\n transform: translate3d(0, 100%, 0);\n transition: transform .3s ease, opacity .3s ease;\n }\n\n .modal-backdrop {\n opacity: 0;\n transition: opacity 0.2s ease;\n }\n\n &.open {\n .modal-backdrop {\n opacity: 1;\n }\n\n .modal-dialog {\n transform: translate3d(0, 0, 0);\n }\n }\n }\n\n .header {\n width: 100%;\n display: flex;\n align-items: center;\n color: #fff;\n margin-bottom: 0.5rem;\n\n h3 {\n font-size: 1.25rem;\n font-weight: 500;\n margin: 0 auto 0 0.5rem;\n }\n }\n\n .videos {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n }\n\n .participants {\n margin-top: 0.75rem;\n background: #222B34;\n border-radius: 0.75rem;\n\n .Loading {\n padding: 2rem 0;\n }\n\n .invite-btn {\n padding: 0.25rem 0.75rem;\n display: flex;\n align-items: center;\n border-radius: 0.75rem;\n transition: .15s ease-out background-color;\n cursor: pointer;\n color: var(--color-text-secondary);\n\n &:hover {\n background: #2F363E;\n }\n\n .text {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n }\n\n .icon {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 2.75rem;\n height: 2.75rem;\n font-size: 1.5rem;\n margin-right: 1rem;\n }\n }\n }\n\n .scrollable {\n overflow: auto;\n padding-bottom: 2rem;\n max-width: 37.5rem;\n width: 100%;\n }\n\n .buttons {\n max-width: 37.5rem;\n margin-top: auto;\n display: flex;\n align-items: center;\n justify-content: space-around;\n width: 100%;\n position: relative;\n height: 8.75rem;\n\n button {\n cursor: pointer;\n }\n\n &::before {\n position: absolute;\n content: \"\";\n width: 100%;\n height: 2rem;\n background: linear-gradient(0deg, #181F27, rgba(24, 31, 39, 0));\n z-index: 0;\n top: -2rem;\n }\n\n .button-wrapper {\n width: 4rem;\n display: flex;\n flex-direction: column;\n align-items: center;\n\n .button-text {\n white-space: nowrap;\n font-size: 0.75rem;\n margin-top: 0.5rem;\n color: #fff;\n }\n\n &.microphone-wrapper {\n width: 6rem;\n\n .button-text {\n margin-top: 0.75rem;\n font-size: 1rem;\n }\n }\n }\n\n .Loading {\n position: absolute;\n transform: translate(0, -1.125rem);\n\n .Spinner {\n --spinner-size: 6.5rem;\n }\n }\n\n .video-buttons {\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n\n .small-button, .smaller-button {\n outline: none;\n border: 0;\n background: #15415b;\n border-radius: 50%;\n width: 3rem;\n height: 3rem;\n color: #fff;\n font-size: 1.375rem;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: 0.25s ease-out background-color;\n\n &:hover {\n background: #11364b;\n }\n }\n\n .small-button.camera.active {\n background: #15415b;\n\n &:hover {\n background: #11364b;\n }\n }\n\n .small-button.speaker {\n background: #2B3A51;\n\n &.active {\n background: #496092;\n }\n }\n\n .small-button.leave {\n background: #5A2824;\n\n &:hover {\n background: #49201d;\n }\n }\n\n .smaller-button {\n width: 2.5rem;\n height: 2.5rem;\n margin-bottom: 0.5rem;\n padding: 0;\n }\n }\n\n\n &.landscape .scrollable {\n display: flex;\n flex-direction: row;\n flex-grow: 1;\n gap: 1rem;\n align-items: flex-start;\n max-width: 100%;\n max-height: 100%;\n }\n\n &.landscape .GroupCallParticipantVideo {\n max-height: initial;\n\n video {\n height: 100%;\n }\n }\n\n &.landscape .buttons {\n position: absolute;\n left: calc(50% - 15.625rem / 2);\n transform: translateX(-50%);\n width: auto;\n gap: 1rem;\n bottom: 4rem;\n background: rgba(0, 0, 0, 0.6);\n backdrop-filter: blur(10px);\n border-radius: 1rem;\n z-index: 5;\n padding: 0.75rem 1rem;\n height: auto;\n\n .button-text {\n display: none;\n }\n\n .video-buttons {\n flex-direction: row;\n gap: 1rem;\n\n .smaller-button {\n margin-bottom: 0;\n }\n }\n\n .Loading {\n transform: none;\n .Spinner {\n --spinner-size: 3.25rem;\n }\n }\n\n .MicrophoneButton {\n canvas {\n width: 2rem !important;\n height: 2rem !important;\n }\n }\n\n .MicrophoneButton, .microphone-wrapper {\n width: 3rem;\n height: 3rem;\n\n .AnimatedSticker {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n }\n\n &::before {\n display: none;\n }\n }\n\n &.landscape.no-sidebar .buttons {\n left: calc(50%);\n }\n\n &.landscape .streams {\n width: 100%;\n height: 100%;\n }\n\n &.landscape .videos {\n width: 100%;\n height: 100%;\n\n display: grid;\n --column-count: 1;\n grid-template-columns: repeat(var(--column-count), 1fr);\n grid-auto-rows: 1fr;\n\n .GroupCallParticipantVideo {\n max-height: 100%;\n width: 100%;\n\n .thumbnail-wrapper {\n height: 100%;\n }\n }\n\n &.span-last-video .GroupCallParticipantVideo:last-child {\n grid-column: span var(--column-count);\n }\n }\n\n &.landscape .participants {\n width: 15.625rem;\n margin-top: 0;\n }\n}\n",".ActiveCallHeader {\n position: absolute;\n top: 0;\n left: 0;\n height: 2rem;\n width: 100%;\n z-index: 1;\n\n display: flex;\n justify-content: center;\n font-weight: 500;\n font-size: 0.875rem;\n color: #fff;\n align-items: center;\n padding: 0 1rem;\n background: linear-gradient(135deg, rgb(49, 82, 232), rgb(143, 74, 172));\n transform: translateY(-100%);\n\n &.open {\n transform: translateY(0);\n }\n\n span {\n line-height: 100%;\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/dist/532.381cf48a5d9ac614b987.js b/dist/532.381cf48a5d9ac614b987.js new file mode 100644 index 000000000..20b7a6231 --- /dev/null +++ b/dist/532.381cf48a5d9ac614b987.js @@ -0,0 +1,3 @@ +/*! For license information please see 532.381cf48a5d9ac614b987.js.LICENSE.txt */ +(self.webpackChunktelegram_t=self.webpackChunktelegram_t||[]).push([[532],{7936:(e,t,a)=>{"use strict";a.r(t),a.d(t,{ActiveCallHeader:()=>J,CallFallbackConfirm:()=>K,GroupCall:()=>Q});var n=a(3794),i=a(4050),o=a(5116),r=a(3716),s=a(1226),l=a(1638),c=a(2607),d=a(4446),u=a(782),p=a(2267),m=a(1394),v=a(1689),g=a(6204),f=a(1171);(0,o.Q6)("apiUpdate",((e,t,a)=>{const{activeGroupCallId:i}=e.groupCalls;switch(a["@type"]){case"updateGroupCallLeavePresentation":t.toggleGroupCallPresentation({value:!1});break;case"updateGroupCallStreams":if(!a.userId||!i)break;if(!(0,c.GU)(e,i,a.userId))break;return(0,d.B6)(e,i,a.userId,(0,u.CE)(a,["@type","userId"]));case"updateGroupCallConnectionState":if(!i)break;if("disconnected"===a.connectionState){t.leaveGroupCall({isFromLibrary:!0});break}return(0,d.AH)(e,i,{connectionState:a.connectionState,isSpeakerDisabled:a.isSpeakerDisabled});case"updateGroupCallParticipants":{const{groupCallId:e,participants:t}=a;i===e&&(0,n.handleUpdateGroupCallParticipants)(t);break}case"updateGroupCallConnection":{if(a.data.stream){t.showNotification({message:"Big live streams are not yet supported"}),t.leaveGroupCall();break}(0,n.handleUpdateGroupCallConnection)(a.data,a.presentation);const i=(0,c.mU)(e);null!=i&&i.participants&&Object.keys(i.participants).length>0&&(0,n.handleUpdateGroupCallParticipants)(Object.values(i.participants));break}}})),(0,o.Q6)("leaveGroupCall",((e,t,a)=>{const{isFromLibrary:i,shouldDiscard:r,shouldRemove:l,rejoin:u}=a||{},p=(0,c.mU)(e);p&&((0,o.R3)((0,d.Ic)(e,{connectionState:"disconnected"},p.participantsCount-1)),(async()=>{await(0,s.t9)("leaveGroupCall",{call:p});let a=!1;var c;r&&((e=(0,o.Rd)()).groupCalls.fallbackChatId===p.chatId&&(a=!0,null===(c=e.groupCalls.fallbackUserIdsToRemove)||void 0===c||c.forEach((a=>{t.deleteChatMember({chatId:e.groupCalls.fallbackChatId,userId:a})}))),await(0,s.t9)("discardGroupCall",{call:p}));e=(0,o.Rd)(),l&&(e=(0,d.dc)(e,p.id)),(0,v.Mt)(),(0,o.R3)({...e,groupCalls:{...e.groupCalls,isGroupCallPanelHidden:!0,activeGroupCallId:void 0,...a&&{fallbackChatId:void 0,fallbackUserIdsToRemove:void 0}}}),i||(0,n.leaveGroupCall)(),u&&t.joinGroupCall(u)})())})),(0,o.Q6)("toggleGroupCallVideo",(e=>{const t=(0,c.mU)(e),a=(0,l.dy)(e,e.currentUserId);a&&t&&(async()=>{await(0,n.toggleStream)("video"),await(0,s.t9)("editGroupCallParticipant",{call:t,videoStopped:!(0,n.isStreamEnabled)("video"),participant:a})})()})),(0,o.Q6)("requestToSpeak",((e,t,a)=>{const{value:n}=a||{value:!0},i=(0,c.mU)(e),o=(0,l.dy)(e,e.currentUserId);o&&i&&(0,s.t9)("editGroupCallParticipant",{call:i,raiseHand:n,participant:o})})),(0,o.Q6)("setGroupCallParticipantVolume",((e,t,a)=>{const{participantId:i,volume:o}=a,d=(0,c.mU)(e),u=(0,l.dy)(e,i);u&&d&&((0,n.setVolume)(i,Math.floor(o/r.Ro)/100),(0,s.t9)("editGroupCallParticipant",{call:d,volume:Number(o),participant:u}))})),(0,o.Q6)("toggleGroupCallMute",((e,t,a)=>{const{participantId:i,value:o}=a||{},r=(0,c.mU)(e),d=(0,l.dy)(e,i||e.currentUserId);d&&r&&(async()=>{const e=void 0===o?(0,n.isStreamEnabled)("audio",d.id):o;i?(0,n.setVolume)(i,e?0:1):await(0,n.toggleStream)("audio"),await(0,s.t9)("editGroupCallParticipant",{call:r,muted:e,participant:d})})()})),(0,o.Q6)("toggleGroupCallPresentation",((e,t,a)=>{const i=(0,c.mU)(e),o=(0,l.dy)(e,e.currentUserId);o&&i&&(async()=>{if(void 0!==(null==a?void 0:a.value)?null==a?void 0:a.value:!(0,n.isStreamEnabled)("presentation")){const e=await(0,n.startSharingScreen)();if(!e)return;await(0,s.t9)("joinGroupCallPresentation",{call:i,params:e})}else await(0,n.toggleStream)("presentation",!1),await(0,s.t9)("leaveGroupCallPresentation",{call:i});await(0,s.t9)("editGroupCallParticipant",{call:i,presentationPaused:!(0,n.isStreamEnabled)("presentation"),participant:o})})()})),(0,o.Q6)("connectToActiveGroupCall",((e,t)=>{const a=(0,c.mU)(e);if(!a)return;if("discarded"===a.connectionState)return void t.showNotification({message:"This voice chat is not active"});const i=(0,v.FF)(),r=(0,v.NH)();if(!i||!r)return;const{currentUserId:d}=e;d&&(async()=>{const e=await(0,n.joinGroupCall)(d,r,i,t.apiUpdate);if(await(0,s.t9)("joinGroupCall",{call:a,params:e,inviteHash:a.inviteHash})&&(t.loadMoreGroupCallParticipants(),a.chatId)){const e=(0,l.Z1)((0,o.Rd)(),a.chatId);if(!e)return;await(0,g.f)(e)}})()})),(0,o.Q6)("inviteToCallFallback",((e,t,a)=>{const{chatId:n}=(0,l.Bt)(e)||{};if(!n)return;const i=(0,l.dy)(e,n);if(!i)return;const{shouldRemove:r}=a;(async()=>{const a=(0,c.oq)(e);let l=Object.values(e.chats.byId).find((e=>e.title===a&&e.isCreator&&!e.isRestricted));if(l)t.updateChatMemberBannedRights({chatId:l.id,userId:n,bannedRights:{}}),(0,s.t9)("addChatMembers",l,[i],!0);else{if(l=await(0,s.t9)("createChannel",{title:a,users:[i]}),!l)return;const e=await(0,m.dc)(f,"avatar.png");(0,s.t9)("editChatPhoto",{chatId:l.id,accessHash:l.accessHash,photo:e})}const d=await(0,s.t9)("updatePrivateLink",{chat:l,usageLimit:1,expireDate:(0,p.b)(e.serverTimeOffset)+1800});if(d){if(r){const t=(e=(0,o.Rd)()).groupCalls.fallbackUserIdsToRemove||[];(0,o.R3)({...e,groupCalls:{...e.groupCalls,fallbackChatId:l.id,fallbackUserIdsToRemove:[...t,n]}})}t.sendMessage({text:`Join a call: ${d}`}),t.openChat({id:l.id}),t.createGroupCall({chatId:l.id}),t.closeCallFallbackConfirm()}})()}));var C=a(7361),h=a(6752),P=a(706),S=a(9107),E=a(4288),b=a(231),k=a(3106),y=a(8964),Z=a(3103);const I=()=>{var e,t;null===(e=(t=navigator).vibrate)||void 0===e||e.call(t,50)};var G=a(7204),w=a(7324),T=a(7799);const M=(0,i.X$)((({size:e,name:t,playSegment:a,color:n})=>{const[o,r]=(0,i.eJ)();return(0,i.d4)((()=>{(0,w.Z)(t).then(r)}),[t]),i.ZP.createElement(T.Z,{id:t,play:!0,noLoop:!0,playSegment:a,size:e,speed:1,animationData:o,color:n})})),N=(0,i.X$)((0,o.c$)((e=>{const t=(0,c.mU)(e),{connectionState:a}=t||{},n=t&&(0,c.GU)(e,t.id,e.currentUserId),{raiseHandRating:i,hasAudioStream:o,canSelfUnmute:r,isMuted:s}=n||{};return{connectionState:a||"discarded",hasRequestedToSpeak:Boolean(i),noAudioStream:!o,canSelfUnmute:r,isMuted:s}}),((e,t)=>(0,u.ei)(t,["toggleGroupCallMute","requestToSpeak","playGroupCallSound"])))((({noAudioStream:e,canSelfUnmute:t,isMuted:a,hasRequestedToSpeak:n,connectionState:o,toggleGroupCallMute:r,requestToSpeak:s,playGroupCallSound:l})=>{const c=(0,S.Z)(),d=(0,i.sO)("up"),[u,p]=(0,i.eJ)(!1),m="connected"!==o,v=!t&&a,g=(0,G.Z)(v);(0,i.d4)((()=>{g&&!v&&l("allowTalk")}),[l,g,v]);const f=(0,i.Ye)((()=>{if(u){const e=Math.floor(100*Math.random());return e<32?[0,120]:e<64?[120,240]:e<97?[240,420]:[420,540]}return!g&&v?e?[99,135]:[136,172]:g&&!v?[0,36]:v?[0,0]:e?[69,99]:[36,69]}),[g,u,e,v]),C=u?"HandFilled":"VoiceMini",P=()=>{I(),r()},E=(0,i.Ye)((()=>c(n?"VoipMutedTapedForSpeak":v?"VoipMutedByAdmin":e?"VoipUnmute":"VoipTapToMute")),[n,e,c,v]);return i.ZP.createElement("div",{className:"button-wrapper microphone-wrapper"},i.ZP.createElement("button",{className:(0,h.Z)("MicrophoneButton",e&&"crossed",t&&"can-self-unmute",m&&"is-connecting",v&&"muted-by-admin"),onMouseDown:()=>{if(v){if(u)return;return I(),s(),p(!0),void setTimeout((()=>{p(!1)}),3e3)}d.current="down",e&&setTimeout((()=>{"down"===d.current&&(d.current="hold",P())}),200)},onMouseUp:()=>{v||(P(),d.current="up")}},i.ZP.createElement(M,{name:C,size:48,playSegment:f})),i.ZP.createElement("div",{className:"button-text"},E))})));var O=a(4605),U=a(6071),D=a(2328),$=a(2275);const R=[0,17],V=[17,34],A=(0,i.X$)((0,o.c$)((e=>({isAdmin:(0,c.Ht)(e)})),((e,t)=>(0,u.ei)(t,["setGroupCallParticipantVolume","toggleGroupCallMute","openChat","toggleGroupCallPanel","requestToSpeak"])))((({participant:e,closeDropdown:t,isDropdownOpen:a,anchor:n,isAdmin:o,toggleGroupCallMute:s,setGroupCallParticipantVolume:l,toggleGroupCallPanel:c,openChat:d,requestToSpeak:u})=>{const p=(0,S.Z)(),[m,v,g]=(0,P.Z)(),f=null==e?void 0:e.id,{isMutedByMe:C,isMuted:E,isSelf:b,canSelfUnmute:k}=e||{},Z=Boolean(null==e?void 0:e.raiseHandRating),I=!k&&E,[G,w]=(0,i.eJ)(C?0:((null==e?void 0:e.volume)||r.aC)/r.Ro);(0,i.d4)((()=>{w(C?0:((null==e?void 0:e.volume)||r.aC)/r.Ro)}),[f]);const T=(0,U.Z)(500),N=(0,i.I4)((e=>{e.stopPropagation(),v(),t()}),[v,t]),O=(0,i.I4)((e=>{e.stopPropagation(),u({value:!1}),t()}),[u,t]),A=(0,i.I4)((e=>{e.stopPropagation(),t(),o||w(C?r.aC/r.Ro:0),s({participantId:f,value:o?!I:!C})}),[t,s,f,o,I,C]),F=(0,i.I4)((e=>{e.stopPropagation(),c(),d({id:f}),t()}),[c,t,d,f]),H=0===G?R:V;return i.ZP.createElement("div",null,i.ZP.createElement(D.Z,{isOpen:a,positionX:"right",autoClose:!0,style:n?`right: 1rem; top: ${n.y}px;`:void 0,onClose:t,className:"participant-menu"},!b&&!I&&i.ZP.createElement("div",{className:"group"},i.ZP.createElement("div",{className:(0,h.Z)("volume-control",G<50&&"low",G>=50&&G<100&&"medium",G>=100&&G<150&&"normal",G>=150&&"high")},i.ZP.createElement("input",{type:"range",min:"0",max:"200",value:G,onChange:e=>{const t=Number(e.target.value);w(t),T((()=>{0===t?s({participantId:f,value:!0}):l({participantId:f,volume:Math.floor(t*r.Ro)})}))}}),i.ZP.createElement("div",{className:"info"},i.ZP.createElement(M,{name:"Speaker",playSegment:H,size:24}),i.ZP.createElement("span",null,G,"%")))),i.ZP.createElement("div",{className:"group"},Z&&b&&i.ZP.createElement(y.Z,{icon:"stop-raising-hand",onClick:O},p("VoipGroupCancelRaiseHand")),!b&&i.ZP.createElement(y.Z,{icon:"user",onClick:F},p("VoipGroupOpenProfile")),!b&&i.ZP.createElement(y.Z,{icon:E&&o?"allow-speak":"microphone-alt",onClick:A},p(o?I?"VoipGroupAllowToSpeak":"VoipMute":C?"VoipGroupUnmuteForMe":"VoipGroupMuteForMe")),!b&&o&&i.ZP.createElement(y.Z,{icon:"delete-user",destructive:!0,onClick:N},p("VoipGroupUserRemove")))),!b&&o&&i.ZP.createElement($.Z,{isOpen:m,userId:f,onClose:g}))})));var F=a(7407),H=a(172);const x=(0,i.X$)((({participant:e,noColor:t})=>{const{isMuted:a,isMutedByMe:o}=e,r=(e.amplitude||0)>n.THRESHOLD,s=Boolean(e.raiseHandRating),l=(0,G.Z)(s),c=!(null!=e&&e.canSelfUnmute)&&a,d=(0,G.Z)(a),u=(0,i.Ye)((()=>a&&!d?[43,64]:!a&&d?[22,42]:s&&!l?[65,84]:!c&&l?[0,21]:a?[22,23]:[43,44]),[a,c,s]),p=(0,i.Ye)((()=>t?[255,255,255]:s?[77,166,224]:c||o?[255,112,111]:r?[87,188,108]:[132,141,148]),[t,s,c,o,r]);return i.ZP.createElement(M,{name:"VoiceOutlined",playSegment:u,size:28,color:p})})),L=(0,i.X$)((0,o.c$)(((e,{participant:t})=>({user:t.isUser?(0,l.dy)(e,t.id):void 0,chat:t.isUser?void 0:(0,l.Z1)(e,t.id)})))((({openParticipantMenu:e,participant:t,user:a,chat:o})=>{const s=(0,i.sO)(null),l=(0,S.Z)(),{isSelf:c,isMutedByMe:d,isMuted:u}=t,p=(t.amplitude||0)>n.THRESHOLD,m=Boolean(t.raiseHandRating),[v,g]=(0,i.Ye)((()=>c?[l("ThisIsYou"),"blue"]:d?[l("VoipGroupMutedForMe"),"red"]:m?[l("WantsToSpeak"),"blue"]:!u&&p?[t.volume&&t.volume!==r.aC?l("SpeakingWithVolume",(t.volume/r.Ro).toString()).replace("%%","%"):l("Speaking"),"green"]:t.about?[t.about,""]:[l("Listening"),"blue"]),[p,t.volume,l,c,d,m,u,t.about]);if(!a&&!o)return;const f=a?`${a.firstName||""} ${a.lastName||""}`:null==o?void 0:o.title;return i.ZP.createElement("div",{className:(0,h.Z)("GroupCallParticipant",t.canSelfUnmute&&"can-self-unmute"),onClick:()=>{c||e(s.current,t)},ref:s},i.ZP.createElement(H.Z,{user:a,chat:o,size:"medium"}),i.ZP.createElement("div",{className:"info"},i.ZP.createElement("span",{className:"name"},f),i.ZP.createElement("span",{className:(0,h.Z)("about",g)},v)),i.ZP.createElement("div",{className:"microphone"},i.ZP.createElement(x,{participant:t})))})));var j=a(1273);const _=(0,i.X$)((0,o.c$)((e=>{const{participantsCount:t,participants:a}=(0,c.mU)(e)||{};return{participants:a,participantsCount:t||0}}),((e,t)=>(0,u.ei)(t,["createGroupCallInviteLink","loadMoreGroupCallParticipants"])))((({createGroupCallInviteLink:e,loadMoreGroupCallParticipants:t,participants:a,participantsCount:n,openParticipantMenu:o})=>{const r=(0,S.Z)(),s=(0,i.Ye)((()=>Object.keys(a||{})),[a]),[l,c]=(0,F.Z)(t,s,s.length>=n);return i.ZP.createElement("div",{className:"participants"},i.ZP.createElement("div",{className:"invite-btn",onClick:e},i.ZP.createElement("div",{className:"icon"},i.ZP.createElement("i",{className:"icon-add-user"})),i.ZP.createElement("div",{className:"text"},r("VoipGroupInviteMember"))),i.ZP.createElement(j.Z,{items:l,onLoadMore:c},null==l?void 0:l.map((e=>a[e]&&i.ZP.createElement(L,{key:e,openParticipantMenu:o,participant:a[e]})))))}))),B=(0,i.X$)((0,o.c$)(((e,{participant:t})=>({currentUserId:e.currentUserId,user:t.isUser?(0,l.dy)(e,t.id):void 0,chat:t.isUser?void 0:(0,l.Z1)(e,t.id),isActive:(t.amplitude||0)>n.THRESHOLD})))((({type:e,onClick:t,user:a,chat:o,isActive:s,isFullscreen:l})=>{const c=(0,S.Z)(),d=(0,i.I4)((()=>{t&&t((null==a?void 0:a.id)||o.id,e)}),[o,t,e,null==a?void 0:a.id]);if(!a&&!o)return;const u=(0,n.getUserStreams)((null==a?void 0:a.id)||o.id);return i.ZP.createElement("div",{className:(0,h.Z)("GroupCallParticipantVideo",s&&"active"),onClick:d},l&&i.ZP.createElement("button",{className:"back-button"},i.ZP.createElement("i",{className:"icon-arrow-left"}),c("Back")),i.ZP.createElement(H.Z,{user:a,chat:o,className:"thumbnail-avatar"}),r.LH&&i.ZP.createElement("div",{className:"thumbnail-wrapper"},i.ZP.createElement("video",{className:"thumbnail",muted:!0,autoPlay:!0,playsInline:!0,srcObject:null==u?void 0:u[e]})),i.ZP.createElement("video",{className:"video",muted:!0,autoPlay:!0,playsInline:!0,srcObject:null==u?void 0:u[e]}),i.ZP.createElement("div",{className:"info"},i.ZP.createElement("i",{className:"icon-microphone-alt"}),i.ZP.createElement("span",{className:"name"},(null==a?void 0:a.firstName)||(null==o?void 0:o.title)),"presentation"===e&&i.ZP.createElement("i",{className:"last-icon icon-active-sessions"})))}))),z=(0,i.X$)((0,o.c$)((e=>{const{participants:t}=(0,c.mU)(e)||{};return{participants:t}}))((({participants:e,onDoubleClick:t})=>{const[a,n]=(0,i.eJ)(void 0),o=(0,i.Ye)((()=>Object.values(e||{}).filter((e=>e.hasPresentationStream))),[e]),r=(0,i.Ye)((()=>Object.values(e||{}).filter((e=>e.hasVideoStream))),[e]),s=r.length+o.length,l=s<=2?1:s<=6?2:s<=9?3:4,c=3===s||2===l&&s%2!=0,d=(0,i.I4)(((e,t)=>{a&&e===a.id&&t===a.type?n(void 0):n({id:e,type:t})}),[a]);return i.ZP.createElement("div",{className:"streams",onDoubleClick:t},i.ZP.createElement("div",{className:(0,h.Z)("videos",c&&"span-last-video"),style:`--column-count: ${a?1:l}`},a&&i.ZP.createElement(B,{key:a.id,isFullscreen:!0,onClick:d,participant:e[a.id],type:a.type}),a?void 0:o.map((e=>i.ZP.createElement(B,{key:e.id,onClick:d,participant:e,type:"presentation"}))),a?void 0:r.map((e=>i.ZP.createElement(B,{key:e.id,onClick:d,participant:e,type:"video"})))))}))),q=[0,10],Q=(0,i.X$)((0,o.c$)(((e,{groupCallId:t})=>{const{connectionState:a,title:n,isSpeakerDisabled:i,participants:o,participantsCount:r}=(0,c.$5)(e,t)||{};return{connectionState:a,title:n,isSpeakerEnabled:!i,participantsCount:r,meParticipant:(0,c.GU)(e,t,e.currentUserId),isGroupCallPanelHidden:!!e.groupCalls.isGroupCallPanelHidden,isAdmin:(0,c.Ht)(e),participants:o}}),((e,t)=>(0,u.ei)(t,["toggleGroupCallVideo","leaveGroupCall","toggleGroupCallPresentation","toggleGroupCallPanel","connectToActiveGroupCall","playGroupCallSound"])))((({groupCallId:e,isGroupCallPanelHidden:t,connectionState:a,isSpeakerEnabled:o,title:r,meParticipant:s,isAdmin:l,participants:c,toggleGroupCallVideo:d,toggleGroupCallPresentation:u,leaveGroupCall:p,toggleGroupCallPanel:m,connectToActiveGroupCall:v,playGroupCallSound:g})=>{const f=(0,S.Z)(),I=(0,i.sO)(null),[G,w]=(0,i.eJ)(!1),[T,U,D]=(0,P.Z)(),[$,R,V]=(0,P.Z)(!0),F=c&&Object.values(c).some((e=>e.video||e.presentation)),H=T&&!C.wB&&F,[x,L]=(0,i.eJ)(),[j,B,Q]=(0,P.Z)(),[J,X,Y]=(0,P.Z)(),[W,K]=(0,i.eJ)(!1),[ee,te]=(0,i.eJ)(!1),ae=null==s?void 0:s.hasVideoStream,ne=null==s?void 0:s.hasPresentationStream,ie="connected"!==a,oe=!(null==s?void 0:s.canSelfUnmute)&&(null==s?void 0:s.isMuted),re=(0,i.I4)(((e,t)=>{const a=e.getBoundingClientRect(),n=I.current;L({anchor:{x:a.left,y:a.top-n.offsetTop+60},participant:t}),B()}),[B]);(0,i.d4)((()=>{"connected"===a?g({sound:"join"}):"reconnecting"===a&&g({sound:"connecting"})}),[a,g]);const se=()=>{Y(),K(!1)},le=(0,i.Ye)((()=>({onTrigger:e,isOpen:t})=>i.ZP.createElement(b.Z,{round:!0,size:"smaller",color:"translucent",className:t?"active":void 0,onClick:e,ariaLabel:f("AccDescrMoreOptions")},i.ZP.createElement("i",{className:"icon-more"}))),[f]),ce=(0,i.I4)((()=>{I.current&&(T?document.exitFullscreen().then(D):I.current.requestFullscreen().then(U))}),[D,T,U]),de=(0,i.I4)((()=>{C.t0&&(T||V(),ce())}),[V,ce,T]),ue=(0,i.I4)((()=>{T?D():U()}),[D,T,U]);(0,i.d4)((()=>{if(!C.t0)return;const e=I.current;return e?(e.addEventListener("fullscreenchange",ue),()=>{e.removeEventListener("fullscreenchange",ue)}):void 0}),[ue]),(0,i.d4)((()=>{v()}),[v,e]);const pe=()=>{if(l&&!J)return X(),void(T&&ce());g({sound:"leave"}),w(!0),Y()};return i.ZP.createElement(Z.Z,{isOpen:!t&&!G,onClose:m,className:(0,h.Z)("GroupCall",C.wB&&"single-column",H&&"landscape",!$&&"no-sidebar"),dialogRef:I,onCloseAnimationEnd:()=>{G&&p({shouldDiscard:ee})}},i.ZP.createElement("div",{className:"header"},i.ZP.createElement("h3",null,r||f("VoipGroupVoiceChat")),C.t0&&i.ZP.createElement(b.Z,{round:!0,size:"smaller",color:"translucent",onClick:ce,ariaLabel:f(T?"AccExitFullscreen":"AccSwitchToFullscreen")},i.ZP.createElement("i",{className:T?"icon-smallscreen":"icon-fullscreen"})),H&&i.ZP.createElement(b.Z,{round:!0,size:"smaller",color:"translucent",onClick:()=>{$?V():R()}},i.ZP.createElement("i",{className:"icon-sidebar"})),(n.IS_SCREENSHARE_SUPPORTED&&!oe||l)&&i.ZP.createElement(k.Z,{positionX:"right",trigger:le},n.IS_SCREENSHARE_SUPPORTED&&!oe&&i.ZP.createElement(y.Z,{icon:"share-screen",onClick:u},f(ne?"VoipChatStopScreenCapture":"VoipChatStartScreenCapture")),l&&i.ZP.createElement(y.Z,{icon:"phone-discard-outline",onClick:()=>{K(!0),te(!0),X(),T&&ce()},destructive:!0},f("VoipGroupLeaveAlertEndChat"))),i.ZP.createElement(b.Z,{round:!0,size:"smaller",color:"translucent",onClick:()=>{m(),T&&D()}},i.ZP.createElement("i",{className:"icon-close"}))),i.ZP.createElement("div",{className:"scrollable custom-scroll"},i.ZP.createElement(z,{onDoubleClick:de}),(!H||$)&&i.ZP.createElement(_,{openParticipantMenu:re})),i.ZP.createElement(A,{participant:null==x?void 0:x.participant,anchor:null==x?void 0:x.anchor,isDropdownOpen:j,closeDropdown:Q}),i.ZP.createElement("div",{className:"buttons"},ie&&i.ZP.createElement(E.Z,null),i.ZP.createElement("div",{className:"button-wrapper"},i.ZP.createElement("div",{className:"video-buttons"},ae&&(C.wZ||C.cj)&&i.ZP.createElement("button",{className:"smaller-button",onClick:n.switchCameraInput},i.ZP.createElement(M,{name:"CameraFlip",playSegment:q,size:24})),i.ZP.createElement("button",{className:(0,h.Z)("small-button",oe?"speaker":"camera",(ae||oe&&o)&&"active"),onClick:()=>{oe?(0,n.toggleSpeaker)():d()}},i.ZP.createElement("i",{className:oe?"icon-speaker":ae?"icon-video-stop":"icon-video"}))),i.ZP.createElement("div",{className:"button-text"},f(oe?"VoipSpeaker":"VoipCamera"))),i.ZP.createElement(N,null),i.ZP.createElement("div",{className:"button-wrapper"},i.ZP.createElement("button",{className:"small-button leave",onClick:pe},i.ZP.createElement("i",{className:"icon-phone-discard"})),i.ZP.createElement("div",{className:"button-text"},f("VoipGroupLeave")))),i.ZP.createElement(Z.Z,{isOpen:J,onClose:se,className:"error",title:f(W?"VoipGroupEndAlertTitle":"VoipGroupLeaveAlertTitle")},i.ZP.createElement("p",null,f(W?"VoipGroupEndAlertText":"VoipGroupLeaveAlertText")),!W&&i.ZP.createElement(O.Z,{label:f("VoipGroupEndChat"),checked:ee,onCheck:te}),i.ZP.createElement(b.Z,{isText:!0,className:"confirm-dialog-button",onClick:pe},f(W?"VoipGroupEnd":"VoipGroupLeave")),i.ZP.createElement(b.Z,{isText:!0,className:"confirm-dialog-button",onClick:se},f("Cancel"))))}))),J=(0,i.X$)((0,o.c$)((e=>({groupCall:(0,c.mU)(e),isGroupCallPanelHidden:e.groupCalls.isGroupCallPanelHidden,meParticipant:(0,c.GU)(e,e.groupCalls.activeGroupCallId,e.currentUserId)})),((e,t)=>(0,u.ei)(t,["toggleGroupCallPanel"])))((({groupCall:e,meParticipant:t,isGroupCallPanelHidden:a,toggleGroupCallPanel:n})=>{const o=(0,S.Z)();if((0,i.d4)((()=>(document.body.classList.toggle("has-group-call-header",a),()=>{document.body.classList.toggle("has-group-call-header",!1)})),[a]),e&&t)return i.ZP.createElement("div",{className:(0,h.Z)("ActiveCallHeader",a&&"open"),onClick:n},i.ZP.createElement("span",{className:"title"},e.title||o("VoipGroupVoiceChat")))})));var X=a(7551),Y=a(2858),W=a(8360);const K=(0,i.X$)((0,o.c$)((e=>{const{chatId:t}=(0,l.Bt)(e)||{},a=t?(0,l.dy)(e,t):void 0;return{userFullName:a?(0,Y.Js)(a):void 0,channelTitle:(0,c.oq)(e)}}),((e,t)=>(0,u.ei)(t,["closeCallFallbackConfirm","inviteToCallFallback"])))((({isOpen:e,channelTitle:t,userFullName:a,closeCallFallbackConfirm:n,inviteToCallFallback:o})=>{const[r,s]=(0,i.eJ)(!0),l=(0,W.Z)(a,!0);return i.ZP.createElement(X.Z,{title:"Start Call",isOpen:e,confirmHandler:()=>{o({shouldRemove:r})},onClose:n},i.ZP.createElement("p",null,"The call will be started in a private channel ",i.ZP.createElement("b",null,t),"."),i.ZP.createElement(O.Z,{label:`Remove ${l} from this channel after the call`,checked:r,onCheck:s}))})))},7324:(e,t,a)=>{"use strict";a.d(t,{Z:()=>r});var n=a(6137),i=a(647);const o={MonkeyIdle:a(1679),MonkeyTracking:a(4889),MonkeyClose:a(4185),MonkeyPeek:a(8431),FoldersAll:a(6041),FoldersNew:a(7196),DiscussionGroups:a(4349),CameraFlip:a(6280),HandFilled:a(9129),HandOutline:a(1039),Speaker:a(9261),VoiceAllowTalk:a(2873),VoiceMini:a(7242),VoiceMuted:a(1274),VoiceOutlined:a(973)};function r(e){const t=o[e].replace(window.location.origin,"");return i.he(`file${t}`,n.IU.Lottie)}},3794:(e,t)=>{(()=>{"use strict";var e={"./src/blacksilence.ts":(e,t,a)=>{a.r(t),a.d(t,{silence:()=>n,black:()=>i});const n=e=>{const t=e.createOscillator(),a=t.connect(e.createMediaStreamDestination());return t.start(),new MediaStream([Object.assign(a.stream.getAudioTracks()[0],{enabled:!1})])},i=({width:e=640,height:t=480}={})=>{const a=Object.assign(document.createElement("canvas"),{width:e,height:t}),n=a.getContext("2d");if(!n)throw Error("Cannot create canvas ctx");n.fillRect(0,0,e,t);const i=a.captureStream();return new MediaStream([Object.assign(i.getVideoTracks()[0],{enabled:!1})])}},"./src/buildSdp.ts":(e,t,a)=>{a.r(t),a.d(t,{default:()=>i});var n=a("./src/utils.ts");const i=(e,t=!1,a=!1)=>{const i=[],o=e=>{i.push(e)},{sessionId:r,ssrcs:s,audioExtensions:l,videoExtensions:c,audioPayloadTypes:d,videoPayloadTypes:u,transport:{ufrag:p,pwd:m,fingerprints:v,candidates:g}}=e;o("v=0"),o(`o=- ${r} 2 IN IP4 0.0.0.0`),o("s=-"),o("t=0 0"),o(`a=group:BUNDLE ${s.map((e=>e.endpoint)).join(" ")}${a?"":" 2"}`),o("a=ice-lite");const f=e=>{let t="";t+="a=candidate:",t+=`${e.foundation} ${e.component} ${e.protocol} ${e.priority} ${e.ip} ${e.port} typ ${e.type}`,"rel-addr"in e&&(t+=` raddr ${e["rel-addr"]} rport ${e["rel-port"]}`),t+=` generation ${e.generation}`,o(t)},C=()=>{o(`a=ice-ufrag:${p}`),o(`a=ice-pwd:${m}`),v.forEach((e=>{o(`a=fingerprint:${e.hash} ${e.fingerprint}`),o("a=setup:passive")})),g.forEach(f)},h=e=>{var t;const{channels:a,id:n,name:i,clockrate:r,parameters:s}=e;var l=a?`/${a}`:"";o(`a=rtpmap:${n} ${i}/${r}${l}`),s&&(l=Object.keys(s).map((e=>`${e}=${s[e]};`)).join(" "),o(`a=fmtp:${n} ${l}`)),null===(t=e["rtcp-fbs"])||void 0===t||t.forEach((e=>{o(`a=rtcp-fb:${n} ${e.type}${e.subtype?` ${e.subtype}`:""}`)}))};return e=e=>{const a=e.isVideo?u:d;var i=e.isVideo?"video":"audio";o(`m=${i} ${e.isMain?1:0} RTP/SAVPF ${a.map((e=>e.id)).join(" ")}`),o("c=IN IP4 0.0.0.0"),o("b=AS:1300"),o(`a=mid:${e.endpoint}`),o("a=rtcp-mux"),a.forEach(h),o("a=rtcp:1 IN IP4 0.0.0.0"),e.isVideo&&o("a=rtcp-rsize"),(e.isVideo?c:l).forEach((({id:e,uri:t})=>{o(`a=extmap:${e} ${t}`)})),e.isRemoved?o("a=inactive"):(C(),t?o("a=recvonly"):(e.isMain?o("a=sendrecv"):(o("a=sendonly"),o("a=bundle-only")),e.sourceGroups.forEach((t=>{o(`a=ssrc-group:${t.semantics} ${t.sources.map(n.fromTelegramSource).join(" ")}`),t.sources.forEach((t=>{t=(0,n.fromTelegramSource)(t),o(`a=ssrc:${t} cname:${e.endpoint}`),o(`a=ssrc:${t} msid:${e.endpoint} ${e.endpoint}`),o(`a=ssrc:${t} mslabel:${e.endpoint}`),o(`a=ssrc:${t} label:${e.endpoint}`)}))}))))},s.filter((e=>"0"===e.endpoint||"1"===e.endpoint)).map(e),a||(o("m=application 1 UDP/DTLS/SCTP webrtc-datachannel"),o("c=IN IP4 0.0.0.0"),C(),o("a=ice-options:trickle"),o("a=mid:"+(a?"1":"2")),o("a=sctp-port:5000"),o("a=max-message-size:262144")),s.filter((e=>"0"!==e.endpoint&&"1"!==e.endpoint)).map(e),`${i.join("\n")}\n`}},"./src/parseSdp.ts":(e,t,a)=>{a.r(t),a.d(t,{default:()=>i});var n=a("./src/utils.ts");const i=e=>{var t,a;if(!e||!e.sdp)throw Error("Failed parsing SDP: session description is null");const i=e.sdp.split("\r\nm=").map(((e,t)=>0===t?e:`m=${e}`)).reduce(((e,t)=>{var a;return e[(null===(a=t.match(/^m=(.+?)\s/))||void 0===a?void 0:a[1])||"header"]=t.split("\r\n").filter(Boolean),e}),{});var o=(e,t)=>{var a,n;return t?null===(a=i[t])||void 0===a||null===(n=a.find((t=>t.startsWith(e))))||void 0===n?void 0:n.substr(e.length):Object.values(i).map((t=>{var a;return null===(a=t.find((t=>t.startsWith(e))))||void 0===a?void 0:a.substr(e.length)})).filter(Boolean)[0]};const r=o("a=ssrc:","audio");var s=r&&Number(r.split(" ")[0]);const l=(null===(t=o("a=ssrc-group:","video"))||void 0===t?void 0:t.split(" "))||void 0;if(!l)throw Error("Failed parsing SDP: no video ssrc");var[c,d]=(null===(a=o("a=fingerprint:"))||void 0===a?void 0:a.split(" "))||[];if(!c||!d)throw Error("Failed parsing SDP: no fingerprint");if(e=o("a=ice-ufrag:"),o=o("a=ice-pwd:"),!e||!o)throw Error("Failed parsing SDP: no ICE ufrag or pwd");return{fingerprints:[{fingerprint:d,hash:c,setup:"active"}],pwd:o,ufrag:e,...s&&{ssrc:(0,n.toTelegramSource)(s)},...l&&{"ssrc-groups":[{semantics:l[0],sources:l.slice(1,l.length).map(Number).map(n.toTelegramSource)}]}}}},"./src/secretsauce.ts":(e,t,a)=>{a.r(t),a.d(t,{getDevices:()=>async function(e,t=!0){return(await navigator.mediaDevices.enumerateDevices()).filter((a=>a.kind===`${e}${t?"input":"output"}`))},toggleSpeaker:()=>function(){var e,t;s&&(s.isSpeakerDisabled=!s.isSpeakerDisabled,null!==(e=s)&&void 0!==e&&null!==(t=e.onUpdate)&&void 0!==t&&t.call(e,{"@type":"updateGroupCallConnectionState",connectionState:"connected",isSpeakerDisabled:s.isSpeakerDisabled}),s.participantFunctions&&Object.values(s.participantFunctions).forEach((e=>{var t,a;null===(t=e.toggleMute)||void 0===t||t.call(e,!(null===(a=s)||void 0===a||!a.isSpeakerDisabled))})))},toggleNoiseSuppression:()=>function(){if(s&&s.myId&&s.streams){const a=s.streams[s.myId].audio;if(a){const n=a.getTracks()[0];var e,t;n&&(({echoCancellation:e,noiseSuppression:t}=n.getConstraints()),n.applyConstraints({echoCancellation:!e,noiseSuppression:!t}))}}},getUserStreams:()=>c,setVolume:()=>function(e,t){var a,n,i;const o=null===(a=s)||void 0===a||null===(n=a.participantFunctions)||void 0===n?void 0:n[e];o&&(null===(i=o.setVolume)||void 0===i||i.call(o,t))},isStreamEnabled:()=>d,switchCameraInput:()=>async function(){var e;if(null!==(e=s)&&void 0!==e&&e.myId&&s.connection&&s.streams&&s.facingMode){var t;const e=null===(t=c(s.myId))||void 0===t?void 0:t.video;if(e){const t=e.getTracks()[0];if(t){const e=s.connection.getSenders().find((e=>{var a;return t.id===(null===(a=e.track)||void 0===a?void 0:a.id)}));if(e){s.facingMode="environment"===s.facingMode?"user":"environment";try{const t=await p("video",s.facingMode);await e.replaceTrack(t.getTracks()[0]),s.streams[s.myId].video=t}catch(e){}}}}}},toggleStream:()=>m,leaveGroupCall:()=>g,handleUpdateGroupCallParticipants:()=>async function(e){if(s){const{participants:n,conference:o,connection:r,myId:l}=s;if(n&&o&&r&&o.ssrcs&&o.transport&&l)if(e.find((e=>{var t,a,n,i;return e.isSelf&&e.source!==(null===(t=s)||void 0===t||null===(a=t.conference)||void 0===a||null===(n=a.ssrcs)||void 0===n||null===(i=n.find((e=>e.isMain&&!e.isVideo)))||void 0===i?void 0:i.sourceGroups[0].sources[0])})))g();else{const n=[];if(e.forEach((e=>{if(e.isSelf)e.isMuted&&!e.canSelfUnmute&&(m("audio",!1),m("video",!1),m("presentation",!1));else{var t=e.isLeft;const a=e.isMuted||e.isMutedByMe,i=!e.isVideoJoined||!e.video||t,r=!e.presentation||t;let s=!1,l=!1,c=!1;o.ssrcs.filter((t=>t.userId===e.id)).forEach((t=>{t.isVideo||(t.sourceGroups[0].sources[0]===e.source&&(l=!0),t.isRemoved=a),t.isVideo&&(t.isPresentation||(e.video&&t.endpoint===e.video.endpoint&&(s=!0),t.isRemoved=i),t.isPresentation&&(e.presentation&&t.endpoint===e.presentation.endpoint&&(c=!0),t.isRemoved=r))})),a||l||o.ssrcs.push({userId:e.id,isMain:!1,endpoint:`audio${e.source}`,isVideo:!1,sourceGroups:[{semantics:"FID",sources:[e.source]}]}),i||s||!e.video||(n.push(e.video.endpoint),o.ssrcs.push({userId:e.id,isMain:!1,endpoint:e.video.endpoint,isVideo:!0,sourceGroups:e.video.sourceGroups})),r||c||!e.presentation||o.ssrcs.push({isPresentation:!0,userId:e.id,isMain:!1,endpoint:e.presentation.endpoint,isVideo:!0,sourceGroups:e.presentation.sourceGroups})}})),s.updatingParticipantsQueue)s.updatingParticipantsQueue.push(o);else{s.updatingParticipantsQueue=[],e=(0,i.default)(o),await r.setRemoteDescription({type:"offer",sdp:e});try{var t=await r.createAnswer();if(await r.setLocalDescription(t),u(l),0async function(e,t){if(s){var a=t?s.screenshareConference:s.conference;const d=t?s.screenshareConnection:s.connection;if(a&&d&&a.ssrcs){var n,o,r,l,c=Date.now();e={...a,transport:e.transport,sessionId:c,audioExtensions:null===(n=e.audio)||void 0===n?void 0:n["rtp-hdrexts"],audioPayloadTypes:null===(o=e.audio)||void 0===o?void 0:o["payload-types"],videoExtensions:null===(r=e.video)||void 0===r?void 0:r["rtp-hdrexts"],videoPayloadTypes:null===(l=e.video)||void 0===l?void 0:l["payload-types"]},s={...s,...t?{screenshareConference:e}:{conference:e}};try{await d.setRemoteDescription({type:"answer",sdp:(0,i.default)(e,!0,t)})}catch(e){console.error(e)}}}},startSharingScreen:()=>async function(){if(s)try{const e=await p("presentation");return e?(e.getTracks()[0].onended=()=>{var e;s&&s.myId&&(null!==(e=s.streams)&&void 0!==e&&e[s.myId].presentation,u(s.myId),l())},new Promise((t=>{var{connection:a,dataChannel:t}=h([e],t,!0);s={...s,screenshareConnection:a,screenshareDataChannel:t}}))):void 0}catch(e){return}},joinGroupCall:()=>function(e,t,a,n){if(s)throw Error("Already in call");v("connecting");var i=t.createMediaStreamDestination();return a.srcObject=i.stream,a.play().catch((e=>console.warn(e))),s={onUpdate:n,participants:[],myId:e,speaking:{},silence:(0,o.silence)(t),black:(0,o.black)({width:640,height:480}),analyserInterval:setInterval(f,1e3),audioElement:a,destination:i,audioContext:t},new Promise((e=>{s={...s,...h([s.silence,s.black],e)}}))}});var n=a("./src/parseSdp.ts"),i=a("./src/buildSdp.ts"),o=a("./src/blacksilence.ts"),r=a("./src/utils.ts");let s;function l(e){var t,a,n,i;s&&(null!==(t=s.screenshareDataChannel)&&void 0!==t&&t.close(),null!==(a=s.screenshareConnection)&&void 0!==a&&a.close(),e||null===(n=(i=s).onUpdate)||void 0===n||n.call(i,{"@type":"updateGroupCallLeavePresentation"}))}function c(e){var t,a;return null===(t=s)||void 0===t||null===(a=t.streams)||void 0===a?void 0:a[e]}function d(e,t){var a,n,i;const o=(t=t||(null===(a=s)||void 0===a?void 0:a.myId))&&(null===(n=c(t))||void 0===n?void 0:n[e]);return!!o&&(null===(i=o.getTracks()[0])||void 0===i?void 0:i.enabled)}function u(e){var t,a,n;null===(t=s)||void 0===t||null===(a=t.onUpdate)||void 0===a||a.call(t,{"@type":"updateGroupCallStreams",userId:e,hasAudioStream:d("audio",e),hasVideoStream:d("video",e),hasPresentationStream:d("presentation",e),amplitude:null===(n=s.speaking)||void 0===n?void 0:n[e]})}function p(e,t="user"){return"presentation"===e?navigator.mediaDevices.getDisplayMedia({audio:!1,video:!0}):navigator.mediaDevices.getUserMedia({audio:"audio"===e&&{...r.IS_ECHO_CANCELLATION_SUPPORTED&&{echoCancellation:!0},...r.IS_NOISE_SUPPRESSION_SUPPORTED&&{noiseSuppression:!0}},video:"video"===e&&{facingMode:t}})}async function m(e,t){if(s&&s.myId&&s.connection&&s.streams){var a;const o=null===(a=c(s.myId))||void 0===a?void 0:a[e];if(o){const a=o.getTracks()[0];if(a){var n;const o=[...s.connection.getSenders(),...(null===(n=s.screenshareConnection)||void 0===n?void 0:n.getSenders())||[]].find((e=>{var t;return a.id===(null===(t=e.track)||void 0===t?void 0:t.id)}));if(o){t=void 0===t?!a.enabled:t;try{if(t&&!a.enabled){const t=await p(e);if(await o.replaceTrack(t.getTracks()[0]),s.streams[s.myId][e]=t,"video"===e)s.facingMode="user";else if("audio"===e){var i;const e=s.audioContext;if(!e)return;const a=e.createMediaStreamSource(t),n=e.createAnalyser();n.minDecibels=-100,n.maxDecibels=-30,n.smoothingTimeConstant=.05,n.fftSize=1024,a.connect(n),s={...s,participantFunctions:{...s.participantFunctions,[s.myId]:{...null===(i=s.participantFunctions)||void 0===i?void 0:i[s.myId],getCurrentAmplitude:()=>{var e=new Uint8Array(n.frequencyBinCount);return n.getByteFrequencyData(e),(0,r.getAmplitude)(e,1.5)}}}}}}else if(!t&&a.enabled){a.stop();const t="audio"===e?s.silence:s.black;if(!t)return;await o.replaceTrack(t.getTracks()[0]),s.streams[s.myId][e]=t,"video"===e&&(s.facingMode=void 0)}u(s.myId),"presentation"!==e||t||l(!0)}catch(e){}}}}}}function v(e){var t,a;null===(t=s)||void 0===t||null===(a=t.onUpdate)||void 0===a||a.call(t,{"@type":"updateGroupCallConnectionState",connectionState:e})}function g(){var e,t,a;s&&(s.myId&&null!==(e=s.streams)&&void 0!==e&&e[s.myId]&&Object.values(s.streams[s.myId]||{}).forEach((e=>{null==e||e.getTracks().forEach((e=>{e.stop()}))})),l(!0),null!==(t=s.dataChannel)&&void 0!==t&&t.close(),null!==(a=s.connection)&&void 0!==a&&a.close(),v("disconnected"),s.analyserInterval&&clearInterval(s.analyserInterval),s=void 0)}function f(){s&&s.participantFunctions&&Object.keys(s.participantFunctions).forEach((e=>{const t=s.participantFunctions[Number(e)].getCurrentAmplitude;var a,n;t&&(a=t(),n=s.speaking[e]||0,((s.speaking[e]=a)>r.THRESHOLD&&n<=r.THRESHOLD||a<=r.THRESHOLD&&n>r.THRESHOLD)&&u(e))}))}function C(e){if(s&&s.audioElement&&s.destination&&s.audioContext){var t,a,n=null===(t=s.conference)||void 0===t||null===(a=t.ssrcs)||void 0===a?void 0:a.find((t=>t.endpoint===e.track.id));if(n&&n.userId){var i,o;const{userId:t,isPresentation:a}=n;var l=null===(i=s.participants)||void 0===i?void 0:i.find((e=>e.id===t));const d="video"===e.track.kind?a?"presentation":"video":"audio";if(e.track.onended=()=>{var e,a;null!==(e=s)&&void 0!==e&&null!==(a=e.streams)&&void 0!==a&&a[t][d],u(t)},n=e.streams[0],"audio"===e.track.kind){var c;const e=s.audioContext,a=e.createMediaStreamSource(n),i=e.createGain();i.gain.value=((null==l?void 0:l.volume)||1e4)/1e4;const o=e.createGain();i.gain.value=1;const d=e.createAnalyser();d.minDecibels=-100,d.maxDecibels=-30,d.smoothingTimeConstant=.05,d.fftSize=1024,a.connect(d).connect(o).connect(i).connect(s.destination);const u=new Audio;u.srcObject=a.mediaStream,u.muted=!0,u.remove(),s={...s,participantFunctions:{...s.participantFunctions,[t]:{...null===(c=s.participantFunctions)||void 0===c?void 0:c[t],setVolume:e=>{i.gain.value=1{o.gain.value=e?0:1},getCurrentAmplitude:()=>{var e=new Uint8Array(d.frequencyBinCount);return d.getByteFrequencyData(e),(0,r.getAmplitude)(e,1.5)}}}}}s={...s,streams:{...s.streams,[t]:{...null===(o=s.streams)||void 0===o?void 0:o[t],[d]:n}}},u(t)}}}function h(e,t,a=!1){const i=new RTCPeerConnection;var o=a?void 0:function(e){const t=e.createDataChannel("data",{id:0});return t.onopen=()=>{},t.onmessage=e=>{JSON.parse(e.data).colibriClass},t.onerror=e=>{console.log("%conerror","background: green; font-size: 5em"),console.error(e)},t}(i);return e.forEach((e=>e.getTracks().forEach((t=>{i.addTrack(t,e)})))),a||(i.oniceconnectionstatechange=()=>{var e=i.iceConnectionState;"connected"===e||"completed"===e?v("connected"):"checking"===e||"new"===e?v("connecting"):"disconnected"===i.iceConnectionState&&v("reconnecting")}),i.ontrack=C,i.onnegotiationneeded=async()=>{if(s){var o=s.myId;if(o){var r=await i.createOffer({offerToReceiveVideo:!0,offerToReceiveAudio:!a});if(await i.setLocalDescription(r),r.sdp){var l,c=(0,n.default)(r),d=a?void 0:{userId:"",sourceGroups:[{semantics:"FID",sources:[c.ssrc||0]}],isRemoved:a,isMain:!0,isVideo:!1,isPresentation:a,endpoint:a?"1":"0"},p=c["ssrc-groups"]&&{isPresentation:a,userId:"",sourceGroups:c["ssrc-groups"],isMain:!0,isVideo:!0,endpoint:a?"0":"1"};r=a?s.screenshareConference:s.conference;const i=[];a?(p&&i.push(p),d&&i.push(d)):(d&&i.push(d),p&&i.push(p)),d=e.find((e=>"audio"===e.getTracks()[0].kind)),p=e.find((e=>"video"===e.getTracks()[0].kind)),s={...s,...a?{screenshareConference:{...r,ssrcs:i}}:{conference:{...r,ssrcs:i}},streams:{...s.streams,[o]:{...null===(l=s.streams)||void 0===l?void 0:l[o],...d&&{audio:d},...!a&&p?{video:p}:{presentation:p}}}},u(o),t(c)}}}},{connection:i,dataChannel:o}}},"./src/types.ts":(e,t,a)=>{a.r(t)},"./src/utils.ts":(e,t,a)=>{var n,i,o,r,s;function l(){var{userAgent:e,platform:t}=window.navigator;let a;return-1!==["Macintosh","MacIntel","MacPPC","Mac68K"].indexOf(t)?a="macOS":-1!==["iPhone","iPad","iPod"].indexOf(t)?a="iOS":-1!==["Win32","Win64","Windows","WinCE"].indexOf(t)?a="Windows":/Android/.test(e)?a="Android":/Linux/.test(t)&&(a="Linux"),a}a.r(t),a.d(t,{toTelegramSource:()=>function(e){return e<<0},fromTelegramSource:()=>function(e){return e>>>0},getAmplitude:()=>function(e,t=3){if(!e)return 0;var a=e.length;let n=0;for(let t=0;tl,THRESHOLD:()=>c,PLATFORM_ENV:()=>d,IS_MAC_OS:()=>u,IS_IOS:()=>p,IS_SCREENSHARE_SUPPORTED:()=>m,IS_ECHO_CANCELLATION_SUPPORTED:()=>v,IS_NOISE_SUPPRESSION_SUPPORTED:()=>g});const c=.1,d=l(),u="macOS"===d,p="iOS"===d,m="getDisplayMedia"in((null===(n=navigator)||void 0===n?void 0:n.mediaDevices)||{}),v=null===(i=navigator)||void 0===i||null===(o=i.mediaDevices)||void 0===o?void 0:o.getSupportedConstraints().echoCancellation,g=null===(r=navigator)||void 0===r||null===(s=r.mediaDevices)||void 0===s?void 0:s.getSupportedConstraints().noiseSuppression}},a={};function n(t){var i=a[t];return void 0!==i||(i=a[t]={exports:{}},e[t](i,i.exports,n)),i.exports}n.d=(e,t)=>{for(var a in t)n.o(t,a)&&!n.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var i={};(()=>{n.r(i),n.d(i,{handleUpdateGroupCallConnection:()=>e.handleUpdateGroupCallConnection,startSharingScreen:()=>e.startSharingScreen,joinGroupCall:()=>e.joinGroupCall,getDevices:()=>e.getDevices,getUserStreams:()=>e.getUserStreams,setVolume:()=>e.setVolume,isStreamEnabled:()=>e.isStreamEnabled,toggleStream:()=>e.toggleStream,leaveGroupCall:()=>e.leaveGroupCall,handleUpdateGroupCallParticipants:()=>e.handleUpdateGroupCallParticipants,switchCameraInput:()=>e.switchCameraInput,toggleSpeaker:()=>e.toggleSpeaker,toggleNoiseSuppression:()=>e.toggleNoiseSuppression,IS_SCREENSHARE_SUPPORTED:()=>t.IS_SCREENSHARE_SUPPORTED,THRESHOLD:()=>t.THRESHOLD});var e=n("./src/secretsauce.ts"),t=n("./src/utils.ts");n("./src/types.ts")})();var o,r=t;for(o in i)r[o]=i[o];i.__esModule&&Object.defineProperty(r,"__esModule",{value:!0})})()},4349:(e,t,a)=>{"use strict";e.exports=a.p+"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a..tgs"},6041:(e,t,a)=>{"use strict";e.exports=a.p+"FoldersAll.3f9f9e243d19f0fbf9aa..tgs"},7196:(e,t,a)=>{"use strict";e.exports=a.p+"FoldersNew.9a40d71c0c8be70f5bd1..tgs"},4185:(e,t,a)=>{"use strict";e.exports=a.p+"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3e..tgs"},1679:(e,t,a)=>{"use strict";e.exports=a.p+"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab..tgs"},8431:(e,t,a)=>{"use strict";e.exports=a.p+"TwoFactorSetupMonkeyPeek.1905436b042520363d7e..tgs"},4889:(e,t,a)=>{"use strict";e.exports=a.p+"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12..tgs"},6280:(e,t,a)=>{"use strict";e.exports=a.p+"CameraFlip.1a9fe44cf01fcb22347d..tgs"},9129:(e,t,a)=>{"use strict";e.exports=a.p+"HandFilled.f87939d160f1dc288586..tgs"},1039:(e,t,a)=>{"use strict";e.exports=a.p+"HandOutline.f9831751ba60df30c484..tgs"},9261:(e,t,a)=>{"use strict";e.exports=a.p+"Speaker.04bb3743412b41ff83c5..tgs"},2873:(e,t,a)=>{"use strict";e.exports=a.p+"VoiceAllowTalk.a9cc7c39ec438973ddc9..tgs"},7242:(e,t,a)=>{"use strict";e.exports=a.p+"VoiceMini.bf00ffdf69625c579569..tgs"},1274:(e,t,a)=>{"use strict";e.exports=a.p+"VoiceMuted.a4b4ec6bfd7c6c5fb275..tgs"},973:(e,t,a)=>{"use strict";e.exports=a.p+"VoiceOutlined.91b394ab3562cdfad6bc..tgs"},1171:(e,t,a)=>{"use strict";e.exports=a.p+"call-fallback-avatar.50c421eaa09a90e44ec4..png"}}]); +//# sourceMappingURL=532.381cf48a5d9ac614b987.js.map \ No newline at end of file diff --git a/dist/757.e669f135f9dce66de020.js.LICENSE.txt b/dist/532.381cf48a5d9ac614b987.js.LICENSE.txt similarity index 100% rename from dist/757.e669f135f9dce66de020.js.LICENSE.txt rename to dist/532.381cf48a5d9ac614b987.js.LICENSE.txt diff --git a/dist/532.381cf48a5d9ac614b987.js.map b/dist/532.381cf48a5d9ac614b987.js.map new file mode 100644 index 000000000..893f2cbd1 --- /dev/null +++ b/dist/532.381cf48a5d9ac614b987.js.map @@ -0,0 +1 @@ +{"version":3,"file":"532.381cf48a5d9ac614b987.js","mappings":"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","sources":["webpack://telegram-t/./src/modules/actions/api/calls.async.ts","webpack://telegram-t/./src/util/vibrate.ts","webpack://telegram-t/./src/components/common/AnimatedIcon.tsx","webpack://telegram-t/./src/components/calls/group/MicrophoneButton.tsx","webpack://telegram-t/./src/components/calls/group/GroupCallParticipantMenu.tsx","webpack://telegram-t/./src/components/calls/group/OutlinedMicrophoneIcon.tsx","webpack://telegram-t/./src/components/calls/group/GroupCallParticipant.tsx","webpack://telegram-t/./src/components/calls/group/GroupCallParticipantList.tsx","webpack://telegram-t/./src/components/calls/group/GroupCallParticipantVideo.tsx","webpack://telegram-t/./src/components/calls/group/GroupCallParticipantStreams.tsx","webpack://telegram-t/./src/components/calls/group/GroupCall.tsx","webpack://telegram-t/./src/components/calls/ActiveCallHeader.tsx","webpack://telegram-t/./src/components/calls/CallFallbackConfirm.tsx","webpack://telegram-t/./src/components/common/helpers/animatedAssets.ts","webpack://telegram-t/./src/lib/secret-sauce/index.js"],"sourcesContent":["import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\nimport {\n joinGroupCall,\n startSharingScreen,\n leaveGroupCall,\n toggleStream,\n isStreamEnabled,\n setVolume,\n handleUpdateGroupCallParticipants, handleUpdateGroupCallConnection,\n} from '../../../lib/secret-sauce';\n\nimport { ApiUpdate } from '../../../api/types';\n\nimport { GROUP_CALL_VOLUME_MULTIPLIER } from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport { selectChat, selectCurrentMessageList, selectUser } from '../../selectors';\nimport {\n selectActiveGroupCall,\n selectCallFallbackChannelTitle,\n selectGroupCallParticipant,\n} from '../../selectors/calls';\nimport {\n removeGroupCall,\n updateActiveGroupCall,\n updateGroupCall,\n updateGroupCallParticipant,\n} from '../../reducers/calls';\nimport { omit } from '../../../util/iteratees';\nimport { getServerTime } from '../../../util/serverTime';\nimport { fetchFile } from '../../../util/files';\nimport { getGroupCallAudioContext, getGroupCallAudioElement, removeGroupCallAudioElement } from '../ui/calls';\nimport { loadFullChat } from './chats';\n\nimport callFallbackAvatarPath from '../../../assets/call-fallback-avatar.png';\n\nconst FALLBACK_INVITE_EXPIRE_SECONDS = 1800; // 30 min\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n const { activeGroupCallId } = global.groupCalls;\n\n switch (update['@type']) {\n case 'updateGroupCallLeavePresentation': {\n actions.toggleGroupCallPresentation({ value: false });\n break;\n }\n case 'updateGroupCallStreams': {\n if (!update.userId || !activeGroupCallId) break;\n if (!selectGroupCallParticipant(global, activeGroupCallId, update.userId)) break;\n\n return updateGroupCallParticipant(global, activeGroupCallId, update.userId, omit(update, ['@type', 'userId']));\n }\n case 'updateGroupCallConnectionState': {\n if (!activeGroupCallId) break;\n\n if (update.connectionState === 'disconnected') {\n actions.leaveGroupCall({ isFromLibrary: true });\n break;\n }\n\n return updateGroupCall(global, activeGroupCallId, {\n connectionState: update.connectionState,\n isSpeakerDisabled: update.isSpeakerDisabled,\n });\n }\n case 'updateGroupCallParticipants': {\n const { groupCallId, participants } = update;\n if (activeGroupCallId === groupCallId) {\n void handleUpdateGroupCallParticipants(participants);\n }\n break;\n }\n case 'updateGroupCallConnection': {\n if (update.data.stream) {\n actions.showNotification({ message: 'Big live streams are not yet supported' });\n actions.leaveGroupCall();\n break;\n }\n void handleUpdateGroupCallConnection(update.data, update.presentation);\n\n const groupCall = selectActiveGroupCall(global);\n if (groupCall?.participants && Object.keys(groupCall.participants).length > 0) {\n void handleUpdateGroupCallParticipants(Object.values(groupCall.participants));\n }\n break;\n }\n }\n\n return undefined;\n});\n\naddReducer('leaveGroupCall', (global, actions, payload) => {\n const {\n isFromLibrary, shouldDiscard, shouldRemove, rejoin,\n } = payload || {};\n const groupCall = selectActiveGroupCall(global);\n if (!groupCall) {\n return;\n }\n\n setGlobal(updateActiveGroupCall(global, { connectionState: 'disconnected' }, groupCall.participantsCount - 1));\n\n (async () => {\n await callApi('leaveGroupCall', {\n call: groupCall,\n });\n\n let shouldResetFallbackState = false;\n if (shouldDiscard) {\n global = getGlobal();\n\n if (global.groupCalls.fallbackChatId === groupCall.chatId) {\n shouldResetFallbackState = true;\n\n global.groupCalls.fallbackUserIdsToRemove?.forEach((userId) => {\n actions.deleteChatMember({ chatId: global.groupCalls.fallbackChatId, userId });\n });\n }\n\n await callApi('discardGroupCall', {\n call: groupCall,\n });\n }\n\n global = getGlobal();\n if (shouldRemove) {\n global = removeGroupCall(global, groupCall.id);\n }\n\n removeGroupCallAudioElement();\n\n setGlobal({\n ...global,\n groupCalls: {\n ...global.groupCalls,\n isGroupCallPanelHidden: true,\n activeGroupCallId: undefined,\n ...(shouldResetFallbackState && {\n fallbackChatId: undefined,\n fallbackUserIdsToRemove: undefined,\n }),\n },\n });\n\n if (!isFromLibrary) {\n leaveGroupCall();\n }\n\n if (rejoin) {\n actions.joinGroupCall(rejoin);\n }\n })();\n});\n\naddReducer('toggleGroupCallVideo', (global) => {\n const groupCall = selectActiveGroupCall(global);\n const user = selectUser(global, global.currentUserId!);\n if (!user || !groupCall) {\n return;\n }\n\n (async () => {\n await toggleStream('video');\n\n await callApi('editGroupCallParticipant', {\n call: groupCall,\n videoStopped: !isStreamEnabled('video'),\n participant: user,\n });\n })();\n});\n\naddReducer('requestToSpeak', (global, actions, payload) => {\n const { value } = payload || { value: true };\n const groupCall = selectActiveGroupCall(global);\n const user = selectUser(global, global.currentUserId!);\n if (!user || !groupCall) {\n return;\n }\n\n void callApi('editGroupCallParticipant', {\n call: groupCall,\n raiseHand: value,\n participant: user,\n });\n});\n\naddReducer('setGroupCallParticipantVolume', (global, actions, payload) => {\n const { participantId, volume } = payload!;\n\n const groupCall = selectActiveGroupCall(global);\n const user = selectUser(global, participantId);\n if (!user || !groupCall) {\n return;\n }\n\n setVolume(participantId, Math.floor(volume / GROUP_CALL_VOLUME_MULTIPLIER) / 100);\n\n void callApi('editGroupCallParticipant', {\n call: groupCall,\n volume: Number(volume),\n participant: user,\n });\n});\n\naddReducer('toggleGroupCallMute', (global, actions, payload) => {\n const { participantId, value } = payload || {};\n const groupCall = selectActiveGroupCall(global);\n const user = selectUser(global, participantId || global.currentUserId!);\n if (!user || !groupCall) {\n return;\n }\n\n (async () => {\n const muted = value === undefined ? isStreamEnabled('audio', user.id) : value;\n\n if (!participantId) {\n await toggleStream('audio');\n } else {\n setVolume(participantId, muted ? 0 : 1);\n }\n\n await callApi('editGroupCallParticipant', {\n call: groupCall,\n muted,\n participant: user,\n });\n })();\n});\n\naddReducer('toggleGroupCallPresentation', (global, actions, payload) => {\n const groupCall = selectActiveGroupCall(global);\n const user = selectUser(global, global.currentUserId!);\n if (!user || !groupCall) {\n return;\n }\n\n (async () => {\n const value = payload?.value !== undefined ? payload?.value : !isStreamEnabled('presentation');\n if (value) {\n const params = await startSharingScreen();\n if (!params) {\n return;\n }\n\n await callApi('joinGroupCallPresentation', {\n call: groupCall,\n params,\n });\n } else {\n await toggleStream('presentation', false);\n await callApi('leaveGroupCallPresentation', {\n call: groupCall,\n });\n }\n\n await callApi('editGroupCallParticipant', {\n call: groupCall,\n presentationPaused: !isStreamEnabled('presentation'),\n participant: user,\n });\n })();\n});\n\naddReducer('connectToActiveGroupCall', (global, actions) => {\n const groupCall = selectActiveGroupCall(global);\n if (!groupCall) return;\n\n if (groupCall.connectionState === 'discarded') {\n actions.showNotification({ message: 'This voice chat is not active' });\n return;\n }\n\n const audioElement = getGroupCallAudioElement();\n const audioContext = getGroupCallAudioContext();\n\n if (!audioElement || !audioContext) {\n return;\n }\n\n const {\n currentUserId,\n } = global;\n\n if (!currentUserId) return;\n\n (async () => {\n const params = await joinGroupCall(currentUserId, audioContext, audioElement, actions.apiUpdate);\n\n const result = await callApi('joinGroupCall', {\n call: groupCall,\n params,\n inviteHash: groupCall.inviteHash,\n });\n\n if (!result) return;\n\n actions.loadMoreGroupCallParticipants();\n\n if (groupCall.chatId) {\n const chat = selectChat(getGlobal(), groupCall.chatId);\n if (!chat) return;\n await loadFullChat(chat);\n }\n })();\n});\n\naddReducer('inviteToCallFallback', (global, actions, payload) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return;\n }\n\n const user = selectUser(global, chatId);\n if (!user) {\n return;\n }\n\n const { shouldRemove } = payload;\n\n (async () => {\n const fallbackChannelTitle = selectCallFallbackChannelTitle(global);\n\n let fallbackChannel = Object.values(global.chats.byId).find((channel) => {\n return (\n channel.title === fallbackChannelTitle\n && channel.isCreator\n && !channel.isRestricted\n );\n });\n if (!fallbackChannel) {\n fallbackChannel = await callApi('createChannel', {\n title: fallbackChannelTitle,\n users: [user],\n });\n\n if (!fallbackChannel) {\n return;\n }\n\n const photo = await fetchFile(callFallbackAvatarPath, 'avatar.png');\n void callApi('editChatPhoto', {\n chatId: fallbackChannel.id,\n accessHash: fallbackChannel.accessHash,\n photo,\n });\n } else {\n actions.updateChatMemberBannedRights({\n chatId: fallbackChannel.id,\n userId: chatId,\n bannedRights: {},\n });\n\n void callApi('addChatMembers', fallbackChannel, [user], true);\n }\n\n const inviteLink = await callApi('updatePrivateLink', {\n chat: fallbackChannel,\n usageLimit: 1,\n expireDate: getServerTime(global.serverTimeOffset) + FALLBACK_INVITE_EXPIRE_SECONDS,\n });\n if (!inviteLink) {\n return;\n }\n\n if (shouldRemove) {\n global = getGlobal();\n const fallbackUserIdsToRemove = global.groupCalls.fallbackUserIdsToRemove || [];\n setGlobal({\n ...global,\n groupCalls: {\n ...global.groupCalls,\n fallbackChatId: fallbackChannel.id,\n fallbackUserIdsToRemove: [...fallbackUserIdsToRemove, chatId],\n },\n });\n }\n\n actions.sendMessage({ text: `Join a call: ${inviteLink}` });\n actions.openChat({ id: fallbackChannel.id });\n actions.createGroupCall({ chatId: fallbackChannel.id });\n actions.closeCallFallbackConfirm();\n })();\n});\n","export const vibrateShort = () => {\n navigator.vibrate?.(50);\n};\n","import React, {\n FC, memo, useEffect, useState,\n} from '../../lib/teact/teact';\n\nimport getAnimationData, { ANIMATED_STICKERS_PATHS } from './helpers/animatedAssets';\n\nimport AnimatedSticker from './AnimatedSticker';\n\ntype OwnProps = {\n name: keyof typeof ANIMATED_STICKERS_PATHS;\n size: number;\n playSegment?: [number, number];\n color?: [number, number, number];\n};\n\nconst AnimatedIcon: FC = ({\n size,\n name,\n playSegment,\n color,\n}) => {\n const [iconData, setIconData] = useState>();\n\n useEffect(() => {\n getAnimationData(name).then(setIconData);\n }, [name]);\n\n return (\n \n );\n};\n\nexport default memo(AnimatedIcon);\n","import { GroupCallConnectionState } from '../../../lib/secret-sauce';\nimport React, {\n FC, memo, useEffect, useMemo, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\n\nimport buildClassName from '../../../util/buildClassName';\nimport { vibrateShort } from '../../../util/vibrate';\nimport { pick } from '../../../util/iteratees';\nimport usePrevious from '../../../hooks/usePrevious';\nimport { selectActiveGroupCall, selectGroupCallParticipant } from '../../../modules/selectors/calls';\nimport useLang from '../../../hooks/useLang';\n\nimport AnimatedIcon from '../../common/AnimatedIcon';\n\nimport './MicrophoneButton.scss';\n\nconst CONNECTION_STATE_DEFAULT = 'discarded';\n\ntype StateProps = {\n connectionState?: GroupCallConnectionState;\n hasRequestedToSpeak: boolean;\n isMuted?: boolean;\n canSelfUnmute?: boolean;\n noAudioStream: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst REQUEST_TO_SPEAK_THROTTLE = 3000;\nconst HOLD_TO_SPEAK_TIME = 200;\nconst ICON_SIZE = 48;\n\nconst MicrophoneButton: FC = ({\n noAudioStream,\n canSelfUnmute,\n isMuted,\n hasRequestedToSpeak,\n connectionState,\n toggleGroupCallMute,\n requestToSpeak,\n playGroupCallSound,\n}) => {\n const lang = useLang();\n const muteMouseDownState = useRef('up');\n\n const [isRequestingToSpeak, setIsRequestingToSpeak] = useState(false);\n const isConnecting = connectionState !== 'connected';\n const shouldRaiseHand = !canSelfUnmute && isMuted;\n const prevShouldRaiseHand = usePrevious(shouldRaiseHand);\n\n useEffect(() => {\n if (prevShouldRaiseHand && !shouldRaiseHand) {\n playGroupCallSound('allowTalk');\n }\n }, [playGroupCallSound, prevShouldRaiseHand, shouldRaiseHand]);\n\n // Voice mini\n // unmuted -> muted [69, 99]\n // muted -> unmuted [36, 69]\n // raise -> muted [0, 36]\n // muted -> raise [99, 136]\n // unmuted -> raise [136, 172]\n // TODO should probably move to other component\n const playSegment: [number, number] = useMemo(() => {\n if (isRequestingToSpeak) {\n const r = Math.floor(Math.random() * 100);\n return (r < 32 ? [0, 120]\n : (r < 64 ? [120, 240]\n : (r < 97 ? [240, 420]\n : [420, 540]\n )\n )\n );\n }\n if (!prevShouldRaiseHand && shouldRaiseHand) {\n return noAudioStream ? [99, 135] : [136, 172];\n }\n if (prevShouldRaiseHand && !shouldRaiseHand) {\n return [0, 36];\n }\n if (!shouldRaiseHand) {\n return noAudioStream ? [69, 99] : [36, 69];\n }\n return [0, 0];\n }, [prevShouldRaiseHand, isRequestingToSpeak, noAudioStream, shouldRaiseHand]);\n\n const animatedIconName = isRequestingToSpeak ? 'HandFilled' : 'VoiceMini';\n\n const toggleMute = () => {\n vibrateShort();\n toggleGroupCallMute();\n };\n\n const handleMouseDownMute = () => {\n if (shouldRaiseHand) {\n if (isRequestingToSpeak) return;\n vibrateShort();\n requestToSpeak();\n setIsRequestingToSpeak(true);\n setTimeout(() => {\n setIsRequestingToSpeak(false);\n }, REQUEST_TO_SPEAK_THROTTLE);\n return;\n }\n muteMouseDownState.current = 'down';\n if (noAudioStream) {\n setTimeout(() => {\n if (muteMouseDownState.current === 'down') {\n muteMouseDownState.current = 'hold';\n toggleMute();\n }\n }, HOLD_TO_SPEAK_TIME);\n }\n };\n\n const handleMouseUpMute = () => {\n if (shouldRaiseHand) {\n return;\n }\n toggleMute();\n muteMouseDownState.current = 'up';\n };\n\n const buttonText = useMemo(() => {\n return lang(\n hasRequestedToSpeak ? 'VoipMutedTapedForSpeak' : (\n shouldRaiseHand ? 'VoipMutedByAdmin' : (\n noAudioStream ? 'VoipUnmute' : 'VoipTapToMute'\n )\n ),\n );\n }, [hasRequestedToSpeak, noAudioStream, lang, shouldRaiseHand]);\n\n return (\n
\n \n \n \n
\n {buttonText}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const groupCall = selectActiveGroupCall(global);\n\n const { connectionState } = groupCall || {};\n const meParticipant = groupCall && selectGroupCallParticipant(global, groupCall.id, global.currentUserId!);\n\n const {\n raiseHandRating, hasAudioStream, canSelfUnmute, isMuted,\n } = meParticipant || {};\n\n return {\n connectionState: connectionState || CONNECTION_STATE_DEFAULT,\n hasRequestedToSpeak: Boolean(raiseHandRating),\n noAudioStream: !hasAudioStream,\n canSelfUnmute,\n isMuted,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'toggleGroupCallMute',\n 'requestToSpeak',\n 'playGroupCallSound',\n ]),\n)(MicrophoneButton));\n","import { GroupCallParticipant } from '../../../lib/secret-sauce';\nimport React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { IAnchorPosition } from '../../../types';\nimport { GlobalActions } from '../../../global/types';\n\nimport buildClassName from '../../../util/buildClassName';\nimport useThrottle from '../../../hooks/useThrottle';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\nimport { selectIsAdminInActiveGroupCall } from '../../../modules/selectors/calls';\nimport { pick } from '../../../util/iteratees';\nimport { GROUP_CALL_DEFAULT_VOLUME, GROUP_CALL_VOLUME_MULTIPLIER } from '../../../config';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\nimport AnimatedIcon from '../../common/AnimatedIcon';\nimport DeleteMemberModal from '../../right/DeleteMemberModal';\n\nimport './GroupCallParticipantMenu.scss';\n\nconst SPEAKER_ICON_DISABLED_SEGMENT: [number, number] = [0, 17];\nconst SPEAKER_ICON_ENABLED_SEGMENT: [number, number] = [17, 34];\n\ntype OwnProps = {\n participant?: GroupCallParticipant;\n closeDropdown: VoidFunction;\n isDropdownOpen: boolean;\n anchor?: IAnchorPosition;\n};\n\ntype StateProps = {\n isAdmin: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst VOLUME_ZERO = 0;\nconst VOLUME_LOW = 50;\nconst VOLUME_MEDIUM = 100;\nconst VOLUME_NORMAL = 150;\n\nconst VOLUME_CHANGE_THROTTLE = 500;\n\nconst SPEAKER_ICON_SIZE = 24;\n\nconst GroupCallParticipantMenu: FC = ({\n participant,\n closeDropdown,\n isDropdownOpen,\n anchor,\n\n isAdmin,\n toggleGroupCallMute,\n setGroupCallParticipantVolume,\n toggleGroupCallPanel,\n openChat,\n requestToSpeak,\n}) => {\n const lang = useLang();\n const [isDeleteUserModalOpen, openDeleteUserModal, closeDeleteUserModal] = useFlag();\n\n const id = participant?.id;\n const {\n isMutedByMe, isMuted, isSelf, canSelfUnmute,\n } = participant || {};\n const isRaiseHand = Boolean(participant?.raiseHandRating);\n const shouldRaiseHand = !canSelfUnmute && isMuted;\n\n const [localVolume, setLocalVolume] = useState(\n isMutedByMe ? VOLUME_ZERO : ((participant?.volume || GROUP_CALL_DEFAULT_VOLUME) / GROUP_CALL_VOLUME_MULTIPLIER),\n );\n\n useEffect(() => {\n setLocalVolume(isMutedByMe\n ? VOLUME_ZERO\n : ((participant?.volume || GROUP_CALL_DEFAULT_VOLUME) / GROUP_CALL_VOLUME_MULTIPLIER));\n // We only want to initialize local volume when switching participants and ignore following updates from server\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id]);\n\n const runThrottled = useThrottle(VOLUME_CHANGE_THROTTLE);\n\n const handleRemove = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n openDeleteUserModal();\n closeDropdown();\n }, [openDeleteUserModal, closeDropdown]);\n\n const handleCancelRequestToSpeak = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n requestToSpeak({\n value: false,\n });\n closeDropdown();\n }, [requestToSpeak, closeDropdown]);\n\n const handleMute = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n closeDropdown();\n\n if (!isAdmin) {\n setLocalVolume(isMutedByMe ? GROUP_CALL_DEFAULT_VOLUME / GROUP_CALL_VOLUME_MULTIPLIER : VOLUME_ZERO);\n }\n\n toggleGroupCallMute({\n participantId: id,\n value: isAdmin ? !shouldRaiseHand : !isMutedByMe,\n });\n }, [closeDropdown, toggleGroupCallMute, id, isAdmin, shouldRaiseHand, isMutedByMe]);\n\n const handleOpenProfile = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n toggleGroupCallPanel();\n openChat({\n id,\n });\n closeDropdown();\n }, [toggleGroupCallPanel, closeDropdown, openChat, id]);\n\n const isLocalVolumeZero = localVolume === VOLUME_ZERO;\n const speakerIconPlaySegment = isLocalVolumeZero ? SPEAKER_ICON_DISABLED_SEGMENT : SPEAKER_ICON_ENABLED_SEGMENT;\n\n const handleChangeVolume = (e: React.ChangeEvent) => {\n const value = Number(e.target.value);\n setLocalVolume(value);\n runThrottled(() => {\n if (value === VOLUME_ZERO) {\n toggleGroupCallMute({\n participantId: id,\n value: true,\n });\n } else {\n setGroupCallParticipantVolume({\n participantId: id,\n volume: Math.floor(value * GROUP_CALL_VOLUME_MULTIPLIER),\n });\n }\n });\n };\n\n return (\n
\n \n {!isSelf && !shouldRaiseHand && (\n
\n
= VOLUME_LOW && localVolume < VOLUME_MEDIUM && 'medium',\n localVolume >= VOLUME_MEDIUM && localVolume < VOLUME_NORMAL && 'normal',\n localVolume >= VOLUME_NORMAL && 'high',\n )}\n >\n \n
\n \n {localVolume}%\n
\n
\n
\n )}\n
\n {(isRaiseHand && isSelf) && (\n \n {lang('VoipGroupCancelRaiseHand')}\n \n )}\n {!isSelf && {lang('VoipGroupOpenProfile')}}\n {!isSelf && (\n // TODO cross mic\n \n {isAdmin\n ? lang(shouldRaiseHand ? 'VoipGroupAllowToSpeak' : 'VoipMute')\n : lang(isMutedByMe ? 'VoipGroupUnmuteForMe' : 'VoipGroupMuteForMe')}\n \n )}\n {!isSelf && isAdmin && (\n // TODO replace with hand\n \n {lang('VoipGroupUserRemove')}\n \n )}\n
\n \n\n {!isSelf && isAdmin && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n isAdmin: selectIsAdminInActiveGroupCall(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setGroupCallParticipantVolume',\n 'toggleGroupCallMute',\n 'openChat',\n 'toggleGroupCallPanel',\n 'requestToSpeak',\n ]),\n)(GroupCallParticipantMenu));\n","import { GroupCallParticipant, THRESHOLD } from '../../../lib/secret-sauce';\nimport React, { FC, memo, useMemo } from '../../../lib/teact/teact';\nimport AnimatedIcon from '../../common/AnimatedIcon';\nimport usePrevious from '../../../hooks/usePrevious';\n\ntype OwnProps = {\n participant: GroupCallParticipant;\n noColor?: boolean;\n};\n\nconst OutlinedMicrophoneIcon: FC = ({\n participant,\n noColor,\n}) => {\n const { isMuted, isMutedByMe } = participant;\n const isSpeaking = (participant.amplitude || 0) > THRESHOLD;\n const isRaiseHand = Boolean(participant.raiseHandRating);\n const prevIsRaiseHand = usePrevious(isRaiseHand);\n const canSelfUnmute = !!participant?.canSelfUnmute;\n const shouldRaiseHand = !canSelfUnmute && isMuted;\n const prevIsMuted = usePrevious(isMuted);\n\n const playSegment: [number, number] = useMemo(() => {\n if (isMuted && !prevIsMuted) {\n return [43, 64];\n }\n\n if (!isMuted && prevIsMuted) {\n return [22, 42];\n }\n\n if (isRaiseHand && !prevIsRaiseHand) {\n return [65, 84];\n }\n\n if (!shouldRaiseHand && prevIsRaiseHand) {\n return [0, 21];\n }\n\n // TODO cancel request to speak should play in reverse\n // if (!isRaiseHand && prevIsRaiseHand) {\n // return [84, 65];\n // }\n\n return isMuted ? [22, 23] : [43, 44];\n // eslint-disable-next-line\n }, [isMuted, shouldRaiseHand, isRaiseHand]);\n\n const microphoneColor: [number, number, number] | undefined = useMemo(() => {\n return noColor ? [0xff, 0xff, 0xff] : (\n isRaiseHand ? [0x4d, 0xa6, 0xe0]\n : (shouldRaiseHand || isMutedByMe ? [0xFF, 0x70, 0x6F] : (\n isSpeaking ? [0x57, 0xBC, 0x6C] : [0x84, 0x8D, 0x94]\n ))\n );\n }, [noColor, isRaiseHand, shouldRaiseHand, isMutedByMe, isSpeaking]);\n\n return (\n \n );\n};\n\nexport default memo(OutlinedMicrophoneIcon);\n","import { GroupCallParticipant as TypeGroupCallParticipant, THRESHOLD } from '../../../lib/secret-sauce';\nimport React, {\n FC, memo, useMemo, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport buildClassName from '../../../util/buildClassName';\nimport { selectChat, selectUser } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\nimport { GROUP_CALL_DEFAULT_VOLUME, GROUP_CALL_VOLUME_MULTIPLIER } from '../../../config';\n\nimport Avatar from '../../common/Avatar';\nimport OutlinedMicrophoneIcon from './OutlinedMicrophoneIcon';\n\nimport './GroupCallParticipant.scss';\n\ntype OwnProps = {\n participant: TypeGroupCallParticipant;\n openParticipantMenu: (anchor: HTMLDivElement, participant: TypeGroupCallParticipant) => void;\n};\n\ntype StateProps = {\n user?: ApiUser;\n chat?: ApiChat;\n};\n\nconst GroupCallParticipant: FC = ({\n openParticipantMenu,\n participant,\n user,\n chat,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const anchorRef = useRef(null);\n const lang = useLang();\n\n const { isSelf, isMutedByMe, isMuted } = participant;\n const isSpeaking = (participant.amplitude || 0) > THRESHOLD;\n const isRaiseHand = Boolean(participant.raiseHandRating);\n\n const handleOnClick = () => {\n if (isSelf) return;\n openParticipantMenu(anchorRef.current!, participant);\n };\n\n const [aboutText, aboutColor] = useMemo(() => {\n if (isSelf) {\n return [lang('ThisIsYou'), 'blue'];\n }\n if (isMutedByMe) {\n return [lang('VoipGroupMutedForMe'), 'red'];\n }\n return isRaiseHand\n ? [lang('WantsToSpeak'), 'blue']\n : (!isMuted && isSpeaking ? [\n participant.volume && participant.volume !== GROUP_CALL_DEFAULT_VOLUME\n ? lang('SpeakingWithVolume',\n (participant.volume / GROUP_CALL_VOLUME_MULTIPLIER).toString())\n .replace('%%', '%') : lang('Speaking'),\n 'green',\n ]\n : (participant.about ? [participant.about, ''] : [lang('Listening'), 'blue']));\n }, [isSpeaking, participant.volume, lang, isSelf, isMutedByMe, isRaiseHand, isMuted, participant.about]);\n\n if (!user && !chat) {\n return undefined;\n }\n\n const name = user ? `${user.firstName || ''} ${user.lastName || ''}` : chat?.title;\n\n return (\n \n \n
\n {name}\n {aboutText}\n
\n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { participant }): StateProps => {\n return {\n user: participant.isUser ? selectUser(global, participant.id) : undefined,\n chat: !participant.isUser ? selectChat(global, participant.id) : undefined,\n };\n },\n)(GroupCallParticipant));\n","import { GroupCallParticipant as TypeGroupCallParticipant } from '../../../lib/secret-sauce';\nimport React, { FC, memo, useMemo } 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';\nimport { selectActiveGroupCall } from '../../../modules/selectors/calls';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\n\nimport GroupCallParticipant from './GroupCallParticipant';\nimport InfiniteScroll from '../../ui/InfiniteScroll';\n\ntype OwnProps = {\n openParticipantMenu: (anchor: HTMLDivElement, participant: TypeGroupCallParticipant) => void;\n};\n\ntype StateProps = {\n participantsCount: number;\n participants?: Record;\n canInvite?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst GroupCallParticipantList: FC = ({\n createGroupCallInviteLink,\n loadMoreGroupCallParticipants,\n participants,\n participantsCount,\n openParticipantMenu,\n}) => {\n const lang = useLang();\n\n const participantsIds = useMemo(() => {\n return Object.keys(participants || {});\n }, [participants]);\n\n const [viewportIds, getMore] = useInfiniteScroll(\n loadMoreGroupCallParticipants,\n participantsIds,\n participantsIds.length >= participantsCount,\n );\n\n return (\n
\n
\n
\n \n
\n
{lang('VoipGroupInviteMember')}
\n
\n\n \n {viewportIds?.map(\n (participantId) => (\n participants![participantId] && (\n \n )\n ),\n )}\n \n\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { participantsCount, participants } = selectActiveGroupCall(global) || {};\n\n return {\n participants,\n participantsCount: participantsCount || 0,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'createGroupCallInviteLink',\n 'loadMoreGroupCallParticipants',\n ]),\n)(GroupCallParticipantList));\n","import { getUserStreams, GroupCallParticipant as TypeGroupCallParticipant, THRESHOLD } from '../../../lib/secret-sauce';\nimport React, { FC, memo, useCallback } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport buildClassName from '../../../util/buildClassName';\nimport { selectChat, selectUser } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\nimport { ENABLE_THUMBNAIL_VIDEO } from '../../../config';\n\nimport Avatar from '../../common/Avatar';\n\nimport './GroupCallParticipantVideo.scss';\n\ntype OwnProps = {\n participant: TypeGroupCallParticipant;\n type: 'video' | 'presentation';\n onClick?: (id: string, type: 'video' | 'presentation') => void;\n isFullscreen?: boolean;\n};\n\ntype StateProps = {\n user?: ApiUser;\n chat?: ApiChat;\n currentUserId?: string;\n isActive?: boolean;\n};\n\nconst GroupCallParticipantVideo: FC = ({\n type,\n onClick,\n user,\n chat,\n isActive,\n isFullscreen,\n}) => {\n const lang = useLang();\n\n const handleClick = useCallback(() => {\n if (onClick) {\n onClick(user?.id || chat!.id, type);\n }\n }, [chat, onClick, type, user?.id]);\n\n if (!user && !chat) return undefined;\n\n const streams = getUserStreams(user?.id || chat!.id);\n\n return (\n \n {isFullscreen && (\n \n )}\n \n {ENABLE_THUMBNAIL_VIDEO && (\n
\n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { participant }): StateProps => {\n return {\n currentUserId: global.currentUserId,\n user: participant.isUser ? selectUser(global, participant.id) : undefined,\n chat: !participant.isUser ? selectChat(global, participant.id) : undefined,\n isActive: (participant.amplitude || 0) > THRESHOLD,\n };\n },\n)(GroupCallParticipantVideo));\n","import { GroupCallParticipant } from '../../../lib/secret-sauce';\nimport React, {\n FC, memo, useCallback, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\nimport GroupCallParticipantVideo from './GroupCallParticipantVideo';\nimport { selectActiveGroupCall } from '../../../modules/selectors/calls';\nimport buildClassName from '../../../util/buildClassName';\n\ntype OwnProps = {\n onDoubleClick?: VoidFunction;\n};\n\ntype StateProps = {\n participants?: Record;\n};\n\ntype SelectedVideo = {\n type: 'video' | 'presentation';\n id: string;\n};\n\nconst GroupCallParticipantStreams: FC = ({\n participants,\n onDoubleClick,\n}) => {\n const [selectedVideo, setSelectedVideo] = useState(undefined);\n const presentationParticipants = useMemo(() => {\n return Object.values(participants || {}).filter((l) => l.hasPresentationStream);\n }, [participants]);\n const videoParticipants = useMemo(() => {\n return Object.values(participants || {}).filter((l) => l.hasVideoStream);\n }, [participants]);\n\n const totalVideoCount = videoParticipants.length + presentationParticipants.length;\n // TODO replace with more adequate solution.\n // There's a max of 30 videos or so right now\n const columnCount = totalVideoCount <= 2 ? 1 : (\n totalVideoCount <= 6 ? 2 : (\n totalVideoCount <= 9 ? 3 : 4\n )\n );\n\n const shouldSpanLastVideo = totalVideoCount === 3 || (columnCount === 2 && totalVideoCount % 2 !== 0);\n\n const handleClickVideo = useCallback((id: string, type: 'video' | 'presentation') => {\n if (!selectedVideo || (id !== selectedVideo.id || type !== selectedVideo.type)) {\n setSelectedVideo({\n id,\n type,\n });\n } else {\n setSelectedVideo(undefined);\n }\n }, [selectedVideo]);\n\n return (\n
\n \n {selectedVideo && (\n \n )}\n\n {!selectedVideo ? presentationParticipants.map((participant) => (\n \n )) : undefined}\n {!selectedVideo ? videoParticipants.map((participant) => (\n \n )) : undefined}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { participants } = selectActiveGroupCall(global) || {};\n return {\n participants,\n };\n },\n)(GroupCallParticipantStreams));\n","import {\n GroupCallConnectionState, GroupCallParticipant as TypeGroupCallParticipant,\n IS_SCREENSHARE_SUPPORTED, switchCameraInput, toggleSpeaker,\n} from '../../../lib/secret-sauce';\nimport React, {\n FC, memo, useCallback, useEffect, useMemo, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\nimport '../../../modules/actions/calls';\n\nimport { GlobalActions } from '../../../global/types';\nimport { IAnchorPosition } from '../../../types';\n\nimport {\n IS_ANDROID,\n IS_IOS,\n IS_REQUEST_FULLSCREEN_SUPPORTED,\n IS_SINGLE_COLUMN_LAYOUT,\n} from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\nimport {\n selectGroupCall,\n selectGroupCallParticipant,\n selectIsAdminInActiveGroupCall,\n} from '../../../modules/selectors/calls';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\n\nimport Loading from '../../ui/Loading';\nimport Button from '../../ui/Button';\nimport DropdownMenu from '../../ui/DropdownMenu';\nimport MenuItem from '../../ui/MenuItem';\nimport Modal from '../../ui/Modal';\nimport MicrophoneButton from './MicrophoneButton';\nimport AnimatedIcon from '../../common/AnimatedIcon';\nimport Checkbox from '../../ui/Checkbox';\nimport GroupCallParticipantMenu from './GroupCallParticipantMenu';\nimport GroupCallParticipantList from './GroupCallParticipantList';\nimport GroupCallParticipantStreams from './GroupCallParticipantStreams';\n\nimport './GroupCall.scss';\n\nconst CAMERA_FLIP_PLAY_SEGMENT: [number, number] = [0, 10];\nconst PARTICIPANT_HEIGHT = 60;\n\nexport type OwnProps = {\n groupCallId: string;\n};\n\ntype StateProps = {\n isGroupCallPanelHidden: boolean;\n connectionState: GroupCallConnectionState;\n title?: string;\n meParticipant?: TypeGroupCallParticipant;\n participantsCount?: number;\n isSpeakerEnabled?: boolean;\n isAdmin: boolean;\n participants: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst GroupCall: FC = ({\n groupCallId,\n isGroupCallPanelHidden,\n connectionState,\n isSpeakerEnabled,\n title,\n meParticipant,\n isAdmin,\n participants,\n\n toggleGroupCallVideo,\n toggleGroupCallPresentation,\n leaveGroupCall,\n toggleGroupCallPanel,\n connectToActiveGroupCall,\n playGroupCallSound,\n}) => {\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const [isLeaving, setIsLeaving] = useState(false);\n const [isFullscreen, openFullscreen, closeFullscreen] = useFlag();\n const [isSidebarOpen, openSidebar, closeSidebar] = useFlag(true);\n const hasVideoParticipants = participants && Object.values(participants).some((l) => l.video || l.presentation);\n const isLandscape = isFullscreen && !IS_SINGLE_COLUMN_LAYOUT && hasVideoParticipants;\n\n const [participantMenu, setParticipantMenu] = useState<{\n participant: TypeGroupCallParticipant;\n anchor: IAnchorPosition;\n } | undefined>();\n const [isParticipantMenuOpen, openParticipantMenu, closeParticipantMenu] = useFlag();\n\n const [isConfirmLeaveModalOpen, openConfirmLeaveModal, closeConfirmLeaveModal] = useFlag();\n const [isEndGroupCallModal, setIsEndGroupCallModal] = useState(false);\n const [shouldEndGroupCall, setShouldEndGroupCall] = useState(false);\n\n const hasVideo = meParticipant?.hasVideoStream;\n const hasPresentation = meParticipant?.hasPresentationStream;\n const isConnecting = connectionState !== 'connected';\n const canSelfUnmute = meParticipant?.canSelfUnmute;\n const shouldRaiseHand = !canSelfUnmute && meParticipant?.isMuted;\n\n const handleOpenParticipantMenu = useCallback((anchor: HTMLDivElement, participant: TypeGroupCallParticipant) => {\n const rect = anchor.getBoundingClientRect();\n const container = containerRef.current!;\n\n setParticipantMenu({\n anchor: { x: rect.left, y: rect.top - container.offsetTop + PARTICIPANT_HEIGHT },\n participant,\n });\n\n openParticipantMenu();\n }, [openParticipantMenu]);\n\n useEffect(() => {\n if (connectionState === 'connected') {\n playGroupCallSound({ sound: 'join' });\n } else if (connectionState === 'reconnecting') {\n playGroupCallSound({ sound: 'connecting' });\n }\n }, [connectionState, playGroupCallSound]);\n\n const handleCloseConfirmLeaveModal = () => {\n closeConfirmLeaveModal();\n setIsEndGroupCallModal(false);\n };\n\n const MainButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n \n \n \n );\n }, [lang]);\n\n const handleToggleFullscreen = useCallback(() => {\n if (!containerRef.current) return;\n\n if (isFullscreen) {\n document.exitFullscreen().then(closeFullscreen);\n } else {\n containerRef.current.requestFullscreen().then(openFullscreen);\n }\n }, [closeFullscreen, isFullscreen, openFullscreen]);\n\n const handleToggleSidebar = () => {\n if (isSidebarOpen) {\n closeSidebar();\n } else {\n openSidebar();\n }\n };\n\n const handleStreamsDoubleClick = useCallback(() => {\n if (!IS_REQUEST_FULLSCREEN_SUPPORTED) return;\n\n if (!isFullscreen) {\n closeSidebar();\n handleToggleFullscreen();\n } else {\n handleToggleFullscreen();\n }\n }, [closeSidebar, handleToggleFullscreen, isFullscreen]);\n\n const toggleFullscreen = useCallback(() => {\n if (isFullscreen) {\n closeFullscreen();\n } else {\n openFullscreen();\n }\n }, [closeFullscreen, isFullscreen, openFullscreen]);\n\n const handleClose = () => {\n toggleGroupCallPanel();\n if (isFullscreen) {\n closeFullscreen();\n }\n };\n\n useEffect(() => {\n if (!IS_REQUEST_FULLSCREEN_SUPPORTED) return undefined;\n const container = containerRef.current;\n if (!container) return undefined;\n\n container.addEventListener('fullscreenchange', toggleFullscreen);\n\n return () => {\n container.removeEventListener('fullscreenchange', toggleFullscreen);\n };\n }, [toggleFullscreen]);\n\n const handleClickVideoOrSpeaker = () => {\n if (shouldRaiseHand) {\n toggleSpeaker();\n } else {\n toggleGroupCallVideo();\n }\n };\n\n useEffect(() => {\n connectToActiveGroupCall();\n }, [connectToActiveGroupCall, groupCallId]);\n\n const endGroupCall = () => {\n setIsEndGroupCallModal(true);\n setShouldEndGroupCall(true);\n openConfirmLeaveModal();\n if (isFullscreen) {\n handleToggleFullscreen();\n }\n };\n\n const handleLeaveGroupCall = () => {\n if (isAdmin && !isConfirmLeaveModalOpen) {\n openConfirmLeaveModal();\n if (isFullscreen) {\n handleToggleFullscreen();\n }\n return;\n }\n playGroupCallSound({ sound: 'leave' });\n setIsLeaving(true);\n closeConfirmLeaveModal();\n };\n\n const handleCloseAnimationEnd = () => {\n if (isLeaving) {\n leaveGroupCall({\n shouldDiscard: shouldEndGroupCall,\n });\n }\n };\n\n return (\n \n
\n

{title || lang('VoipGroupVoiceChat')}

\n {IS_REQUEST_FULLSCREEN_SUPPORTED && (\n \n \n \n )}\n {isLandscape && (\n \n \n \n )}\n {((IS_SCREENSHARE_SUPPORTED && !shouldRaiseHand) || isAdmin) && (\n \n {IS_SCREENSHARE_SUPPORTED && !shouldRaiseHand && (\n \n {lang(hasPresentation ? 'VoipChatStopScreenCapture' : 'VoipChatStartScreenCapture')}\n \n )}\n {isAdmin && (\n \n {lang('VoipGroupLeaveAlertEndChat')}\n \n )}\n \n )}\n \n \n \n
\n\n
\n \n\n {(!isLandscape || isSidebarOpen)\n && }\n
\n\n \n\n
\n {isConnecting && }\n\n
\n
\n {hasVideo && (IS_ANDROID || IS_IOS) && (\n \n )}\n \n \n \n
\n\n
\n {lang(shouldRaiseHand ? 'VoipSpeaker' : 'VoipCamera')}\n
\n
\n\n \n\n
\n \n\n
\n {lang('VoipGroupLeave')}\n
\n
\n
\n\n \n

{lang(isEndGroupCallModal ? 'VoipGroupEndAlertText' : 'VoipGroupLeaveAlertText')}

\n {!isEndGroupCallModal && (\n \n )}\n \n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { groupCallId }): StateProps => {\n const {\n connectionState, title, isSpeakerDisabled, participants, participantsCount,\n } = selectGroupCall(global, groupCallId)! || {};\n\n return {\n connectionState,\n title,\n isSpeakerEnabled: !isSpeakerDisabled,\n participantsCount,\n meParticipant: selectGroupCallParticipant(global, groupCallId, global.currentUserId!),\n isGroupCallPanelHidden: !!global.groupCalls.isGroupCallPanelHidden,\n isAdmin: selectIsAdminInActiveGroupCall(global),\n participants,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'toggleGroupCallVideo',\n 'leaveGroupCall',\n 'toggleGroupCallPresentation',\n 'toggleGroupCallPanel',\n 'connectToActiveGroupCall',\n 'playGroupCallSound',\n ]),\n)(GroupCall));\n","import { GroupCallParticipant } from '../../lib/secret-sauce';\nimport React, {\n FC, memo, useEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiGroupCall } from '../../api/types';\n\nimport { selectActiveGroupCall, selectGroupCallParticipant } from '../../modules/selectors/calls';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport './ActiveCallHeader.scss';\n\ntype StateProps = {\n isGroupCallPanelHidden?: boolean;\n meParticipant: GroupCallParticipant;\n groupCall?: ApiGroupCall;\n};\n\ntype DispatchProps = Pick;\n\nconst ActiveCallHeader: FC = ({\n groupCall,\n meParticipant,\n isGroupCallPanelHidden,\n toggleGroupCallPanel,\n}) => {\n const lang = useLang();\n\n useEffect(() => {\n document.body.classList.toggle('has-group-call-header', isGroupCallPanelHidden);\n\n return () => {\n document.body.classList.toggle('has-group-call-header', false);\n };\n }, [isGroupCallPanelHidden]);\n\n if (!groupCall || !meParticipant) return undefined;\n\n return (\n \n {groupCall.title || lang('VoipGroupVoiceChat')}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n groupCall: selectActiveGroupCall(global),\n isGroupCallPanelHidden: global.groupCalls.isGroupCallPanelHidden,\n meParticipant: selectGroupCallParticipant(global, global.groupCalls.activeGroupCallId!, global.currentUserId!),\n };\n },\n (setGlobal, actions) => pick(actions, [\n 'toggleGroupCallPanel',\n ]),\n)(ActiveCallHeader));\n","import React, { FC, memo, useState } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\n\nimport ConfirmDialog from '../ui/ConfirmDialog';\nimport Checkbox from '../ui/Checkbox';\nimport { selectCallFallbackChannelTitle } from '../../modules/selectors/calls';\nimport { getUserFullName } from '../../modules/helpers';\nimport { selectCurrentMessageList, selectUser } from '../../modules/selectors';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\n\nexport type OwnProps = {\n isOpen: boolean;\n};\n\ninterface StateProps {\n userFullName?: string;\n channelTitle: string;\n}\n\ntype DispatchProps = Pick;\n\nconst CallFallbackConfirm: FC = ({\n isOpen,\n channelTitle,\n userFullName,\n closeCallFallbackConfirm,\n inviteToCallFallback,\n}) => {\n const [shouldRemove, setShouldRemove] = useState(true);\n const renderingUserFullName = useCurrentOrPrev(userFullName, true);\n\n return (\n {\n inviteToCallFallback({ shouldRemove });\n }}\n onClose={closeCallFallbackConfirm}\n >\n

The call will be started in a private channel {channelTitle}.

\n \n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { chatId } = selectCurrentMessageList(global) || {};\n const user = chatId ? selectUser(global, chatId) : undefined;\n\n return {\n userFullName: user ? getUserFullName(user) : undefined,\n channelTitle: selectCallFallbackChannelTitle(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'closeCallFallbackConfirm', 'inviteToCallFallback',\n ]),\n)(CallFallbackConfirm));\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// @ts-ignore\nimport CameraFlip from '../../../assets/animatedIcons/CameraFlip.tgs';\n// @ts-ignore\nimport HandFilled from '../../../assets/animatedIcons/HandFilled.tgs';\n// @ts-ignore\nimport HandOutline from '../../../assets/animatedIcons/HandOutline.tgs';\n// @ts-ignore\nimport Speaker from '../../../assets/animatedIcons/Speaker.tgs';\n// @ts-ignore\nimport VoiceAllowTalk from '../../../assets/animatedIcons/VoiceAllowTalk.tgs';\n// @ts-ignore\nimport VoiceMini from '../../../assets/animatedIcons/VoiceMini.tgs';\n// @ts-ignore\nimport VoiceMuted from '../../../assets/animatedIcons/VoiceMuted.tgs';\n// @ts-ignore\nimport VoiceOutlined from '../../../assets/animatedIcons/VoiceOutlined.tgs';\n\nexport const ANIMATED_STICKERS_PATHS = {\n MonkeyIdle,\n MonkeyTracking,\n MonkeyClose,\n MonkeyPeek,\n FoldersAll,\n FoldersNew,\n DiscussionGroups,\n CameraFlip,\n HandFilled,\n HandOutline,\n Speaker,\n VoiceAllowTalk,\n VoiceMini,\n VoiceMuted,\n VoiceOutlined,\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","/*! For license information please see index.js.LICENSE.txt */\n(()=>{\"use strict\";var e={\"./src/blacksilence.ts\":(e,t,n)=>{n.r(t),n.d(t,{silence:()=>a,black:()=>i});const a=e=>{const t=e.createOscillator(),n=t.connect(e.createMediaStreamDestination());return t.start(),new MediaStream([Object.assign(n.stream.getAudioTracks()[0],{enabled:!1})])},i=({width:e=640,height:t=480}={})=>{const n=Object.assign(document.createElement(\"canvas\"),{width:e,height:t}),a=n.getContext(\"2d\");if(!a)throw Error(\"Cannot create canvas ctx\");a.fillRect(0,0,e,t);const i=n.captureStream();return new MediaStream([Object.assign(i.getVideoTracks()[0],{enabled:!1})])}},\"./src/buildSdp.ts\":(e,t,n)=>{n.r(t),n.d(t,{default:()=>i});var a=n(\"./src/utils.ts\");const i=(e,t=!1,n=!1)=>{const i=[],r=e=>{i.push(e)},{sessionId:s,ssrcs:o,audioExtensions:c,videoExtensions:d,audioPayloadTypes:p,videoPayloadTypes:u,transport:{ufrag:l,pwd:f,fingerprints:m,candidates:g}}=e;r(\"v=0\"),r(`o=- ${s} 2 IN IP4 0.0.0.0`),r(\"s=-\"),r(\"t=0 0\"),r(`a=group:BUNDLE ${o.map((e=>e.endpoint)).join(\" \")}${n?\"\":\" 2\"}`),r(\"a=ice-lite\");const v=e=>{let t=\"\";t+=\"a=candidate:\",t+=`${e.foundation} ${e.component} ${e.protocol} ${e.priority} ${e.ip} ${e.port} typ ${e.type}`,\"rel-addr\"in e&&(t+=` raddr ${e[\"rel-addr\"]} rport ${e[\"rel-port\"]}`),t+=` generation ${e.generation}`,r(t)},S=()=>{r(`a=ice-ufrag:${l}`),r(`a=ice-pwd:${f}`),m.forEach((e=>{r(`a=fingerprint:${e.hash} ${e.fingerprint}`),r(\"a=setup:passive\")})),g.forEach(v)},h=e=>{const{channels:t,id:n,name:a,clockrate:i,parameters:s}=e;var o=t?`/${t}`:\"\";r(`a=rtpmap:${n} ${a}/${i}${o}`),s&&(o=Object.keys(s).map((e=>`${e}=${s[e]};`)).join(\" \"),r(`a=fmtp:${n} ${o}`)),e[\"rtcp-fbs\"]?.forEach((e=>{r(`a=rtcp-fb:${n} ${e.type}${e.subtype?` ${e.subtype}`:\"\"}`)}))};return e=e=>{const n=e.isVideo?u:p;var i=e.isVideo?\"video\":\"audio\";r(`m=${i} ${e.isMain?1:0} RTP/SAVPF ${n.map((e=>e.id)).join(\" \")}`),r(\"c=IN IP4 0.0.0.0\"),r(\"b=AS:1300\"),r(`a=mid:${e.endpoint}`),r(\"a=rtcp-mux\"),n.forEach(h),r(\"a=rtcp:1 IN IP4 0.0.0.0\"),e.isVideo&&r(\"a=rtcp-rsize\"),(e.isVideo?d:c).forEach((({id:e,uri:t})=>{r(`a=extmap:${e} ${t}`)})),e.isRemoved?r(\"a=inactive\"):(S(),t?r(\"a=recvonly\"):(e.isMain?r(\"a=sendrecv\"):(r(\"a=sendonly\"),r(\"a=bundle-only\")),e.sourceGroups.forEach((t=>{r(`a=ssrc-group:${t.semantics} ${t.sources.map(a.fromTelegramSource).join(\" \")}`),t.sources.forEach((t=>{t=(0,a.fromTelegramSource)(t),r(`a=ssrc:${t} cname:${e.endpoint}`),r(`a=ssrc:${t} msid:${e.endpoint} ${e.endpoint}`),r(`a=ssrc:${t} mslabel:${e.endpoint}`),r(`a=ssrc:${t} label:${e.endpoint}`)}))}))))},o.filter((e=>\"0\"===e.endpoint||\"1\"===e.endpoint)).map(e),n||(r(\"m=application 1 UDP/DTLS/SCTP webrtc-datachannel\"),r(\"c=IN IP4 0.0.0.0\"),S(),r(\"a=ice-options:trickle\"),r(\"a=mid:\"+(n?\"1\":\"2\")),r(\"a=sctp-port:5000\"),r(\"a=max-message-size:262144\")),o.filter((e=>\"0\"!==e.endpoint&&\"1\"!==e.endpoint)).map(e),`${i.join(\"\\n\")}\\n`}},\"./src/parseSdp.ts\":(e,t,n)=>{n.r(t),n.d(t,{default:()=>i});var a=n(\"./src/utils.ts\");const i=e=>{if(!e||!e.sdp)throw Error(\"Failed parsing SDP: session description is null\");const t=e.sdp.split(\"\\r\\nm=\").map(((e,t)=>0===t?e:`m=${e}`)).reduce(((e,t)=>(e[t.match(/^m=(.+?)\\s/)?.[1]||\"header\"]=t.split(\"\\r\\n\").filter(Boolean),e)),{});var n=(e,n)=>n?t[n]?.find((t=>t.startsWith(e)))?.substr(e.length):Object.values(t).map((t=>t.find((t=>t.startsWith(e)))?.substr(e.length))).filter(Boolean)[0];const i=n(\"a=ssrc:\",\"audio\");var r=i&&Number(i.split(\" \")[0]);const s=n(\"a=ssrc-group:\",\"video\")?.split(\" \")||void 0;if(!s)throw Error(\"Failed parsing SDP: no video ssrc\");var[o,c]=n(\"a=fingerprint:\")?.split(\" \")||[];if(!o||!c)throw Error(\"Failed parsing SDP: no fingerprint\");if(e=n(\"a=ice-ufrag:\"),n=n(\"a=ice-pwd:\"),!e||!n)throw Error(\"Failed parsing SDP: no ICE ufrag or pwd\");return{fingerprints:[{fingerprint:c,hash:o,setup:\"active\"}],pwd:n,ufrag:e,...r&&{ssrc:(0,a.toTelegramSource)(r)},...s&&{\"ssrc-groups\":[{semantics:s[0],sources:s.slice(1,s.length).map(Number).map(a.toTelegramSource)}]}}}},\"./src/secretsauce.ts\":(e,t,n)=>{n.r(t),n.d(t,{getDevices:()=>async function(e,t=!0){return(await navigator.mediaDevices.enumerateDevices()).filter((n=>n.kind===`${e}${t?\"input\":\"output\"}`))},toggleSpeaker:()=>function(){o&&(o.isSpeakerDisabled=!o.isSpeakerDisabled,o?.onUpdate?.({\"@type\":\"updateGroupCallConnectionState\",connectionState:\"connected\",isSpeakerDisabled:o.isSpeakerDisabled}),o.participantFunctions&&Object.values(o.participantFunctions).forEach((e=>{e.toggleMute?.(!!o?.isSpeakerDisabled)})))},toggleNoiseSuppression:()=>function(){if(o&&o.myId&&o.streams){const n=o.streams[o.myId].audio;if(n){const a=n.getTracks()[0];var e,t;a&&(({echoCancellation:e,noiseSuppression:t}=a.getConstraints()),a.applyConstraints({echoCancellation:!e,noiseSuppression:!t}))}}},getUserStreams:()=>d,setVolume:()=>function(e,t){const n=o?.participantFunctions?.[e];n&&n.setVolume?.(t)},isStreamEnabled:()=>p,switchCameraInput:()=>async function(){if(o?.myId&&o.connection&&o.streams&&o.facingMode){const e=d(o.myId)?.video;if(e){const t=e.getTracks()[0];if(t){const e=o.connection.getSenders().find((e=>t.id===e.track?.id));if(e){o.facingMode=\"environment\"===o.facingMode?\"user\":\"environment\";try{const t=await l(\"video\",o.facingMode);await e.replaceTrack(t.getTracks()[0]),o.streams[o.myId].video=t}catch(e){}}}}}},toggleStream:()=>f,leaveGroupCall:()=>g,handleUpdateGroupCallParticipants:()=>async function(e){if(o){const{participants:a,conference:r,connection:s,myId:c}=o;if(a&&r&&s&&r.ssrcs&&r.transport&&c)if(e.find((e=>e.isSelf&&e.source!==o?.conference?.ssrcs?.find((e=>e.isMain&&!e.isVideo))?.sourceGroups[0].sources[0])))g();else{const a=[];if(e.forEach((e=>{if(e.isSelf)e.isMuted&&!e.canSelfUnmute&&(f(\"audio\",!1),f(\"video\",!1),f(\"presentation\",!1));else{var t=e.isLeft;const n=e.isMuted||e.isMutedByMe,i=!e.isVideoJoined||!e.video||t,s=!e.presentation||t;let o=!1,c=!1,d=!1;r.ssrcs.filter((t=>t.userId===e.id)).forEach((t=>{t.isVideo||(t.sourceGroups[0].sources[0]===e.source&&(c=!0),t.isRemoved=n),t.isVideo&&(t.isPresentation||(e.video&&t.endpoint===e.video.endpoint&&(o=!0),t.isRemoved=i),t.isPresentation&&(e.presentation&&t.endpoint===e.presentation.endpoint&&(d=!0),t.isRemoved=s))})),n||c||r.ssrcs.push({userId:e.id,isMain:!1,endpoint:`audio${e.source}`,isVideo:!1,sourceGroups:[{semantics:\"FID\",sources:[e.source]}]}),i||o||!e.video||(a.push(e.video.endpoint),r.ssrcs.push({userId:e.id,isMain:!1,endpoint:e.video.endpoint,isVideo:!0,sourceGroups:e.video.sourceGroups})),s||d||!e.presentation||r.ssrcs.push({isPresentation:!0,userId:e.id,isMain:!1,endpoint:e.presentation.endpoint,isVideo:!0,sourceGroups:e.presentation.sourceGroups})}})),o.updatingParticipantsQueue)o.updatingParticipantsQueue.push(r);else{o.updatingParticipantsQueue=[],e=(0,i.default)(r),await s.setRemoteDescription({type:\"offer\",sdp:e});try{var t=await s.createAnswer();if(await s.setLocalDescription(t),u(c),0async function(e,t){if(o){var n=t?o.screenshareConference:o.conference;const r=t?o.screenshareConnection:o.connection;if(n&&r&&n.ssrcs){var a=Date.now();e={...n,transport:e.transport,sessionId:a,audioExtensions:e.audio?.[\"rtp-hdrexts\"],audioPayloadTypes:e.audio?.[\"payload-types\"],videoExtensions:e.video?.[\"rtp-hdrexts\"],videoPayloadTypes:e.video?.[\"payload-types\"]};o={...o,...t?{screenshareConference:e}:{conference:e}};try{await r.setRemoteDescription({type:\"answer\",sdp:(0,i.default)(e,!0,t)})}catch(e){console.error(e)}}}},startSharingScreen:()=>async function(){if(o)try{const e=await l(\"presentation\");return e?(e.getTracks()[0].onended=()=>{o&&o.myId&&(o.streams?.[o.myId].presentation,u(o.myId),c())},new Promise((t=>{var{connection:n,dataChannel:t}=h([e],t,!0);o={...o,screenshareConnection:n,screenshareDataChannel:t}}))):void 0}catch(e){return}},joinGroupCall:()=>function(e,t,n,a){if(o)throw Error(\"Already in call\");m(\"connecting\");var i=t.createMediaStreamDestination();return n.srcObject=i.stream,n.play().catch((e=>console.warn(e))),o={onUpdate:a,participants:[],myId:e,speaking:{},silence:(0,r.silence)(t),black:(0,r.black)({width:640,height:480}),analyserInterval:setInterval(v,1e3),audioElement:n,destination:i,audioContext:t},new Promise((e=>{o={...o,...h([o.silence,o.black],e)}}))}});var a=n(\"./src/parseSdp.ts\"),i=n(\"./src/buildSdp.ts\"),r=n(\"./src/blacksilence.ts\"),s=n(\"./src/utils.ts\");let o;function c(e){o&&(o.screenshareDataChannel?.close(),o.screenshareConnection?.close(),e||o.onUpdate?.({\"@type\":\"updateGroupCallLeavePresentation\"}))}function d(e){return o?.streams?.[e]}function p(e,t){const n=(t=t||o?.myId)&&d(t)?.[e];return!!n&&n.getTracks()[0]?.enabled}function u(e){o?.onUpdate?.({\"@type\":\"updateGroupCallStreams\",userId:e,hasAudioStream:p(\"audio\",e),hasVideoStream:p(\"video\",e),hasPresentationStream:p(\"presentation\",e),amplitude:o.speaking?.[e]})}function l(e,t=\"user\"){return\"presentation\"===e?navigator.mediaDevices.getDisplayMedia({audio:!1,video:!0}):navigator.mediaDevices.getUserMedia({audio:\"audio\"===e&&{...s.IS_ECHO_CANCELLATION_SUPPORTED&&{echoCancellation:!0},...s.IS_NOISE_SUPPRESSION_SUPPORTED&&{noiseSuppression:!0}},video:\"video\"===e&&{facingMode:t}})}async function f(e,t){if(o&&o.myId&&o.connection&&o.streams){const n=d(o.myId)?.[e];if(n){const a=n.getTracks()[0];if(a){const n=[...o.connection.getSenders(),...o.screenshareConnection?.getSenders()||[]].find((e=>a.id===e.track?.id));if(n){t=void 0===t?!a.enabled:t;try{if(t&&!a.enabled){const t=await l(e);if(await n.replaceTrack(t.getTracks()[0]),o.streams[o.myId][e]=t,\"video\"===e)o.facingMode=\"user\";else if(\"audio\"===e){const e=o.audioContext;if(!e)return;const n=e.createMediaStreamSource(t),a=e.createAnalyser();a.minDecibels=-100,a.maxDecibels=-30,a.smoothingTimeConstant=.05,a.fftSize=1024,n.connect(a),o={...o,participantFunctions:{...o.participantFunctions,[o.myId]:{...o.participantFunctions?.[o.myId],getCurrentAmplitude:()=>{var e=new Uint8Array(a.frequencyBinCount);return a.getByteFrequencyData(e),(0,s.getAmplitude)(e,1.5)}}}}}}else if(!t&&a.enabled){a.stop();const t=\"audio\"===e?o.silence:o.black;if(!t)return;await n.replaceTrack(t.getTracks()[0]),o.streams[o.myId][e]=t,\"video\"===e&&(o.facingMode=void 0)}u(o.myId),\"presentation\"!==e||t||c(!0)}catch(e){}}}}}}function m(e){o?.onUpdate?.({\"@type\":\"updateGroupCallConnectionState\",connectionState:e})}function g(){o&&(o.myId&&o.streams?.[o.myId]&&Object.values(o.streams[o.myId]||{}).forEach((e=>{e?.getTracks().forEach((e=>{e.stop()}))})),c(!0),o.dataChannel?.close(),o.connection?.close(),m(\"disconnected\"),o.analyserInterval&&clearInterval(o.analyserInterval),o=void 0)}function v(){o&&o.participantFunctions&&Object.keys(o.participantFunctions).forEach((e=>{const t=o.participantFunctions[Number(e)].getCurrentAmplitude;var n,a;t&&(n=t(),a=o.speaking[e]||0,((o.speaking[e]=n)>s.THRESHOLD&&a<=s.THRESHOLD||n<=s.THRESHOLD&&a>s.THRESHOLD)&&u(e))}))}function S(e){if(o&&o.audioElement&&o.destination&&o.audioContext){var t=o.conference?.ssrcs?.find((t=>t.endpoint===e.track.id));if(t&&t.userId){const{userId:a,isPresentation:i}=t;var n=o.participants?.find((e=>e.id===a));const r=\"video\"===e.track.kind?i?\"presentation\":\"video\":\"audio\";if(e.track.onended=()=>{o?.streams?.[a][r],u(a)},t=e.streams[0],\"audio\"===e.track.kind){const e=o.audioContext,i=e.createMediaStreamSource(t),r=e.createGain();r.gain.value=(n?.volume||1e4)/1e4;const c=e.createGain();r.gain.value=1;const d=e.createAnalyser();d.minDecibels=-100,d.maxDecibels=-30,d.smoothingTimeConstant=.05,d.fftSize=1024,i.connect(d).connect(c).connect(r).connect(o.destination);const p=new Audio;p.srcObject=i.mediaStream,p.muted=!0,p.remove(),o={...o,participantFunctions:{...o.participantFunctions,[a]:{...o.participantFunctions?.[a],setVolume:e=>{r.gain.value=1{c.gain.value=e?0:1},getCurrentAmplitude:()=>{var e=new Uint8Array(d.frequencyBinCount);return d.getByteFrequencyData(e),(0,s.getAmplitude)(e,1.5)}}}}}o={...o,streams:{...o.streams,[a]:{...o.streams?.[a],[r]:t}}},u(a)}}}function h(e,t,n=!1){const i=new RTCPeerConnection;var r=n?void 0:function(e){const t=e.createDataChannel(\"data\",{id:0});return t.onopen=()=>{},t.onmessage=e=>{JSON.parse(e.data).colibriClass},t.onerror=e=>{console.log(\"%conerror\",\"background: green; font-size: 5em\"),console.error(e)},t}(i);return e.forEach((e=>e.getTracks().forEach((t=>{i.addTrack(t,e)})))),n||(i.oniceconnectionstatechange=()=>{var e=i.iceConnectionState;\"connected\"===e||\"completed\"===e?m(\"connected\"):\"checking\"===e||\"new\"===e?m(\"connecting\"):\"disconnected\"===i.iceConnectionState&&m(\"reconnecting\")}),i.ontrack=S,i.onnegotiationneeded=async()=>{if(o){var r=o.myId;if(r){var s=await i.createOffer({offerToReceiveVideo:!0,offerToReceiveAudio:!n});if(await i.setLocalDescription(s),s.sdp){var c=(0,a.default)(s),d=n?void 0:{userId:\"\",sourceGroups:[{semantics:\"FID\",sources:[c.ssrc||0]}],isRemoved:n,isMain:!0,isVideo:!1,isPresentation:n,endpoint:n?\"1\":\"0\"},p=c[\"ssrc-groups\"]&&{isPresentation:n,userId:\"\",sourceGroups:c[\"ssrc-groups\"],isMain:!0,isVideo:!0,endpoint:n?\"0\":\"1\"};s=n?o.screenshareConference:o.conference;const i=[];n?(p&&i.push(p),d&&i.push(d)):(d&&i.push(d),p&&i.push(p)),d=e.find((e=>\"audio\"===e.getTracks()[0].kind)),p=e.find((e=>\"video\"===e.getTracks()[0].kind)),o={...o,...n?{screenshareConference:{...s,ssrcs:i}}:{conference:{...s,ssrcs:i}},streams:{...o.streams,[r]:{...o.streams?.[r],...d&&{audio:d},...!n&&p?{video:p}:{presentation:p}}}},u(r),t(c)}}}},{connection:i,dataChannel:r}}},\"./src/types.ts\":(e,t,n)=>{n.r(t)},\"./src/utils.ts\":(e,t,n)=>{function a(){var{userAgent:e,platform:t}=window.navigator;let n;return-1!==[\"Macintosh\",\"MacIntel\",\"MacPPC\",\"Mac68K\"].indexOf(t)?n=\"macOS\":-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}n.r(t),n.d(t,{toTelegramSource:()=>function(e){return e<<0},fromTelegramSource:()=>function(e){return e>>>0},getAmplitude:()=>function(e,t=3){if(!e)return 0;var n=e.length;let a=0;for(let t=0;ta,THRESHOLD:()=>i,PLATFORM_ENV:()=>r,IS_MAC_OS:()=>s,IS_IOS:()=>o,IS_SCREENSHARE_SUPPORTED:()=>c,IS_ECHO_CANCELLATION_SUPPORTED:()=>d,IS_NOISE_SUPPRESSION_SUPPORTED:()=>p});const i=.1,r=a(),s=\"macOS\"===r,o=\"iOS\"===r,c=\"getDisplayMedia\"in(navigator?.mediaDevices||{}),d=navigator?.mediaDevices?.getSupportedConstraints().echoCancellation,p=navigator?.mediaDevices?.getSupportedConstraints().noiseSuppression}},t={};function n(a){var i=t[a];return void 0!==i||(i=t[a]={exports:{}},e[a](i,i.exports,n)),i.exports}n.d=(e,t)=>{for(var a in t)n.o(t,a)&&!n.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})};var a={};(()=>{n.r(a),n.d(a,{handleUpdateGroupCallConnection:()=>e.handleUpdateGroupCallConnection,startSharingScreen:()=>e.startSharingScreen,joinGroupCall:()=>e.joinGroupCall,getDevices:()=>e.getDevices,getUserStreams:()=>e.getUserStreams,setVolume:()=>e.setVolume,isStreamEnabled:()=>e.isStreamEnabled,toggleStream:()=>e.toggleStream,leaveGroupCall:()=>e.leaveGroupCall,handleUpdateGroupCallParticipants:()=>e.handleUpdateGroupCallParticipants,switchCameraInput:()=>e.switchCameraInput,toggleSpeaker:()=>e.toggleSpeaker,toggleNoiseSuppression:()=>e.toggleNoiseSuppression,IS_SCREENSHARE_SUPPORTED:()=>t.IS_SCREENSHARE_SUPPORTED,THRESHOLD:()=>t.THRESHOLD});var e=n(\"./src/secretsauce.ts\"),t=n(\"./src/utils.ts\");n(\"./src/types.ts\")})();var i,r=exports;for(i in a)r[i]=a[i];a.__esModule&&Object.defineProperty(r,\"__esModule\",{value:!0})})();"],"names":["addReducer","global","actions","update","activeGroupCallId","groupCalls","toggleGroupCallPresentation","value","userId","selectGroupCallParticipant","updateGroupCallParticipant","omit","connectionState","leaveGroupCall","isFromLibrary","updateGroupCall","isSpeakerDisabled","groupCallId","participants","handleUpdateGroupCallParticipants","data","stream","showNotification","message","handleUpdateGroupCallConnection","presentation","groupCall","selectActiveGroupCall","Object","keys","length","values","payload","shouldDiscard","shouldRemove","rejoin","setGlobal","updateActiveGroupCall","participantsCount","callApi","call","shouldResetFallbackState","getGlobal","fallbackChatId","chatId","fallbackUserIdsToRemove","forEach","deleteChatMember","removeGroupCall","id","removeGroupCallAudioElement","isGroupCallPanelHidden","undefined","joinGroupCall","user","selectUser","currentUserId","toggleStream","videoStopped","isStreamEnabled","participant","raiseHand","participantId","volume","setVolume","Math","floor","GROUP_CALL_VOLUME_MULTIPLIER","Number","muted","params","startSharingScreen","presentationPaused","audioElement","getGroupCallAudioElement","audioContext","getGroupCallAudioContext","apiUpdate","inviteHash","loadMoreGroupCallParticipants","chat","selectChat","loadFullChat","selectCurrentMessageList","fallbackChannelTitle","selectCallFallbackChannelTitle","fallbackChannel","chats","byId","find","channel","title","isCreator","isRestricted","updateChatMemberBannedRights","bannedRights","users","photo","fetchFile","callFallbackAvatarPath","accessHash","inviteLink","usageLimit","expireDate","getServerTime","serverTimeOffset","sendMessage","text","openChat","createGroupCall","closeCallFallbackConfirm","vibrateShort","navigator","vibrate","memo","size","name","playSegment","color","iconData","setIconData","useState","useEffect","getAnimationData","then","AnimatedSticker","play","noLoop","speed","animationData","withGlobal","meParticipant","raiseHandRating","hasAudioStream","canSelfUnmute","isMuted","hasRequestedToSpeak","Boolean","noAudioStream","pick","toggleGroupCallMute","requestToSpeak","playGroupCallSound","lang","useLang","muteMouseDownState","useRef","isRequestingToSpeak","setIsRequestingToSpeak","isConnecting","shouldRaiseHand","prevShouldRaiseHand","usePrevious","useMemo","r","random","animatedIconName","toggleMute","buttonText","className","buildClassName","onMouseDown","setTimeout","current","onMouseUp","SPEAKER_ICON_DISABLED_SEGMENT","SPEAKER_ICON_ENABLED_SEGMENT","isAdmin","selectIsAdminInActiveGroupCall","closeDropdown","isDropdownOpen","anchor","setGroupCallParticipantVolume","toggleGroupCallPanel","isDeleteUserModalOpen","openDeleteUserModal","closeDeleteUserModal","useFlag","isMutedByMe","isSelf","isRaiseHand","localVolume","setLocalVolume","GROUP_CALL_DEFAULT_VOLUME","runThrottled","useThrottle","handleRemove","useCallback","e","stopPropagation","handleCancelRequestToSpeak","handleMute","handleOpenProfile","speakerIconPlaySegment","Menu","isOpen","positionX","autoClose","style","y","onClose","type","min","max","onChange","target","MenuItem","icon","onClick","destructive","DeleteMemberModal","noColor","isSpeaking","amplitude","THRESHOLD","prevIsRaiseHand","prevIsMuted","microphoneColor","isUser","openParticipantMenu","anchorRef","aboutText","aboutColor","toString","replace","about","firstName","lastName","ref","Avatar","createGroupCallInviteLink","participantsIds","viewportIds","getMore","useInfiniteScroll","InfiniteScroll","items","onLoadMore","map","key","isActive","isFullscreen","handleClick","streams","getUserStreams","ENABLE_THUMBNAIL_VIDEO","autoPlay","playsInline","srcObject","onDoubleClick","selectedVideo","setSelectedVideo","presentationParticipants","filter","l","hasPresentationStream","videoParticipants","hasVideoStream","totalVideoCount","columnCount","shouldSpanLastVideo","handleClickVideo","CAMERA_FLIP_PLAY_SEGMENT","selectGroupCall","isSpeakerEnabled","toggleGroupCallVideo","connectToActiveGroupCall","containerRef","isLeaving","setIsLeaving","openFullscreen","closeFullscreen","isSidebarOpen","openSidebar","closeSidebar","hasVideoParticipants","some","video","isLandscape","IS_SINGLE_COLUMN_LAYOUT","participantMenu","setParticipantMenu","isParticipantMenuOpen","closeParticipantMenu","isConfirmLeaveModalOpen","openConfirmLeaveModal","closeConfirmLeaveModal","isEndGroupCallModal","setIsEndGroupCallModal","shouldEndGroupCall","setShouldEndGroupCall","hasVideo","hasPresentation","handleOpenParticipantMenu","rect","getBoundingClientRect","container","x","left","top","offsetTop","sound","handleCloseConfirmLeaveModal","MainButton","onTrigger","Button","round","ariaLabel","handleToggleFullscreen","document","exitFullscreen","requestFullscreen","handleStreamsDoubleClick","IS_REQUEST_FULLSCREEN_SUPPORTED","toggleFullscreen","addEventListener","removeEventListener","handleLeaveGroupCall","Modal","dialogRef","onCloseAnimationEnd","IS_SCREENSHARE_SUPPORTED","DropdownMenu","trigger","Loading","IS_ANDROID","IS_IOS","switchCameraInput","toggleSpeaker","Checkbox","label","checked","onCheck","isText","body","classList","toggle","userFullName","getUserFullName","channelTitle","inviteToCallFallback","setShouldRemove","renderingUserFullName","useCurrentOrPrev","ConfirmDialog","confirmHandler","ANIMATED_STICKERS_PATHS","MonkeyIdle","MonkeyTracking","MonkeyClose","MonkeyPeek","FoldersAll","FoldersNew","DiscussionGroups","CameraFlip","HandFilled","HandOutline","Speaker","VoiceAllowTalk","VoiceMini","VoiceMuted","VoiceOutlined","path","window","location","origin","mediaLoader","ApiMediaFormat","t","n","d","silence","a","black","i","createOscillator","connect","createMediaStreamDestination","start","MediaStream","assign","getAudioTracks","enabled","width","height","createElement","getContext","Error","fillRect","captureStream","getVideoTracks","default","push","sessionId","s","ssrcs","o","audioExtensions","c","videoExtensions","audioPayloadTypes","p","videoPayloadTypes","u","transport","ufrag","pwd","f","fingerprints","m","candidates","g","endpoint","join","v","foundation","component","protocol","priority","ip","port","generation","S","hash","fingerprint","h","channels","clockrate","parameters","subtype","isVideo","isMain","uri","isRemoved","sourceGroups","semantics","sources","fromTelegramSource","sdp","split","reduce","match","startsWith","substr","setup","ssrc","toTelegramSource","slice","getDevices","async","mediaDevices","enumerateDevices","kind","onUpdate","participantFunctions","toggleNoiseSuppression","myId","audio","getTracks","echoCancellation","noiseSuppression","getConstraints","applyConstraints","connection","facingMode","getSenders","track","replaceTrack","conference","source","isLeft","isVideoJoined","isPresentation","updatingParticipantsQueue","setRemoteDescription","createAnswer","setLocalDescription","console","error","screenshareConference","screenshareConnection","Date","now","onended","Promise","dataChannel","screenshareDataChannel","catch","warn","speaking","analyserInterval","setInterval","destination","close","getDisplayMedia","getUserMedia","IS_ECHO_CANCELLATION_SUPPORTED","IS_NOISE_SUPPRESSION_SUPPORTED","createMediaStreamSource","createAnalyser","minDecibels","maxDecibels","smoothingTimeConstant","fftSize","getCurrentAmplitude","Uint8Array","frequencyBinCount","getByteFrequencyData","getAmplitude","stop","clearInterval","createGain","gain","Audio","mediaStream","remove","RTCPeerConnection","createDataChannel","onopen","onmessage","JSON","parse","colibriClass","onerror","log","addTrack","oniceconnectionstatechange","iceConnectionState","ontrack","onnegotiationneeded","createOffer","offerToReceiveVideo","offerToReceiveAudio","userAgent","platform","indexOf","test","sqrt","getPlatform","PLATFORM_ENV","IS_MAC_OS","getSupportedConstraints","exports","defineProperty","enumerable","get","prototype","hasOwnProperty","Symbol","toStringTag","__esModule"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/701.f1f158c205e1345450d1.css b/dist/701.b9c40fbb5ff59255dc0a.css similarity index 99% rename from dist/701.f1f158c205e1345450d1.css rename to dist/701.b9c40fbb5ff59255dc0a.css index df032e48c..86b35893b 100644 --- a/dist/701.f1f158c205e1345450d1.css +++ b/dist/701.b9c40fbb5ff59255dc0a.css @@ -63,4 +63,4 @@ .PaymentInfo{padding:.5rem 1rem}.PaymentInfo h5{font-size:.9rem;color:var(--color-text-secondary);margin:1rem 0 1.1rem}.PaymentInfo .inline-inputs{display:flex;justify-content:space-between}.PaymentInfo .inline-inputs .input-group{flex:1 10rem;max-width:45%;display:flex} .PaymentModal .modal-backdrop{pointer-events:none}.PaymentModal .header{position:relative;border-top-left-radius:10px;border-top-right-radius:10px;width:100%;padding:.25rem 1rem;display:flex;align-items:center;flex-direction:row;background:var(--color-background);border-bottom:1px var(--color-borders) solid}.PaymentModal .header h3{margin-bottom:0;margin-left:1.5rem;unicode-bidi:plaintext;text-align:initial}.PaymentModal .Transition{height:25rem}.PaymentModal .empty-content{height:25rem;max-height:90%;display:flex;align-items:center;justify-content:center}.PaymentModal .receipt-content{height:25rem;overflow-y:auto}.PaymentModal .content{overflow:auto;width:100%;height:100%;position:relative}.PaymentModal .footer{position:relative;border-bottom-left-radius:10px;border-bottom-right-radius:10px;width:100%;padding:.75rem 1rem;background:var(--color-background);border-top:1px var(--color-borders) solid}.PaymentModal .footer button{text-transform:none;font-weight:500}.PaymentModal .modal-dialog{width:25rem}.PaymentModal .modal-content{padding:0;overflow:hidden}@media screen and (max-device-width: 640px)and (max-height: 640px)and (orientation: landscape){.PaymentModal .modal-dialog{max-height:100%}.PaymentModal .Transition{height:10rem}} -/*# sourceMappingURL=701.f1f158c205e1345450d1.css.map*/ \ No newline at end of file +/*# sourceMappingURL=701.b9c40fbb5ff59255dc0a.css.map*/ \ No newline at end of file diff --git a/dist/701.f1f158c205e1345450d1.css.map b/dist/701.b9c40fbb5ff59255dc0a.css.map similarity index 99% rename from dist/701.f1f158c205e1345450d1.css.map rename to dist/701.b9c40fbb5ff59255dc0a.css.map index b45e9da19..f94f6eb46 100644 --- a/dist/701.f1f158c205e1345450d1.css.map +++ b/dist/701.b9c40fbb5ff59255dc0a.css.map @@ -1 +1 @@ -{"version":3,"file":"701.f1f158c205e1345450d1.css","mappings":"AAAA,YACE,aACA,qBACA,WACA,eAEA,WACA,wBAEA,kBACE,UAGF,oBACE,uBAEA,yBAHF,oBAII,cAIJ,kBACE,aACA,sBACA,uBACA,+BAGF,mBACE,oBACA,gBACA,gBACA,gBACA,uBAGF,kBACE,oBACA,kBACA,wB;ACvCJ,oBACE,aACA,yBACA,4BAEA,4BACE,2BAIJ,2BACE,kBACA,wBAEA,4CACE,kBACA,MACA,O;ACjBJ,mBACE,kBACA,SACA,eACA,WACA,wBAEA,uCACE,aAGF,0BAXF,mBAYI,mBAGF,yBAfF,mBAgBI,sBACA,mEAEA,gCACE,UACA,oBAEA,wDACE,UACA,oBAKN,gDACE,kBACA,0CACA,YACA,eACA,WACA,wBAEA,sDACE,UAGF,yBAZF,gDAaI,WAIJ,6BACE,UAGF,+BACE,gBACA,cACA,gBACA,kBACA,2BACA,mBACA,uBACA,mBAEA,0BAVF,+BAWI,oBAGF,sCACE,eACA,gBACA,oBAIA,iDACE,WACA,kBACA,cACA,eACA,aACA,gBACA,2BACA,2CACA,uBAEA,yBAXF,iDAYI,aACA,iBAMR,qBACE,yBAEA,sDAEE,0B;AChGN,qBACE,aACA,mBACA,kBACA,OACA,SACA,WACA,oBACA,kBACA,mEAEA,yCACE,aAGF,yBAfF,qBAgBI,eACA,6BACA,gBACA,+BAIA,8CACE,gBACA,UACA,eACA,iBAGF,wCACE,iBAGF,qDACE,iBAIJ,6BACE,cACA,UACA,cACA,eACA,yBALF,6BAMI,gBAIJ,6BACE,mBAGF,kCACE,cACA,mBAGF,iCACE,iBACA,yBAFF,iCAGI,kBAEF,mCACE,oBACA,yBAFF,mCAGI,kBAKN,yBACE,8CACE,kBAIJ,uCACE,kBACA,SACA,2BACA,mBACA,gBACA,uBAEA,yBARF,uCASI,gBACA,UACA,eACA,iBACA,kBACA,mDACE,eAKN,sCACE,kBACA,UACA,WACA,MACA,YACA,kBACA,eAEA,4CACE,kBACA,QACA,cACA,eACA,WACA,2BACA,uCACA,2CAGF,wIAGE,kBACA,MACA,OACA,YACA,2CAGF,+CACE,sCAGF,6CACE,gCAEA,oDACE,WACA,kBACA,aACA,cACA,kBACA,sCACA,QACA,QACA,oC;AC/IR,aACE,kBACA,oBACA,sBACA,gBAEA,iCACE,kBACA,MACA,QACA,SACA,OACA,qCACE,sBACA,uBAEF,uCACE,2BAIJ,yBArBF,aAuBI,WAGF,yBA1BF,aA2BI,kBAGF,0BA9BF,aA+BI,sBACS,yBACP,iBAIJ,mBACE,cACA,iCACA,YACA,mBACA,aACA,WACA,YACA,6BACA,wBAEA,0BAXF,mBAYI,gCAEO,+BACP,+BACA,0BAFO,+BAGL,gCAKN,0BACE,kBACA,SACA,QACA,gCACA,cACA,eACA,2CACA,uDACE,uCAGF,qCACE,kBACA,kBACA,aAIJ,gCACE,kBACA,MACA,OACA,WACA,YACA,aACA,mBACA,uBAEA,2CACE,2BACA,WACA,iBACA,kBACA,cACA,aACA,UACA,kBACA,qBACA,qBAGF,iDACE,e;ACtGN,cACE,kBACA,eACA,SACA,0BACA,2CACA,WACA,gBACA,gBACA,qCACA,+BACA,oBAEA,mBACE,8BACA,mBAGF,+CAEE,kBACA,aACA,aACA,cACA,WAEA,mDACE,iBAIJ,wBACE,WAGF,uBACE,YAGF,wBACE,kBACA,aACA,cACA,aACA,YAEA,8BACE,kBACA,QACA,cACA,eACA,WACA,2BACA,sCACA,2CAGF,6DAEE,kBACA,MACA,OACA,YACA,2CAGF,+BACE,gBACA,uBAEA,sCACE,WACA,kBACA,aACA,cACA,kBACA,oCACA,QACA,QACA,oCAIJ,8BACE,WACA,YACA,cACA,UACA,SACA,UACA,eACA,gBAEA,oDACE,iB;AC9FR,4BAEE,kBACA,WACA,YAGF,aACE,YACA,gEAGF,eACE,iCAEA,iCACE,gBAGF,uBACE,eACA,MACA,O;ACtBJ,aACE,eACA,MACA,OACA,YACA,YACA,0BACA,WACA,8BACA,gBAEA,aACA,2BACA,+BACA,kBACA,eACA,sBACA,mBAGA,yBACE,yBACA,mBAIA,sIACE,aAIJ,oCACE,mCAKA,sEACE,oBACA,gBAKF,gCACE,aAGF,uCACE,UAGF,0CACE,eACA,MACA,OACA,YACA,aACA,UACA,UAIJ,gCACE,aACA,mBACA,kBACA,kBACA,mCACA,YAEA,4CACE,WACA,YAGF,yBAbF,gCAcI,gBAEA,gDAhBJ,gCAiBM,kDAGF,oDACE,qBAIJ,gDAzBF,gCA0BI,mDAIJ,mDAEE,oBAGF,+DAEE,kBACA,oBACA,kBACA,WACA,YACA,aACA,mBACA,gBAGF,mCACE,kBACA,UACA,kBACA,YACA,oBACA,uBACA,mBAEA,8CACE,eACA,yBAFF,8CAGI,iBAGF,0BANF,8CAOI,gBAGF,kDACE,+BACA,0BAFF,kDAGI,gCAKN,8CACE,kBAEA,kDACE,kBACA,QACA,SACA,gCAIJ,uCACE,gBACA,iCACA,mBACA,yBAGF,oDACE,gBACA,YAGF,4CACE,YAIJ,yBACE,eACA,SACA,WACA,SACA,YACA,UACA,SACA,6DACA,iCACA,wBACA,UACA,wBACA,aACA,eACA,UAEA,yBAjBF,yBAkBI,YAGF,sEACE,UAGF,8BACE,OACA,yDACA,6CAEA,2CALF,8BAMI,gCAGF,uCACE,UACA,QACA,qBAEA,2CALF,uCAMI,UACA,kCAKN,8BACE,QACA,yDACA,0DAEA,2CALF,8BAMI,kCAGF,uCACE,OACA,WACA,qBAEA,2CALF,uCAMI,WACA,gCAKN,gCACE,qBACA,aACA,YACA,6BAEA,yBANF,gCAOI,UACA,gCACA,oBAEA,wDACE,UACA,oBAOV,OACE,kBACA,8BACA,8BACA,gBACA,gBACA,+CAEA,uBACE,4CAGF,cACE,kBAGF,mBACE,iFAGF,wBAEE,WACA,YACA,uCACA,yBACA,+C;ACtRJ,kBACE,8BAEA,gCACE,WACA,gBAEA,yBAJF,gCAKI,YAIJ,gCACE,aACA,mBACA,qBAEA,wCACE,mBAGF,6CACE,SACA,OAGF,8CACE,YACA,2BAEA,eACA,cACA,kBACA,oBACA,uBAIJ,iCACE,UACA,gBACA,aACA,sBAEA,8CACE,YACA,kBACA,gBACA,oBAIJ,8BACE,YACA,SACA,kBACA,aACA,mBACA,uBACA,kCAKE,yBADF,4EAEI,SAEA,6FACE,iB;ACpEV,SACE,eACA,MACA,OACA,YACA,aACA,uB;ACLA,6BACE,mBACA,4CACE,0BAIJ,2BACE,aACA,mBACA,uBACA,qBAEA,yCACE,eACA,kBAEA,qDACE,kBAEF,oDACE,iBAKN,uBACE,aACA,yBACA,sBAEA,+BACE,oBAEA,uCACE,iBAKN,+BACE,aACA,mBAEA,kCACE,OACA,qBACA,kBAEA,yBALF,kCAMI,oBAGF,0CACE,2BAIJ,8CACE,WACA,oBAIJ,2BACE,kBACA,mBACA,wBACA,gBACA,uBAEA,yBAPF,2BAQI,uBAGF,mCACE,gBACA,YAGF,qCACE,eAEA,2CACE,wDAGF,8CACE,sCACA,WAIJ,oCACE,YACA,oBAGF,mCACE,WACA,cACA,iBAGF,gCACE,kBACA,MACA,OACA,WACA,YACA,aACA,mBACA,uBACA,kBAIJ,iCACE,aACA,mBACA,uBACA,iBACA,4BAGF,8BACE,aACA,qCACA,W;ACjIJ,sBACE,kBACA,aACA,WACA,YACA,WACA,WACA,uBACA,SA4BA,UA1BA,uDAVF,sBAWI,mDAGF,mDACE,qBACA,sBAGF,mCACE,WACA,yBAFF,mCAGI,yBAIJ,yBA1BF,sBA2BI,UACA,WACA,eAEA,mCACE,cAMJ,4BACE,oBACA,+EAGF,kDACE,kCAGF,kHAEE,SAGF,6CACE,2BAGF,kCACE,UACA,oBAEA,+CACE,iDAGF,4EACE,2FAGF,kFACE,kEAIJ,8BACE,WACA,gBACA,WACA,UACA,WAGF,4BACE,WACA,gBACA,aACA,mBACA,eAEA,mCACA,4CACA,iDACA,gBAEA,yBAZF,4BAaI,UACA,gBAGF,oCACE,WACA,YAEA,yBAJF,oCAKI,eACA,iBAKN,4BACE,iBACA,mBACA,gBACA,uBACA,YAEA,yBAPF,4BAQI,oBAIJ,8BACE,iBACA,aAEA,oCACE,WACA,gBACA,uBACA,2BACA,wBACA,aACA,kBACA,gBACA,mBACA,mBACA,wBACA,oCACA,eACA,uBAEA,iBACA,kBAEA,sCACE,iBACA,kCAGF,gDACE,yBACA,kDACE,cAIJ,6CACE,WACA,eACA,oBAGF,0DACE,0CACA,2BAGF,qBACE,oFACE,yCACA,sB;ACzKR,yBACE,gBAGF,mCACE,mBAGF,2BACE,YACA,eACA,gBACA,kBACA,mBAEA,qBACA,8BAEA,8CACE,SAGF,oDACE,+BAIJ,+BACE,qBACA,aACA,YACA,uBACA,kBACA,2CACA,eACA,kBACA,gBAEA,2CACE,oBAGF,0CACE,qBAGF,uCACE,sBAGF,qCACE,mCAGF,8CACE,kBACA,mBACA,iBACA,gBACA,uBAEA,2DACE,WACA,YACA,qBACA,sBACA,oBAKN,qCACE,aACA,mBAEA,6CACE,iBAIA,sDACE,cACA,kB;AClFN,yBACE,iBAGA,qFACE,qCAIJ,8BACE,qBAIA,0BACE,YAGF,sBACE,eACA,WAGF,6BACE,kCAEA,sDACE,wBACA,mBACA,qBACA,kBAIJ,4BACE,YACA,kCACA,gBACA,uBAEA,yCACE,wBAGA,gDACE,aAIJ,gCACE,cACA,eACA,iBACA,sBACA,wBACA,oBAGF,uCACE,kBACA,qBACA,iBACA,WACA,6BACA,wBACA,gBAKN,uBACE,aACA,8BAIA,gCACE,iB;AC9EN,aACE,aACA,YACA,mBACA,8BACA,kBACA,oBAEA,wBACE,aACA,cACA,eACA,mBACA,eACA,kBACA,gBACA,kCAEA,uCACE,kBACA,oB;ACpBN,wBACE,sBACA,YACA,gBACA,yBAEA,MACE,gBACA,sBAGF,kBACE,UACA,6BAGF,yBACE,uCAEA,iBACE,8BAIJ,iBACE,oBACA,qBACA,oCACA,gBAEA,mBACA,kCACA,sCAEA,UACE,kBACA,WACA,WACA,gCACA,aACA,SACA,8EAGF,cAEE,sBACA,oCACA,mBACA,8FAEA,SACE,cACA,uHAKN,4BAEE,wBACA,2CACA,uIAEA,YACE,sBAIJ,YACE,0CAGF,iBACE,YACA,YACA,gBACA,uBACA,sBACA,2BAGF,gBACE,kCACA,kBACA,mBACA,yBAGF,YACE,cACA,qCACA,mBACA,gBACA,qCAIA,gCACE,uDAMA,sBACE,2BACA,uBACA,+DAEA,WACE,6EACA,aACE,yBACA,8DAIJ,YACE,kCACA,4EAEA,UACE,gEAMJ,gBACE,wEAEA,WACE,0DAQR,uBACE,iEAEA,YACE,gBACA,0BAKN,sBACE,kBACE,8BAIJ,oBACE,8CAEA,iCACE,mBACA,gBACA,2BACA,oBACA,oDAEA,WACE,yBACA,gBACA,kBACA,mHAEA,yBAEE,0HAMF,UACE,iBACA,eACA,sCAKN,aACE,oBACA,6BAIJ,iBACE,aACA,cACA,iBACA,8BACA,qBACA,iDACA,yCACA,iCACA,gBACA,kBACA,8BAEA,iDAEA,aACE,4DAEA,iBACE,qEAKF,gBACE,eACA,2BAKN,WACE,qCAIA,cACE,mBACA,C;AC7NJ,yBACE,wBACA,gBACA,yBACA,iBACA,kBAGF,kDACE,gBAGF,2BACE,kBACA,YACA,WACA,iDAGF,wBACE,gBACA,cACA,kBAEA,gCACE,WACA,cACA,iBAGF,qCACE,kBACA,MACA,OACA,kDAGF,qCACE,YACA,kDAOA,kEACE,gCAGF,qDACE,gCAGF,8CACE,gCAGF,yDArEJ,gCACA,eACA,mBACA,oFAEA,+DACE,qBAmEE,qDAzEJ,gCACA,eACA,mBACA,iFAEA,2DACE,qBAuEE,8CA7EJ,gCACA,eACA,mBACA,gFAEA,oDACE,qB;ACJF,sBACE,iBACA,kBACA,aACA,cACA,mBACA,wBACA,mBACA,uBACA,sCACA,kBACA,WACA,eACA,eACA,kBACA,gBACA,wBAEA,4BACE,aAGF,0BACE,kBACA,MACA,OACA,WACA,YAGF,wBACE,mBACA,iCACA,qCAKA,6UACE,wBAGF,6GACE,2BAKF,8BACE,qBAIJ,6BACE,yCAEA,oCACE,WACA,cACA,kBACA,OACA,MACA,WACA,YACA,gCAIJ,+BACE,oBAEA,iCACE,aAGF,sCACE,a;AC/ER,gBACE,mCACA,aACA,mBACA,gBACA,oBACA,+BACA,qBAEA,kBACE,iBACA,kBACA,kCAGF,yBACE,a;AChBJ,4BACE,yCAEA,2CACE,+CAEA,8DACE,oBACA,kBACA,YAGF,8DACE,kCAIJ,yCACE,sBAEA,qDACE,aAKF,uFACE,uBAGF,kFACE,qBAGF,iEACE,iBACA,qBAGF,kEACE,eACA,gBACA,SAIA,0EACE,cACA,kBACA,eACA,sBAKN,kDACE,mBACA,gBACA,oBAGF,iDACE,uBACA,6C;AC/DJ,mCACE,WACA,aACA,mBACA,8BAIA,sCACE,aACA,mBAEA,8CACE,qBACA,oBAGF,6CACE,aACA,2BACA,mBAEA,gDACE,eACA,gBACA,mBACA,SACA,gBACA,mBACA,uBACA,gBAIJ,8CACE,aAIA,yDACE,iBAMJ,+CACE,WAIJ,2DACE,2BAEA,6DACE,UACA,cAKF,6CACE,mBACA,sBAKN,+BACE,eACA,wBACA,6B;ACtEA,4CACE,oBAGF,+DAEE,WACA,YACA,mBACA,UACA,cAGF,wBACE,eACA,gBAGF,yCACE,aACA,sBACA,uBAIA,iFAEE,mB;AC5BN,eACE,SACA,oBACA,eACA,kBAEA,kDAEE,kBACA,OACA,MACA,WACA,YAGF,4BACE,gBACA,mBACA,+BAEA,mEACE,kBACA,OACA,MACA,WACA,YACA,iBAIJ,sBACE,WACA,cACA,sCACA,UACA,6BAIA,+BACE,UAGF,qCACE,qBAIJ,kCACE,YACA,aACA,mBACA,uB;ACnDF,gDACE,aACA,cACA,qCACA,mBACA,gBAGF,oCACE,uBACA,gB;ACVF,0DACE,gCAGF,0FACE,kBAGF,8CACE,gBACA,aAGF,4CACE,cACA,aAGF,uCACE,cACA,WACA,YACA,2CACA,eAGF,wCACE,kBACA,aACA,cACA,aACA,cACA,wCACA,qBACA,YAGF,oDACE,YAGF,uCACE,sBACA,aAEA,oDACE,gBAGE,mEACE,mDAKN,gEACE,mBAGF,+DACE,kBAIJ,mDACE,aACA,cACA,qCACA,mBACA,gBAEA,uDACE,eACA,iDACA,iCAEA,8DACE,0CACA,wDAIF,8DACE,cACA,WACA,WACA,iBACA,oB;ACxFR,QACE,kBACA,cACA,iBACA,kBACA,aACA,cACA,sBAEA,gDATF,QAUI,YACA,aACA,sBAGF,YACE,YACA,aAGF,yBACE,kBACA,OACA,MACA,WACA,YAEA,gCACE,aAIJ,wBACE,WACA,YACA,qBACA,wD;AClCJ,UACE,YAEA,cACE,aACA,sBACA,gBAGF,uBACE,uBAIJ,sBACE,aACA,YACA,8BACA,mBAIA,4BACE,WAEA,6CACE,6BACA,8BAKN,kBACE,mCACA,yCAEA,gBC9BA,+BD0BF,kBCzBI,mBAGA,mBD6BF,kCACE,aACA,sBAEA,iDACE,cACA,YAIJ,0BACE,iBACA,mBAGF,iCACE,iBACA,qBAIJ,yBACE,aACA,sBACA,mBACA,sBACA,kBAEA,sCACE,WAIJ,uBACE,WACA,YACA,qBACA,kBAEA,wCACE,kBACA,OACA,MACA,WACA,YAEA,+CACE,aAKN,oBACE,uBAEA,+BACE,yBACA,yBACA,2EACA,8DAEA,gDACE,qBAKN,eACE,0CACA,2BAEA,yBACE,gBAGF,sBACE,eACA,kCACA,mBACA,kBAEA,+BACE,iBAIJ,sBACE,gBAGF,2BACE,kBACA,kCACA,mBACA,qBAEA,oDACE,eAGF,oCACE,iBACA,uBAIJ,kCACE,eACA,sBACA,kCACA,gBACA,qBAEA,2CACE,iBAIJ,yBACE,oBAEA,oCACE,gBAGF,8CACE,oBAEA,wDACE,WAGF,oDACE,YACA,iBACA,iBACA,kCAGF,6GACE,cACA,gBAGF,qDACE,oBAGF,wDACE,kBACA,mBACA,kCAEA,kEACE,oBAGF,8DACE,wBAGF,8DACE,sBACA,uBAMJ,sDACE,yBAEA,wDACE,cAKN,2CACE,oBAEA,4DACE,mBACA,gBACA,cAGF,mDACE,WACA,YACA,kBAGF,yDACE,eACA,iBACA,qBACA,gBAGF,0DACE,kBACA,iBACA,kCAMA,+HACE,iBAGF,6DACE,WACA,cACA,kBAMR,4BACE,wBAGF,qDACE,qBAIA,8CACE,gBAIJ,gEACE,gBAIJ,sBACE,yCACA,kBACA,gBAEA,wCACE,YAGF,4CACE,aAIJ,uBACE,iBAGF,eACE,yB;AE7SF,SACE,YACA,gBACA,kBAEA,eACE,yCACA,gBAEA,sBACE,kBACA,aACA,sBAEA,yDACE,kBACA,oBACA,qBAGF,6BACE,yBAGF,4BACE,sBACA,kCAGF,4CACE,kCACA,eACA,gBACA,mBAGF,yCACE,kBACA,oBAEA,kBACA,Y;ACzCR,eACE,YACA,gBAEA,0BACE,yC;ACLJ,oBACE,kBACA,eAEA,4BACE,qBACA,4GACA,cACA,iBAGF,8BACE,kB;ACXF,+BACE,eACA,eAGF,yBACE,+BACE,iBAIJ,+BACE,mBAGF,gCACE,kBACA,UAGF,2BACE,kBACA,WACA,aACA,gBACA,gBACA,iBACA,gBAGF,iCACE,gBACA,0CACA,+CAEA,wCACE,qBAIJ,0BACE,WACA,kBACA,kC;AC5CJ,qBACE,eACA,MACA,OACA,QACA,aACA,6BAEA,2BACE,kBACA,eAEA,qCACE,sCAGF,mCACE,6BACA,8B;AClBN,sBACE,kBACA,MACA,OACA,+BACA,WACA,cACA,mCACA,aACA,mBACA,yBAEA,mDAZF,sBAaI,qDACA,uDAGF,mCACE,mBACA,OAIJ,sBACE,kBACA,SACA,OACA,+BACA,WACA,cACA,mCACA,aACA,mBACA,kBACA,oBAEA,uDAbF,sBAcI,kDACA,sDAEA,kDACE,2CACA,mDAIJ,+BACE,OACA,kCAKF,sEAEE,8B;ACvDJ,gBACE,wBACA,gBACA,sBAEA,WAEA,yBAPF,gBAQI,yBAGF,8CACE,SAEA,+DACE,gBAGF,oDACE,aAGF,qDACE,0BACA,cAGF,sDACE,eAIA,+DACE,WAMJ,oCACE,iBAGF,kCACE,kBAIA,0CACE,YAIJ,uCACE,wB;ACtDN,iBACE,kCAEA,+BACE,mBACA,yBAFF,+BAGI,gBACA,uBAIJ,gCACE,+BACA,iCACA,yBAHF,gCAII,uBAIJ,gCACE,iBACA,cACA,aACA,eACA,qBAEA,0EAEE,OACA,0BACA,aACA,oBACA,2CACA,iBAEA,gGACE,YACA,iBACA,gBAGF,0GACE,kBAKN,mCACE,iBACA,cACA,cACA,aACA,sBACA,wBAEA,0DACE,qBAGF,8CACE,0BAIJ,6CACE,kBAEA,2DACE,mCAGF,6DACE,mBACA,UAIJ,8BACE,kBAEA,2EAEE,WACA,kBACA,OACA,MACA,QACA,SACA,2CACA,oBAEA,UACA,yBACA,UAGF,sCACE,mDACA,yCAGF,qCACE,sCACA,aACA,uBACA,mBACA,2BAKF,8CACE,YAGF,6CACE,UAGF,wIAGE,oBAGF,mFAEE,2C;AC9HJ,yBACE,mBACA,8BAGF,0BACE,+BACA,oBAGF,mCACE,mBAGF,2BACE,kCACA,eACA,gBACA,qBAGF,yBACE,6BACA,iBACA,6CACA,iBACA,cAEA,mCACE,6BAGF,yBAXF,yBAYI,gBACA,gBAEA,4DACE,kBAKN,2BACE,kBAEA,yCACE,mBAGF,iDACE,kBACA,aACA,eAIJ,sBACE,kBAEA,sCACE,oBAGF,4BACE,iBAIJ,iBACE,kBACA,kCAGF,kBACE,kBACA,yBACA,2BAGF,mCACE,oB;ACjFJ,aACE,oBACA,mBACA,uBACA,aACA,cACA,eACA,kDACA,eACA,kBACA,mBACA,6BACA,sCAEA,yBACE,oBAGF,sCAEE,kDAGF,iBACE,WACA,Y;ACzBJ,aACE,YAEA,kBACE,yBACA,gBACA,cAEA,yBALF,kBAMI,sBAGF,wCACE,aACA,eAIJ,oBACE,YACA,6CACA,aACA,mBACA,6BACA,+CAEA,yBARF,oBASI,gBACA,kBACA,cACA,mBACA,mBAEA,qBACA,8BAEA,uCACE,SAGF,6CACE,+BAGF,uCACE,oBACA,sBAIF,2BACE,WACA,cACA,cACA,WACA,a;ACvDR,eACE,YAEA,oBACE,kBACA,yBACA,gBACA,cAEA,yBANF,oBAOI,sBAIJ,sBACE,YACA,6CACA,kBACA,gBACA,kBACA,mBACA,+CAEA,qBACA,8BAEA,yCACE,SAGF,+CACE,+BAIF,6BACE,WACA,cACA,cACA,WACA,YAIF,0CACE,oBACA,sBAEA,wDACE,qBAEA,qIACE,YACA,aACA,WACA,YAIJ,6DACE,WACA,YACA,kBACA,aACA,mBACA,uBAEA,+IACE,WACA,YACA,kBACA,MACA,OAMR,qCACE,YACA,cAEA,yBAJF,qCAKI,YAIJ,mCACE,yBACA,eACA,gBACA,kD;AC3FJ,WACE,aACA,mBACA,uBACA,eACA,6BACA,eACA,gBACA,kBAEA,sBACE,mBAGF,oBACE,uBAGF,sBACE,uBAGF,sBACE,WACA,YACA,iCACA,wCAGF,qCACE,kBACA,MACA,OACA,WACA,YACA,iBAGF,oBACE,kBACA,oB;ACxCJ,WACE,aACA,qCACA,uBACA,gBACA,qBACA,YACA,gBACA,eAEA,gDACE,iBACA,0B;ACTF,wBACE,eACA,OACA,QACA,SACA,mCACA,gGACA,UAEA,6CACA,uDAVF,wBAWI,yCACA,2CACA,uCACA,+HAGF,6BACE,+BAEA,uDACE,gGAIJ,+CACE,gBAGF,iDACE,8CAIJ,iBACE,+BACA,iCACA,0DACA,uDAJF,iBAKI,yFAIJ,mBACE,wCACA,0CACA,aACA,mBACA,uBACA,+CACA,kBAEA,2BACE,cACA,0BACA,gBACA,gBACA,UAEA,qCACE,oBAGF,6CACE,gBAGF,gDACE,kBACA,YAGF,gDACE,kBACA,aAKN,8BACE,YAEA,uCACE,iCAKF,sCACE,kBACA,UACA,OACA,WACA,aACA,cAKF,2DACE,UACA,cAIJ,oBACE,UACA,+BACA,gBAGF,6BACE,iCACA,aACA,mBACA,uBACA,kCAGF,iCACE,aACA,kBACA,aACA,WAEA,6CANF,iCAOI,8CACA,2CAIJ,+BACE,iCACE,eAKN,YACE,mBAEA,iBACE,eACA,sBACA,gBACA,SACA,mBACA,kDACA,gBACA,mBACA,uBACA,mBACA,uBAGF,sBACE,mBAGF,mBACE,cACA,0BACA,gBACA,gBACA,UfrKF,iFeyKE,gBAIA,8CACE,cAGF,0CACE,gB;ACpLN,YACE,kBAGE,sCACE,kBACA,UACA,UACA,QACA,aAKJ,mCACE,mB;ACfJ,YACE,oBAEA,6BACE,gBAGF,4BACE,eAEA,sCACE,mBACA,mBAKF,wCACE,UACA,aAGF,uCACE,O;ACvBN,mBACE,wBACA,gBACA,sBAEA,WAEA,yBAPF,mBAQI,yB;ACPF,gCACE,wBACA,gBACA,gBACA,cACA,sBAEA,yBAPF,gCAQI,yBAKF,0CACE,kBACA,UACA,OACA,WACA,aACA,c;ACpBN,gBACE,aACA,2DACA,oBACA,mBAEA,uBACE,a;ACPJ,gBACE,kBACA,cAGE,0CACE,kBACA,UACA,UACA,QACA,aAKJ,uCACE,mBAGF,wBACE,Y;ACpBJ,cACE,aACA,oBAEA,gBAIA,kBAHA,+BALF,cAMI,oBAIF,2BACE,gB;ACVF,iDACE,gCACA,iCAEA,wDACE,cACA,uBAIJ,mBACE,mDACA,cACA,WACA,YACA,iBACA,gDACA,oBACA,qBACA,uBACA,wBACA,gBACA,iBAEA,mCACE,WACA,iBAGF,6BACE,aACA,cACA,kBAIJ,2BACE,YAGF,mBACE,gBACA,gBACA,uBAGF,yBACE,mBACA,oBACA,qBACA,4BACA,gBACA,uBACA,gBACA,uBAEF,8DAEE,iB;AC3DJ,aACE,SACA,oBACA,gBACA,kBACA,eAEA,iBACE,kBACA,OACA,MACA,WACA,YACA,iB;ACbJ,kBAME,2BALA,oCACE,cACA,gBAKF,0BACE,aACA,qCACA,aACA,UAEA,yBANF,0BAOI,sCAGF,qCACE,iBACA,sDACE,4BACA,6BAIJ,qCACE,wBAGF,yCACE,cACA,SACA,SACA,oBACA,gBAEA,uJACE,kBACA,MACA,OACA,sBACA,uBAEA,yBAPF,uJAQI,WACA,YACA,oCACA,sC;AChDV,aACE,YACA,gBACA,gBAEA,0BACE,aACA,sBACA,gBACA,kCACA,uBACA,mB;ACXJ,eACE,YACA,gBACA,gBAEA,4BACE,aACA,sBACA,gBACA,kCAGF,4BACE,mBAEA,mCACE,aACA,8BACA,cAEA,kDACE,gBAGF,0CACE,eACA,sBACA,SACA,gBACA,mBACA,uBAGF,0CACE,kCACA,SAGF,2CACE,cACA,iBAEA,oDACE,mCACA,kCAEA,qHACE,+CAMR,iCACE,aACA,iBACA,gBAIA,oDACE,iBAGF,6CACE,cACA,kBAKN,8BACE,e;ACxEJ,WACE,YACA,eAEA,0BACE,YACA,cAEA,+BACE,aACA,qCACA,uBACA,gBACA,qBAIJ,wBACE,6BACA,gBACA,kB;ACpBJ,mBACE,6CACA,wBACA,aACA,8BAEA,gCACE,aACA,mBACA,mBACA,sBACA,gBACA,kCACA,+BACA,gBACA,MACA,mCAEA,yBAZF,gCAaI,kCAIJ,mCACE,iBAEA,6CACE,cACA,kBAIJ,gCACE,iBACA,kBACA,gBAEA,yBALF,gCAMI,kBAGF,yCACE,wBAKF,oEACE,qBAIA,6EACE,oBACA,eAKN,mCACE,0BACA,wBAGE,uDACE,iBACA,eAKN,8BACE,sBACA,kBACA,iB;AC1EJ,aACE,YACA,kBACA,aACA,sBACA,oBAEA,sBACE,kBACA,MACA,OACA,SACA,QACA,iCAGF,4BACE,sBACA,cACA,kBAEA,yBALF,4BAMI,gBAIJ,gCACE,0CACA,YACA,c;AC7BJ,YACE,kBACA,YAEA,2BACE,YACA,kBACA,kBAGF,qBACE,oBACA,0CAEA,0BACE,eAGF,mCACE,gBACA,iBAGF,+BACE,gBAGF,+BACE,2BAEA,yCACE,gBAIJ,mCACE,cACA,eACA,mBACA,kBAEA,oDACE,kBACA,OACA,MACA,WACA,YAEA,2DACE,aAKN,+BACE,kBAEA,0CACE,gBAGF,yDACE,oBAGF,gEACE,gBACA,mBAIA,gDACE,gBACA,mBAKF,mEACE,qBAKN,sCACE,gBACA,mBACA,kCAEA,gDACE,mBAIJ,mCACE,kCACA,qBAEA,6CACE,mBAIJ,mCACE,kCACA,kBAGF,8BACE,iBAIJ,kCACE,YAGF,wBACE,wBAGF,yBACE,gBAEA,gCACE,oBACA,mBAEA,2CACE,sBAKF,6CACE,aACA,WACA,eAGF,4CACE,cACA,aACA,eAMR,oBACE,mB;ACtJF,cACE,mBAEA,iBACE,gBACA,kCACA,qB;ACNJ,UACE,mBAGE,iBACE,kCACA,gBACA,oBAGF,sBACE,mB;ACXN,UACE,gBAEA,uBACE,aACA,mBACA,cAEA,2BACE,YACA,aAIA,gCACE,iBACA,mBAGF,+BACE,gBACA,iBACA,kCAKN,sBACE,YAEA,uCACE,kBACA,aACA,mBACA,4BACA,kCACA,gBAEA,4CACE,wBAGF,8CACE,aACA,YAKN,wBACE,0CACA,aAEA,4CACE,aACA,0BACA,gBAEA,8CACE,iBACA,kCACA,kBACA,aAGF,8DACE,oEACA,qBACA,mBACA,cAIA,yDACE,eACA,sBACA,gBACA,gBACA,sBACA,wBACA,0BAGF,wDACE,gBACA,kBACA,qC;ACtFV,WACE,kBAEA,qDACE,kBAGF,uBACE,kBACA,UACA,UACA,UAEA,2BACE,e;ACdN,aACE,mBAEA,gBACE,gBACA,kCACA,qBAGF,4BACE,aACA,8BAEA,yCACE,aACA,cACA,a;ACfJ,8BACE,oBAGF,sBACE,kBACA,4BACA,6BACA,WACA,oBACA,aACA,mBACA,mBACA,mCACA,6CAEA,yBACE,gBACA,mBACA,uBACA,mBAIJ,0BACE,aAGF,6BACE,aACA,eACA,aACA,mBACA,uBAGF,+BACE,aACA,gBAGF,uBACE,cACA,WACA,YACA,kBAGF,sBACE,kBACA,+BACA,gCACA,WACA,oBACA,mCACA,0CAEA,6BACE,oBACA,gBAIJ,4BACE,YAGF,6BACE,UACA,gBAIJ,+FAKI,4BACE,gBAGF,0BACE,c","sources":["webpack://telegram-t/./src/components/mediaViewer/SenderInfo.scss","webpack://telegram-t/./src/components/mediaViewer/MediaViewerActions.scss","webpack://telegram-t/./src/components/mediaViewer/MediaViewerFooter.scss","webpack://telegram-t/./src/components/mediaViewer/VideoPlayerControls.scss","webpack://telegram-t/./src/components/mediaViewer/VideoPlayer.scss","webpack://telegram-t/./src/components/mediaViewer/ZoomControls.scss","webpack://telegram-t/./src/components/mediaViewer/PanZoom.scss","webpack://telegram-t/./src/components/mediaViewer/MediaViewer.scss","webpack://telegram-t/./src/components/common/ChatOrUserPicker.scss","webpack://telegram-t/./src/components/main/Dialogs.scss","webpack://telegram-t/./src/components/common/CalendarModal.scss","webpack://telegram-t/./src/components/middle/MessageSelectToolbar.scss","webpack://telegram-t/./src/components/left/search/RecentContacts.scss","webpack://telegram-t/./src/components/left/search/ChatMessage.scss","webpack://telegram-t/./src/components/left/search/DateSuggest.scss","webpack://telegram-t/./src/components/left/search/LeftSearch.scss","webpack://telegram-t/./src/components/ui/CropModal.scss","webpack://telegram-t/./src/components/ui/AvatarEditable.scss","webpack://telegram-t/./src/components/ui/ShowMoreButton.scss","webpack://telegram-t/./src/components/left/settings/folders/SettingsFoldersChatsPicker.scss","webpack://telegram-t/./src/components/left/settings/folders/SettingsFolders.scss","webpack://telegram-t/./src/components/left/settings/SettingsStickerSet.scss","webpack://telegram-t/./src/components/left/settings/WallpaperTile.scss","webpack://telegram-t/./src/components/left/settings/SettingsGeneralBackground.scss","webpack://telegram-t/./src/components/left/settings/SettingsGeneralBackgroundColor.scss","webpack://telegram-t/./src/components/common/PasswordMonkey.scss","webpack://telegram-t/./src/components/left/settings/Settings.scss","webpack://telegram-t/./src/styles/_mixins.scss","webpack://telegram-t/./src/components/left/newChat/NewChat.scss","webpack://telegram-t/./src/components/left/ArchivedChats.scss","webpack://telegram-t/./src/components/middle/message/MessageContextMenu.scss","webpack://telegram-t/./src/components/common/StickerSetModal.scss","webpack://telegram-t/./src/components/middle/HeaderMenuContainer.scss","webpack://telegram-t/./src/components/middle/MobileSearch.scss","webpack://telegram-t/./src/components/middle/composer/MentionTooltip.scss","webpack://telegram-t/./src/components/middle/composer/AttachmentModal.scss","webpack://telegram-t/./src/components/middle/composer/PollModal.scss","webpack://telegram-t/./src/components/middle/composer/EmojiButton.scss","webpack://telegram-t/./src/components/middle/composer/EmojiPicker.scss","webpack://telegram-t/./src/components/middle/composer/StickerPicker.scss","webpack://telegram-t/./src/components/common/GifButton.scss","webpack://telegram-t/./src/components/middle/composer/GifPicker.scss","webpack://telegram-t/./src/components/middle/composer/SymbolMenu.scss","webpack://telegram-t/./src/components/middle/composer/AttachMenu.scss","webpack://telegram-t/./src/components/middle/composer/BotCommand.scss","webpack://telegram-t/./src/components/middle/composer/BotCommandTooltip.scss","webpack://telegram-t/./src/components/middle/composer/BotCommandMenu.scss","webpack://telegram-t/./src/components/middle/composer/StickerTooltip.scss","webpack://telegram-t/./src/components/middle/composer/CustomSendMenu.scss","webpack://telegram-t/./src/components/middle/composer/EmojiTooltip.scss","webpack://telegram-t/./src/components/middle/composer/inlineResults/BaseResult.scss","webpack://telegram-t/./src/components/middle/composer/inlineResults/MediaResult.scss","webpack://telegram-t/./src/components/middle/composer/InlineBotTooltip.scss","webpack://telegram-t/./src/components/right/RightSearch.scss","webpack://telegram-t/./src/components/right/StickerSearch.scss","webpack://telegram-t/./src/components/right/GifSearch.scss","webpack://telegram-t/./src/components/right/PollAnswerResults.scss","webpack://telegram-t/./src/components/right/PollResults.scss","webpack://telegram-t/./src/components/right/management/Management.scss","webpack://telegram-t/./src/components/payment/ShippingInfo.scss","webpack://telegram-t/./src/components/payment/Shipping.scss","webpack://telegram-t/./src/components/payment/Checkout.scss","webpack://telegram-t/./src/components/payment/CardInput.scss","webpack://telegram-t/./src/components/payment/PaymentInfo.scss","webpack://telegram-t/./src/components/payment/PaymentModal.scss"],"sourcesContent":[".SenderInfo {\n display: flex;\n align-content: center;\n color: white;\n cursor: pointer;\n\n opacity: .5;\n transition: .15s opacity;\n\n &:hover {\n opacity: 1;\n }\n\n .Avatar {\n margin-inline-end: 1rem;\n\n @media (max-width: 600px) {\n display: none;\n }\n }\n\n .meta {\n display: flex;\n flex-direction: column;\n justify-content: center;\n max-width: calc(100% - 3.75rem);\n }\n\n .title {\n line-height: 1.45rem;\n font-weight: 500;\n white-space: pre;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .date {\n line-height: 1.25rem;\n font-size: 0.875rem;\n letter-spacing: -0.01rem;\n }\n}\n",".MediaViewerActions {\n display: flex;\n margin-inline-start: auto;\n margin-inline-end: -.375rem;\n\n .Button {\n margin-inline-start: .25rem;\n }\n}\n\n.MediaViewerActions-mobile {\n position: relative;\n color: var(--color-text);\n\n .ProgressSpinner {\n position: absolute;\n top: 0;\n left: 0;\n }\n}\n",".MediaViewerFooter {\n position: absolute;\n bottom: 0;\n padding: 1rem 0;\n width: 100%;\n transition: opacity .15s;\n\n #MediaViewer.zoomed & {\n display: none;\n }\n\n @media (max-height: 640px) {\n padding: .5rem 0 0;\n }\n\n @media (max-width: 600px) {\n padding-bottom: 4.5rem;\n background: linear-gradient(to top, #000 0%, rgba(0, 0, 0, 0) 100%);\n\n &.is-for-video {\n opacity: 0;\n pointer-events: none;\n\n .video-controls-visible & {\n opacity: 1;\n pointer-events: all;\n }\n }\n }\n\n .media-viewer-footer-content {\n position: relative;\n max-width: var(--messages-container-width);\n margin: auto;\n cursor: pointer;\n opacity: .5;\n transition: opacity .15s;\n\n &:hover {\n opacity: 1;\n }\n\n @media (max-width: 600px) {\n opacity: 1;\n }\n }\n\n &.is-hidden {\n opacity: 0;\n }\n\n .media-text {\n margin-bottom: 0;\n overflow: auto;\n padding: 0 .5rem;\n text-align: center;\n color: rgba(255, 255, 255, .9);\n font-size: .9375rem;\n letter-spacing: .025rem;\n max-height: 4.25rem;\n\n @media (max-height: 640px) {\n max-height: 2.75rem;\n }\n\n .emoji {\n width: .9375rem;\n height: .9375rem;\n vertical-align: -2px;\n }\n\n &.multiline {\n &::before {\n content: '';\n position: absolute;\n left: -.75rem;\n right: -.75rem;\n top: -.25rem;\n bottom: -.25rem;\n background: rgba(0, 0, 0, .75);\n border-radius: var(--border-radius-default);\n z-index: var(--z-below);\n\n @media (max-width: 600px) {\n display: none;\n background: none;\n }\n }\n }\n }\n\n a {\n color: var(--color-links);\n\n &:hover,\n &:focus {\n text-decoration: underline;\n }\n }\n}\n",".VideoPlayerControls {\n display: flex;\n align-items: center;\n position: absolute;\n left: 0;\n bottom: 0;\n width: 100%;\n padding-top: .625rem;\n font-size: .875rem;\n background: linear-gradient(to top, #000 0%, rgba(0, 0, 0, 0) 100%);\n\n #MediaViewer.zoomed & {\n display: none;\n }\n\n @media (max-width: 600px) {\n position: fixed;\n padding: 1.25rem .5rem .75rem;\n background: none;\n z-index: var(--z-media-viewer);\n }\n\n &.mobile {\n .player-file-size {\n position: static;\n left: auto;\n transform: none;\n margin-left: auto;\n }\n\n .fullscreen {\n margin-left: 1rem;\n }\n\n .player-time + .fullscreen {\n margin-left: auto;\n }\n }\n\n .Button {\n width: 2.25rem;\n padding: 0;\n margin: .25rem;\n height: 1.75rem;\n @media (max-width: 600px) {\n height: 2.25rem;\n }\n }\n\n .play i {\n line-height: 1.5rem;\n }\n\n .player-time {\n margin: 0 1rem;\n white-space: nowrap;\n }\n\n .fullscreen {\n margin-left: auto;\n @media (max-width: 600px) {\n margin-left: 1rem;\n }\n i {\n line-height: 1.75rem;\n @media (max-width: 600px) {\n font-size: 1.5rem;\n }\n }\n }\n\n @media (max-width: 600px) {\n .player-time + .fullscreen {\n margin-left: auto;\n }\n }\n\n .player-file-size {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n @media (max-width: 600px) {\n position: static;\n left: auto;\n transform: none;\n margin-left: auto;\n margin-right: 1rem;\n & + .fullscreen {\n margin-left: 0;\n }\n }\n }\n\n .player-seekline {\n position: absolute;\n left: 1rem;\n right: 1rem;\n top: 0;\n height: 1rem;\n touch-action: none;\n cursor: pointer;\n\n &-track {\n position: absolute;\n top: 50%;\n left: -.25rem;\n right: -.25rem;\n height: 5px;\n transform: translateY(-50%);\n background-color: rgba(255, 255, 255, 0.16);\n border-radius: var(--border-radius-default);\n }\n\n &-buffered,\n &-played,\n &-input {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n border-radius: var(--border-radius-default);\n }\n\n &-buffered {\n background-color: rgba(255, 255, 255, 0.5);\n }\n\n &-played {\n background: var(--color-primary);\n\n &::after {\n content: '';\n position: absolute;\n width: .75rem;\n height: .75rem;\n border-radius: 50%;\n background-color: var(--color-primary);\n right: 0;\n top: 50%;\n transform: translate(.325rem, -50%);\n }\n }\n }\n}\n",".VideoPlayer {\n position: relative;\n display: inline-flex;\n flex-direction: column;\n overflow: hidden;\n\n #MediaViewer.zoomed & {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n > div {\n width: 100% !important;\n height: 100% !important;\n }\n video {\n max-height: none !important;\n }\n }\n\n @media (min-width: 601px) {\n // Safari: custom controls are not displayed after exiting full screen mode.\n z-index: 1;\n }\n\n @media (max-width: 600px) {\n overflow: visible;\n }\n\n @media (max-height: 640px) {\n margin-bottom: 1.75rem;\n @at-root .has-footer #{&} {\n margin-bottom: 0;\n }\n }\n\n video {\n display: block;\n max-height: calc(100vh - 8.25rem);\n margin: auto;\n object-fit: contain;\n outline: none;\n width: 100%;\n height: 100%;\n background: no-repeat 50% 50%;\n background-size: contain;\n\n @media (max-height: 640px) {\n max-height: calc(100vh - 10rem);\n }\n @at-root .has-footer #{&} {\n max-height: calc(100vh - 15rem);\n @media (max-height: 640px) {\n max-height: calc(100vh - 10rem);\n }\n }\n }\n\n .play-button {\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n width: 3.25rem;\n height: 3.25rem;\n background-color: rgba(0, 0, 0, 0.5) !important;\n body:not(.animation-level-0) & {\n transition: opacity .3s ease !important;\n }\n\n .icon-play {\n font-size: 1.75rem;\n position: relative;\n left: .125rem;\n }\n }\n\n .spinner-container {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n .buffering {\n background: rgba(0, 0, 0, 0.25);\n color: #fff;\n font-size: 0.75rem;\n position: absolute;\n left: 0.1875rem;\n top: 0.1875rem;\n z-index: 1;\n padding: 0 0.375rem;\n border-radius: 0.75rem;\n line-height: 1.125rem;\n }\n\n .ProgressSpinner {\n cursor: pointer;\n }\n }\n}\n",".ZoomControls {\n position: absolute;\n bottom: 1.25rem;\n left: 50%;\n background: rgba(0,0,0,.5);\n border-radius: var(--border-radius-default);\n width: 100%;\n height: 3.375rem;\n max-width: 274px;\n transform: translate3d(-50%, 0, 10px);\n transition: opacity .3s ease-in;\n pointer-events: none;\n\n &.open {\n z-index: var(--z-media-viewer);\n pointer-events: all;\n }\n\n .zoom-out,\n .zoom-in {\n position: absolute;\n top: 0.4375rem;\n width: 2.5rem;\n height: 2.5rem;\n color: #fff;\n\n i {\n font-size: 1.5rem;\n }\n }\n\n .zoom-out {\n left: .5rem;\n }\n\n .zoom-in {\n right: .5rem;\n }\n\n .seekline {\n position: absolute;\n left: 3.25rem;\n right: 3.25rem;\n top: 1.125rem;\n height: 1rem;\n\n &-track {\n position: absolute;\n top: 50%;\n left: -.25rem;\n right: -.25rem;\n height: 2px;\n transform: translateY(-50%);\n background-color: rgba(255, 255, 255, .5);\n border-radius: var(--border-radius-default);\n }\n\n &-played,\n &-input {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n border-radius: var(--border-radius-default);\n }\n\n &-played {\n background: #fff;\n transition: width 200ms;\n\n &::after {\n content: '';\n position: absolute;\n width: .75rem;\n height: .75rem;\n border-radius: 50%;\n background-color: var(--color-white);\n right: 0;\n top: 50%;\n transform: translate(.325rem, -50%);\n }\n }\n\n &-input {\n width: 100%;\n height: 1rem;\n top: -.375rem;\n opacity: 0;\n margin: 0;\n padding: 0;\n cursor: pointer;\n overflow: hidden;\n\n &::-webkit-slider-thumb {\n margin-top: -2rem;\n }\n }\n }\n}\n",".pan-wrapper,\n.pan-container {\n position: relative;\n width: 100%;\n height: 100%;\n}\n\n.pan-wrapper {\n cursor: move;\n user-select: none;\n}\n\n.pan-container {\n transition: transform .2s ease-in;\n\n .pan-wrapper.move & {\n transition: none;\n }\n\n .zoomed & {\n position: fixed;\n top: 0;\n left: 0;\n }\n}\n","#MediaViewer {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100%;\n background: rgba(0, 0, 0, .9);\n color: #fff;\n z-index: var(--z-media-viewer);\n padding: 0.5rem 0;\n\n display: grid;\n grid-template-columns: auto;\n grid-template-rows: 2.75rem 1fr;\n grid-column-gap: 0;\n grid-row-gap: 0;\n justify-items: stretch;\n align-items: center;\n\n // Potential perf improvement\n &:not(.shown) {\n display: block !important;\n transform: scale(0);\n }\n\n body.ghost-animating & {\n > .pan-wrapper, > .Transition, > button {\n display: none;\n }\n }\n\n body.animation-level-2 & {\n transition-duration: .3s !important;\n }\n\n &:not(.open),\n .closing {\n .SenderInfo {\n pointer-events: none;\n transition: none;\n }\n }\n\n &.zoomed {\n .navigation {\n display: none;\n }\n\n .media-viewer-head {\n z-index: 2;\n }\n\n .media-viewer-content {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n padding: 0;\n z-index: 1;\n }\n }\n\n .media-viewer-head {\n display: flex;\n grid-area: 1 / 1 / 2 / -2;\n padding: 0 1.25rem;\n position: relative;\n z-index: var(--z-media-viewer-head);\n min-width: 0;\n\n & > .Transition {\n width: 100%;\n min-width: 0;\n }\n\n @media (max-width: 600px) {\n padding: 0 0.5rem;\n\n @supports (padding: 0 env(safe-area-inset-left)) {\n padding: 0 #{\"max(0.5rem, env(safe-area-inset-left))\"};\n }\n\n .media-viewer-close {\n margin-right: 1.5rem;\n }\n }\n\n @supports (padding: 0 env(safe-area-inset-left)) {\n padding: 0 #{\"max(1.25rem, env(safe-area-inset-left))\"};\n }\n }\n\n & > .Transition,\n & > .pan-wrapper {\n grid-area: 1 / 1 / -1 / -1;\n }\n\n & > .Transition,\n & > .pan-wrapper .Transition {\n position: relative;\n justify-self: center;\n text-align: center;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n overflow: hidden;\n }\n\n .media-viewer-content {\n position: relative;\n z-index: 1;\n padding: 3.25rem 0;\n height: 100%;\n display: inline-flex;\n justify-content: center;\n align-items: center;\n\n &.has-footer {\n padding: 7rem 0;\n @media (min-width: 600px) {\n min-width: 600px;\n }\n\n @media (max-height: 640px) {\n padding: 4rem 0;\n }\n\n > img {\n max-height: calc(100vh - 15rem);\n @media (max-height: 640px) {\n max-height: calc(100vh - 10rem);\n }\n }\n }\n\n .thumbnail {\n position: relative;\n\n img {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n }\n\n > img {\n max-width: 100vw;\n max-height: calc(100vh - 8.25rem);\n object-fit: contain;\n transition: transform .2s;\n }\n\n .spinner-wrapper {\n max-width: 100vw;\n margin: auto;\n }\n\n .Spinner {\n margin: auto;\n }\n }\n\n .navigation {\n position: fixed;\n top: 4rem;\n width: 10vw;\n bottom: 0;\n border: none;\n padding: 0;\n margin: 0;\n appearance: none;\n background: transparent no-repeat;\n background-size: 1.25rem;\n opacity: 0;\n transition: opacity .15s;\n outline: none;\n cursor: pointer;\n z-index: 1;\n\n @media (max-width: 600px) {\n width: 20vw;\n }\n\n &:hover, .is-touch-env & {\n opacity: 1;\n }\n\n &.prev {\n left: 0;\n background-image: url(\"../../assets/media_navigation_previous.svg\");\n background-position: 1.25rem calc(50% - 2rem);\n\n @supports (left: env(safe-area-inset-left)) {\n left: env(safe-area-inset-left);\n }\n\n &[dir=rtl] {\n left: auto;\n right: 0;\n transform: scaleX(-1);\n\n @supports (left: env(safe-area-inset-left)) {\n left: auto;\n right: env(safe-area-inset-right);\n }\n }\n }\n\n &.next {\n right: 0;\n background-image: url(\"../../assets/media_navigation_next.svg\");\n background-position: calc(100% - 1.25rem) calc(50% - 2rem);\n\n @supports (left: env(safe-area-inset-left)) {\n right: env(safe-area-inset-right);\n }\n\n &[dir=rtl]{\n left: 0;\n right: auto;\n transform: scaleX(-1);\n\n @supports (left: env(safe-area-inset-left)) {\n right: auto;\n left: env(safe-area-inset-left);\n }\n }\n }\n\n &.inline {\n top: calc(50% - 3rem);\n bottom: unset;\n height: 6rem;\n background-position-y: center;\n\n @media (max-width: 600px) {\n opacity: 0;\n transition: opacity .15s ease-in;\n pointer-events: none;\n\n .video-controls-visible & {\n opacity: 1;\n pointer-events: all;\n }\n }\n }\n }\n}\n\n.ghost {\n position: absolute;\n z-index: var(--z-media-viewer);\n will-change: transform, opacity;\n overflow: hidden;\n border-radius: 0;\n transition: transform .2s ease, opacity .2s ease;\n\n &.rounded-corners {\n border-radius: var(--border-radius-messages);\n }\n\n &.circle {\n border-radius: 50%;\n }\n\n body.is-ios & {\n transition: transform .2s ease, opacity .2s ease, border-radius .2s ease !important;\n }\n\n img,\n video {\n width: 100%;\n height: 100%;\n user-select: none;\n -webkit-user-select: none;\n object-fit: cover;\n }\n}\n",".ChatOrUserPicker {\n z-index: var(--z-media-viewer);\n\n .modal-dialog {\n height: 70%;\n max-width: 25rem;\n\n @media (max-width: 600px) {\n height: 90%;\n }\n }\n\n .modal-header {\n display: flex;\n align-items: center;\n padding: 0.25rem 0.5rem;\n\n .Button {\n margin-right: 0.5rem;\n }\n\n .input-group {\n margin: 0;\n flex: 1;\n }\n\n .form-control {\n border: none;\n box-shadow: none !important;\n\n height: 2.75rem;\n padding: 0.5rem;\n font-size: 1.25rem;\n line-height: 1.75rem;\n unicode-bidi: plaintext;\n }\n }\n\n .modal-content {\n padding: 0;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n\n .picker-list {\n height: 100%;\n overflow-x: hidden;\n overflow-y: auto;\n padding: 0 1rem 1rem;\n }\n }\n\n .no-results {\n height: 100%;\n margin: 0;\n padding: 1rem 1rem;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-text-secondary);\n }\n\n .ListItem.chat-item-clickable {\n &:not(.force-rounded-corners) {\n @media (max-width: 600px) {\n margin: 0;\n\n .ListItem-button {\n border-radius: 0;\n }\n }\n }\n }\n}\n","#Dialogs {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n z-index: var(--z-modal);\n}\n",".CalendarModal {\n .modal-dialog {\n max-width: 26.25rem;\n .modal-content {\n padding: .375rem 1rem 1rem;\n }\n }\n\n .timepicker {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 1.5rem;\n\n .form-control {\n max-width: 5rem;\n text-align: center;\n\n &:first-child {\n margin-right: 1rem;\n }\n &:last-child {\n margin-left: 1rem;\n }\n }\n }\n\n .footer {\n display: flex;\n justify-content: flex-end;\n flex-direction: column;\n\n .Button {\n text-transform: none;\n\n + .Button {\n margin-top: .5rem;\n }\n }\n }\n\n .month-selector {\n display: flex;\n align-items: center;\n\n h4 {\n flex: 1;\n margin: 0 0 0 1.25rem;\n font-size: 1.25rem;\n\n @media (max-width: 600px) {\n margin-left: .75rem;\n }\n\n & ~ .Button {\n color: var(--color-primary)\n }\n }\n\n .Button.hidden {\n opacity: 0.5;\n pointer-events: none;\n }\n }\n\n .day-button {\n position: relative;\n border-radius: 4rem;\n outline: none !important;\n font-weight: 500;\n margin: .125rem .625rem;\n\n @media (max-width: 600px) {\n margin: .25rem .375rem;\n }\n\n &.weekday {\n margin-bottom: 0;\n height: 1rem;\n }\n\n &.clickable {\n cursor: pointer;\n\n &:hover {\n background-color: var(--color-interactive-element-hover);\n }\n\n &.selected {\n background-color: var(--color-primary);\n color: white;\n }\n }\n\n &.disabled {\n opacity: 0.25;\n pointer-events: none;\n }\n\n &::before {\n content: \"\";\n display: block;\n padding-top: 100%;\n }\n\n span {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.875rem;\n }\n }\n\n .calendar-wrapper {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 17rem;\n margin: 1.5rem -0.5rem 0.5rem;\n }\n\n .calendar-grid {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n width: 100%;\n }\n}\n",".MessageSelectToolbar {\n position: absolute;\n bottom: 0.5rem;\n left: 0.5rem;\n right: 0.5rem;\n width: auto;\n z-index: 20;\n justify-content: center;\n margin: 0;\n\n @supports (padding-bottom: env(safe-area-inset-bottom)) {\n bottom: calc(0.5rem + env(safe-area-inset-bottom));\n }\n\n .mask-image-disabled &::before {\n left: auto !important;\n right: auto !important;\n }\n\n .no-composer & {\n width: 100%;\n @media (max-width: 600px) {\n width: calc(100% - 1rem);\n }\n }\n\n @media (min-width: 601px) {\n left: 1rem;\n right: 1rem;\n bottom: 1.25rem;\n\n .no-composer & {\n top: -4.75rem;\n }\n }\n\n opacity: 1;\n\n &-inner {\n transform: scaleX(1);\n transition: transform var(--select-transition), opacity var(--select-transition);\n }\n\n & .MessageSelectToolbar-inner {\n transform: scaleX(1) translateX(0);\n }\n\n .no-composer .unpin-button-container + &,\n .no-composer .messaging-disabled + & {\n top: auto;\n }\n\n body.animation-level-0 & {\n transition: none !important;\n }\n\n &:not(.shown) {\n opacity: 0;\n pointer-events: none;\n\n .shown-inner {\n transform: scaleX(var(--toolbar-hidden-scale, 1));\n }\n\n &.with-composer .MessageSelectToolbar-inner {\n transform: scaleX(var(--toolbar-hidden-scale, 1)) translateX(var(--toolbar-translate-x, 0));\n }\n\n &:not(.with-composer) .MessageSelectToolbar-inner {\n transform: scaleX(var(--toolbar-unpin-hidden-scale)) translateX(0);\n }\n }\n\n &::before {\n z-index: -1;\n max-width: 32rem;\n width: 100%;\n left: auto;\n right: auto;\n }\n\n &-inner {\n width: 100%;\n max-width: 32rem;\n display: flex;\n align-items: center;\n padding: 0.25rem;\n\n background: var(--color-background);\n border-radius: var(--border-radius-messages);\n box-shadow: 0 1px 2px var(--color-default-shadow);\n font-weight: 500;\n\n @media (max-width: 600px) {\n padding: 0;\n max-width: none;\n }\n\n > .Button {\n width: 3rem;\n height: 3rem;\n\n @media (max-width: 600px) {\n width: 2.875rem;\n height: 2.875rem;\n }\n }\n }\n\n &-count {\n margin-left: 1rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n flex-grow: 1;\n\n @media (max-width: 600px) {\n margin-right: 0.5rem;\n }\n }\n\n &-actions {\n margin-left: auto;\n display: flex;\n\n .item {\n width: 100%;\n background: none;\n border: none !important;\n box-shadow: none !important;\n outline: none !important;\n display: flex;\n position: relative;\n overflow: hidden;\n line-height: 1.5rem;\n white-space: nowrap;\n color: var(--color-text);\n --ripple-color: rgba(0, 0, 0, 0.08);\n cursor: pointer;\n unicode-bidi: plaintext;\n\n padding: 0.6875rem;\n border-radius: 50%;\n\n i {\n font-size: 1.5rem;\n color: var(--color-text-secondary);\n }\n\n &.destructive {\n color: var(--color-error);\n i {\n color: inherit;\n }\n }\n\n &.disabled {\n opacity: 0.5;\n cursor: default;\n pointer-events: none;\n }\n\n &:not(.disabled):active {\n background-color: var(--color-item-active);\n transition: none !important;\n }\n\n @media (hover: hover) {\n &:hover, &:focus {\n background-color: var(--color-chat-hover);\n text-decoration: none;\n }\n }\n }\n }\n}\n",".RecentContacts {\n .Loading {\n min-height: 75vh;\n }\n\n .top-peers-section {\n padding: .5rem 1rem;\n }\n\n .top-peers {\n height: 6rem;\n margin: 0 -1rem;\n overflow-x: auto;\n overflow-y: hidden;\n white-space: nowrap;\n\n scrollbar-width: none;\n scrollbar-color: rgba(0, 0, 0, 0);\n\n &::-webkit-scrollbar {\n height: 0;\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, 0);\n }\n }\n\n .top-peer-item {\n display: inline-block;\n width: 4.5rem;\n height: 6rem;\n padding: 0.625rem 0.25rem;\n margin-left: 0.5rem;\n border-radius: var(--border-radius-default);\n cursor: pointer;\n position: relative;\n overflow: hidden;\n\n &:first-child {\n margin-left: 0.125rem;\n }\n\n &:last-child {\n margin-right: 0.125rem;\n }\n\n .Avatar {\n margin: 0 auto 0.375rem;\n }\n\n &:hover {\n background: var(--color-chat-hover);\n }\n\n .top-peer-name {\n text-align: center;\n white-space: nowrap;\n font-size: 0.75rem;\n overflow: hidden;\n text-overflow: ellipsis;\n\n .emoji-small {\n width: 1rem;\n height: 1rem;\n background-size: 1rem;\n margin-inline-end: 1px;\n vertical-align: -3px;\n }\n }\n }\n\n .recent-chats-header {\n display: flex;\n align-items: center;\n\n .Button {\n margin-left: auto;\n }\n\n &[dir=rtl] {\n .Button {\n margin-left: 0;\n margin-right: auto;\n }\n }\n }\n}\n",".ChatMessage {\n &:first-child {\n margin-top: .5rem;\n }\n &:hover, &.selected {\n .Avatar.online::after {\n border-color: var(--color-chat-hover);\n }\n }\n\n .ListItem-button {\n padding: .25rem .5rem;\n }\n\n .info {\n .title {\n flex-grow: 1;\n }\n\n h3 {\n font-size: 1rem;\n width: auto;\n }\n\n .subtitle {\n color: var(--color-text-secondary);\n\n .matching-text-highlight {\n color: var(--color-text);\n background: #CAE3F7;\n border-radius: 0.25rem;\n padding: 0 0.125rem;\n }\n }\n\n .message {\n flex-grow: 1;\n color: var(--color-text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n\n .sender-name {\n color: var(--color-text);\n }\n .sender-name {\n &::after {\n content: ': ';\n }\n }\n\n img {\n width: 1.25rem;\n height: 1.25rem;\n object-fit: cover;\n border-radius: .125rem;\n vertical-align: -.25rem;\n margin-right: .25rem;\n }\n\n .icon-play {\n position: relative;\n display: inline-block;\n font-size: .75rem;\n color: #fff;\n margin-inline-start: -1.25rem;\n margin-inline-end: 0.5rem;\n bottom: 0.0625rem;\n }\n }\n }\n\n .info-row {\n display: flex;\n justify-content: space-between;\n }\n\n &[dir=rtl] {\n .subtitle {\n text-align: right;\n }\n }\n}\n",".DateSuggest {\n display: flex;\n height: 2rem;\n flex-direction: row;\n justify-content: space-between;\n margin-left: .5rem;\n margin-bottom: .5rem;\n\n .date-item {\n display: flex;\n flex: 1 1 auto;\n min-width: 8rem;\n margin-top: .375rem;\n cursor: pointer;\n font-size: .875rem;\n font-weight: 500;\n color: var(--color-text-secondary);\n\n .icon-calendar {\n font-size: 1.25rem;\n margin-right: .25rem;\n }\n }\n \n}",".LeftSearch {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n\n & > .Transition {\n flex: 1;\n overflow: hidden;\n }\n\n .TabList {\n padding-bottom: 1px;\n z-index: 1;\n }\n\n .documents-list {\n padding: 0 1.25rem 1.25rem;\n\n .ListItem {\n padding: 0.625rem 0;\n }\n }\n\n .section-heading {\n position: relative;\n padding-top: 1.25rem;\n padding-left: 1.25rem;\n margin: 0 0 1rem -1.25rem !important;\n\n font-weight: 500;\n font-size: .9375rem;\n color: var(--color-text-secondary);\n\n &::before {\n content: '';\n position: absolute;\n width: 100%;\n height: 1px;\n background: var(--color-borders);\n left: .625rem;\n top: -1px;\n }\n\n &[dir=rtl],\n &[dir=auto] {\n padding-left: 0;\n padding-right: 1.25rem;\n margin: 0 -1.25rem 0 1rem !important;\n text-align: initial;\n\n &::before {\n left: auto;\n right: .625rem;\n }\n }\n }\n\n .LeftSearch .search-section .section-heading,\n .RecentContacts .search-section .section-heading {\n margin-left: -1rem !important;\n width: calc(100% + 2rem);\n box-shadow: 0 -1px 0 0 var(--color-borders);\n\n &::before {\n display: none;\n }\n }\n\n .WebLink {\n display: flex;\n }\n\n .content:not(.with-seekline) {\n align-self: center;\n min-width: 0;\n flex-grow: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n word-break: break-word;\n }\n\n .message-date {\n font-size: .75rem;\n color: var(--color-text-secondary);\n padding-left: 1rem;\n white-space: nowrap;\n }\n\n .media-list {\n display: grid;\n padding: .5rem;\n grid-template-columns: repeat(3, 1fr);\n grid-auto-rows: 1fr;\n grid-gap: .25rem;\n }\n\n .Audio {\n .ProgressSpinner {\n margin: -.1875rem 0 0 -.1875rem;\n }\n }\n\n .ListItem.search-result {\n .ChatInfo {\n .handle {\n unicode-bidi: plaintext;\n color: var(--color-primary);\n unicode-bidi: plaintext;\n\n &::before {\n content: '@';\n html[lang=ar] & {\n content: ' ،@';\n margin-inline-end: .25rem;\n }\n }\n\n &::after {\n content: ', ';\n color: var(--color-text-secondary);\n\n html[lang=ar] & {\n content: '';\n }\n }\n }\n\n &[dir=rtl] {\n .status {\n text-align: right;\n\n .handle {\n float: right;\n }\n }\n }\n }\n }\n\n .ListItem.search-result-message {\n .sender-name {\n color: var(--color-text);\n\n &::after {\n content: ': ';\n white-space: pre;\n }\n }\n }\n\n @media (max-width: 600px) {\n .ListItem {\n margin: 0 -0.625rem;\n }\n }\n\n .search-section {\n padding: 0 1rem 0.5rem;\n\n .section-heading {\n color: var(--color-text-secondary);\n font-size: .9375rem;\n font-weight: 500;\n margin-bottom: 0 !important;\n padding-top: .875rem;\n\n .Link {\n float: right;\n color: var(--color-links);\n font-weight: 400;\n margin-right: 1rem;\n\n &:focus,\n &:hover {\n text-decoration: underline;\n }\n }\n\n &[dir=rtl],\n &[dir=auto] {\n .Link {\n float: left;\n margin-left: 1rem;\n margin-right: 0;\n }\n }\n }\n\n .Loading {\n height: 4.5rem;\n margin-bottom: 0.5rem;\n }\n }\n\n .chat-selection {\n padding-top: .5rem;\n display: flex;\n flex-shrink: 0;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: flex-end;\n box-shadow: inset 0 -1px 0 0 var(--color-borders);\n background-color: var(--color-background);\n -webkit-overflow-scrolling: touch;\n overflow-x: auto;\n overflow-y: hidden;\n\n scrollbar-color: rgba(0, 0, 0, 0);\n\n > .PickerSelectedItem {\n flex: 0 0 auto;\n\n &:last-child {\n margin-right: auto;\n }\n }\n\n &[dir=rtl] {\n > .PickerSelectedItem:last-child {\n margin-left: auto;\n margin-right: 0;\n }\n }\n }\n\n .NothingFound {\n height: 100%;\n }\n\n [dir=rtl] {\n .message-date {\n padding-left: 0;\n padding-right: 1rem;\n }\n }\n}\n","@mixin thumb-styles() {\n background: var(--color-primary);\n cursor: pointer;\n transform: scale(1);\n transition: transform .25s ease-in-out;\n\n &:hover {\n transform: scale(1.2);\n }\n}\n\n.CropModal {\n .modal-dialog {\n width: calc(100% - 2rem);\n max-width: 35rem;\n height: calc(100% - 1rem);\n max-height: 35rem;\n position: relative;\n }\n\n .modal-content, #avatar-crop {\n overflow: hidden;\n }\n\n .confirm-button {\n position: absolute;\n bottom: 1rem;\n right: 1rem;\n box-shadow: 0 1px 2px var(--color-default-shadow);\n }\n\n #avatar-crop {\n max-width: 25rem;\n margin: 0 auto;\n position: relative;\n\n &::before {\n content: '';\n display: block;\n padding-top: 100%;\n }\n\n .cr-boundary {\n position: absolute;\n top: 0;\n left: 0;\n border-radius: var(--border-radius-messages-small);\n }\n\n .cr-viewport {\n border: none;\n box-shadow: 0 0 2000px 2000px rgba(white, 0.5);\n }\n\n .cr-slider {\n // Note that while we're repeating code here, that's necessary as you can't comma-separate these type of selectors.\n // Browsers will drop the entire selector if it doesn't understand a part of it.\n\n &::-webkit-slider-runnable-track {\n background: var(--color-borders);\n }\n\n &::-moz-range-track {\n background: var(--color-borders);\n }\n\n &::-ms-track {\n background: var(--color-borders);\n }\n\n &::-webkit-slider-thumb {\n @include thumb-styles();\n }\n\n &::-moz-range-thumb {\n @include thumb-styles();\n }\n\n &::-ms-thumb {\n @include thumb-styles();\n }\n }\n }\n}\n","@import '../../styles/mixins';\n\n.AvatarEditable {\n label {\n margin-left: auto;\n margin-right: auto;\n width: 7.5rem;\n height: 7.5rem;\n margin-bottom: 2rem;\n display: flex !important;\n align-items: center;\n justify-content: center;\n background-color: var(--color-primary);\n border-radius: 50%;\n color: white;\n font-size: 3rem;\n cursor: pointer;\n position: relative;\n overflow: hidden;\n outline: none !important;\n\n input {\n display: none;\n }\n\n img {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n\n i {\n transform: scale(1);\n transition: transform .15s linear;\n z-index: var(--z-register-add-avatar);\n }\n\n // @optimization The weirdest workaround for screen animation lag\n @include while-transition() {\n input, i, &::after {\n display: none !important;\n }\n\n img {\n position: static !important;\n }\n }\n\n &:hover {\n i {\n transform: scale(1.2);\n }\n }\n\n &.filled {\n background-color: var(--color-background);\n\n &::after {\n content: '';\n display: block;\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(black, 0.4);\n }\n }\n\n &.disabled {\n pointer-events: none;\n\n i {\n display: none;\n }\n\n &::after {\n display: none;\n }\n }\n }\n}\n",".ShowMoreButton {\n color: var(--text-color) !important;\n display: flex;\n align-items: center;\n text-align: left;\n text-transform: none;\n padding-left: .75rem !important;\n opacity: 1 !important;\n\n i {\n font-size: 1.5rem;\n margin-right: 2rem;\n color: var(--color-text-secondary);\n }\n\n .Spinner {\n top: 0.4375rem;\n }\n}\n",".SettingsFoldersChatsPicker {\n height: calc(100% - var(--header-height));\n\n .picker-header {\n box-shadow: 0 0 2px var(--color-default-shadow);\n\n .max-items-reached {\n margin-bottom: 0.5rem;\n margin-left: 0.5rem;\n flex-grow: 1;\n }\n\n .max-items-reached {\n color: var(--color-text-secondary);\n }\n }\n\n .picker-list {\n padding: 0 0.5rem 0.5rem;\n\n .no-results {\n height: 10rem;\n }\n }\n\n .ListItem.picker-list-item {\n &.chat-type-item .ListItem-button {\n padding: 0.875rem 0.75rem;\n }\n\n &.chat-item .ListItem-button {\n padding: 0.5rem 0.75rem;\n }\n\n .Checkbox {\n margin-left: auto;\n padding-left: 3.25rem;\n }\n\n .chat-type {\n font-size: 1rem;\n font-weight: 400;\n margin: 0;\n }\n\n &[dir=rtl] {\n .Checkbox {\n margin-left: 0;\n margin-right: auto;\n padding-left: 0;\n padding-right: 3.25rem;\n }\n }\n }\n\n .settings-item-header {\n margin-left: 0.75rem;\n margin-top: 1rem;\n margin-bottom: 0.5rem;\n }\n\n .picker-list-divider {\n margin: 0.5rem -0.5rem 0;\n border-bottom: 1px solid var(--color-borders);\n }\n}\n",".settings-folders-recommended-item {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.settings-folders-list-item {\n .ChatInfo {\n display: flex;\n align-items: center;\n\n .Avatar {\n margin-left: -0.25rem;\n margin-right: 1.5rem;\n }\n\n .title {\n display: flex;\n justify-content: flex-start;\n align-items: center;\n\n h3 {\n font-size: 1rem;\n font-weight: 500;\n line-height: 1.3125;\n margin: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-align: left;\n }\n }\n\n .status {\n display: none;\n }\n\n &[dir=rtl] {\n .title h3{\n text-align: right;\n }\n }\n }\n\n .ListItem-button {\n i {\n opacity: 0.9;\n }\n }\n\n &.color-primary .ListItem-button {\n color: var(--color-primary);\n\n i {\n opacity: 1;\n color: inherit;\n }\n }\n\n &[dir=rtl] {\n .Avatar {\n margin-left: 1.5rem;\n margin-right: -0.25rem;\n }\n }\n}\n\n.settings-item .ShowMoreButton {\n margin: 0 -1rem;\n width: calc(100% + 2rem);\n padding-left: 1rem !important;\n}\n",".SettingsStickerSet {\n .settings-item &.ListItem {\n margin-bottom: .5rem;\n }\n\n .StickerButton,\n .Button {\n width: 3rem;\n height: 3rem;\n margin: 0 .5rem 0 0;\n padding: 0;\n flex: 0 0 3rem;\n }\n\n img {\n max-width: 100%;\n max-height: 100%;\n }\n\n .multiline-menu-item {\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n\n &[dir=rtl] {\n .StickerButton,\n .Button {\n margin: 0 0 0 .5rem;\n }\n }\n}\n",".WallpaperTile {\n height: 0;\n padding-bottom: 100%;\n cursor: pointer;\n position: relative;\n\n .media-inner,\n &::after {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n }\n\n .media-inner {\n overflow: hidden;\n transform: scale(1);\n transition: transform .15s ease;\n\n img, canvas {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n }\n\n &::after {\n content: \"\";\n display: block;\n border: 2px solid var(--color-primary);\n opacity: 0;\n transition: opacity .15s ease;\n }\n\n &.selected {\n &::after {\n opacity: 1;\n }\n\n .media-inner {\n transform: scale(0.9);\n }\n }\n\n .spinner-container {\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n}\n",".SettingsGeneralBackground {\n .settings-wallpapers {\n display: grid;\n padding: .5rem;\n grid-template-columns: repeat(3, 1fr);\n grid-auto-rows: 1fr;\n grid-gap: .25rem;\n }\n\n .Loading {\n height: auto !important;\n margin-top: 5rem;\n }\n}\n",".SettingsGeneralBackgroundColor {\n &:not(.is-dragging) .handle {\n transition: transform 300ms ease;\n }\n\n .color-picker, .hue-picker {\n position: relative;\n }\n\n .color-picker {\n margin-top: 1rem;\n height: 12rem;\n }\n\n .hue-picker {\n margin: 2rem 0;\n height: 0.5rem;\n }\n\n canvas {\n display: block;\n width: 100%;\n height: 100%;\n border-radius: var(--border-radius-default);\n cursor: pointer;\n }\n\n .handle {\n position: absolute;\n top: -0.75rem;\n left: -0.75rem;\n width: 1.5rem;\n height: 1.5rem;\n border: 0.125rem solid var(--color-white);\n border-radius: 0.75rem;\n cursor: grab;\n }\n\n .hue-picker .handle {\n top: -0.5rem;\n }\n\n .tools {\n margin-bottom: 0.625rem;\n display: flex;\n\n .input-group {\n margin-bottom: 0;\n\n &[dir=rtl] {\n label {\n transform: scale(0.75) translate(1.25rem, -2.25rem);\n }\n }\n }\n\n .input-group:first-child {\n margin-right: 0.5rem;\n }\n\n .input-group:last-child {\n margin-left: 0.5rem;\n }\n }\n\n .predefined-colors {\n display: grid;\n padding: .5rem;\n grid-template-columns: repeat(3, 1fr);\n grid-auto-rows: 1fr;\n grid-gap: .25rem;\n\n div {\n cursor: pointer;\n box-shadow: inset 0 0 0 0 var(--color-background);\n transition: box-shadow 300ms ease;\n\n &.active {\n border: 0.125rem solid var(--color-primary);\n box-shadow: inset 0 0 0 0.3125rem var(--color-background);\n }\n\n // A hack to make a square\n &:before {\n display: block;\n content: \"\";\n width: 100%;\n padding-top: 100%;\n pointer-events: none;\n }\n }\n }\n}\n","#monkey {\n position: relative;\n display: block;\n margin-left: auto;\n margin-right: auto;\n width: 7.5rem;\n height: 7.5rem;\n margin-bottom: 1.75rem;\n\n @media (min-width: 600px) and (min-height: 450px) {\n width: 10rem;\n height: 10rem;\n margin-bottom: 2.5rem;\n }\n\n &.big {\n width: 10rem;\n height: 10rem;\n }\n\n .AnimatedSticker {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n\n &.hidden {\n display: none\n }\n }\n\n .monkey-preview {\n width: 100%;\n height: 100%;\n background-size: 100%;\n background: url('../../assets/monkey.svg') center;\n }\n}\n","@import '../../../styles/mixins';\n\n#Settings {\n height: 100%;\n\n > div {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .left-header {\n padding-right: .8125rem;\n }\n}\n\n.settings-main-header {\n display: flex;\n flex-grow: 1;\n justify-content: space-between;\n align-items: center;\n}\n\n.settings-more-menu {\n .bubble {\n width: auto;\n\n .MenuItem button {\n padding-left: 1rem !important;\n padding-right: 2rem !important;\n }\n }\n}\n\n.settings-content {\n background: var(--color-background);\n height: calc(100% - var(--header-height));\n\n overflow-y: auto;\n @include overflow-y-overlay();\n\n &.infinite-scroll {\n display: flex;\n flex-direction: column;\n\n & > .custom-scroll {\n flex: 1 1 auto;\n height: auto;\n }\n }\n\n #monkey {\n margin-top: .5rem;\n margin-bottom: 1rem;\n }\n\n .AnimatedEmoji {\n margin-top: .5rem;\n margin-bottom: 1.5rem;\n }\n}\n\n.settings-content-header {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 0 1.5rem 1rem;\n text-align: center;\n\n .input-group {\n width: 100%;\n }\n}\n\n.settings-content-icon {\n width: 5rem;\n height: 5rem;\n margin-bottom: 2.5rem;\n position: relative;\n\n .AnimatedSticker {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n\n &.hidden {\n display: none\n }\n }\n}\n\n.settings-main-menu {\n padding: 0 0.5rem .75rem;\n\n > .ChatExtra {\n padding: 0 .5rem .3125rem;\n margin: 0 -.5rem .625rem;\n box-shadow: inset 0 -.0625rem 0 0 var(--color-background-secondary-accent);\n border-bottom: .625rem solid var(--color-background-secondary);\n\n .ListItem.narrow {\n margin-bottom: .25rem;\n }\n }\n}\n\n.settings-item {\n border-top: 1px solid var(--color-borders);\n padding: 1.5rem 1.5rem 1rem;\n\n &.no-border {\n border-top: none;\n }\n\n &-header {\n font-size: 1rem;\n color: var(--color-text-secondary);\n margin-bottom: 2rem;\n position: relative;\n\n &[dir=rtl] {\n text-align: right;\n }\n }\n\n &-slider {\n margin-top: 2rem;\n }\n\n &-description {\n font-size: 0.875rem;\n color: var(--color-text-secondary);\n margin-top: -0.5rem;\n margin-bottom: 1.5rem;\n\n .settings-content.two-fa & {\n font-size: 1rem;\n }\n\n &[dir=rtl] {\n text-align: right;\n unicode-bidi: plaintext;\n }\n }\n\n &-description-larger {\n font-size: 1rem;\n line-height: 1.3125rem;\n color: var(--color-text-secondary);\n margin-top: 2rem;\n margin-bottom: 0.75rem;\n\n &[dir=rtl] {\n text-align: right;\n }\n }\n\n .ListItem {\n margin: 0 -1rem 1rem;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n .multiline-menu-item {\n white-space: initial;\n\n &.full-size {\n width: 100%;\n }\n\n .date {\n float: right;\n font-size: 0.75rem;\n margin-left: 1rem;\n color: var(--color-text-secondary);\n }\n\n .title, .subtitle {\n display: block;\n text-align: left;\n }\n\n .title {\n line-height: 1.25rem;\n }\n\n .subtitle {\n font-size: 0.875rem;\n line-height: 1.5rem;\n color: var(--color-text-secondary);\n\n & + .subtitle {\n margin-top: -0.25rem;\n }\n\n &.black {\n color: var(--color-text);\n }\n\n &.tight {\n line-height: 1.3125rem;\n margin-bottom: .1875rem;\n }\n }\n }\n\n &.destructive {\n .ListItem-button {\n color: var(--color-error);\n\n i {\n color: inherit;\n }\n }\n }\n\n &.blocked-list-item {\n margin-bottom: 0.5rem;\n\n .ListItem-button {\n align-items: center;\n text-align: left;\n padding: 0.5rem;\n }\n\n .Avatar {\n width: 3rem;\n height: 3rem;\n margin-right: 1rem;\n }\n\n .contact-name {\n font-size: 1rem;\n line-height: 1rem;\n margin-bottom: 0.25rem;\n font-weight: 500;\n }\n\n .contact-phone {\n font-size: 0.875rem;\n line-height: 1rem;\n color: var(--color-text-secondary);\n }\n }\n\n &[dir=rtl] {\n .multiline-menu-item {\n .title, .subtitle {\n text-align: right;\n }\n\n .date {\n float: left;\n margin-left: 0;\n margin-right: 1rem;\n }\n }\n }\n }\n\n .RangeSlider {\n margin-bottom: 1.0625rem;\n }\n\n .Checkbox, .radio-group {\n margin: 0 -1rem 0.5rem;\n }\n\n .radio-group {\n .Radio:last-child {\n margin-bottom: 0;\n }\n }\n\n .Radio + .Radio, .Checkbox + .Checkbox {\n margin-top: 2rem;\n }\n}\n\n.settings-fab-wrapper {\n height: calc(100% - var(--header-height));\n position: relative;\n overflow: hidden;\n\n .settings-content {\n height: 100%;\n }\n\n .FloatingActionButton {\n right: 1.5rem;\n }\n}\n\n.settings-edit-profile {\n padding: 0 1.5rem;\n}\n\n.username-link {\n color: var(--color-links);\n}\n","// @optimization\n@mixin while-transition() {\n .Transition > div:not(.active) &, body.animating-right-column & {\n @content;\n }\n}\n\n@mixin overflow-y-overlay() {\n @supports (overflow-y: overlay) {\n overflow-y: overlay;\n\n //Workaround for Android <= 9\n overflow-x: hidden;\n }\n}\n\n@mixin reset-range() {\n input[type=\"range\"] {\n -webkit-appearance: none;\n display: block;\n width: 100%;\n height: 0.75rem;\n margin-bottom: 0.5rem;\n background: transparent;\n\n &:focus {\n outline: none;\n }\n\n &::-ms-track {\n width: 100%;\n cursor: pointer;\n\n background: transparent;\n border-color: transparent;\n color: transparent;\n }\n\n &::-webkit-slider-thumb {\n -webkit-appearance: none;\n }\n\n &::-moz-slider-thumb {\n -moz-appearance: none;\n }\n\n &::-webkit-slider-runnable-track {\n cursor: pointer;\n }\n\n &::-moz-range-track, &::-moz-range-progress {\n cursor: pointer;\n }\n }\n}\n",".NewChat {\n height: 100%;\n overflow: hidden;\n position: relative;\n\n &-inner {\n height: calc(100% - var(--header-height));\n overflow: hidden;\n\n &.step-2 {\n padding: 0 1.25rem;\n display: flex;\n flex-direction: column;\n\n .note, .error {\n font-size: 0.875rem;\n line-height: 1.25rem;\n margin: 1.5rem 0.25rem;\n }\n\n .error {\n color: var(--color-error);\n }\n\n .note {\n margin-top: -0.5625rem;\n color: var(--color-text-secondary);\n }\n\n .chat-members-heading {\n color: var(--color-text-secondary);\n font-size: 1rem;\n font-weight: 500;\n margin: 1rem 0.25rem;\n }\n\n .chat-members-list {\n margin: 0 -1.25rem;\n padding: 0 1rem 1rem;\n\n overflow-x: hidden;\n flex-grow: 1;\n }\n }\n }\n}\n",".ArchivedChats {\n height: 100%;\n overflow: hidden;\n\n .chat-list {\n height: calc(100% - var(--header-height));\n }\n}\n",".MessageContextMenu {\n position: absolute;\n font-size: 1rem;\n\n .bubble {\n transform: scale(0.5);\n transition: opacity .15s cubic-bezier(0.2, 0, 0.2, 1), transform .15s cubic-bezier(0.2, 0, 0.2, 1) !important;\n overflow: auto;\n overflow: overlay;\n }\n\n .backdrop {\n touch-action: none;\n }\n}\n",".StickerSetModal {\n .modal-dialog {\n width: 26.25rem;\n max-width: 100%;\n }\n\n @media (max-width: 600px) {\n .modal-dialog {\n width: 18.875rem;\n }\n }\n\n .modal-header {\n padding: 0.5rem 1rem;\n }\n\n .modal-content {\n text-align: center;\n padding: 0;\n }\n\n .stickers {\n position: relative;\n width: 100%;\n height: 19rem;\n max-height: 50vh;\n overflow-y: auto;\n padding: 0 0.25rem;\n text-align: left;\n }\n\n .button-wrapper {\n padding: 0.5rem 0;\n border-top: 1px solid var(--color-borders);\n box-shadow: 0 0 2px var(--color-default-shadow);\n\n button {\n display: inline-block;\n }\n }\n\n .Loading {\n width: 100%;\n height: 22.8125rem;\n max-height: calc(50vh + 3.8125rem);\n }\n}\n\n",".HeaderMenuContainer {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n height: 100vh;\n z-index: var(--z-header-menu);\n\n .Menu {\n position: absolute;\n font-size: 1rem;\n\n .backdrop {\n z-index: var(--z-header-menu-backdrop);\n }\n\n .bubble {\n z-index: var(--z-header-menu);\n --offset-y: calc(100% + 1rem);\n }\n }\n}\n","#MobileSearch > .header {\n position: absolute;\n top: 0;\n left: 0;\n z-index: var(--z-mobile-search);\n width: 100%;\n height: 3.5rem;\n background: var(--color-background);\n display: flex;\n align-items: center;\n padding: 0 0.5rem 0 0.25rem;\n\n @supports (padding-left: env(safe-area-inset-left)) {\n padding-left: #{\"max(0.25rem, env(safe-area-inset-left))\"};\n padding-right: #{\"max(0.5rem, env(safe-area-inset-right))\"};\n }\n\n > .SearchInput {\n margin-left: 0.25rem;\n flex: 1;\n }\n}\n\n#MobileSearch > .footer {\n position: absolute;\n bottom: 0;\n left: 0;\n z-index: var(--z-mobile-search);\n width: 100%;\n height: 3.5rem;\n background: var(--color-background);\n display: flex;\n align-items: center;\n padding-left: 1rem;\n padding-right: 0.5rem;\n\n @supports (padding-bottom: env(safe-area-inset-bottom)) {\n padding-left: #{\"max(1rem, env(safe-area-inset-left))\"};\n padding-right: #{\"max(0.5rem, env(safe-area-inset-right))\"};\n\n body:not(.keyboard-visible) & {\n padding-bottom: env(safe-area-inset-bottom);\n height: calc(3.5rem + env(safe-area-inset-bottom));\n }\n }\n\n > .counter {\n flex: 1;\n color: var(--color-text-secondary);\n }\n}\n\n#MobileSearch:not(.active) {\n .header, .footer {\n // `display: none` will prevent synchronous focus on iOS\n transform: translateX(-999rem);\n }\n}\n",".MentionTooltip {\n width: calc(100% - 4rem);\n max-width: 20rem;\n flex-direction: column;\n\n z-index: -1;\n\n @media (max-width: 600px) {\n width: calc(100% - 3rem);\n }\n\n .ListItem.chat-item-clickable {\n margin: 0;\n\n .ListItem-button {\n border-radius: 0;\n }\n\n .info {\n display: flex;\n }\n\n .title {\n margin-inline-end: .625rem;\n max-width: 70%;\n }\n\n .handle {\n font-size: 1rem;\n }\n\n &[dir=rtl] {\n .status {\n width: auto;\n }\n }\n }\n\n .ChatInfo {\n .title h3 {\n line-height: 1.25;\n }\n\n .Avatar {\n margin-right: 0.7em;\n }\n\n .handle {\n &::before {\n content: '@';\n }\n }\n\n .user-status {\n display: none !important;\n }\n }\n}\n",".AttachmentModal {\n --border-radius-default: 0.625rem;\n\n .modal-dialog {\n max-width: 26.25rem;\n @media(max-width: 600px) {\n max-height: 100%;\n padding-bottom: 1.5rem;\n }\n }\n\n .modal-content {\n padding: .5rem 1.25rem 1.875rem;\n max-height: calc(100vh - 3.25rem);\n @media(max-width: 600px) {\n padding-bottom: .25rem;\n }\n }\n\n .media-wrapper {\n max-height: 26rem;\n overflow: auto;\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 1.5rem;\n\n video,\n img {\n flex: 1;\n width: calc(50% - 0.15rem);\n height: 12rem;\n margin-bottom: 0.3rem;\n border-radius: var(--border-radius-default);\n object-fit: cover;\n\n &:only-child {\n height: auto;\n max-height: 25rem;\n margin-bottom: 0;\n }\n\n &:nth-child(even) {\n margin-left: 0.3rem;\n }\n }\n }\n\n .document-wrapper {\n max-height: 25rem;\n overflow: auto;\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n margin: .75rem 0 1.75rem;\n\n .File:not(:last-child) {\n margin-bottom: 1.5rem;\n }\n\n .file-icon {\n cursor: default !important;\n }\n }\n\n .attachment-caption-wrapper {\n position: relative;\n\n .form-control {\n background: var(--color-background);\n }\n\n .MentionTooltip {\n right: 0 !important;\n z-index: 0;\n }\n }\n\n .drop-target {\n position: relative;\n\n &::before,\n &::after {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n right: 0;\n bottom: 0;\n border-radius: var(--border-radius-default);\n pointer-events: none;\n\n opacity: 0;\n transition: 250ms opacity;\n z-index: 1;\n }\n\n &::before {\n background-image: var(--drag-target-border-hovered);\n background-color: var(--color-background);\n }\n\n &::after {\n content: attr(data-attach-description);\n display: flex;\n justify-content: center;\n align-items: center;\n color: var(--color-primary);\n }\n }\n\n &.hovered {\n .drop-target::before {\n opacity: .95;\n }\n\n .drop-target::after {\n opacity: 1;\n }\n\n .attachment-caption-wrapper,\n .document-wrapper,\n .media-wrapper {\n pointer-events: none;\n }\n\n .document-wrapper,\n .media-wrapper {\n border-radius: var(--border-radius-default);\n }\n }\n}\n",".PollModal {\n .modal-dialog {\n max-width: 26.25rem;\n max-height: calc(100vh - 5rem);\n }\n\n .modal-content {\n padding: .5rem 1.25rem 1.875rem;\n min-height: 4.875rem;\n }\n\n .modal-header-condensed {\n margin-bottom: 1rem;\n }\n\n .options-header {\n color: var(--color-text-secondary);\n font-size: 1rem;\n font-weight: 500;\n margin: 1.5rem 0.25rem;\n }\n\n .options-list {\n margin: 1rem -0.75rem -0.5rem;\n padding: 0 0.75rem;\n border-top: 1px solid var(--color-chat-hover);\n max-height: 20rem;\n overflow: auto;\n\n &.overflown {\n padding: 0 0.4rem 0.5rem 0.75rem;\n }\n\n @media (max-width: 600px) {\n overflow: hidden;\n max-height: none;\n\n &, &.overflown {\n padding: 0 0.75rem;\n }\n }\n }\n\n .option-wrapper {\n position: relative;\n\n .form-control {\n padding-right: 3rem;\n }\n\n .option-remove-button {\n position: absolute;\n top: 0.3125rem;\n right: 0.3125rem;\n }\n }\n\n .quiz-mode {\n margin-top: 1.5rem;\n\n .options-header {\n margin-bottom: 0.5rem;\n }\n\n .note {\n margin-top: 0.5rem;\n }\n }\n\n .note {\n font-size: smaller;\n color: var(--color-text-secondary)\n }\n\n .error {\n font-size: smaller;\n color: var(--color-error);\n margin: -1rem 0 1rem .25rem;\n }\n\n .input-group:last-child {\n margin-bottom: 0.5rem;\n }\n}\n",".EmojiButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 2.5rem;\n height: 2.5rem;\n margin: 0.125rem;\n border-radius: var(--border-radius-messages-small);\n cursor: pointer;\n font-size: 1.75rem;\n line-height: 2.5rem;\n background-color: transparent;\n transition: background-color .15s ease;\n\n .mac-os-fix & {\n line-height: inherit;\n }\n\n &.focus,\n &:hover {\n background-color: var(--color-background-selected);\n }\n\n & > img {\n width: 2rem;\n height: 2rem;\n }\n}\n",".EmojiPicker {\n height: 100%;\n\n &-main {\n height: calc(100% - 3rem);\n overflow-y: auto;\n padding: 0.5rem;\n\n @media (max-width: 600px) {\n padding: 0.5rem 0.25rem;\n }\n\n .symbol-set-container {\n display: flex;\n flex-wrap: wrap;\n }\n }\n\n &-header {\n height: 3rem;\n border-bottom: 1px solid var(--color-borders);\n display: flex;\n align-items: center;\n justify-content: space-around;\n box-shadow: 0 0 2px var(--color-default-shadow);\n\n @media (max-width: 600px) {\n overflow-x: auto;\n overflow-y: hidden;\n display: block;\n white-space: nowrap;\n padding: 0.4375rem 0;\n\n scrollbar-width: none;\n scrollbar-color: rgba(0, 0, 0, 0);\n\n &::-webkit-scrollbar {\n height: 0;\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, 0);\n }\n\n .symbol-set-button {\n display: inline-flex;\n vertical-align: middle;\n }\n\n // Spacer to counter last button margin not being accounted in scroll width\n &::after {\n content: \"\";\n display: block;\n flex-shrink: 0;\n width: 0.1px;\n height: 1rem;\n }\n }\n }\n}\n",".StickerPicker {\n height: 100%;\n\n &-main {\n position: relative;\n height: calc(100% - 3rem);\n overflow-y: auto;\n padding: 0.5rem;\n\n @media (max-width: 600px) {\n padding: 0.5rem 0.25rem;\n }\n }\n\n &-header {\n height: 3rem;\n border-bottom: 1px solid var(--color-borders);\n padding: 0.125rem 0;\n overflow-x: auto;\n overflow-y: hidden;\n white-space: nowrap;\n box-shadow: 0 0 2px var(--color-default-shadow);\n\n scrollbar-width: none;\n scrollbar-color: rgba(0, 0, 0, 0);\n\n &::-webkit-scrollbar {\n height: 0;\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, 0);\n }\n\n // Spacer to counter last button margin not being accounted in scroll width\n &::after {\n content: \"\";\n display: block;\n flex-shrink: 0;\n width: 0.1px;\n height: 1rem;\n }\n\n\n .sticker-set-button {\n display: inline-flex;\n vertical-align: middle;\n\n &.StickerButton {\n background-size: 2rem;\n\n img, .AnimatedSticker {\n top: 0.375rem;\n left: 0.375rem;\n width: 2rem;\n height: 2rem;\n }\n }\n\n .sticker-set-cover {\n width: 2rem;\n height: 2rem;\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n\n img, .AnimatedSticker {\n width: 100%;\n height: 100%;\n position: absolute;\n top: 0;\n left: 0;\n }\n }\n }\n }\n\n .symbol-set-container {\n width: 25rem;\n line-height: 0;\n\n @media (max-width: 600px) {\n width: 100%;\n }\n }\n\n .sticker-set-button {\n width: 2.75rem !important;\n height: 2.75rem;\n margin: 0 0.25rem;\n border-radius: var(--border-radius-messages-small);\n }\n}\n",".GifButton {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 6.25rem;\n background-color: transparent;\n cursor: pointer;\n overflow: hidden;\n position: relative;\n\n &:last-child {\n margin-bottom: 1rem;\n }\n\n &.vertical {\n grid-column-end: span 1;\n }\n\n &.horizontal {\n grid-column-end: span 2;\n }\n\n .thumbnail {\n width: 100%;\n height: 100%;\n background-size: cover !important;\n background: transparent no-repeat center;\n }\n\n .preview, video {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .Spinner {\n position: absolute;\n pointer-events: none;\n }\n}\n",".GifPicker {\n display: grid;\n grid-template-columns: repeat(6, 1fr);\n grid-auto-rows: 6.25rem;\n grid-gap: 0.25rem;\n grid-auto-flow: dense;\n height: 100%;\n overflow-y: auto;\n padding: 0.25rem;\n\n .Loading, .picker-disabled {\n grid-column: 1 / -1;\n height: var(--menu-height);\n }\n}\n","@import '../../../styles/mixins';\n\n.SymbolMenu {\n &.mobile-menu {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--color-background);\n transform: translate3d(0, calc(var(--symbol-menu-height) + var(--symbol-menu-footer-height)), 0);\n z-index: 1;\n\n transition: transform var(--layer-transition);\n @supports (padding-bottom: env(safe-area-inset-bottom)) {\n padding-right: env(safe-area-inset-right);\n padding-bottom: env(safe-area-inset-bottom);\n padding-left: env(safe-area-inset-left);\n transform: translate3d(0, calc(var(--symbol-menu-height) + var(--symbol-menu-footer-height) + env(safe-area-inset-bottom)), 0);\n }\n\n &.open {\n transform: translate3d(0, 0, 0);\n\n body.is-media-viewer-open & {\n transform: translate3d(0, calc(var(--symbol-menu-height) + var(--symbol-menu-footer-height)), 0);\n }\n }\n\n body.animation-level-0 & {\n transition: none;\n }\n\n &:not(.middle-column-open) {\n transform: translate3d(100vw, 0, 0) !important;\n }\n }\n\n &-main {\n width: var(--symbol-menu-width);\n height: var(--symbol-menu-height);\n max-height: calc(100vh - var(--symbol-menu-footer-height));\n @supports (padding-bottom: env(safe-area-inset-bottom)) {\n max-height: calc(100vh - var(--symbol-menu-footer-height) - env(safe-area-inset-bottom));\n }\n }\n\n &-footer {\n height: var(--symbol-menu-footer-height);\n border-top: 1px solid var(--color-borders);\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 0 2px var(--color-default-shadow);\n position: relative;\n\n .Button {\n flex-shrink: 0;\n width: 2.125rem !important;\n height: 2.125rem;\n margin: 0 .25rem;\n padding: 0;\n\n &.activated {\n pointer-events: none;\n }\n\n &.symbol-tab-button {\n margin: 0 0.75rem;\n }\n\n &.symbol-search-button {\n position: absolute;\n left: 0.25rem;\n }\n\n &.symbol-delete-button {\n position: absolute;\n right: 0.25rem;\n }\n }\n }\n\n .Transition.slide {\n height: 100%;\n\n .Loading {\n height: var(--symbol-menu-height);\n }\n }\n\n .is-pointer-env & {\n > .backdrop {\n position: absolute;\n top: -1rem;\n left: 0;\n right: auto;\n width: 3.5rem;\n height: 4.5rem;\n }\n }\n\n .Button.bot-commands ~ & {\n .is-pointer-env & > .backdrop {\n left: 3rem;\n width: 3.25rem;\n }\n }\n\n .bubble {\n padding: 0;\n width: var(--symbol-menu-width);\n overflow: hidden;\n }\n\n .picker-disabled {\n height: var(--symbol-menu-height);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-text-secondary);\n }\n\n .symbol-close-button {\n display: none;\n position: absolute;\n right: .25rem;\n top: .25rem;\n\n @supports (right: env(safe-area-inset-right)) {\n right: #{\"max(.25rem, env(safe-area-inset-right))\"};\n top: #{\"max(.25rem, env(safe-area-inset-top))\"};\n }\n }\n\n @media (orientation: landscape) {\n .symbol-close-button {\n display: block;\n }\n }\n}\n\n.symbol-set {\n margin-bottom: 1rem;\n\n &-name {\n font-size: 1rem;\n line-height: 1.6875rem;\n font-weight: 500;\n margin: 0;\n padding-left: 0.5rem;\n color: rgba(var(--color-text-secondary-rgb), 0.75);\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-align: initial;\n unicode-bidi: plaintext;\n }\n\n &-container {\n text-align: initial;\n }\n\n &-button {\n flex-shrink: 0;\n width: 2.125rem !important;\n height: 2.125rem;\n margin: 0 0.25rem;\n padding: 0;\n }\n\n @include while-transition() {\n overflow: hidden;\n }\n\n .symbol-set-container {\n &:not(.shown) {\n display: block;\n }\n\n &.closing {\n transition: none;\n }\n }\n}\n",".AttachMenu {\n position: relative;\n\n .is-pointer-env & {\n > .backdrop {\n position: absolute;\n top: -1rem;\n left: auto;\n right: 0;\n width: 3.5rem;\n }\n }\n\n\n .media-disabled > button {\n white-space: normal;\n }\n}\n",".BotCommand {\n margin: 0 !important;\n\n .ListItem-button {\n border-radius: 0;\n }\n\n .multiline-item {\n padding: 0 1rem;\n\n .subtitle {\n padding-top: .25rem;\n line-height: 1.3125;\n }\n }\n\n &.with-avatar {\n .multiline-item {\n padding: 0;\n display: flex;\n }\n\n .content-inner {\n flex: 1;\n }\n }\n}\n",".BotCommandTooltip {\n width: calc(100% - 4rem);\n max-width: 26rem;\n flex-direction: column;\n\n z-index: -1;\n\n @media (max-width: 600px) {\n width: calc(100% - 3rem);\n }\n}\n",".BotCommandMenu {\n .menu-container {\n width: calc(100% - 4rem);\n max-width: 20rem;\n max-height: 40vh;\n overflow: auto;\n flex-direction: column;\n\n @media (max-width: 600px) {\n width: calc(100% - 3rem);\n }\n }\n\n .is-pointer-env & {\n > .backdrop {\n position: absolute;\n top: -1rem;\n left: 0;\n right: auto;\n width: 3.5rem;\n height: 4.5rem;\n }\n }\n}\n",".StickerTooltip {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(5rem, 1fr));\n grid-auto-rows: auto;\n place-items: center;\n\n &.hidden {\n display: none;\n }\n}\n",".CustomSendMenu {\n position: relative;\n bottom: 3.5rem;\n\n .is-pointer-env & {\n > .backdrop {\n position: absolute;\n top: -1rem;\n left: auto;\n right: 0;\n width: 3.5rem;\n }\n }\n\n\n .media-disabled > button {\n white-space: normal;\n }\n\n .bubble {\n width: 16rem;\n }\n}\n",".EmojiTooltip {\n display: flex;\n padding-left: .25rem;\n\n overflow-x: auto;\n @supports (overflow-x: overlay) {\n overflow-x: overlay;\n }\n overflow-y: hidden;\n\n .EmojiButton {\n flex: 0 0 2.5rem\n }\n}\n",".BaseResult {\n &.chat-item-clickable > .ListItem-button {\n padding-left: 1.25rem !important;\n padding-right: 1.25rem !important;\n\n .title {\n display: block;\n text-overflow: ellipsis;\n }\n }\n\n .thumb {\n background-color: var(--color-background-secondary);\n flex: 0 0 3rem;\n width: 3rem;\n height: 3rem;\n line-height: 3rem;\n border-radius: var(--border-radius-default-tiny);\n display: inline-flex;\n align-content: center;\n justify-content: center;\n margin-inline-end: .5rem;\n overflow: hidden;\n font-size: 1.5rem;\n\n img:not(.emoji) {\n width: 100%;\n object-fit: cover;\n }\n\n img.emoji {\n width: 1.5rem;\n height: 1.5rem;\n margin: .75rem 0 0;\n }\n }\n\n .content-inner {\n min-width: 0;\n }\n\n .title {\n font-weight: 500;\n text-align: left;\n unicode-bidi: plaintext;\n }\n\n .description {\n white-space: normal;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n text-overflow: ellipsis;\n text-align: left;\n unicode-bidi: plaintext;\n }\n &[dir=rtl] .title,\n &[dir=rtl] .description {\n text-align: right;\n }\n}\n",".MediaResult {\n height: 0;\n padding-bottom: 100%;\n overflow: hidden;\n position: relative;\n cursor: pointer;\n\n img {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n}\n",".InlineBotTooltip {\n .switch-pm .title {\n margin: 0 auto;\n font-weight: 500;\n }\n\n --border-radius-default: 0;\n\n &.gallery {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n grid-gap: 1px;\n padding: 0;\n\n @media (max-width: 600px) {\n grid-template-columns: repeat(3, 1fr);\n }\n\n .switch-pm {\n grid-column: 1 / -1;\n .ListItem-button {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n\n .GifButton {\n grid-column-end: initial;\n }\n\n .StickerButton {\n width: initial;\n height: 0;\n margin: 0;\n padding-bottom: 100%;\n border-radius: 0;\n\n .AnimatedSticker, img, canvas {\n position: absolute;\n top: 0;\n left: 0;\n width: 100% !important;\n height: 100% !important;\n\n @media (min-width: 600px) {\n top: .25rem;\n left: .25rem;\n width: calc(100% - .5rem) !important;\n height: calc(100% - .5rem) !important;\n }\n }\n }\n }\n}\n",".RightSearch {\n height: 100%;\n padding: 0 0.5rem;\n overflow-y: auto;\n\n .helper-text {\n padding: 1rem;\n margin-bottom: 0.125rem;\n font-weight: 500;\n color: var(--color-text-secondary);\n unicode-bidi: plaintext;\n text-align: initial;\n }\n}\n",".StickerSearch {\n height: 100%;\n padding: 0 0.5rem;\n overflow-y: auto;\n\n .helper-text {\n padding: 1rem;\n margin-bottom: 0.125rem;\n font-weight: 500;\n color: var(--color-text-secondary);\n }\n\n .sticker-set {\n margin-bottom: 1rem;\n\n &-header {\n display: flex;\n justify-content: space-between;\n padding: 0.5rem;\n\n .title-wrapper {\n overflow: hidden;\n }\n\n .title {\n font-size: 1rem;\n line-height: 1.6875rem;\n margin: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .count {\n color: var(--color-text-secondary);\n margin: 0;\n }\n\n .Button {\n flex-shrink: 0;\n margin-left: 1rem;\n\n &.is-added {\n background: var(--color-chat-hover);\n color: var(--color-text-secondary);\n\n &:hover, &:active {\n background: var(--color-item-active) !important;\n }\n }\n }\n }\n\n &-main {\n display: flex;\n flex-wrap: nowrap;\n overflow: hidden;\n }\n\n &[dir=rtl] {\n .title-wrapper {\n text-align: right;\n }\n\n .Button {\n margin-left: 0;\n margin-right: 1rem;\n }\n }\n }\n\n .StickerButton {\n margin: 0.125rem;\n }\n}\n",".GifSearch {\n height: 100%;\n padding: 0.25rem;\n\n .gif-container {\n height: 100%;\n overflow: auto;\n\n &.grid {\n display: grid;\n grid-template-columns: repeat(6, 1fr);\n grid-auto-rows: 6.25rem;\n grid-gap: 0.25rem;\n grid-auto-flow: dense;\n }\n }\n\n .helper-text {\n color: var(--color-text-meta);\n margin-top: 2rem;\n text-align: center;\n }\n}\n",".PollAnswerResults {\n border-bottom: 1px solid var(--color-borders);\n padding: 0 .5rem .625rem;\n display: flex;\n flex-direction: column-reverse;\n\n .answer-head {\n display: flex;\n align-items: center;\n font-size: .9375rem;\n line-height: 1.3125rem;\n font-weight: 500;\n color: var(--color-text-secondary);\n padding: 1rem .75rem .5rem 1rem;\n position: sticky;\n top: 0;\n background: var(--color-background);\n\n @media (max-width: 600px) {\n padding: .5rem .25rem .5rem .5rem;\n }\n }\n\n .answer-percent {\n margin-left: auto;\n\n &[dir=auto] {\n margin-left: 0;\n margin-right: auto;\n }\n }\n\n .poll-voters {\n padding: 0 .75rem;\n position: relative;\n min-height: 3rem;\n\n @media (max-width: 600px) {\n padding: 0 .25rem;\n }\n\n .Spinner {\n --spinner-size: 1.25rem;\n }\n }\n\n .chat-item-clickable {\n .ChatInfo .Avatar.size-tiny {\n margin-right: 1.75rem;\n }\n\n &[dir=rtl] {\n .ChatInfo .Avatar.size-tiny {\n margin-left: 1.75rem;\n margin-right: 0;\n }\n }\n }\n\n .ShowMoreButton {\n margin: .25rem 0 0 -0.5rem;\n width: calc(100% + 1rem);\n\n &[dir=rtl] {\n .icon-down {\n margin-left: 2rem;\n margin-right: 0;\n }\n }\n }\n\n .icon-down {\n vertical-align: middle;\n margin-right: 2rem;\n font-size: 1.5rem;\n }\n}\n",".PollResults {\n height: 100%;\n position: relative;\n display: flex;\n flex-direction: column;\n pointer-events: auto;\n\n > .Loading {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n background: rgba(white, 0.75);\n }\n\n .poll-question {\n padding: .75rem 1.5rem;\n flex-shrink: 0;\n font-size: 1.25rem;\n\n @media (max-width: 600px) {\n padding: 0 1rem;\n }\n }\n\n .poll-results-list {\n border-top: 1px solid var(--color-borders);\n flex-grow: 1;\n overflow: auto;\n }\n}\n",".Management {\n position: relative;\n height: 100%;\n\n & > .custom-scroll {\n height: 100%;\n overflow-y: scroll;\n overflow-x: hidden;\n }\n\n .section {\n padding: 1rem 1.5rem;\n border-top: 1px solid var(--color-borders);\n\n &.wide {\n padding: 1.5rem;\n }\n\n &:first-of-type {\n border-top: none;\n padding-top: 1rem;\n }\n\n &.no-border {\n border-top: none;\n }\n\n > .ChatInfo {\n margin: 0 0 2rem !important;\n\n .title h3 {\n margin-bottom: 0;\n }\n }\n\n .section-icon {\n width: 8.75rem;\n height: 8.75rem;\n margin: 0 auto 2rem;\n position: relative;\n\n .AnimatedSticker {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n\n &.hidden {\n display: none\n }\n }\n }\n\n .ListItem {\n margin: 0 -.75rem;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n .multiline-item .subtitle {\n line-height: 1.25rem;\n }\n\n &:not(.picker-list-item) .Checkbox {\n margin-top: 2rem;\n margin-bottom: 2rem;\n }\n\n &.narrow {\n .Checkbox {\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n }\n\n &.exceptions-member {\n .ChatInfo .status {\n white-space: pre-wrap;\n }\n }\n }\n\n .section-heading {\n font-weight: 500;\n font-size: .9375rem;\n color: var(--color-text-secondary);\n\n &[dir=auto] {\n text-align: initial;\n }\n }\n\n .section-help {\n color: var(--color-text-secondary);\n line-height: 1.375rem;\n\n &[dir=auto] {\n text-align: initial;\n }\n }\n\n .section-info {\n color: var(--color-text-secondary);\n font-size: .875rem;\n }\n\n &[dir=rtl] {\n text-align: right;\n }\n }\n\n textarea.form-control {\n height: auto;\n }\n\n .group-link {\n color: var(--color-text);\n }\n\n .radio-group {\n margin-top: 2rem;\n\n .Radio {\n padding-left: 3.5rem;\n margin-bottom: 2rem;\n\n &:last-child {\n margin-bottom: .625rem;\n }\n }\n\n .Radio-main {\n &::before {\n left: 0.125rem;\n top: .25rem;\n transform: none;\n }\n\n &::after {\n left: 0.4375rem;\n top: .5625rem;\n transform: none;\n }\n }\n }\n}\n\n.ManageGroupMembers {\n padding: 0.5rem 1rem;\n}\n",".ShippingInfo {\n padding: 0.5rem 1rem;\n\n h5 {\n font-size: 0.9rem;\n color: var(--color-text-secondary);\n margin: 1rem 0 1.1rem;\n }\n}",".Shipping {\n padding: 0.5rem 1rem;\n\n form {\n p {\n color: var(--color-text-secondary);\n font-weight: 500;\n margin: .5rem 0 2rem;\n }\n\n .Radio {\n margin-bottom: 2rem;\n }\n }\n}",".Checkout {\n padding: 0.5rem 0;\n\n .description {\n display: flex;\n flex-direction: row;\n margin: 0 1rem;\n\n img {\n height: 6rem;\n margin: .5rem;\n }\n\n .text {\n h5 {\n margin-top: .5rem;\n font-size: 1.125rem;\n }\n\n p {\n font-size: 0.8rem;\n line-height: 1rem;\n color: var(--color-text-secondary);\n }\n }\n }\n\n .price-info {\n margin: 1rem;\n\n .price-info-item {\n margin: 1rem .5rem;\n display: flex;\n flex-direction: row;\n align-content: space-between;\n color: var(--color-text-secondary);\n font-weight: 500;\n \n &-main{\n color: var(--color-text);\n }\n \n .title {\n display: flex;\n flex: 1 auto;\n }\n }\n }\n\n .invoice-info {\n border-top: 1px var(--color-borders) solid;\n padding: 1rem;\n\n .checkout-info-item {\n display: flex;\n padding: .75rem .5rem 1rem;\n text-align: left;\n\n i {\n font-size: 1.5rem;\n color: var(--color-text-secondary);\n margin-right: 2rem;\n width: 1.5rem;\n }\n\n i.stripe-provider {\n background: url('../../assets/stripe-logo.png') no-repeat center;\n background-size: 2rem;\n border-radius: 1rem;\n height: 1.5rem;\n }\n\n .info {\n .title {\n font-size: 1rem;\n line-height: 1.4375rem;\n margin-bottom: 0;\n font-weight: 400;\n word-break: break-word;\n color: var(--color-text);\n text-transform: capitalize;\n }\n\n .data {\n margin-bottom: 0;\n font-size: 0.875rem;\n color: var(--color-text-secondary);\n }\n }\n }\n }\n \n}",".CardInput {\n position: relative;\n\n .input-group.has-left-addon .form-control{\n padding-left: 4rem;\n }\n\n .left-addon {\n position: absolute;\n top: .8rem;\n left: 1rem;\n z-index: 8;\n\n img {\n max-width: 2rem;\n }\n }\n}\n",".PaymentInfo {\n padding: 0.5rem 1rem;\n\n h5 {\n font-size: 0.9rem;\n color: var(--color-text-secondary);\n margin: 1rem 0 1.1rem;\n }\n\n .inline-inputs {\n display: flex;\n justify-content: space-between;\n\n .input-group {\n flex: 1 10rem;\n max-width: 45%;\n display: flex;\n }\n }\n}\n",".PaymentModal {\n .modal-backdrop {\n pointer-events: none;\n }\n\n .header {\n position: relative;\n border-top-left-radius: 10px;\n border-top-right-radius: 10px;\n width: 100%;\n padding: .25rem 1rem;\n display: flex;\n align-items: center;\n flex-direction: row;\n background: var(--color-background);\n border-bottom: 1px var(--color-borders) solid;\n\n h3 {\n margin-bottom: 0;\n margin-left: 1.5rem;\n unicode-bidi: plaintext;\n text-align: initial;\n }\n }\n\n .Transition {\n height: 25rem;\n }\n\n .empty-content {\n height: 25rem;\n max-height: 90%;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .receipt-content {\n height: 25rem;\n overflow-y: auto;\n }\n\n .content {\n overflow: auto;\n width: 100%;\n height: 100%;\n position: relative;\n }\n\n .footer {\n position: relative;\n border-bottom-left-radius: 10px;\n border-bottom-right-radius: 10px;\n width: 100%;\n padding: .75rem 1rem;\n background: var(--color-background);\n border-top: 1px var(--color-borders) solid;\n\n button {\n text-transform: none;\n font-weight: 500;\n }\n }\n\n .modal-dialog {\n width: 25rem;\n }\n\n .modal-content {\n padding:0;\n overflow: hidden;\n }\n}\n\n@media screen\n and (max-device-width: 640px)\n and (max-height: 640px)\n and (orientation: landscape) {\n .PaymentModal {\n .modal-dialog {\n max-height: 100%;\n }\n\n .Transition {\n height: 10rem;\n }\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"701.b9c40fbb5ff59255dc0a.css","mappings":"AAAA,YACE,aACA,qBACA,WACA,eAEA,WACA,wBAEA,kBACE,UAGF,oBACE,uBAEA,yBAHF,oBAII,cAIJ,kBACE,aACA,sBACA,uBACA,+BAGF,mBACE,oBACA,gBACA,gBACA,gBACA,uBAGF,kBACE,oBACA,kBACA,wB;ACvCJ,oBACE,aACA,yBACA,4BAEA,4BACE,2BAIJ,2BACE,kBACA,wBAEA,4CACE,kBACA,MACA,O;ACjBJ,mBACE,kBACA,SACA,eACA,WACA,wBAEA,uCACE,aAGF,0BAXF,mBAYI,mBAGF,yBAfF,mBAgBI,sBACA,mEAEA,gCACE,UACA,oBAEA,wDACE,UACA,oBAKN,gDACE,kBACA,0CACA,YACA,eACA,WACA,wBAEA,sDACE,UAGF,yBAZF,gDAaI,WAIJ,6BACE,UAGF,+BACE,gBACA,cACA,gBACA,kBACA,2BACA,mBACA,uBACA,mBAEA,0BAVF,+BAWI,oBAGF,sCACE,eACA,gBACA,oBAIA,iDACE,WACA,kBACA,cACA,eACA,aACA,gBACA,2BACA,2CACA,uBAEA,yBAXF,iDAYI,aACA,iBAMR,qBACE,yBAEA,sDAEE,0B;AChGN,qBACE,aACA,mBACA,kBACA,OACA,SACA,WACA,oBACA,kBACA,mEAEA,yCACE,aAGF,yBAfF,qBAgBI,eACA,6BACA,gBACA,+BAIA,8CACE,gBACA,UACA,eACA,iBAGF,wCACE,iBAGF,qDACE,iBAIJ,6BACE,cACA,UACA,cACA,eACA,yBALF,6BAMI,gBAIJ,6BACE,mBAGF,kCACE,cACA,mBAGF,iCACE,iBACA,yBAFF,iCAGI,kBAEF,mCACE,oBACA,yBAFF,mCAGI,kBAKN,yBACE,8CACE,kBAIJ,uCACE,kBACA,SACA,2BACA,mBACA,gBACA,uBAEA,yBARF,uCASI,gBACA,UACA,eACA,iBACA,kBACA,mDACE,eAKN,sCACE,kBACA,UACA,WACA,MACA,YACA,kBACA,eAEA,4CACE,kBACA,QACA,cACA,eACA,WACA,2BACA,uCACA,2CAGF,wIAGE,kBACA,MACA,OACA,YACA,2CAGF,+CACE,sCAGF,6CACE,gCAEA,oDACE,WACA,kBACA,aACA,cACA,kBACA,sCACA,QACA,QACA,oC;AC/IR,aACE,kBACA,oBACA,sBACA,gBAEA,iCACE,kBACA,MACA,QACA,SACA,OACA,qCACE,sBACA,uBAEF,uCACE,2BAIJ,yBArBF,aAuBI,WAGF,yBA1BF,aA2BI,kBAGF,0BA9BF,aA+BI,sBACS,yBACP,iBAIJ,mBACE,cACA,iCACA,YACA,mBACA,aACA,WACA,YACA,6BACA,wBAEA,0BAXF,mBAYI,gCAEO,+BACP,+BACA,0BAFO,+BAGL,gCAKN,0BACE,kBACA,SACA,QACA,gCACA,cACA,eACA,2CACA,uDACE,uCAGF,qCACE,kBACA,kBACA,aAIJ,gCACE,kBACA,MACA,OACA,WACA,YACA,aACA,mBACA,uBAEA,2CACE,2BACA,WACA,iBACA,kBACA,cACA,aACA,UACA,kBACA,qBACA,qBAGF,iDACE,e;ACtGN,cACE,kBACA,eACA,SACA,0BACA,2CACA,WACA,gBACA,gBACA,qCACA,+BACA,oBAEA,mBACE,8BACA,mBAGF,+CAEE,kBACA,aACA,aACA,cACA,WAEA,mDACE,iBAIJ,wBACE,WAGF,uBACE,YAGF,wBACE,kBACA,aACA,cACA,aACA,YAEA,8BACE,kBACA,QACA,cACA,eACA,WACA,2BACA,sCACA,2CAGF,6DAEE,kBACA,MACA,OACA,YACA,2CAGF,+BACE,gBACA,uBAEA,sCACE,WACA,kBACA,aACA,cACA,kBACA,oCACA,QACA,QACA,oCAIJ,8BACE,WACA,YACA,cACA,UACA,SACA,UACA,eACA,gBAEA,oDACE,iB;AC9FR,4BAEE,kBACA,WACA,YAGF,aACE,YACA,gEAGF,eACE,iCAEA,iCACE,gBAGF,uBACE,eACA,MACA,O;ACtBJ,aACE,eACA,MACA,OACA,YACA,YACA,0BACA,WACA,8BACA,gBAEA,aACA,2BACA,+BACA,kBACA,eACA,sBACA,mBAGA,yBACE,yBACA,mBAIA,sIACE,aAIJ,oCACE,mCAKA,sEACE,oBACA,gBAKF,gCACE,aAGF,uCACE,UAGF,0CACE,eACA,MACA,OACA,YACA,aACA,UACA,UAIJ,gCACE,aACA,mBACA,kBACA,kBACA,mCACA,YAEA,4CACE,WACA,YAGF,yBAbF,gCAcI,gBAEA,gDAhBJ,gCAiBM,kDAGF,oDACE,qBAIJ,gDAzBF,gCA0BI,mDAIJ,mDAEE,oBAGF,+DAEE,kBACA,oBACA,kBACA,WACA,YACA,aACA,mBACA,gBAGF,mCACE,kBACA,UACA,kBACA,YACA,oBACA,uBACA,mBAEA,8CACE,eACA,yBAFF,8CAGI,iBAGF,0BANF,8CAOI,gBAGF,kDACE,+BACA,0BAFF,kDAGI,gCAKN,8CACE,kBAEA,kDACE,kBACA,QACA,SACA,gCAIJ,uCACE,gBACA,iCACA,mBACA,yBAGF,oDACE,gBACA,YAGF,4CACE,YAIJ,yBACE,eACA,SACA,WACA,SACA,YACA,UACA,SACA,6DACA,iCACA,wBACA,UACA,wBACA,aACA,eACA,UAEA,yBAjBF,yBAkBI,YAGF,sEACE,UAGF,8BACE,OACA,yDACA,6CAEA,2CALF,8BAMI,gCAGF,uCACE,UACA,QACA,qBAEA,2CALF,uCAMI,UACA,kCAKN,8BACE,QACA,yDACA,0DAEA,2CALF,8BAMI,kCAGF,uCACE,OACA,WACA,qBAEA,2CALF,uCAMI,WACA,gCAKN,gCACE,qBACA,aACA,YACA,6BAEA,yBANF,gCAOI,UACA,gCACA,oBAEA,wDACE,UACA,oBAOV,OACE,kBACA,8BACA,8BACA,gBACA,gBACA,+CAEA,uBACE,4CAGF,cACE,kBAGF,mBACE,iFAGF,wBAEE,WACA,YACA,uCACA,yBACA,+C;ACtRJ,kBACE,8BAEA,gCACE,WACA,gBAEA,yBAJF,gCAKI,YAIJ,gCACE,aACA,mBACA,qBAEA,wCACE,mBAGF,6CACE,SACA,OAGF,8CACE,YACA,2BAEA,eACA,cACA,kBACA,oBACA,uBAIJ,iCACE,UACA,gBACA,aACA,sBAEA,8CACE,YACA,kBACA,gBACA,oBAIJ,8BACE,YACA,SACA,kBACA,aACA,mBACA,uBACA,kCAKE,yBADF,4EAEI,SAEA,6FACE,iB;ACpEV,SACE,eACA,MACA,OACA,YACA,aACA,uB;ACLA,6BACE,mBACA,4CACE,0BAIJ,2BACE,aACA,mBACA,uBACA,qBAEA,yCACE,eACA,kBAEA,qDACE,kBAEF,oDACE,iBAKN,uBACE,aACA,yBACA,sBAEA,+BACE,oBAEA,uCACE,iBAKN,+BACE,aACA,mBAEA,kCACE,OACA,qBACA,kBAEA,yBALF,kCAMI,oBAGF,0CACE,2BAIJ,8CACE,WACA,oBAIJ,2BACE,kBACA,mBACA,wBACA,gBACA,uBAEA,yBAPF,2BAQI,uBAGF,mCACE,gBACA,YAGF,qCACE,eAEA,2CACE,wDAGF,8CACE,sCACA,WAIJ,oCACE,YACA,oBAGF,mCACE,WACA,cACA,iBAGF,gCACE,kBACA,MACA,OACA,WACA,YACA,aACA,mBACA,uBACA,kBAIJ,iCACE,aACA,mBACA,uBACA,iBACA,4BAGF,8BACE,aACA,qCACA,W;ACjIJ,sBACE,kBACA,aACA,WACA,YACA,WACA,WACA,uBACA,SA4BA,UA1BA,uDAVF,sBAWI,mDAGF,mDACE,qBACA,sBAGF,mCACE,WACA,yBAFF,mCAGI,yBAIJ,yBA1BF,sBA2BI,UACA,WACA,eAEA,mCACE,cAMJ,4BACE,oBACA,+EAGF,kDACE,kCAGF,kHAEE,SAGF,6CACE,2BAGF,kCACE,UACA,oBAEA,+CACE,iDAGF,4EACE,2FAGF,kFACE,kEAIJ,8BACE,WACA,gBACA,WACA,UACA,WAGF,4BACE,WACA,gBACA,aACA,mBACA,eAEA,mCACA,4CACA,iDACA,gBAEA,yBAZF,4BAaI,UACA,gBAGF,oCACE,WACA,YAEA,yBAJF,oCAKI,eACA,iBAKN,4BACE,iBACA,mBACA,gBACA,uBACA,YAEA,yBAPF,4BAQI,oBAIJ,8BACE,iBACA,aAEA,oCACE,WACA,gBACA,uBACA,2BACA,wBACA,aACA,kBACA,gBACA,mBACA,mBACA,wBACA,oCACA,eACA,uBAEA,iBACA,kBAEA,sCACE,iBACA,kCAGF,gDACE,yBACA,kDACE,cAIJ,6CACE,WACA,eACA,oBAGF,0DACE,0CACA,2BAGF,qBACE,oFACE,yCACA,sB;ACzKR,yBACE,gBAGF,mCACE,mBAGF,2BACE,YACA,eACA,gBACA,kBACA,mBAEA,qBACA,8BAEA,8CACE,SAGF,oDACE,+BAIJ,+BACE,qBACA,aACA,YACA,uBACA,kBACA,2CACA,eACA,kBACA,gBAEA,2CACE,oBAGF,0CACE,qBAGF,uCACE,sBAGF,qCACE,mCAGF,8CACE,kBACA,mBACA,iBACA,gBACA,uBAEA,2DACE,WACA,YACA,qBACA,sBACA,oBAKN,qCACE,aACA,mBAEA,6CACE,iBAIA,sDACE,cACA,kB;AClFN,yBACE,iBAGA,qFACE,qCAIJ,8BACE,qBAIA,0BACE,YAGF,sBACE,eACA,WAGF,6BACE,kCAEA,sDACE,wBACA,mBACA,qBACA,kBAIJ,4BACE,YACA,kCACA,gBACA,uBAEA,yCACE,wBAGA,gDACE,aAIJ,gCACE,cACA,eACA,iBACA,sBACA,wBACA,oBAGF,uCACE,kBACA,qBACA,iBACA,WACA,6BACA,wBACA,gBAKN,uBACE,aACA,8BAIA,gCACE,iB;AC9EN,aACE,aACA,YACA,mBACA,8BACA,kBACA,oBAEA,wBACE,aACA,cACA,eACA,mBACA,eACA,kBACA,gBACA,kCAEA,uCACE,kBACA,oB;ACpBN,wBACE,sBACA,YACA,gBACA,yBAEA,MACE,gBACA,sBAGF,kBACE,UACA,6BAGF,yBACE,uCAEA,iBACE,8BAIJ,iBACE,oBACA,qBACA,oCACA,gBAEA,mBACA,kCACA,sCAEA,UACE,kBACA,WACA,WACA,gCACA,aACA,SACA,8EAGF,cAEE,sBACA,oCACA,mBACA,8FAEA,SACE,cACA,uHAKN,4BAEE,wBACA,2CACA,uIAEA,YACE,sBAIJ,YACE,0CAGF,iBACE,YACA,YACA,gBACA,uBACA,sBACA,2BAGF,gBACE,kCACA,kBACA,mBACA,yBAGF,YACE,cACA,qCACA,mBACA,gBACA,qCAIA,gCACE,uDAMA,sBACE,2BACA,uBACA,+DAEA,WACE,6EACA,aACE,yBACA,8DAIJ,YACE,kCACA,4EAEA,UACE,gEAMJ,gBACE,wEAEA,WACE,0DAQR,uBACE,iEAEA,YACE,gBACA,0BAKN,sBACE,kBACE,8BAIJ,oBACE,8CAEA,iCACE,mBACA,gBACA,2BACA,oBACA,oDAEA,WACE,yBACA,gBACA,kBACA,mHAEA,yBAEE,0HAMF,UACE,iBACA,eACA,sCAKN,aACE,oBACA,6BAIJ,iBACE,aACA,cACA,iBACA,8BACA,qBACA,iDACA,yCACA,iCACA,gBACA,kBACA,8BAEA,iDAEA,aACE,4DAEA,iBACE,qEAKF,gBACE,eACA,2BAKN,WACE,qCAIA,cACE,mBACA,C;AC7NJ,yBACE,wBACA,gBACA,yBACA,iBACA,kBAGF,kDACE,gBAGF,2BACE,kBACA,YACA,WACA,iDAGF,wBACE,gBACA,cACA,kBAEA,gCACE,WACA,cACA,iBAGF,qCACE,kBACA,MACA,OACA,kDAGF,qCACE,YACA,kDAOA,kEACE,gCAGF,qDACE,gCAGF,8CACE,gCAGF,yDArEJ,gCACA,eACA,mBACA,oFAEA,+DACE,qBAmEE,qDAzEJ,gCACA,eACA,mBACA,iFAEA,2DACE,qBAuEE,8CA7EJ,gCACA,eACA,mBACA,gFAEA,oDACE,qB;ACJF,sBACE,iBACA,kBACA,aACA,cACA,mBACA,wBACA,mBACA,uBACA,sCACA,kBACA,WACA,eACA,eACA,kBACA,gBACA,wBAEA,4BACE,aAGF,0BACE,kBACA,MACA,OACA,WACA,YAGF,wBACE,mBACA,iCACA,qCAKA,6UACE,wBAGF,6GACE,2BAKF,8BACE,qBAIJ,6BACE,yCAEA,oCACE,WACA,cACA,kBACA,OACA,MACA,WACA,YACA,gCAIJ,+BACE,oBAEA,iCACE,aAGF,sCACE,a;AC/ER,gBACE,mCACA,aACA,mBACA,gBACA,oBACA,+BACA,qBAEA,kBACE,iBACA,kBACA,kCAGF,yBACE,a;AChBJ,4BACE,yCAEA,2CACE,+CAEA,8DACE,oBACA,kBACA,YAGF,8DACE,kCAIJ,yCACE,sBAEA,qDACE,aAKF,uFACE,uBAGF,kFACE,qBAGF,iEACE,iBACA,qBAGF,kEACE,eACA,gBACA,SAIA,0EACE,cACA,kBACA,eACA,sBAKN,kDACE,mBACA,gBACA,oBAGF,iDACE,uBACA,6C;AC/DJ,mCACE,WACA,aACA,mBACA,8BAIA,sCACE,aACA,mBAEA,8CACE,qBACA,oBAGF,6CACE,aACA,2BACA,mBAEA,gDACE,eACA,gBACA,mBACA,SACA,gBACA,mBACA,uBACA,gBAIJ,8CACE,aAIA,yDACE,iBAMJ,+CACE,WAIJ,2DACE,2BAEA,6DACE,UACA,cAKF,6CACE,mBACA,sBAKN,+BACE,eACA,wBACA,6B;ACtEA,4CACE,oBAGF,+DAEE,WACA,YACA,mBACA,UACA,cAGF,wBACE,eACA,gBAGF,yCACE,aACA,sBACA,uBAIA,iFAEE,mB;AC5BN,eACE,SACA,oBACA,eACA,kBAEA,kDAEE,kBACA,OACA,MACA,WACA,YAGF,4BACE,gBACA,mBACA,+BAEA,mEACE,kBACA,OACA,MACA,WACA,YACA,iBAIJ,sBACE,WACA,cACA,sCACA,UACA,6BAIA,+BACE,UAGF,qCACE,qBAIJ,kCACE,YACA,aACA,mBACA,uB;ACnDF,gDACE,aACA,cACA,qCACA,mBACA,gBAGF,oCACE,uBACA,gB;ACVF,0DACE,gCAGF,0FACE,kBAGF,8CACE,gBACA,aAGF,4CACE,cACA,aAGF,uCACE,cACA,WACA,YACA,2CACA,eAGF,wCACE,kBACA,aACA,cACA,aACA,cACA,wCACA,qBACA,YAGF,oDACE,YAGF,uCACE,sBACA,aAEA,oDACE,gBAGE,mEACE,mDAKN,gEACE,mBAGF,+DACE,kBAIJ,mDACE,aACA,cACA,qCACA,mBACA,gBAEA,uDACE,eACA,iDACA,iCAEA,8DACE,0CACA,wDAIF,8DACE,cACA,WACA,WACA,iBACA,oB;ACxFR,QACE,kBACA,cACA,iBACA,kBACA,aACA,cACA,sBAEA,gDATF,QAUI,YACA,aACA,sBAGF,YACE,YACA,aAGF,yBACE,kBACA,OACA,MACA,WACA,YAEA,gCACE,aAIJ,wBACE,WACA,YACA,qBACA,wD;AClCJ,UACE,YAEA,cACE,aACA,sBACA,gBAGF,uBACE,uBAIJ,sBACE,aACA,YACA,8BACA,mBAIA,4BACE,WAEA,6CACE,6BACA,8BAKN,kBACE,mCACA,yCAEA,gBC9BA,+BD0BF,kBCzBI,mBAGA,mBD6BF,kCACE,aACA,sBAEA,iDACE,cACA,YAIJ,0BACE,iBACA,mBAGF,iCACE,iBACA,qBAIJ,yBACE,aACA,sBACA,mBACA,sBACA,kBAEA,sCACE,WAIJ,uBACE,WACA,YACA,qBACA,kBAEA,wCACE,kBACA,OACA,MACA,WACA,YAEA,+CACE,aAKN,oBACE,uBAEA,+BACE,yBACA,yBACA,2EACA,8DAEA,gDACE,qBAKN,eACE,0CACA,2BAEA,yBACE,gBAGF,sBACE,eACA,kCACA,mBACA,kBAEA,+BACE,iBAIJ,sBACE,gBAGF,2BACE,kBACA,kCACA,mBACA,qBAEA,oDACE,eAGF,oCACE,iBACA,uBAIJ,kCACE,eACA,sBACA,kCACA,gBACA,qBAEA,2CACE,iBAIJ,yBACE,oBAEA,oCACE,gBAGF,8CACE,oBAEA,wDACE,WAGF,oDACE,YACA,iBACA,iBACA,kCAGF,6GACE,cACA,gBAGF,qDACE,oBAGF,wDACE,kBACA,mBACA,kCAEA,kEACE,oBAGF,8DACE,wBAGF,8DACE,sBACA,uBAMJ,sDACE,yBAEA,wDACE,cAKN,2CACE,oBAEA,4DACE,mBACA,gBACA,cAGF,mDACE,WACA,YACA,kBAGF,yDACE,eACA,iBACA,qBACA,gBAGF,0DACE,kBACA,iBACA,kCAMA,+HACE,iBAGF,6DACE,WACA,cACA,kBAMR,4BACE,wBAGF,qDACE,qBAIA,8CACE,gBAIJ,gEACE,gBAIJ,sBACE,yCACA,kBACA,gBAEA,wCACE,YAGF,4CACE,aAIJ,uBACE,iBAGF,eACE,yB;AE7SF,SACE,YACA,gBACA,kBAEA,eACE,yCACA,gBAEA,sBACE,kBACA,aACA,sBAEA,yDACE,kBACA,oBACA,qBAGF,6BACE,yBAGF,4BACE,sBACA,kCAGF,4CACE,kCACA,eACA,gBACA,mBAGF,yCACE,kBACA,oBAEA,kBACA,Y;ACzCR,eACE,YACA,gBAEA,0BACE,yC;ACLJ,oBACE,kBACA,eAEA,4BACE,qBACA,4GACA,cACA,iBAGF,8BACE,kB;ACXF,+BACE,eACA,eAGF,yBACE,+BACE,iBAIJ,+BACE,mBAGF,gCACE,kBACA,UAGF,2BACE,kBACA,WACA,aACA,gBACA,gBACA,iBACA,gBAGF,iCACE,gBACA,0CACA,+CAEA,wCACE,qBAIJ,0BACE,WACA,kBACA,kC;AC5CJ,qBACE,eACA,MACA,OACA,QACA,aACA,6BAEA,2BACE,kBACA,eAEA,qCACE,sCAGF,mCACE,6BACA,8B;AClBN,sBACE,kBACA,MACA,OACA,+BACA,WACA,cACA,mCACA,aACA,mBACA,yBAEA,mDAZF,sBAaI,qDACA,uDAGF,mCACE,mBACA,OAIJ,sBACE,kBACA,SACA,OACA,+BACA,WACA,cACA,mCACA,aACA,mBACA,kBACA,oBAEA,uDAbF,sBAcI,kDACA,sDAEA,kDACE,2CACA,mDAIJ,+BACE,OACA,kCAKF,sEAEE,8B;ACvDJ,gBACE,wBACA,gBACA,sBAEA,WAEA,yBAPF,gBAQI,yBAGF,8CACE,SAEA,+DACE,gBAGF,oDACE,aAGF,qDACE,0BACA,cAGF,sDACE,eAIA,+DACE,WAMJ,oCACE,iBAGF,kCACE,kBAIA,0CACE,YAIJ,uCACE,wB;ACtDN,iBACE,kCAEA,+BACE,mBACA,yBAFF,+BAGI,gBACA,uBAIJ,gCACE,+BACA,iCACA,yBAHF,gCAII,uBAIJ,gCACE,iBACA,cACA,aACA,eACA,qBAEA,0EAEE,OACA,0BACA,aACA,oBACA,2CACA,iBAEA,gGACE,YACA,iBACA,gBAGF,0GACE,kBAKN,mCACE,iBACA,cACA,cACA,aACA,sBACA,wBAEA,0DACE,qBAGF,8CACE,0BAIJ,6CACE,kBAEA,2DACE,mCAGF,6DACE,mBACA,UAIJ,8BACE,kBAEA,2EAEE,WACA,kBACA,OACA,MACA,QACA,SACA,2CACA,oBAEA,UACA,yBACA,UAGF,sCACE,mDACA,yCAGF,qCACE,sCACA,aACA,uBACA,mBACA,2BAKF,8CACE,YAGF,6CACE,UAGF,wIAGE,oBAGF,mFAEE,2C;AC9HJ,yBACE,mBACA,8BAGF,0BACE,+BACA,oBAGF,mCACE,mBAGF,2BACE,kCACA,eACA,gBACA,qBAGF,yBACE,6BACA,iBACA,6CACA,iBACA,cAEA,mCACE,6BAGF,yBAXF,yBAYI,gBACA,gBAEA,4DACE,kBAKN,2BACE,kBAEA,yCACE,mBAGF,iDACE,kBACA,aACA,eAIJ,sBACE,kBAEA,sCACE,oBAGF,4BACE,iBAIJ,iBACE,kBACA,kCAGF,kBACE,kBACA,yBACA,2BAGF,mCACE,oB;ACjFJ,aACE,oBACA,mBACA,uBACA,aACA,cACA,eACA,kDACA,eACA,kBACA,mBACA,6BACA,sCAEA,yBACE,oBAGF,sCAEE,kDAGF,iBACE,WACA,Y;ACzBJ,aACE,YAEA,kBACE,yBACA,gBACA,cAEA,yBALF,kBAMI,sBAGF,wCACE,aACA,eAIJ,oBACE,YACA,6CACA,aACA,mBACA,6BACA,+CAEA,yBARF,oBASI,gBACA,kBACA,cACA,mBACA,mBAEA,qBACA,8BAEA,uCACE,SAGF,6CACE,+BAGF,uCACE,oBACA,sBAIF,2BACE,WACA,cACA,cACA,WACA,a;ACvDR,eACE,YAEA,oBACE,kBACA,yBACA,gBACA,cAEA,yBANF,oBAOI,sBAIJ,sBACE,YACA,6CACA,kBACA,gBACA,kBACA,mBACA,+CAEA,qBACA,8BAEA,yCACE,SAGF,+CACE,+BAIF,6BACE,WACA,cACA,cACA,WACA,YAIF,0CACE,oBACA,sBAEA,wDACE,qBAEA,qIACE,YACA,aACA,WACA,YAIJ,6DACE,WACA,YACA,kBACA,aACA,mBACA,uBAEA,+IACE,WACA,YACA,kBACA,MACA,OAMR,qCACE,YACA,cAEA,yBAJF,qCAKI,YAIJ,mCACE,yBACA,eACA,gBACA,kD;AC3FJ,WACE,aACA,mBACA,uBACA,eACA,6BACA,eACA,gBACA,kBAEA,sBACE,mBAGF,oBACE,uBAGF,sBACE,uBAGF,sBACE,WACA,YACA,iCACA,wCAGF,qCACE,kBACA,MACA,OACA,WACA,YACA,iBAGF,oBACE,kBACA,oB;ACxCJ,WACE,aACA,qCACA,uBACA,gBACA,qBACA,YACA,gBACA,eAEA,gDACE,iBACA,0B;ACTF,wBACE,eACA,OACA,QACA,SACA,mCACA,gGACA,UAEA,6CACA,uDAVF,wBAWI,yCACA,2CACA,uCACA,+HAGF,6BACE,+BAEA,uDACE,gGAIJ,+CACE,gBAGF,iDACE,8CAIJ,iBACE,+BACA,iCACA,0DACA,uDAJF,iBAKI,yFAIJ,mBACE,wCACA,0CACA,aACA,mBACA,uBACA,+CACA,kBAEA,2BACE,cACA,0BACA,gBACA,gBACA,UAEA,qCACE,oBAGF,6CACE,gBAGF,gDACE,kBACA,YAGF,gDACE,kBACA,aAKN,8BACE,YAEA,uCACE,iCAKF,sCACE,kBACA,UACA,OACA,WACA,aACA,cAKF,2DACE,UACA,cAIJ,oBACE,UACA,+BACA,gBAGF,6BACE,iCACA,aACA,mBACA,uBACA,kCAGF,iCACE,aACA,kBACA,aACA,WAEA,6CANF,iCAOI,8CACA,2CAIJ,+BACE,iCACE,eAKN,YACE,mBAEA,iBACE,eACA,sBACA,gBACA,SACA,mBACA,kDACA,gBACA,mBACA,uBACA,mBACA,uBAGF,sBACE,mBAGF,mBACE,cACA,0BACA,gBACA,gBACA,UfrKF,iFeyKE,gBAIA,8CACE,cAGF,0CACE,gB;ACpLN,YACE,kBAGE,sCACE,kBACA,UACA,UACA,QACA,aAKJ,mCACE,mB;ACfJ,YACE,oBAEA,6BACE,gBAGF,4BACE,eAEA,sCACE,mBACA,mBAKF,wCACE,UACA,aAGF,uCACE,O;ACvBN,mBACE,wBACA,gBACA,sBAEA,WAEA,yBAPF,mBAQI,yB;ACPF,gCACE,wBACA,gBACA,gBACA,cACA,sBAEA,yBAPF,gCAQI,yBAKF,0CACE,kBACA,UACA,OACA,WACA,aACA,c;ACpBN,gBACE,aACA,2DACA,oBACA,mBAEA,uBACE,a;ACPJ,gBACE,kBACA,cAGE,0CACE,kBACA,UACA,UACA,QACA,aAKJ,uCACE,mBAGF,wBACE,Y;ACpBJ,cACE,aACA,oBAEA,gBAIA,kBAHA,+BALF,cAMI,oBAIF,2BACE,gB;ACVF,iDACE,gCACA,iCAEA,wDACE,cACA,uBAIJ,mBACE,mDACA,cACA,WACA,YACA,iBACA,gDACA,oBACA,qBACA,uBACA,wBACA,gBACA,iBAEA,mCACE,WACA,iBAGF,6BACE,aACA,cACA,kBAIJ,2BACE,YAGF,mBACE,gBACA,gBACA,uBAGF,yBACE,mBACA,oBACA,qBACA,4BACA,gBACA,uBACA,gBACA,uBAEF,8DAEE,iB;AC3DJ,aACE,SACA,oBACA,gBACA,kBACA,eAEA,iBACE,kBACA,OACA,MACA,WACA,YACA,iB;ACbJ,kBAME,2BALA,oCACE,cACA,gBAKF,0BACE,aACA,qCACA,aACA,UAEA,yBANF,0BAOI,sCAGF,qCACE,iBACA,sDACE,4BACA,6BAIJ,qCACE,wBAGF,yCACE,cACA,SACA,SACA,oBACA,gBAEA,uJACE,kBACA,MACA,OACA,sBACA,uBAEA,yBAPF,uJAQI,WACA,YACA,oCACA,sC;AChDV,aACE,YACA,gBACA,gBAEA,0BACE,aACA,sBACA,gBACA,kCACA,uBACA,mB;ACXJ,eACE,YACA,gBACA,gBAEA,4BACE,aACA,sBACA,gBACA,kCAGF,4BACE,mBAEA,mCACE,aACA,8BACA,cAEA,kDACE,gBAGF,0CACE,eACA,sBACA,SACA,gBACA,mBACA,uBAGF,0CACE,kCACA,SAGF,2CACE,cACA,iBAEA,oDACE,mCACA,kCAEA,qHACE,+CAMR,iCACE,aACA,iBACA,gBAIA,oDACE,iBAGF,6CACE,cACA,kBAKN,8BACE,e;ACxEJ,WACE,YACA,eAEA,0BACE,YACA,cAEA,+BACE,aACA,qCACA,uBACA,gBACA,qBAIJ,wBACE,6BACA,gBACA,kB;ACpBJ,mBACE,6CACA,wBACA,aACA,8BAEA,gCACE,aACA,mBACA,mBACA,sBACA,gBACA,kCACA,+BACA,gBACA,MACA,mCAEA,yBAZF,gCAaI,kCAIJ,mCACE,iBAEA,6CACE,cACA,kBAIJ,gCACE,iBACA,kBACA,gBAEA,yBALF,gCAMI,kBAGF,yCACE,wBAKF,oEACE,qBAIA,6EACE,oBACA,eAKN,mCACE,0BACA,wBAGE,uDACE,iBACA,eAKN,8BACE,sBACA,kBACA,iB;AC1EJ,aACE,YACA,kBACA,aACA,sBACA,oBAEA,sBACE,kBACA,MACA,OACA,SACA,QACA,iCAGF,4BACE,sBACA,cACA,kBAEA,yBALF,4BAMI,gBAIJ,gCACE,0CACA,YACA,c;AC7BJ,YACE,kBACA,YAEA,2BACE,YACA,kBACA,kBAGF,qBACE,oBACA,0CAEA,0BACE,eAGF,mCACE,gBACA,iBAGF,+BACE,gBAGF,+BACE,2BAEA,yCACE,gBAIJ,mCACE,cACA,eACA,mBACA,kBAEA,oDACE,kBACA,OACA,MACA,WACA,YAEA,2DACE,aAKN,+BACE,kBAEA,0CACE,gBAGF,yDACE,oBAGF,gEACE,gBACA,mBAIA,gDACE,gBACA,mBAKF,mEACE,qBAKN,sCACE,gBACA,mBACA,kCAEA,gDACE,mBAIJ,mCACE,kCACA,qBAEA,6CACE,mBAIJ,mCACE,kCACA,kBAGF,8BACE,iBAIJ,kCACE,YAGF,wBACE,wBAGF,yBACE,gBAEA,gCACE,oBACA,mBAEA,2CACE,sBAKF,6CACE,aACA,WACA,eAGF,4CACE,cACA,aACA,eAMR,oBACE,mB;ACtJF,cACE,mBAEA,iBACE,gBACA,kCACA,qB;ACNJ,UACE,mBAGE,iBACE,kCACA,gBACA,oBAGF,sBACE,mB;ACXN,UACE,gBAEA,uBACE,aACA,mBACA,cAEA,2BACE,YACA,aAIA,gCACE,iBACA,mBAGF,+BACE,gBACA,iBACA,kCAKN,sBACE,YAEA,uCACE,kBACA,aACA,mBACA,4BACA,kCACA,gBAEA,4CACE,wBAGF,8CACE,aACA,YAKN,wBACE,0CACA,aAEA,4CACE,aACA,0BACA,gBAEA,8CACE,iBACA,kCACA,kBACA,aAGF,8DACE,oEACA,qBACA,mBACA,cAIA,yDACE,eACA,sBACA,gBACA,gBACA,sBACA,wBACA,0BAGF,wDACE,gBACA,kBACA,qC;ACtFV,WACE,kBAEA,qDACE,kBAGF,uBACE,kBACA,UACA,UACA,UAEA,2BACE,e;ACdN,aACE,mBAEA,gBACE,gBACA,kCACA,qBAGF,4BACE,aACA,8BAEA,yCACE,aACA,cACA,a;ACfJ,8BACE,oBAGF,sBACE,kBACA,4BACA,6BACA,WACA,oBACA,aACA,mBACA,mBACA,mCACA,6CAEA,yBACE,gBACA,mBACA,uBACA,mBAIJ,0BACE,aAGF,6BACE,aACA,eACA,aACA,mBACA,uBAGF,+BACE,aACA,gBAGF,uBACE,cACA,WACA,YACA,kBAGF,sBACE,kBACA,+BACA,gCACA,WACA,oBACA,mCACA,0CAEA,6BACE,oBACA,gBAIJ,4BACE,YAGF,6BACE,UACA,gBAIJ,+FAKI,4BACE,gBAGF,0BACE,c","sources":["webpack://telegram-t/./src/components/mediaViewer/SenderInfo.scss","webpack://telegram-t/./src/components/mediaViewer/MediaViewerActions.scss","webpack://telegram-t/./src/components/mediaViewer/MediaViewerFooter.scss","webpack://telegram-t/./src/components/mediaViewer/VideoPlayerControls.scss","webpack://telegram-t/./src/components/mediaViewer/VideoPlayer.scss","webpack://telegram-t/./src/components/mediaViewer/ZoomControls.scss","webpack://telegram-t/./src/components/mediaViewer/PanZoom.scss","webpack://telegram-t/./src/components/mediaViewer/MediaViewer.scss","webpack://telegram-t/./src/components/common/ChatOrUserPicker.scss","webpack://telegram-t/./src/components/main/Dialogs.scss","webpack://telegram-t/./src/components/common/CalendarModal.scss","webpack://telegram-t/./src/components/middle/MessageSelectToolbar.scss","webpack://telegram-t/./src/components/left/search/RecentContacts.scss","webpack://telegram-t/./src/components/left/search/ChatMessage.scss","webpack://telegram-t/./src/components/left/search/DateSuggest.scss","webpack://telegram-t/./src/components/left/search/LeftSearch.scss","webpack://telegram-t/./src/components/ui/CropModal.scss","webpack://telegram-t/./src/components/ui/AvatarEditable.scss","webpack://telegram-t/./src/components/ui/ShowMoreButton.scss","webpack://telegram-t/./src/components/left/settings/folders/SettingsFoldersChatsPicker.scss","webpack://telegram-t/./src/components/left/settings/folders/SettingsFolders.scss","webpack://telegram-t/./src/components/left/settings/SettingsStickerSet.scss","webpack://telegram-t/./src/components/left/settings/WallpaperTile.scss","webpack://telegram-t/./src/components/left/settings/SettingsGeneralBackground.scss","webpack://telegram-t/./src/components/left/settings/SettingsGeneralBackgroundColor.scss","webpack://telegram-t/./src/components/common/PasswordMonkey.scss","webpack://telegram-t/./src/components/left/settings/Settings.scss","webpack://telegram-t/./src/styles/_mixins.scss","webpack://telegram-t/./src/components/left/newChat/NewChat.scss","webpack://telegram-t/./src/components/left/ArchivedChats.scss","webpack://telegram-t/./src/components/middle/message/MessageContextMenu.scss","webpack://telegram-t/./src/components/common/StickerSetModal.scss","webpack://telegram-t/./src/components/middle/HeaderMenuContainer.scss","webpack://telegram-t/./src/components/middle/MobileSearch.scss","webpack://telegram-t/./src/components/middle/composer/MentionTooltip.scss","webpack://telegram-t/./src/components/middle/composer/AttachmentModal.scss","webpack://telegram-t/./src/components/middle/composer/PollModal.scss","webpack://telegram-t/./src/components/middle/composer/EmojiButton.scss","webpack://telegram-t/./src/components/middle/composer/EmojiPicker.scss","webpack://telegram-t/./src/components/middle/composer/StickerPicker.scss","webpack://telegram-t/./src/components/common/GifButton.scss","webpack://telegram-t/./src/components/middle/composer/GifPicker.scss","webpack://telegram-t/./src/components/middle/composer/SymbolMenu.scss","webpack://telegram-t/./src/components/middle/composer/AttachMenu.scss","webpack://telegram-t/./src/components/middle/composer/BotCommand.scss","webpack://telegram-t/./src/components/middle/composer/BotCommandTooltip.scss","webpack://telegram-t/./src/components/middle/composer/BotCommandMenu.scss","webpack://telegram-t/./src/components/middle/composer/StickerTooltip.scss","webpack://telegram-t/./src/components/middle/composer/CustomSendMenu.scss","webpack://telegram-t/./src/components/middle/composer/EmojiTooltip.scss","webpack://telegram-t/./src/components/middle/composer/inlineResults/BaseResult.scss","webpack://telegram-t/./src/components/middle/composer/inlineResults/MediaResult.scss","webpack://telegram-t/./src/components/middle/composer/InlineBotTooltip.scss","webpack://telegram-t/./src/components/right/RightSearch.scss","webpack://telegram-t/./src/components/right/StickerSearch.scss","webpack://telegram-t/./src/components/right/GifSearch.scss","webpack://telegram-t/./src/components/right/PollAnswerResults.scss","webpack://telegram-t/./src/components/right/PollResults.scss","webpack://telegram-t/./src/components/right/management/Management.scss","webpack://telegram-t/./src/components/payment/ShippingInfo.scss","webpack://telegram-t/./src/components/payment/Shipping.scss","webpack://telegram-t/./src/components/payment/Checkout.scss","webpack://telegram-t/./src/components/payment/CardInput.scss","webpack://telegram-t/./src/components/payment/PaymentInfo.scss","webpack://telegram-t/./src/components/payment/PaymentModal.scss"],"sourcesContent":[".SenderInfo {\n display: flex;\n align-content: center;\n color: white;\n cursor: pointer;\n\n opacity: .5;\n transition: .15s opacity;\n\n &:hover {\n opacity: 1;\n }\n\n .Avatar {\n margin-inline-end: 1rem;\n\n @media (max-width: 600px) {\n display: none;\n }\n }\n\n .meta {\n display: flex;\n flex-direction: column;\n justify-content: center;\n max-width: calc(100% - 3.75rem);\n }\n\n .title {\n line-height: 1.45rem;\n font-weight: 500;\n white-space: pre;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .date {\n line-height: 1.25rem;\n font-size: 0.875rem;\n letter-spacing: -0.01rem;\n }\n}\n",".MediaViewerActions {\n display: flex;\n margin-inline-start: auto;\n margin-inline-end: -.375rem;\n\n .Button {\n margin-inline-start: .25rem;\n }\n}\n\n.MediaViewerActions-mobile {\n position: relative;\n color: var(--color-text);\n\n .ProgressSpinner {\n position: absolute;\n top: 0;\n left: 0;\n }\n}\n",".MediaViewerFooter {\n position: absolute;\n bottom: 0;\n padding: 1rem 0;\n width: 100%;\n transition: opacity .15s;\n\n #MediaViewer.zoomed & {\n display: none;\n }\n\n @media (max-height: 640px) {\n padding: .5rem 0 0;\n }\n\n @media (max-width: 600px) {\n padding-bottom: 4.5rem;\n background: linear-gradient(to top, #000 0%, rgba(0, 0, 0, 0) 100%);\n\n &.is-for-video {\n opacity: 0;\n pointer-events: none;\n\n .video-controls-visible & {\n opacity: 1;\n pointer-events: all;\n }\n }\n }\n\n .media-viewer-footer-content {\n position: relative;\n max-width: var(--messages-container-width);\n margin: auto;\n cursor: pointer;\n opacity: .5;\n transition: opacity .15s;\n\n &:hover {\n opacity: 1;\n }\n\n @media (max-width: 600px) {\n opacity: 1;\n }\n }\n\n &.is-hidden {\n opacity: 0;\n }\n\n .media-text {\n margin-bottom: 0;\n overflow: auto;\n padding: 0 .5rem;\n text-align: center;\n color: rgba(255, 255, 255, .9);\n font-size: .9375rem;\n letter-spacing: .025rem;\n max-height: 4.25rem;\n\n @media (max-height: 640px) {\n max-height: 2.75rem;\n }\n\n .emoji {\n width: .9375rem;\n height: .9375rem;\n vertical-align: -2px;\n }\n\n &.multiline {\n &::before {\n content: '';\n position: absolute;\n left: -.75rem;\n right: -.75rem;\n top: -.25rem;\n bottom: -.25rem;\n background: rgba(0, 0, 0, .75);\n border-radius: var(--border-radius-default);\n z-index: var(--z-below);\n\n @media (max-width: 600px) {\n display: none;\n background: none;\n }\n }\n }\n }\n\n a {\n color: var(--color-links);\n\n &:hover,\n &:focus {\n text-decoration: underline;\n }\n }\n}\n",".VideoPlayerControls {\n display: flex;\n align-items: center;\n position: absolute;\n left: 0;\n bottom: 0;\n width: 100%;\n padding-top: .625rem;\n font-size: .875rem;\n background: linear-gradient(to top, #000 0%, rgba(0, 0, 0, 0) 100%);\n\n #MediaViewer.zoomed & {\n display: none;\n }\n\n @media (max-width: 600px) {\n position: fixed;\n padding: 1.25rem .5rem .75rem;\n background: none;\n z-index: var(--z-media-viewer);\n }\n\n &.mobile {\n .player-file-size {\n position: static;\n left: auto;\n transform: none;\n margin-left: auto;\n }\n\n .fullscreen {\n margin-left: 1rem;\n }\n\n .player-time + .fullscreen {\n margin-left: auto;\n }\n }\n\n .Button {\n width: 2.25rem;\n padding: 0;\n margin: .25rem;\n height: 1.75rem;\n @media (max-width: 600px) {\n height: 2.25rem;\n }\n }\n\n .play i {\n line-height: 1.5rem;\n }\n\n .player-time {\n margin: 0 1rem;\n white-space: nowrap;\n }\n\n .fullscreen {\n margin-left: auto;\n @media (max-width: 600px) {\n margin-left: 1rem;\n }\n i {\n line-height: 1.75rem;\n @media (max-width: 600px) {\n font-size: 1.5rem;\n }\n }\n }\n\n @media (max-width: 600px) {\n .player-time + .fullscreen {\n margin-left: auto;\n }\n }\n\n .player-file-size {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n @media (max-width: 600px) {\n position: static;\n left: auto;\n transform: none;\n margin-left: auto;\n margin-right: 1rem;\n & + .fullscreen {\n margin-left: 0;\n }\n }\n }\n\n .player-seekline {\n position: absolute;\n left: 1rem;\n right: 1rem;\n top: 0;\n height: 1rem;\n touch-action: none;\n cursor: pointer;\n\n &-track {\n position: absolute;\n top: 50%;\n left: -.25rem;\n right: -.25rem;\n height: 5px;\n transform: translateY(-50%);\n background-color: rgba(255, 255, 255, 0.16);\n border-radius: var(--border-radius-default);\n }\n\n &-buffered,\n &-played,\n &-input {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n border-radius: var(--border-radius-default);\n }\n\n &-buffered {\n background-color: rgba(255, 255, 255, 0.5);\n }\n\n &-played {\n background: var(--color-primary);\n\n &::after {\n content: '';\n position: absolute;\n width: .75rem;\n height: .75rem;\n border-radius: 50%;\n background-color: var(--color-primary);\n right: 0;\n top: 50%;\n transform: translate(.325rem, -50%);\n }\n }\n }\n}\n",".VideoPlayer {\n position: relative;\n display: inline-flex;\n flex-direction: column;\n overflow: hidden;\n\n #MediaViewer.zoomed & {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n > div {\n width: 100% !important;\n height: 100% !important;\n }\n video {\n max-height: none !important;\n }\n }\n\n @media (min-width: 601px) {\n // Safari: custom controls are not displayed after exiting full screen mode.\n z-index: 1;\n }\n\n @media (max-width: 600px) {\n overflow: visible;\n }\n\n @media (max-height: 640px) {\n margin-bottom: 1.75rem;\n @at-root .has-footer #{&} {\n margin-bottom: 0;\n }\n }\n\n video {\n display: block;\n max-height: calc(100vh - 8.25rem);\n margin: auto;\n object-fit: contain;\n outline: none;\n width: 100%;\n height: 100%;\n background: no-repeat 50% 50%;\n background-size: contain;\n\n @media (max-height: 640px) {\n max-height: calc(100vh - 10rem);\n }\n @at-root .has-footer #{&} {\n max-height: calc(100vh - 15rem);\n @media (max-height: 640px) {\n max-height: calc(100vh - 10rem);\n }\n }\n }\n\n .play-button {\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n width: 3.25rem;\n height: 3.25rem;\n background-color: rgba(0, 0, 0, 0.5) !important;\n body:not(.animation-level-0) & {\n transition: opacity .3s ease !important;\n }\n\n .icon-play {\n font-size: 1.75rem;\n position: relative;\n left: .125rem;\n }\n }\n\n .spinner-container {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n .buffering {\n background: rgba(0, 0, 0, 0.25);\n color: #fff;\n font-size: 0.75rem;\n position: absolute;\n left: 0.1875rem;\n top: 0.1875rem;\n z-index: 1;\n padding: 0 0.375rem;\n border-radius: 0.75rem;\n line-height: 1.125rem;\n }\n\n .ProgressSpinner {\n cursor: pointer;\n }\n }\n}\n",".ZoomControls {\n position: absolute;\n bottom: 1.25rem;\n left: 50%;\n background: rgba(0,0,0,.5);\n border-radius: var(--border-radius-default);\n width: 100%;\n height: 3.375rem;\n max-width: 274px;\n transform: translate3d(-50%, 0, 10px);\n transition: opacity .3s ease-in;\n pointer-events: none;\n\n &.open {\n z-index: var(--z-media-viewer);\n pointer-events: all;\n }\n\n .zoom-out,\n .zoom-in {\n position: absolute;\n top: 0.4375rem;\n width: 2.5rem;\n height: 2.5rem;\n color: #fff;\n\n i {\n font-size: 1.5rem;\n }\n }\n\n .zoom-out {\n left: .5rem;\n }\n\n .zoom-in {\n right: .5rem;\n }\n\n .seekline {\n position: absolute;\n left: 3.25rem;\n right: 3.25rem;\n top: 1.125rem;\n height: 1rem;\n\n &-track {\n position: absolute;\n top: 50%;\n left: -.25rem;\n right: -.25rem;\n height: 2px;\n transform: translateY(-50%);\n background-color: rgba(255, 255, 255, .5);\n border-radius: var(--border-radius-default);\n }\n\n &-played,\n &-input {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n border-radius: var(--border-radius-default);\n }\n\n &-played {\n background: #fff;\n transition: width 200ms;\n\n &::after {\n content: '';\n position: absolute;\n width: .75rem;\n height: .75rem;\n border-radius: 50%;\n background-color: var(--color-white);\n right: 0;\n top: 50%;\n transform: translate(.325rem, -50%);\n }\n }\n\n &-input {\n width: 100%;\n height: 1rem;\n top: -.375rem;\n opacity: 0;\n margin: 0;\n padding: 0;\n cursor: pointer;\n overflow: hidden;\n\n &::-webkit-slider-thumb {\n margin-top: -2rem;\n }\n }\n }\n}\n",".pan-wrapper,\n.pan-container {\n position: relative;\n width: 100%;\n height: 100%;\n}\n\n.pan-wrapper {\n cursor: move;\n user-select: none;\n}\n\n.pan-container {\n transition: transform .2s ease-in;\n\n .pan-wrapper.move & {\n transition: none;\n }\n\n .zoomed & {\n position: fixed;\n top: 0;\n left: 0;\n }\n}\n","#MediaViewer {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100%;\n background: rgba(0, 0, 0, .9);\n color: #fff;\n z-index: var(--z-media-viewer);\n padding: 0.5rem 0;\n\n display: grid;\n grid-template-columns: auto;\n grid-template-rows: 2.75rem 1fr;\n grid-column-gap: 0;\n grid-row-gap: 0;\n justify-items: stretch;\n align-items: center;\n\n // Potential perf improvement\n &:not(.shown) {\n display: block !important;\n transform: scale(0);\n }\n\n body.ghost-animating & {\n > .pan-wrapper, > .Transition, > button {\n display: none;\n }\n }\n\n body.animation-level-2 & {\n transition-duration: .3s !important;\n }\n\n &:not(.open),\n .closing {\n .SenderInfo {\n pointer-events: none;\n transition: none;\n }\n }\n\n &.zoomed {\n .navigation {\n display: none;\n }\n\n .media-viewer-head {\n z-index: 2;\n }\n\n .media-viewer-content {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n padding: 0;\n z-index: 1;\n }\n }\n\n .media-viewer-head {\n display: flex;\n grid-area: 1 / 1 / 2 / -2;\n padding: 0 1.25rem;\n position: relative;\n z-index: var(--z-media-viewer-head);\n min-width: 0;\n\n & > .Transition {\n width: 100%;\n min-width: 0;\n }\n\n @media (max-width: 600px) {\n padding: 0 0.5rem;\n\n @supports (padding: 0 env(safe-area-inset-left)) {\n padding: 0 #{\"max(0.5rem, env(safe-area-inset-left))\"};\n }\n\n .media-viewer-close {\n margin-right: 1.5rem;\n }\n }\n\n @supports (padding: 0 env(safe-area-inset-left)) {\n padding: 0 #{\"max(1.25rem, env(safe-area-inset-left))\"};\n }\n }\n\n & > .Transition,\n & > .pan-wrapper {\n grid-area: 1 / 1 / -1 / -1;\n }\n\n & > .Transition,\n & > .pan-wrapper .Transition {\n position: relative;\n justify-self: center;\n text-align: center;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n overflow: hidden;\n }\n\n .media-viewer-content {\n position: relative;\n z-index: 1;\n padding: 3.25rem 0;\n height: 100%;\n display: inline-flex;\n justify-content: center;\n align-items: center;\n\n &.has-footer {\n padding: 7rem 0;\n @media (min-width: 600px) {\n min-width: 600px;\n }\n\n @media (max-height: 640px) {\n padding: 4rem 0;\n }\n\n > img {\n max-height: calc(100vh - 15rem);\n @media (max-height: 640px) {\n max-height: calc(100vh - 10rem);\n }\n }\n }\n\n .thumbnail {\n position: relative;\n\n img {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n }\n\n > img {\n max-width: 100vw;\n max-height: calc(100vh - 8.25rem);\n object-fit: contain;\n transition: transform .2s;\n }\n\n .spinner-wrapper {\n max-width: 100vw;\n margin: auto;\n }\n\n .Spinner {\n margin: auto;\n }\n }\n\n .navigation {\n position: fixed;\n top: 4rem;\n width: 10vw;\n bottom: 0;\n border: none;\n padding: 0;\n margin: 0;\n appearance: none;\n background: transparent no-repeat;\n background-size: 1.25rem;\n opacity: 0;\n transition: opacity .15s;\n outline: none;\n cursor: pointer;\n z-index: 1;\n\n @media (max-width: 600px) {\n width: 20vw;\n }\n\n &:hover, .is-touch-env & {\n opacity: 1;\n }\n\n &.prev {\n left: 0;\n background-image: url(\"../../assets/media_navigation_previous.svg\");\n background-position: 1.25rem calc(50% - 2rem);\n\n @supports (left: env(safe-area-inset-left)) {\n left: env(safe-area-inset-left);\n }\n\n &[dir=rtl] {\n left: auto;\n right: 0;\n transform: scaleX(-1);\n\n @supports (left: env(safe-area-inset-left)) {\n left: auto;\n right: env(safe-area-inset-right);\n }\n }\n }\n\n &.next {\n right: 0;\n background-image: url(\"../../assets/media_navigation_next.svg\");\n background-position: calc(100% - 1.25rem) calc(50% - 2rem);\n\n @supports (left: env(safe-area-inset-left)) {\n right: env(safe-area-inset-right);\n }\n\n &[dir=rtl]{\n left: 0;\n right: auto;\n transform: scaleX(-1);\n\n @supports (left: env(safe-area-inset-left)) {\n right: auto;\n left: env(safe-area-inset-left);\n }\n }\n }\n\n &.inline {\n top: calc(50% - 3rem);\n bottom: unset;\n height: 6rem;\n background-position-y: center;\n\n @media (max-width: 600px) {\n opacity: 0;\n transition: opacity .15s ease-in;\n pointer-events: none;\n\n .video-controls-visible & {\n opacity: 1;\n pointer-events: all;\n }\n }\n }\n }\n}\n\n.ghost {\n position: absolute;\n z-index: var(--z-media-viewer);\n will-change: transform, opacity;\n overflow: hidden;\n border-radius: 0;\n transition: transform .2s ease, opacity .2s ease;\n\n &.rounded-corners {\n border-radius: var(--border-radius-messages);\n }\n\n &.circle {\n border-radius: 50%;\n }\n\n body.is-ios & {\n transition: transform .2s ease, opacity .2s ease, border-radius .2s ease !important;\n }\n\n img,\n video {\n width: 100%;\n height: 100%;\n user-select: none;\n -webkit-user-select: none;\n object-fit: cover;\n }\n}\n",".ChatOrUserPicker {\n z-index: var(--z-media-viewer);\n\n .modal-dialog {\n height: 70%;\n max-width: 25rem;\n\n @media (max-width: 600px) {\n height: 90%;\n }\n }\n\n .modal-header {\n display: flex;\n align-items: center;\n padding: 0.25rem 0.5rem;\n\n .Button {\n margin-right: 0.5rem;\n }\n\n .input-group {\n margin: 0;\n flex: 1;\n }\n\n .form-control {\n border: none;\n box-shadow: none !important;\n\n height: 2.75rem;\n padding: 0.5rem;\n font-size: 1.25rem;\n line-height: 1.75rem;\n unicode-bidi: plaintext;\n }\n }\n\n .modal-content {\n padding: 0;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n\n .picker-list {\n height: 100%;\n overflow-x: hidden;\n overflow-y: auto;\n padding: 0 1rem 1rem;\n }\n }\n\n .no-results {\n height: 100%;\n margin: 0;\n padding: 1rem 1rem;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-text-secondary);\n }\n\n .ListItem.chat-item-clickable {\n &:not(.force-rounded-corners) {\n @media (max-width: 600px) {\n margin: 0;\n\n .ListItem-button {\n border-radius: 0;\n }\n }\n }\n }\n}\n","#Dialogs {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n z-index: var(--z-modal);\n}\n",".CalendarModal {\n .modal-dialog {\n max-width: 26.25rem;\n .modal-content {\n padding: .375rem 1rem 1rem;\n }\n }\n\n .timepicker {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 1.5rem;\n\n .form-control {\n max-width: 5rem;\n text-align: center;\n\n &:first-child {\n margin-right: 1rem;\n }\n &:last-child {\n margin-left: 1rem;\n }\n }\n }\n\n .footer {\n display: flex;\n justify-content: flex-end;\n flex-direction: column;\n\n .Button {\n text-transform: none;\n\n + .Button {\n margin-top: .5rem;\n }\n }\n }\n\n .month-selector {\n display: flex;\n align-items: center;\n\n h4 {\n flex: 1;\n margin: 0 0 0 1.25rem;\n font-size: 1.25rem;\n\n @media (max-width: 600px) {\n margin-left: .75rem;\n }\n\n & ~ .Button {\n color: var(--color-primary)\n }\n }\n\n .Button.hidden {\n opacity: 0.5;\n pointer-events: none;\n }\n }\n\n .day-button {\n position: relative;\n border-radius: 4rem;\n outline: none !important;\n font-weight: 500;\n margin: .125rem .625rem;\n\n @media (max-width: 600px) {\n margin: .25rem .375rem;\n }\n\n &.weekday {\n margin-bottom: 0;\n height: 1rem;\n }\n\n &.clickable {\n cursor: pointer;\n\n &:hover {\n background-color: var(--color-interactive-element-hover);\n }\n\n &.selected {\n background-color: var(--color-primary);\n color: white;\n }\n }\n\n &.disabled {\n opacity: 0.25;\n pointer-events: none;\n }\n\n &::before {\n content: \"\";\n display: block;\n padding-top: 100%;\n }\n\n span {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.875rem;\n }\n }\n\n .calendar-wrapper {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 17rem;\n margin: 1.5rem -0.5rem 0.5rem;\n }\n\n .calendar-grid {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n width: 100%;\n }\n}\n",".MessageSelectToolbar {\n position: absolute;\n bottom: 0.5rem;\n left: 0.5rem;\n right: 0.5rem;\n width: auto;\n z-index: 20;\n justify-content: center;\n margin: 0;\n\n @supports (padding-bottom: env(safe-area-inset-bottom)) {\n bottom: calc(0.5rem + env(safe-area-inset-bottom));\n }\n\n .mask-image-disabled &::before {\n left: auto !important;\n right: auto !important;\n }\n\n .no-composer & {\n width: 100%;\n @media (max-width: 600px) {\n width: calc(100% - 1rem);\n }\n }\n\n @media (min-width: 601px) {\n left: 1rem;\n right: 1rem;\n bottom: 1.25rem;\n\n .no-composer & {\n top: -4.75rem;\n }\n }\n\n opacity: 1;\n\n &-inner {\n transform: scaleX(1);\n transition: transform var(--select-transition), opacity var(--select-transition);\n }\n\n & .MessageSelectToolbar-inner {\n transform: scaleX(1) translateX(0);\n }\n\n .no-composer .unpin-button-container + &,\n .no-composer .messaging-disabled + & {\n top: auto;\n }\n\n body.animation-level-0 & {\n transition: none !important;\n }\n\n &:not(.shown) {\n opacity: 0;\n pointer-events: none;\n\n .shown-inner {\n transform: scaleX(var(--toolbar-hidden-scale, 1));\n }\n\n &.with-composer .MessageSelectToolbar-inner {\n transform: scaleX(var(--toolbar-hidden-scale, 1)) translateX(var(--toolbar-translate-x, 0));\n }\n\n &:not(.with-composer) .MessageSelectToolbar-inner {\n transform: scaleX(var(--toolbar-unpin-hidden-scale)) translateX(0);\n }\n }\n\n &::before {\n z-index: -1;\n max-width: 32rem;\n width: 100%;\n left: auto;\n right: auto;\n }\n\n &-inner {\n width: 100%;\n max-width: 32rem;\n display: flex;\n align-items: center;\n padding: 0.25rem;\n\n background: var(--color-background);\n border-radius: var(--border-radius-messages);\n box-shadow: 0 1px 2px var(--color-default-shadow);\n font-weight: 500;\n\n @media (max-width: 600px) {\n padding: 0;\n max-width: none;\n }\n\n > .Button {\n width: 3rem;\n height: 3rem;\n\n @media (max-width: 600px) {\n width: 2.875rem;\n height: 2.875rem;\n }\n }\n }\n\n &-count {\n margin-left: 1rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n flex-grow: 1;\n\n @media (max-width: 600px) {\n margin-right: 0.5rem;\n }\n }\n\n &-actions {\n margin-left: auto;\n display: flex;\n\n .item {\n width: 100%;\n background: none;\n border: none !important;\n box-shadow: none !important;\n outline: none !important;\n display: flex;\n position: relative;\n overflow: hidden;\n line-height: 1.5rem;\n white-space: nowrap;\n color: var(--color-text);\n --ripple-color: rgba(0, 0, 0, 0.08);\n cursor: pointer;\n unicode-bidi: plaintext;\n\n padding: 0.6875rem;\n border-radius: 50%;\n\n i {\n font-size: 1.5rem;\n color: var(--color-text-secondary);\n }\n\n &.destructive {\n color: var(--color-error);\n i {\n color: inherit;\n }\n }\n\n &.disabled {\n opacity: 0.5;\n cursor: default;\n pointer-events: none;\n }\n\n &:not(.disabled):active {\n background-color: var(--color-item-active);\n transition: none !important;\n }\n\n @media (hover: hover) {\n &:hover, &:focus {\n background-color: var(--color-chat-hover);\n text-decoration: none;\n }\n }\n }\n }\n}\n",".RecentContacts {\n .Loading {\n min-height: 75vh;\n }\n\n .top-peers-section {\n padding: .5rem 1rem;\n }\n\n .top-peers {\n height: 6rem;\n margin: 0 -1rem;\n overflow-x: auto;\n overflow-y: hidden;\n white-space: nowrap;\n\n scrollbar-width: none;\n scrollbar-color: rgba(0, 0, 0, 0);\n\n &::-webkit-scrollbar {\n height: 0;\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, 0);\n }\n }\n\n .top-peer-item {\n display: inline-block;\n width: 4.5rem;\n height: 6rem;\n padding: 0.625rem 0.25rem;\n margin-left: 0.5rem;\n border-radius: var(--border-radius-default);\n cursor: pointer;\n position: relative;\n overflow: hidden;\n\n &:first-child {\n margin-left: 0.125rem;\n }\n\n &:last-child {\n margin-right: 0.125rem;\n }\n\n .Avatar {\n margin: 0 auto 0.375rem;\n }\n\n &:hover {\n background: var(--color-chat-hover);\n }\n\n .top-peer-name {\n text-align: center;\n white-space: nowrap;\n font-size: 0.75rem;\n overflow: hidden;\n text-overflow: ellipsis;\n\n .emoji-small {\n width: 1rem;\n height: 1rem;\n background-size: 1rem;\n margin-inline-end: 1px;\n vertical-align: -3px;\n }\n }\n }\n\n .recent-chats-header {\n display: flex;\n align-items: center;\n\n .Button {\n margin-left: auto;\n }\n\n &[dir=rtl] {\n .Button {\n margin-left: 0;\n margin-right: auto;\n }\n }\n }\n}\n",".ChatMessage {\n &:first-child {\n margin-top: .5rem;\n }\n &:hover, &.selected {\n .Avatar.online::after {\n border-color: var(--color-chat-hover);\n }\n }\n\n .ListItem-button {\n padding: .25rem .5rem;\n }\n\n .info {\n .title {\n flex-grow: 1;\n }\n\n h3 {\n font-size: 1rem;\n width: auto;\n }\n\n .subtitle {\n color: var(--color-text-secondary);\n\n .matching-text-highlight {\n color: var(--color-text);\n background: #CAE3F7;\n border-radius: 0.25rem;\n padding: 0 0.125rem;\n }\n }\n\n .message {\n flex-grow: 1;\n color: var(--color-text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n\n .sender-name {\n color: var(--color-text);\n }\n .sender-name {\n &::after {\n content: ': ';\n }\n }\n\n img {\n width: 1.25rem;\n height: 1.25rem;\n object-fit: cover;\n border-radius: .125rem;\n vertical-align: -.25rem;\n margin-right: .25rem;\n }\n\n .icon-play {\n position: relative;\n display: inline-block;\n font-size: .75rem;\n color: #fff;\n margin-inline-start: -1.25rem;\n margin-inline-end: 0.5rem;\n bottom: 0.0625rem;\n }\n }\n }\n\n .info-row {\n display: flex;\n justify-content: space-between;\n }\n\n &[dir=rtl] {\n .subtitle {\n text-align: right;\n }\n }\n}\n",".DateSuggest {\n display: flex;\n height: 2rem;\n flex-direction: row;\n justify-content: space-between;\n margin-left: .5rem;\n margin-bottom: .5rem;\n\n .date-item {\n display: flex;\n flex: 1 1 auto;\n min-width: 8rem;\n margin-top: .375rem;\n cursor: pointer;\n font-size: .875rem;\n font-weight: 500;\n color: var(--color-text-secondary);\n\n .icon-calendar {\n font-size: 1.25rem;\n margin-right: .25rem;\n }\n }\n \n}",".LeftSearch {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n\n & > .Transition {\n flex: 1;\n overflow: hidden;\n }\n\n .TabList {\n padding-bottom: 1px;\n z-index: 1;\n }\n\n .documents-list {\n padding: 0 1.25rem 1.25rem;\n\n .ListItem {\n padding: 0.625rem 0;\n }\n }\n\n .section-heading {\n position: relative;\n padding-top: 1.25rem;\n padding-left: 1.25rem;\n margin: 0 0 1rem -1.25rem !important;\n\n font-weight: 500;\n font-size: .9375rem;\n color: var(--color-text-secondary);\n\n &::before {\n content: '';\n position: absolute;\n width: 100%;\n height: 1px;\n background: var(--color-borders);\n left: .625rem;\n top: -1px;\n }\n\n &[dir=rtl],\n &[dir=auto] {\n padding-left: 0;\n padding-right: 1.25rem;\n margin: 0 -1.25rem 0 1rem !important;\n text-align: initial;\n\n &::before {\n left: auto;\n right: .625rem;\n }\n }\n }\n\n .LeftSearch .search-section .section-heading,\n .RecentContacts .search-section .section-heading {\n margin-left: -1rem !important;\n width: calc(100% + 2rem);\n box-shadow: 0 -1px 0 0 var(--color-borders);\n\n &::before {\n display: none;\n }\n }\n\n .WebLink {\n display: flex;\n }\n\n .content:not(.with-seekline) {\n align-self: center;\n min-width: 0;\n flex-grow: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n word-break: break-word;\n }\n\n .message-date {\n font-size: .75rem;\n color: var(--color-text-secondary);\n padding-left: 1rem;\n white-space: nowrap;\n }\n\n .media-list {\n display: grid;\n padding: .5rem;\n grid-template-columns: repeat(3, 1fr);\n grid-auto-rows: 1fr;\n grid-gap: .25rem;\n }\n\n .Audio {\n .ProgressSpinner {\n margin: -.1875rem 0 0 -.1875rem;\n }\n }\n\n .ListItem.search-result {\n .ChatInfo {\n .handle {\n unicode-bidi: plaintext;\n color: var(--color-primary);\n unicode-bidi: plaintext;\n\n &::before {\n content: '@';\n html[lang=ar] & {\n content: ' ،@';\n margin-inline-end: .25rem;\n }\n }\n\n &::after {\n content: ', ';\n color: var(--color-text-secondary);\n\n html[lang=ar] & {\n content: '';\n }\n }\n }\n\n &[dir=rtl] {\n .status {\n text-align: right;\n\n .handle {\n float: right;\n }\n }\n }\n }\n }\n\n .ListItem.search-result-message {\n .sender-name {\n color: var(--color-text);\n\n &::after {\n content: ': ';\n white-space: pre;\n }\n }\n }\n\n @media (max-width: 600px) {\n .ListItem {\n margin: 0 -0.625rem;\n }\n }\n\n .search-section {\n padding: 0 1rem 0.5rem;\n\n .section-heading {\n color: var(--color-text-secondary);\n font-size: .9375rem;\n font-weight: 500;\n margin-bottom: 0 !important;\n padding-top: .875rem;\n\n .Link {\n float: right;\n color: var(--color-links);\n font-weight: 400;\n margin-right: 1rem;\n\n &:focus,\n &:hover {\n text-decoration: underline;\n }\n }\n\n &[dir=rtl],\n &[dir=auto] {\n .Link {\n float: left;\n margin-left: 1rem;\n margin-right: 0;\n }\n }\n }\n\n .Loading {\n height: 4.5rem;\n margin-bottom: 0.5rem;\n }\n }\n\n .chat-selection {\n padding-top: .5rem;\n display: flex;\n flex-shrink: 0;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: flex-end;\n box-shadow: inset 0 -1px 0 0 var(--color-borders);\n background-color: var(--color-background);\n -webkit-overflow-scrolling: touch;\n overflow-x: auto;\n overflow-y: hidden;\n\n scrollbar-color: rgba(0, 0, 0, 0);\n\n > .PickerSelectedItem {\n flex: 0 0 auto;\n\n &:last-child {\n margin-right: auto;\n }\n }\n\n &[dir=rtl] {\n > .PickerSelectedItem:last-child {\n margin-left: auto;\n margin-right: 0;\n }\n }\n }\n\n .NothingFound {\n height: 100%;\n }\n\n [dir=rtl] {\n .message-date {\n padding-left: 0;\n padding-right: 1rem;\n }\n }\n}\n","@mixin thumb-styles() {\n background: var(--color-primary);\n cursor: pointer;\n transform: scale(1);\n transition: transform .25s ease-in-out;\n\n &:hover {\n transform: scale(1.2);\n }\n}\n\n.CropModal {\n .modal-dialog {\n width: calc(100% - 2rem);\n max-width: 35rem;\n height: calc(100% - 1rem);\n max-height: 35rem;\n position: relative;\n }\n\n .modal-content, #avatar-crop {\n overflow: hidden;\n }\n\n .confirm-button {\n position: absolute;\n bottom: 1rem;\n right: 1rem;\n box-shadow: 0 1px 2px var(--color-default-shadow);\n }\n\n #avatar-crop {\n max-width: 25rem;\n margin: 0 auto;\n position: relative;\n\n &::before {\n content: '';\n display: block;\n padding-top: 100%;\n }\n\n .cr-boundary {\n position: absolute;\n top: 0;\n left: 0;\n border-radius: var(--border-radius-messages-small);\n }\n\n .cr-viewport {\n border: none;\n box-shadow: 0 0 2000px 2000px rgba(white, 0.5);\n }\n\n .cr-slider {\n // Note that while we're repeating code here, that's necessary as you can't comma-separate these type of selectors.\n // Browsers will drop the entire selector if it doesn't understand a part of it.\n\n &::-webkit-slider-runnable-track {\n background: var(--color-borders);\n }\n\n &::-moz-range-track {\n background: var(--color-borders);\n }\n\n &::-ms-track {\n background: var(--color-borders);\n }\n\n &::-webkit-slider-thumb {\n @include thumb-styles();\n }\n\n &::-moz-range-thumb {\n @include thumb-styles();\n }\n\n &::-ms-thumb {\n @include thumb-styles();\n }\n }\n }\n}\n","@import '../../styles/mixins';\n\n.AvatarEditable {\n label {\n margin-left: auto;\n margin-right: auto;\n width: 7.5rem;\n height: 7.5rem;\n margin-bottom: 2rem;\n display: flex !important;\n align-items: center;\n justify-content: center;\n background-color: var(--color-primary);\n border-radius: 50%;\n color: white;\n font-size: 3rem;\n cursor: pointer;\n position: relative;\n overflow: hidden;\n outline: none !important;\n\n input {\n display: none;\n }\n\n img {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n\n i {\n transform: scale(1);\n transition: transform .15s linear;\n z-index: var(--z-register-add-avatar);\n }\n\n // @optimization The weirdest workaround for screen animation lag\n @include while-transition() {\n input, i, &::after {\n display: none !important;\n }\n\n img {\n position: static !important;\n }\n }\n\n &:hover {\n i {\n transform: scale(1.2);\n }\n }\n\n &.filled {\n background-color: var(--color-background);\n\n &::after {\n content: '';\n display: block;\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(black, 0.4);\n }\n }\n\n &.disabled {\n pointer-events: none;\n\n i {\n display: none;\n }\n\n &::after {\n display: none;\n }\n }\n }\n}\n",".ShowMoreButton {\n color: var(--text-color) !important;\n display: flex;\n align-items: center;\n text-align: left;\n text-transform: none;\n padding-left: .75rem !important;\n opacity: 1 !important;\n\n i {\n font-size: 1.5rem;\n margin-right: 2rem;\n color: var(--color-text-secondary);\n }\n\n .Spinner {\n top: 0.4375rem;\n }\n}\n",".SettingsFoldersChatsPicker {\n height: calc(100% - var(--header-height));\n\n .picker-header {\n box-shadow: 0 0 2px var(--color-default-shadow);\n\n .max-items-reached {\n margin-bottom: 0.5rem;\n margin-left: 0.5rem;\n flex-grow: 1;\n }\n\n .max-items-reached {\n color: var(--color-text-secondary);\n }\n }\n\n .picker-list {\n padding: 0 0.5rem 0.5rem;\n\n .no-results {\n height: 10rem;\n }\n }\n\n .ListItem.picker-list-item {\n &.chat-type-item .ListItem-button {\n padding: 0.875rem 0.75rem;\n }\n\n &.chat-item .ListItem-button {\n padding: 0.5rem 0.75rem;\n }\n\n .Checkbox {\n margin-left: auto;\n padding-left: 3.25rem;\n }\n\n .chat-type {\n font-size: 1rem;\n font-weight: 400;\n margin: 0;\n }\n\n &[dir=rtl] {\n .Checkbox {\n margin-left: 0;\n margin-right: auto;\n padding-left: 0;\n padding-right: 3.25rem;\n }\n }\n }\n\n .settings-item-header {\n margin-left: 0.75rem;\n margin-top: 1rem;\n margin-bottom: 0.5rem;\n }\n\n .picker-list-divider {\n margin: 0.5rem -0.5rem 0;\n border-bottom: 1px solid var(--color-borders);\n }\n}\n",".settings-folders-recommended-item {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.settings-folders-list-item {\n .ChatInfo {\n display: flex;\n align-items: center;\n\n .Avatar {\n margin-left: -0.25rem;\n margin-right: 1.5rem;\n }\n\n .title {\n display: flex;\n justify-content: flex-start;\n align-items: center;\n\n h3 {\n font-size: 1rem;\n font-weight: 500;\n line-height: 1.3125;\n margin: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-align: left;\n }\n }\n\n .status {\n display: none;\n }\n\n &[dir=rtl] {\n .title h3{\n text-align: right;\n }\n }\n }\n\n .ListItem-button {\n i {\n opacity: 0.9;\n }\n }\n\n &.color-primary .ListItem-button {\n color: var(--color-primary);\n\n i {\n opacity: 1;\n color: inherit;\n }\n }\n\n &[dir=rtl] {\n .Avatar {\n margin-left: 1.5rem;\n margin-right: -0.25rem;\n }\n }\n}\n\n.settings-item .ShowMoreButton {\n margin: 0 -1rem;\n width: calc(100% + 2rem);\n padding-left: 1rem !important;\n}\n",".SettingsStickerSet {\n .settings-item &.ListItem {\n margin-bottom: .5rem;\n }\n\n .StickerButton,\n .Button {\n width: 3rem;\n height: 3rem;\n margin: 0 .5rem 0 0;\n padding: 0;\n flex: 0 0 3rem;\n }\n\n img {\n max-width: 100%;\n max-height: 100%;\n }\n\n .multiline-menu-item {\n display: flex;\n flex-direction: column;\n justify-content: center;\n }\n\n &[dir=rtl] {\n .StickerButton,\n .Button {\n margin: 0 0 0 .5rem;\n }\n }\n}\n",".WallpaperTile {\n height: 0;\n padding-bottom: 100%;\n cursor: pointer;\n position: relative;\n\n .media-inner,\n &::after {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n }\n\n .media-inner {\n overflow: hidden;\n transform: scale(1);\n transition: transform .15s ease;\n\n img, canvas {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n }\n\n &::after {\n content: \"\";\n display: block;\n border: 2px solid var(--color-primary);\n opacity: 0;\n transition: opacity .15s ease;\n }\n\n &.selected {\n &::after {\n opacity: 1;\n }\n\n .media-inner {\n transform: scale(0.9);\n }\n }\n\n .spinner-container {\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n}\n",".SettingsGeneralBackground {\n .settings-wallpapers {\n display: grid;\n padding: .5rem;\n grid-template-columns: repeat(3, 1fr);\n grid-auto-rows: 1fr;\n grid-gap: .25rem;\n }\n\n .Loading {\n height: auto !important;\n margin-top: 5rem;\n }\n}\n",".SettingsGeneralBackgroundColor {\n &:not(.is-dragging) .handle {\n transition: transform 300ms ease;\n }\n\n .color-picker, .hue-picker {\n position: relative;\n }\n\n .color-picker {\n margin-top: 1rem;\n height: 12rem;\n }\n\n .hue-picker {\n margin: 2rem 0;\n height: 0.5rem;\n }\n\n canvas {\n display: block;\n width: 100%;\n height: 100%;\n border-radius: var(--border-radius-default);\n cursor: pointer;\n }\n\n .handle {\n position: absolute;\n top: -0.75rem;\n left: -0.75rem;\n width: 1.5rem;\n height: 1.5rem;\n border: 0.125rem solid var(--color-white);\n border-radius: 0.75rem;\n cursor: grab;\n }\n\n .hue-picker .handle {\n top: -0.5rem;\n }\n\n .tools {\n margin-bottom: 0.625rem;\n display: flex;\n\n .input-group {\n margin-bottom: 0;\n\n &[dir=rtl] {\n label {\n transform: scale(0.75) translate(1.25rem, -2.25rem);\n }\n }\n }\n\n .input-group:first-child {\n margin-right: 0.5rem;\n }\n\n .input-group:last-child {\n margin-left: 0.5rem;\n }\n }\n\n .predefined-colors {\n display: grid;\n padding: .5rem;\n grid-template-columns: repeat(3, 1fr);\n grid-auto-rows: 1fr;\n grid-gap: .25rem;\n\n div {\n cursor: pointer;\n box-shadow: inset 0 0 0 0 var(--color-background);\n transition: box-shadow 300ms ease;\n\n &.active {\n border: 0.125rem solid var(--color-primary);\n box-shadow: inset 0 0 0 0.3125rem var(--color-background);\n }\n\n // A hack to make a square\n &:before {\n display: block;\n content: \"\";\n width: 100%;\n padding-top: 100%;\n pointer-events: none;\n }\n }\n }\n}\n","#monkey {\n position: relative;\n display: block;\n margin-left: auto;\n margin-right: auto;\n width: 7.5rem;\n height: 7.5rem;\n margin-bottom: 1.75rem;\n\n @media (min-width: 600px) and (min-height: 450px) {\n width: 10rem;\n height: 10rem;\n margin-bottom: 2.5rem;\n }\n\n &.big {\n width: 10rem;\n height: 10rem;\n }\n\n .AnimatedSticker {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n\n &.hidden {\n display: none\n }\n }\n\n .monkey-preview {\n width: 100%;\n height: 100%;\n background-size: 100%;\n background: url('../../assets/monkey.svg') center;\n }\n}\n","@import '../../../styles/mixins';\n\n#Settings {\n height: 100%;\n\n > div {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .left-header {\n padding-right: .8125rem;\n }\n}\n\n.settings-main-header {\n display: flex;\n flex-grow: 1;\n justify-content: space-between;\n align-items: center;\n}\n\n.settings-more-menu {\n .bubble {\n width: auto;\n\n .MenuItem button {\n padding-left: 1rem !important;\n padding-right: 2rem !important;\n }\n }\n}\n\n.settings-content {\n background: var(--color-background);\n height: calc(100% - var(--header-height));\n\n overflow-y: auto;\n @include overflow-y-overlay();\n\n &.infinite-scroll {\n display: flex;\n flex-direction: column;\n\n & > .custom-scroll {\n flex: 1 1 auto;\n height: auto;\n }\n }\n\n #monkey {\n margin-top: .5rem;\n margin-bottom: 1rem;\n }\n\n .AnimatedEmoji {\n margin-top: .5rem;\n margin-bottom: 1.5rem;\n }\n}\n\n.settings-content-header {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 0 1.5rem 1rem;\n text-align: center;\n\n .input-group {\n width: 100%;\n }\n}\n\n.settings-content-icon {\n width: 5rem;\n height: 5rem;\n margin-bottom: 2.5rem;\n position: relative;\n\n .AnimatedSticker {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n\n &.hidden {\n display: none\n }\n }\n}\n\n.settings-main-menu {\n padding: 0 0.5rem .75rem;\n\n > .ChatExtra {\n padding: 0 .5rem .3125rem;\n margin: 0 -.5rem .625rem;\n box-shadow: inset 0 -.0625rem 0 0 var(--color-background-secondary-accent);\n border-bottom: .625rem solid var(--color-background-secondary);\n\n .ListItem.narrow {\n margin-bottom: .25rem;\n }\n }\n}\n\n.settings-item {\n border-top: 1px solid var(--color-borders);\n padding: 1.5rem 1.5rem 1rem;\n\n &.no-border {\n border-top: none;\n }\n\n &-header {\n font-size: 1rem;\n color: var(--color-text-secondary);\n margin-bottom: 2rem;\n position: relative;\n\n &[dir=rtl] {\n text-align: right;\n }\n }\n\n &-slider {\n margin-top: 2rem;\n }\n\n &-description {\n font-size: 0.875rem;\n color: var(--color-text-secondary);\n margin-top: -0.5rem;\n margin-bottom: 1.5rem;\n\n .settings-content.two-fa & {\n font-size: 1rem;\n }\n\n &[dir=rtl] {\n text-align: right;\n unicode-bidi: plaintext;\n }\n }\n\n &-description-larger {\n font-size: 1rem;\n line-height: 1.3125rem;\n color: var(--color-text-secondary);\n margin-top: 2rem;\n margin-bottom: 0.75rem;\n\n &[dir=rtl] {\n text-align: right;\n }\n }\n\n .ListItem {\n margin: 0 -1rem 1rem;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n .multiline-menu-item {\n white-space: initial;\n\n &.full-size {\n width: 100%;\n }\n\n .date {\n float: right;\n font-size: 0.75rem;\n margin-left: 1rem;\n color: var(--color-text-secondary);\n }\n\n .title, .subtitle {\n display: block;\n text-align: left;\n }\n\n .title {\n line-height: 1.25rem;\n }\n\n .subtitle {\n font-size: 0.875rem;\n line-height: 1.5rem;\n color: var(--color-text-secondary);\n\n & + .subtitle {\n margin-top: -0.25rem;\n }\n\n &.black {\n color: var(--color-text);\n }\n\n &.tight {\n line-height: 1.3125rem;\n margin-bottom: .1875rem;\n }\n }\n }\n\n &.destructive {\n .ListItem-button {\n color: var(--color-error);\n\n i {\n color: inherit;\n }\n }\n }\n\n &.blocked-list-item {\n margin-bottom: 0.5rem;\n\n .ListItem-button {\n align-items: center;\n text-align: left;\n padding: 0.5rem;\n }\n\n .Avatar {\n width: 3rem;\n height: 3rem;\n margin-right: 1rem;\n }\n\n .contact-name {\n font-size: 1rem;\n line-height: 1rem;\n margin-bottom: 0.25rem;\n font-weight: 500;\n }\n\n .contact-phone {\n font-size: 0.875rem;\n line-height: 1rem;\n color: var(--color-text-secondary);\n }\n }\n\n &[dir=rtl] {\n .multiline-menu-item {\n .title, .subtitle {\n text-align: right;\n }\n\n .date {\n float: left;\n margin-left: 0;\n margin-right: 1rem;\n }\n }\n }\n }\n\n .RangeSlider {\n margin-bottom: 1.0625rem;\n }\n\n .Checkbox, .radio-group {\n margin: 0 -1rem 0.5rem;\n }\n\n .radio-group {\n .Radio:last-child {\n margin-bottom: 0;\n }\n }\n\n .Radio + .Radio, .Checkbox + .Checkbox {\n margin-top: 2rem;\n }\n}\n\n.settings-fab-wrapper {\n height: calc(100% - var(--header-height));\n position: relative;\n overflow: hidden;\n\n .settings-content {\n height: 100%;\n }\n\n .FloatingActionButton {\n right: 1.5rem;\n }\n}\n\n.settings-edit-profile {\n padding: 0 1.5rem;\n}\n\n.username-link {\n color: var(--color-links);\n}\n","// @optimization\n@mixin while-transition() {\n .Transition > div:not(.active) &, body.animating-right-column & {\n @content;\n }\n}\n\n@mixin overflow-y-overlay() {\n @supports (overflow-y: overlay) {\n overflow-y: overlay;\n\n //Workaround for Android <= 9\n overflow-x: hidden;\n }\n}\n\n@mixin reset-range() {\n input[type=\"range\"] {\n -webkit-appearance: none;\n display: block;\n width: 100%;\n height: 0.75rem;\n margin-bottom: 0.5rem;\n background: transparent;\n\n &:focus {\n outline: none;\n }\n\n &::-ms-track {\n width: 100%;\n cursor: pointer;\n\n background: transparent;\n border-color: transparent;\n color: transparent;\n }\n\n &::-webkit-slider-thumb {\n -webkit-appearance: none;\n }\n\n &::-moz-slider-thumb {\n -moz-appearance: none;\n }\n\n &::-webkit-slider-runnable-track {\n cursor: pointer;\n }\n\n &::-moz-range-track, &::-moz-range-progress {\n cursor: pointer;\n }\n }\n}\n",".NewChat {\n height: 100%;\n overflow: hidden;\n position: relative;\n\n &-inner {\n height: calc(100% - var(--header-height));\n overflow: hidden;\n\n &.step-2 {\n padding: 0 1.25rem;\n display: flex;\n flex-direction: column;\n\n .note, .error {\n font-size: 0.875rem;\n line-height: 1.25rem;\n margin: 1.5rem 0.25rem;\n }\n\n .error {\n color: var(--color-error);\n }\n\n .note {\n margin-top: -0.5625rem;\n color: var(--color-text-secondary);\n }\n\n .chat-members-heading {\n color: var(--color-text-secondary);\n font-size: 1rem;\n font-weight: 500;\n margin: 1rem 0.25rem;\n }\n\n .chat-members-list {\n margin: 0 -1.25rem;\n padding: 0 1rem 1rem;\n\n overflow-x: hidden;\n flex-grow: 1;\n }\n }\n }\n}\n",".ArchivedChats {\n height: 100%;\n overflow: hidden;\n\n .chat-list {\n height: calc(100% - var(--header-height));\n }\n}\n",".MessageContextMenu {\n position: absolute;\n font-size: 1rem;\n\n .bubble {\n transform: scale(0.5);\n transition: opacity .15s cubic-bezier(0.2, 0, 0.2, 1), transform .15s cubic-bezier(0.2, 0, 0.2, 1) !important;\n overflow: auto;\n overflow: overlay;\n }\n\n .backdrop {\n touch-action: none;\n }\n}\n",".StickerSetModal {\n .modal-dialog {\n width: 26.25rem;\n max-width: 100%;\n }\n\n @media (max-width: 600px) {\n .modal-dialog {\n width: 18.875rem;\n }\n }\n\n .modal-header {\n padding: 0.5rem 1rem;\n }\n\n .modal-content {\n text-align: center;\n padding: 0;\n }\n\n .stickers {\n position: relative;\n width: 100%;\n height: 19rem;\n max-height: 50vh;\n overflow-y: auto;\n padding: 0 0.25rem;\n text-align: left;\n }\n\n .button-wrapper {\n padding: 0.5rem 0;\n border-top: 1px solid var(--color-borders);\n box-shadow: 0 0 2px var(--color-default-shadow);\n\n button {\n display: inline-block;\n }\n }\n\n .Loading {\n width: 100%;\n height: 22.8125rem;\n max-height: calc(50vh + 3.8125rem);\n }\n}\n\n",".HeaderMenuContainer {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n height: 100vh;\n z-index: var(--z-header-menu);\n\n .Menu {\n position: absolute;\n font-size: 1rem;\n\n .backdrop {\n z-index: var(--z-header-menu-backdrop);\n }\n\n .bubble {\n z-index: var(--z-header-menu);\n --offset-y: calc(100% + 1rem);\n }\n }\n}\n","#MobileSearch > .header {\n position: absolute;\n top: 0;\n left: 0;\n z-index: var(--z-mobile-search);\n width: 100%;\n height: 3.5rem;\n background: var(--color-background);\n display: flex;\n align-items: center;\n padding: 0 0.5rem 0 0.25rem;\n\n @supports (padding-left: env(safe-area-inset-left)) {\n padding-left: #{\"max(0.25rem, env(safe-area-inset-left))\"};\n padding-right: #{\"max(0.5rem, env(safe-area-inset-right))\"};\n }\n\n > .SearchInput {\n margin-left: 0.25rem;\n flex: 1;\n }\n}\n\n#MobileSearch > .footer {\n position: absolute;\n bottom: 0;\n left: 0;\n z-index: var(--z-mobile-search);\n width: 100%;\n height: 3.5rem;\n background: var(--color-background);\n display: flex;\n align-items: center;\n padding-left: 1rem;\n padding-right: 0.5rem;\n\n @supports (padding-bottom: env(safe-area-inset-bottom)) {\n padding-left: #{\"max(1rem, env(safe-area-inset-left))\"};\n padding-right: #{\"max(0.5rem, env(safe-area-inset-right))\"};\n\n body:not(.keyboard-visible) & {\n padding-bottom: env(safe-area-inset-bottom);\n height: calc(3.5rem + env(safe-area-inset-bottom));\n }\n }\n\n > .counter {\n flex: 1;\n color: var(--color-text-secondary);\n }\n}\n\n#MobileSearch:not(.active) {\n .header, .footer {\n // `display: none` will prevent synchronous focus on iOS\n transform: translateX(-999rem);\n }\n}\n",".MentionTooltip {\n width: calc(100% - 4rem);\n max-width: 20rem;\n flex-direction: column;\n\n z-index: -1;\n\n @media (max-width: 600px) {\n width: calc(100% - 3rem);\n }\n\n .ListItem.chat-item-clickable {\n margin: 0;\n\n .ListItem-button {\n border-radius: 0;\n }\n\n .info {\n display: flex;\n }\n\n .title {\n margin-inline-end: .625rem;\n max-width: 70%;\n }\n\n .handle {\n font-size: 1rem;\n }\n\n &[dir=rtl] {\n .status {\n width: auto;\n }\n }\n }\n\n .ChatInfo {\n .title h3 {\n line-height: 1.25;\n }\n\n .Avatar {\n margin-right: 0.7em;\n }\n\n .handle {\n &::before {\n content: '@';\n }\n }\n\n .user-status {\n display: none !important;\n }\n }\n}\n",".AttachmentModal {\n --border-radius-default: 0.625rem;\n\n .modal-dialog {\n max-width: 26.25rem;\n @media(max-width: 600px) {\n max-height: 100%;\n padding-bottom: 1.5rem;\n }\n }\n\n .modal-content {\n padding: .5rem 1.25rem 1.875rem;\n max-height: calc(100vh - 3.25rem);\n @media(max-width: 600px) {\n padding-bottom: .25rem;\n }\n }\n\n .media-wrapper {\n max-height: 26rem;\n overflow: auto;\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 1.5rem;\n\n video,\n img {\n flex: 1;\n width: calc(50% - 0.15rem);\n height: 12rem;\n margin-bottom: 0.3rem;\n border-radius: var(--border-radius-default);\n object-fit: cover;\n\n &:only-child {\n height: auto;\n max-height: 25rem;\n margin-bottom: 0;\n }\n\n &:nth-child(even) {\n margin-left: 0.3rem;\n }\n }\n }\n\n .document-wrapper {\n max-height: 25rem;\n overflow: auto;\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n margin: .75rem 0 1.75rem;\n\n .File:not(:last-child) {\n margin-bottom: 1.5rem;\n }\n\n .file-icon {\n cursor: default !important;\n }\n }\n\n .attachment-caption-wrapper {\n position: relative;\n\n .form-control {\n background: var(--color-background);\n }\n\n .MentionTooltip {\n right: 0 !important;\n z-index: 0;\n }\n }\n\n .drop-target {\n position: relative;\n\n &::before,\n &::after {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n right: 0;\n bottom: 0;\n border-radius: var(--border-radius-default);\n pointer-events: none;\n\n opacity: 0;\n transition: 250ms opacity;\n z-index: 1;\n }\n\n &::before {\n background-image: var(--drag-target-border-hovered);\n background-color: var(--color-background);\n }\n\n &::after {\n content: attr(data-attach-description);\n display: flex;\n justify-content: center;\n align-items: center;\n color: var(--color-primary);\n }\n }\n\n &.hovered {\n .drop-target::before {\n opacity: .95;\n }\n\n .drop-target::after {\n opacity: 1;\n }\n\n .attachment-caption-wrapper,\n .document-wrapper,\n .media-wrapper {\n pointer-events: none;\n }\n\n .document-wrapper,\n .media-wrapper {\n border-radius: var(--border-radius-default);\n }\n }\n}\n",".PollModal {\n .modal-dialog {\n max-width: 26.25rem;\n max-height: calc(100vh - 5rem);\n }\n\n .modal-content {\n padding: .5rem 1.25rem 1.875rem;\n min-height: 4.875rem;\n }\n\n .modal-header-condensed {\n margin-bottom: 1rem;\n }\n\n .options-header {\n color: var(--color-text-secondary);\n font-size: 1rem;\n font-weight: 500;\n margin: 1.5rem 0.25rem;\n }\n\n .options-list {\n margin: 1rem -0.75rem -0.5rem;\n padding: 0 0.75rem;\n border-top: 1px solid var(--color-chat-hover);\n max-height: 20rem;\n overflow: auto;\n\n &.overflown {\n padding: 0 0.4rem 0.5rem 0.75rem;\n }\n\n @media (max-width: 600px) {\n overflow: hidden;\n max-height: none;\n\n &, &.overflown {\n padding: 0 0.75rem;\n }\n }\n }\n\n .option-wrapper {\n position: relative;\n\n .form-control {\n padding-right: 3rem;\n }\n\n .option-remove-button {\n position: absolute;\n top: 0.3125rem;\n right: 0.3125rem;\n }\n }\n\n .quiz-mode {\n margin-top: 1.5rem;\n\n .options-header {\n margin-bottom: 0.5rem;\n }\n\n .note {\n margin-top: 0.5rem;\n }\n }\n\n .note {\n font-size: smaller;\n color: var(--color-text-secondary)\n }\n\n .error {\n font-size: smaller;\n color: var(--color-error);\n margin: -1rem 0 1rem .25rem;\n }\n\n .input-group:last-child {\n margin-bottom: 0.5rem;\n }\n}\n",".EmojiButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 2.5rem;\n height: 2.5rem;\n margin: 0.125rem;\n border-radius: var(--border-radius-messages-small);\n cursor: pointer;\n font-size: 1.75rem;\n line-height: 2.5rem;\n background-color: transparent;\n transition: background-color .15s ease;\n\n .mac-os-fix & {\n line-height: inherit;\n }\n\n &.focus,\n &:hover {\n background-color: var(--color-background-selected);\n }\n\n & > img {\n width: 2rem;\n height: 2rem;\n }\n}\n",".EmojiPicker {\n height: 100%;\n\n &-main {\n height: calc(100% - 3rem);\n overflow-y: auto;\n padding: 0.5rem;\n\n @media (max-width: 600px) {\n padding: 0.5rem 0.25rem;\n }\n\n .symbol-set-container {\n display: flex;\n flex-wrap: wrap;\n }\n }\n\n &-header {\n height: 3rem;\n border-bottom: 1px solid var(--color-borders);\n display: flex;\n align-items: center;\n justify-content: space-around;\n box-shadow: 0 0 2px var(--color-default-shadow);\n\n @media (max-width: 600px) {\n overflow-x: auto;\n overflow-y: hidden;\n display: block;\n white-space: nowrap;\n padding: 0.4375rem 0;\n\n scrollbar-width: none;\n scrollbar-color: rgba(0, 0, 0, 0);\n\n &::-webkit-scrollbar {\n height: 0;\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, 0);\n }\n\n .symbol-set-button {\n display: inline-flex;\n vertical-align: middle;\n }\n\n // Spacer to counter last button margin not being accounted in scroll width\n &::after {\n content: \"\";\n display: block;\n flex-shrink: 0;\n width: 0.1px;\n height: 1rem;\n }\n }\n }\n}\n",".StickerPicker {\n height: 100%;\n\n &-main {\n position: relative;\n height: calc(100% - 3rem);\n overflow-y: auto;\n padding: 0.5rem;\n\n @media (max-width: 600px) {\n padding: 0.5rem 0.25rem;\n }\n }\n\n &-header {\n height: 3rem;\n border-bottom: 1px solid var(--color-borders);\n padding: 0.125rem 0;\n overflow-x: auto;\n overflow-y: hidden;\n white-space: nowrap;\n box-shadow: 0 0 2px var(--color-default-shadow);\n\n scrollbar-width: none;\n scrollbar-color: rgba(0, 0, 0, 0);\n\n &::-webkit-scrollbar {\n height: 0;\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, 0);\n }\n\n // Spacer to counter last button margin not being accounted in scroll width\n &::after {\n content: \"\";\n display: block;\n flex-shrink: 0;\n width: 0.1px;\n height: 1rem;\n }\n\n\n .sticker-set-button {\n display: inline-flex;\n vertical-align: middle;\n\n &.StickerButton {\n background-size: 2rem;\n\n img, .AnimatedSticker {\n top: 0.375rem;\n left: 0.375rem;\n width: 2rem;\n height: 2rem;\n }\n }\n\n .sticker-set-cover {\n width: 2rem;\n height: 2rem;\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n\n img, .AnimatedSticker {\n width: 100%;\n height: 100%;\n position: absolute;\n top: 0;\n left: 0;\n }\n }\n }\n }\n\n .symbol-set-container {\n width: 25rem;\n line-height: 0;\n\n @media (max-width: 600px) {\n width: 100%;\n }\n }\n\n .sticker-set-button {\n width: 2.75rem !important;\n height: 2.75rem;\n margin: 0 0.25rem;\n border-radius: var(--border-radius-messages-small);\n }\n}\n",".GifButton {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 6.25rem;\n background-color: transparent;\n cursor: pointer;\n overflow: hidden;\n position: relative;\n\n &:last-child {\n margin-bottom: 1rem;\n }\n\n &.vertical {\n grid-column-end: span 1;\n }\n\n &.horizontal {\n grid-column-end: span 2;\n }\n\n .thumbnail {\n width: 100%;\n height: 100%;\n background-size: cover !important;\n background: transparent no-repeat center;\n }\n\n .preview, video {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .Spinner {\n position: absolute;\n pointer-events: none;\n }\n}\n",".GifPicker {\n display: grid;\n grid-template-columns: repeat(6, 1fr);\n grid-auto-rows: 6.25rem;\n grid-gap: 0.25rem;\n grid-auto-flow: dense;\n height: 100%;\n overflow-y: auto;\n padding: 0.25rem;\n\n .Loading, .picker-disabled {\n grid-column: 1 / -1;\n height: var(--menu-height);\n }\n}\n","@import '../../../styles/mixins';\n\n.SymbolMenu {\n &.mobile-menu {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--color-background);\n transform: translate3d(0, calc(var(--symbol-menu-height) + var(--symbol-menu-footer-height)), 0);\n z-index: 1;\n\n transition: transform var(--layer-transition);\n @supports (padding-bottom: env(safe-area-inset-bottom)) {\n padding-right: env(safe-area-inset-right);\n padding-bottom: env(safe-area-inset-bottom);\n padding-left: env(safe-area-inset-left);\n transform: translate3d(0, calc(var(--symbol-menu-height) + var(--symbol-menu-footer-height) + env(safe-area-inset-bottom)), 0);\n }\n\n &.open {\n transform: translate3d(0, 0, 0);\n\n body.is-media-viewer-open & {\n transform: translate3d(0, calc(var(--symbol-menu-height) + var(--symbol-menu-footer-height)), 0);\n }\n }\n\n body.animation-level-0 & {\n transition: none;\n }\n\n &:not(.middle-column-open) {\n transform: translate3d(100vw, 0, 0) !important;\n }\n }\n\n &-main {\n width: var(--symbol-menu-width);\n height: var(--symbol-menu-height);\n max-height: calc(100vh - var(--symbol-menu-footer-height));\n @supports (padding-bottom: env(safe-area-inset-bottom)) {\n max-height: calc(100vh - var(--symbol-menu-footer-height) - env(safe-area-inset-bottom));\n }\n }\n\n &-footer {\n height: var(--symbol-menu-footer-height);\n border-top: 1px solid var(--color-borders);\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 0 2px var(--color-default-shadow);\n position: relative;\n\n .Button {\n flex-shrink: 0;\n width: 2.125rem !important;\n height: 2.125rem;\n margin: 0 .25rem;\n padding: 0;\n\n &.activated {\n pointer-events: none;\n }\n\n &.symbol-tab-button {\n margin: 0 0.75rem;\n }\n\n &.symbol-search-button {\n position: absolute;\n left: 0.25rem;\n }\n\n &.symbol-delete-button {\n position: absolute;\n right: 0.25rem;\n }\n }\n }\n\n .Transition.slide {\n height: 100%;\n\n .Loading {\n height: var(--symbol-menu-height);\n }\n }\n\n .is-pointer-env & {\n > .backdrop {\n position: absolute;\n top: -1rem;\n left: 0;\n right: auto;\n width: 3.5rem;\n height: 4.5rem;\n }\n }\n\n .Button.bot-commands ~ & {\n .is-pointer-env & > .backdrop {\n left: 3rem;\n width: 3.25rem;\n }\n }\n\n .bubble {\n padding: 0;\n width: var(--symbol-menu-width);\n overflow: hidden;\n }\n\n .picker-disabled {\n height: var(--symbol-menu-height);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-text-secondary);\n }\n\n .symbol-close-button {\n display: none;\n position: absolute;\n right: .25rem;\n top: .25rem;\n\n @supports (right: env(safe-area-inset-right)) {\n right: #{\"max(.25rem, env(safe-area-inset-right))\"};\n top: #{\"max(.25rem, env(safe-area-inset-top))\"};\n }\n }\n\n @media (orientation: landscape) {\n .symbol-close-button {\n display: block;\n }\n }\n}\n\n.symbol-set {\n margin-bottom: 1rem;\n\n &-name {\n font-size: 1rem;\n line-height: 1.6875rem;\n font-weight: 500;\n margin: 0;\n padding-left: 0.5rem;\n color: rgba(var(--color-text-secondary-rgb), 0.75);\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-align: initial;\n unicode-bidi: plaintext;\n }\n\n &-container {\n text-align: initial;\n }\n\n &-button {\n flex-shrink: 0;\n width: 2.125rem !important;\n height: 2.125rem;\n margin: 0 0.25rem;\n padding: 0;\n }\n\n @include while-transition() {\n overflow: hidden;\n }\n\n .symbol-set-container {\n &:not(.shown) {\n display: block;\n }\n\n &.closing {\n transition: none;\n }\n }\n}\n",".AttachMenu {\n position: relative;\n\n .is-pointer-env & {\n > .backdrop {\n position: absolute;\n top: -1rem;\n left: auto;\n right: 0;\n width: 3.5rem;\n }\n }\n\n\n .media-disabled > button {\n white-space: normal;\n }\n}\n",".BotCommand {\n margin: 0 !important;\n\n .ListItem-button {\n border-radius: 0;\n }\n\n .multiline-item {\n padding: 0 1rem;\n\n .subtitle {\n padding-top: .25rem;\n line-height: 1.3125;\n }\n }\n\n &.with-avatar {\n .multiline-item {\n padding: 0;\n display: flex;\n }\n\n .content-inner {\n flex: 1;\n }\n }\n}\n",".BotCommandTooltip {\n width: calc(100% - 4rem);\n max-width: 26rem;\n flex-direction: column;\n\n z-index: -1;\n\n @media (max-width: 600px) {\n width: calc(100% - 3rem);\n }\n}\n",".BotCommandMenu {\n .menu-container {\n width: calc(100% - 4rem);\n max-width: 20rem;\n max-height: 40vh;\n overflow: auto;\n flex-direction: column;\n\n @media (max-width: 600px) {\n width: calc(100% - 3rem);\n }\n }\n\n .is-pointer-env & {\n > .backdrop {\n position: absolute;\n top: -1rem;\n left: 0;\n right: auto;\n width: 3.5rem;\n height: 4.5rem;\n }\n }\n}\n",".StickerTooltip {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(5rem, 1fr));\n grid-auto-rows: auto;\n place-items: center;\n\n &.hidden {\n display: none;\n }\n}\n",".CustomSendMenu {\n position: relative;\n bottom: 3.5rem;\n\n .is-pointer-env & {\n > .backdrop {\n position: absolute;\n top: -1rem;\n left: auto;\n right: 0;\n width: 3.5rem;\n }\n }\n\n\n .media-disabled > button {\n white-space: normal;\n }\n\n .bubble {\n width: 16rem;\n }\n}\n",".EmojiTooltip {\n display: flex;\n padding-left: .25rem;\n\n overflow-x: auto;\n @supports (overflow-x: overlay) {\n overflow-x: overlay;\n }\n overflow-y: hidden;\n\n .EmojiButton {\n flex: 0 0 2.5rem\n }\n}\n",".BaseResult {\n &.chat-item-clickable > .ListItem-button {\n padding-left: 1.25rem !important;\n padding-right: 1.25rem !important;\n\n .title {\n display: block;\n text-overflow: ellipsis;\n }\n }\n\n .thumb {\n background-color: var(--color-background-secondary);\n flex: 0 0 3rem;\n width: 3rem;\n height: 3rem;\n line-height: 3rem;\n border-radius: var(--border-radius-default-tiny);\n display: inline-flex;\n align-content: center;\n justify-content: center;\n margin-inline-end: .5rem;\n overflow: hidden;\n font-size: 1.5rem;\n\n img:not(.emoji) {\n width: 100%;\n object-fit: cover;\n }\n\n img.emoji {\n width: 1.5rem;\n height: 1.5rem;\n margin: .75rem 0 0;\n }\n }\n\n .content-inner {\n min-width: 0;\n }\n\n .title {\n font-weight: 500;\n text-align: left;\n unicode-bidi: plaintext;\n }\n\n .description {\n white-space: normal;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n text-overflow: ellipsis;\n text-align: left;\n unicode-bidi: plaintext;\n }\n &[dir=rtl] .title,\n &[dir=rtl] .description {\n text-align: right;\n }\n}\n",".MediaResult {\n height: 0;\n padding-bottom: 100%;\n overflow: hidden;\n position: relative;\n cursor: pointer;\n\n img {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n}\n",".InlineBotTooltip {\n .switch-pm .title {\n margin: 0 auto;\n font-weight: 500;\n }\n\n --border-radius-default: 0;\n\n &.gallery {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n grid-gap: 1px;\n padding: 0;\n\n @media (max-width: 600px) {\n grid-template-columns: repeat(3, 1fr);\n }\n\n .switch-pm {\n grid-column: 1 / -1;\n .ListItem-button {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n\n .GifButton {\n grid-column-end: initial;\n }\n\n .StickerButton {\n width: initial;\n height: 0;\n margin: 0;\n padding-bottom: 100%;\n border-radius: 0;\n\n .AnimatedSticker, img, canvas {\n position: absolute;\n top: 0;\n left: 0;\n width: 100% !important;\n height: 100% !important;\n\n @media (min-width: 600px) {\n top: .25rem;\n left: .25rem;\n width: calc(100% - .5rem) !important;\n height: calc(100% - .5rem) !important;\n }\n }\n }\n }\n}\n",".RightSearch {\n height: 100%;\n padding: 0 0.5rem;\n overflow-y: auto;\n\n .helper-text {\n padding: 1rem;\n margin-bottom: 0.125rem;\n font-weight: 500;\n color: var(--color-text-secondary);\n unicode-bidi: plaintext;\n text-align: initial;\n }\n}\n",".StickerSearch {\n height: 100%;\n padding: 0 0.5rem;\n overflow-y: auto;\n\n .helper-text {\n padding: 1rem;\n margin-bottom: 0.125rem;\n font-weight: 500;\n color: var(--color-text-secondary);\n }\n\n .sticker-set {\n margin-bottom: 1rem;\n\n &-header {\n display: flex;\n justify-content: space-between;\n padding: 0.5rem;\n\n .title-wrapper {\n overflow: hidden;\n }\n\n .title {\n font-size: 1rem;\n line-height: 1.6875rem;\n margin: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .count {\n color: var(--color-text-secondary);\n margin: 0;\n }\n\n .Button {\n flex-shrink: 0;\n margin-left: 1rem;\n\n &.is-added {\n background: var(--color-chat-hover);\n color: var(--color-text-secondary);\n\n &:hover, &:active {\n background: var(--color-item-active) !important;\n }\n }\n }\n }\n\n &-main {\n display: flex;\n flex-wrap: nowrap;\n overflow: hidden;\n }\n\n &[dir=rtl] {\n .title-wrapper {\n text-align: right;\n }\n\n .Button {\n margin-left: 0;\n margin-right: 1rem;\n }\n }\n }\n\n .StickerButton {\n margin: 0.125rem;\n }\n}\n",".GifSearch {\n height: 100%;\n padding: 0.25rem;\n\n .gif-container {\n height: 100%;\n overflow: auto;\n\n &.grid {\n display: grid;\n grid-template-columns: repeat(6, 1fr);\n grid-auto-rows: 6.25rem;\n grid-gap: 0.25rem;\n grid-auto-flow: dense;\n }\n }\n\n .helper-text {\n color: var(--color-text-meta);\n margin-top: 2rem;\n text-align: center;\n }\n}\n",".PollAnswerResults {\n border-bottom: 1px solid var(--color-borders);\n padding: 0 .5rem .625rem;\n display: flex;\n flex-direction: column-reverse;\n\n .answer-head {\n display: flex;\n align-items: center;\n font-size: .9375rem;\n line-height: 1.3125rem;\n font-weight: 500;\n color: var(--color-text-secondary);\n padding: 1rem .75rem .5rem 1rem;\n position: sticky;\n top: 0;\n background: var(--color-background);\n\n @media (max-width: 600px) {\n padding: .5rem .25rem .5rem .5rem;\n }\n }\n\n .answer-percent {\n margin-left: auto;\n\n &[dir=auto] {\n margin-left: 0;\n margin-right: auto;\n }\n }\n\n .poll-voters {\n padding: 0 .75rem;\n position: relative;\n min-height: 3rem;\n\n @media (max-width: 600px) {\n padding: 0 .25rem;\n }\n\n .Spinner {\n --spinner-size: 1.25rem;\n }\n }\n\n .chat-item-clickable {\n .ChatInfo .Avatar.size-tiny {\n margin-right: 1.75rem;\n }\n\n &[dir=rtl] {\n .ChatInfo .Avatar.size-tiny {\n margin-left: 1.75rem;\n margin-right: 0;\n }\n }\n }\n\n .ShowMoreButton {\n margin: .25rem 0 0 -0.5rem;\n width: calc(100% + 1rem);\n\n &[dir=rtl] {\n .icon-down {\n margin-left: 2rem;\n margin-right: 0;\n }\n }\n }\n\n .icon-down {\n vertical-align: middle;\n margin-right: 2rem;\n font-size: 1.5rem;\n }\n}\n",".PollResults {\n height: 100%;\n position: relative;\n display: flex;\n flex-direction: column;\n pointer-events: auto;\n\n > .Loading {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n background: rgba(white, 0.75);\n }\n\n .poll-question {\n padding: .75rem 1.5rem;\n flex-shrink: 0;\n font-size: 1.25rem;\n\n @media (max-width: 600px) {\n padding: 0 1rem;\n }\n }\n\n .poll-results-list {\n border-top: 1px solid var(--color-borders);\n flex-grow: 1;\n overflow: auto;\n }\n}\n",".Management {\n position: relative;\n height: 100%;\n\n & > .custom-scroll {\n height: 100%;\n overflow-y: scroll;\n overflow-x: hidden;\n }\n\n .section {\n padding: 1rem 1.5rem;\n border-top: 1px solid var(--color-borders);\n\n &.wide {\n padding: 1.5rem;\n }\n\n &:first-of-type {\n border-top: none;\n padding-top: 1rem;\n }\n\n &.no-border {\n border-top: none;\n }\n\n > .ChatInfo {\n margin: 0 0 2rem !important;\n\n .title h3 {\n margin-bottom: 0;\n }\n }\n\n .section-icon {\n width: 8.75rem;\n height: 8.75rem;\n margin: 0 auto 2rem;\n position: relative;\n\n .AnimatedSticker {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n\n &.hidden {\n display: none\n }\n }\n }\n\n .ListItem {\n margin: 0 -.75rem;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n .multiline-item .subtitle {\n line-height: 1.25rem;\n }\n\n &:not(.picker-list-item) .Checkbox {\n margin-top: 2rem;\n margin-bottom: 2rem;\n }\n\n &.narrow {\n .Checkbox {\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n }\n\n &.exceptions-member {\n .ChatInfo .status {\n white-space: pre-wrap;\n }\n }\n }\n\n .section-heading {\n font-weight: 500;\n font-size: .9375rem;\n color: var(--color-text-secondary);\n\n &[dir=auto] {\n text-align: initial;\n }\n }\n\n .section-help {\n color: var(--color-text-secondary);\n line-height: 1.375rem;\n\n &[dir=auto] {\n text-align: initial;\n }\n }\n\n .section-info {\n color: var(--color-text-secondary);\n font-size: .875rem;\n }\n\n &[dir=rtl] {\n text-align: right;\n }\n }\n\n textarea.form-control {\n height: auto;\n }\n\n .group-link {\n color: var(--color-text);\n }\n\n .radio-group {\n margin-top: 2rem;\n\n .Radio {\n padding-left: 3.5rem;\n margin-bottom: 2rem;\n\n &:last-child {\n margin-bottom: .625rem;\n }\n }\n\n .Radio-main {\n &::before {\n left: 0.125rem;\n top: .25rem;\n transform: none;\n }\n\n &::after {\n left: 0.4375rem;\n top: .5625rem;\n transform: none;\n }\n }\n }\n}\n\n.ManageGroupMembers {\n padding: 0.5rem 1rem;\n}\n",".ShippingInfo {\n padding: 0.5rem 1rem;\n\n h5 {\n font-size: 0.9rem;\n color: var(--color-text-secondary);\n margin: 1rem 0 1.1rem;\n }\n}",".Shipping {\n padding: 0.5rem 1rem;\n\n form {\n p {\n color: var(--color-text-secondary);\n font-weight: 500;\n margin: .5rem 0 2rem;\n }\n\n .Radio {\n margin-bottom: 2rem;\n }\n }\n}",".Checkout {\n padding: 0.5rem 0;\n\n .description {\n display: flex;\n flex-direction: row;\n margin: 0 1rem;\n\n img {\n height: 6rem;\n margin: .5rem;\n }\n\n .text {\n h5 {\n margin-top: .5rem;\n font-size: 1.125rem;\n }\n\n p {\n font-size: 0.8rem;\n line-height: 1rem;\n color: var(--color-text-secondary);\n }\n }\n }\n\n .price-info {\n margin: 1rem;\n\n .price-info-item {\n margin: 1rem .5rem;\n display: flex;\n flex-direction: row;\n align-content: space-between;\n color: var(--color-text-secondary);\n font-weight: 500;\n \n &-main{\n color: var(--color-text);\n }\n \n .title {\n display: flex;\n flex: 1 auto;\n }\n }\n }\n\n .invoice-info {\n border-top: 1px var(--color-borders) solid;\n padding: 1rem;\n\n .checkout-info-item {\n display: flex;\n padding: .75rem .5rem 1rem;\n text-align: left;\n\n i {\n font-size: 1.5rem;\n color: var(--color-text-secondary);\n margin-right: 2rem;\n width: 1.5rem;\n }\n\n i.stripe-provider {\n background: url('../../assets/stripe-logo.png') no-repeat center;\n background-size: 2rem;\n border-radius: 1rem;\n height: 1.5rem;\n }\n\n .info {\n .title {\n font-size: 1rem;\n line-height: 1.4375rem;\n margin-bottom: 0;\n font-weight: 400;\n word-break: break-word;\n color: var(--color-text);\n text-transform: capitalize;\n }\n\n .data {\n margin-bottom: 0;\n font-size: 0.875rem;\n color: var(--color-text-secondary);\n }\n }\n }\n }\n \n}",".CardInput {\n position: relative;\n\n .input-group.has-left-addon .form-control{\n padding-left: 4rem;\n }\n\n .left-addon {\n position: absolute;\n top: .8rem;\n left: 1rem;\n z-index: 8;\n\n img {\n max-width: 2rem;\n }\n }\n}\n",".PaymentInfo {\n padding: 0.5rem 1rem;\n\n h5 {\n font-size: 0.9rem;\n color: var(--color-text-secondary);\n margin: 1rem 0 1.1rem;\n }\n\n .inline-inputs {\n display: flex;\n justify-content: space-between;\n\n .input-group {\n flex: 1 10rem;\n max-width: 45%;\n display: flex;\n }\n }\n}\n",".PaymentModal {\n .modal-backdrop {\n pointer-events: none;\n }\n\n .header {\n position: relative;\n border-top-left-radius: 10px;\n border-top-right-radius: 10px;\n width: 100%;\n padding: .25rem 1rem;\n display: flex;\n align-items: center;\n flex-direction: row;\n background: var(--color-background);\n border-bottom: 1px var(--color-borders) solid;\n\n h3 {\n margin-bottom: 0;\n margin-left: 1.5rem;\n unicode-bidi: plaintext;\n text-align: initial;\n }\n }\n\n .Transition {\n height: 25rem;\n }\n\n .empty-content {\n height: 25rem;\n max-height: 90%;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .receipt-content {\n height: 25rem;\n overflow-y: auto;\n }\n\n .content {\n overflow: auto;\n width: 100%;\n height: 100%;\n position: relative;\n }\n\n .footer {\n position: relative;\n border-bottom-left-radius: 10px;\n border-bottom-right-radius: 10px;\n width: 100%;\n padding: .75rem 1rem;\n background: var(--color-background);\n border-top: 1px var(--color-borders) solid;\n\n button {\n text-transform: none;\n font-weight: 500;\n }\n }\n\n .modal-dialog {\n width: 25rem;\n }\n\n .modal-content {\n padding:0;\n overflow: hidden;\n }\n}\n\n@media screen\n and (max-device-width: 640px)\n and (max-height: 640px)\n and (orientation: landscape) {\n .PaymentModal {\n .modal-dialog {\n max-height: 100%;\n }\n\n .Transition {\n height: 10rem;\n }\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/dist/701.f1f158c205e1345450d1.js b/dist/701.b9c40fbb5ff59255dc0a.js similarity index 59% rename from dist/701.f1f158c205e1345450d1.js rename to dist/701.b9c40fbb5ff59255dc0a.js index 7cc8ba7ec..69194e9fe 100644 --- a/dist/701.f1f158c205e1345450d1.js +++ b/dist/701.b9c40fbb5ff59255dc0a.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunktelegram_t=self.webpackChunktelegram_t||[]).push([[701],{9701:(e,t,n)=>{n.r(t),n.d(t,{ArchivedChats:()=>Ua,AttachMenu:()=>Hs,AttachmentModal:()=>Es,BotCommandMenu:()=>Ks,BotCommandTooltip:()=>js,CalendarModal:()=>Ue,ChatFolderModal:()=>xa,ContactList:()=>Fa,ContextMenuContainer:()=>Qa,CustomSendMenu:()=>Ws,DeleteMessageModal:()=>xe,Dialogs:()=>ke,DropArea:()=>Qs.Z,EmojiTooltip:()=>nr,ForwardPicker:()=>Ie,GifSearch:()=>gr,HeaderMenuContainer:()=>ns,HistoryCalendar:()=>Oe,InlineBotTooltip:()=>cr,LeftSearch:()=>Bt,Management:()=>Dr,MediaViewer:()=>de,MentionTooltip:()=>vs,MessageSelectToolbar:()=>He,MobileSearch:()=>rs,NewChat:()=>$a,NewChatStep1:()=>La,NewChatStep2:()=>Ra,Notifications:()=>Ne,PaymentModal:()=>co,PinMessageModal:()=>Ge,PollModal:()=>fs,PollResults:()=>pr,ReceiptModal:()=>ho,RightSearch:()=>mr,SafeLinkModal:()=>Ae,Settings:()=>Ma,StickerSearch:()=>Pr,StickerSetModal:()=>es,StickerTooltip:()=>qs,SymbolMenu:()=>Ys,TextFormatter:()=>er.Z,UnpinAllMessagesModal:()=>Je});var a=n(4050),s=n(5116),r=n(6137),o=n(1713),l=n(3716),i=n(7361),c=n(3858),d=n(4399),m=n(1638),u=n(2858),h=n(782),Z=n(1174),P=n(3989),g=n(396),v=n(5326),p=n(6202),E=n(2566),C=n(2937),f=n(7204),b=n(8674),I=n(935);function y(e,t){const n=document.createElement("div");n.classList.add("ghost");const a=new Image;if("string"==typeof e?a.src=e:e instanceof HTMLVideoElement?a.src=e.poster:a.src=e.src,n.appendChild(a),t===o.bZ.ProfileAvatar||t===o.bZ.SettingsAvatar){n.classList.add("ProfileInfo"),t===o.bZ.SettingsAvatar&&n.classList.add("self");const e=document.querySelector(t===o.bZ.ProfileAvatar?"#RightColumn .ProfileInfo .info":"#Settings .ProfileInfo .info");e&&n.appendChild(e.cloneNode(!0))}return n}function S(e,t){const n=document.querySelector(".active > .MessageList");let a=e.offsetTop+t.closest(".content-inner, .WebPage").offsetTop;return e.id.includes("album-media-")&&(a+=e.parentElement.offsetTop+e.closest(".Message").offsetTop),a>n.scrollTop&&a+t.offsetHeight .MessageList #album-media-${t.id}`,a=".full-media";break;case o.bZ.SharedMedia:n=`#shared-media${t.id}`,a="img";break;case o.bZ.SearchResult:n=`#search-media${t.id}`,a="img";break;case o.bZ.MiddleHeaderAvatar:n=".MiddleHeader .ChatInfo .Avatar",a="img.avatar-media";break;case o.bZ.SettingsAvatar:n="#Settings .ProfileInfo .active .ProfilePhoto",a="img.avatar-media";break;case o.bZ.ProfileAvatar:n="#RightColumn .ProfileInfo .active .ProfilePhoto",a="img.avatar-media";break;case o.bZ.ScheduledInline:case o.bZ.Inline:default:n=`.active > .MessageList #message${t.id}`,a=".message-content .full-media, .message-content .thumbnail"}const s=document.querySelector(n),r=s&&s.querySelectorAll(a);return{container:s,mediaEl:null==r?void 0:r[r.length-1]}}function N(e,t){switch(t){case o.bZ.Album:case o.bZ.ScheduledAlbum:case o.bZ.Inline:case o.bZ.ScheduledInline:e.classList.add("rounded-corners");break;case o.bZ.SharedMedia:case o.bZ.SettingsAvatar:case o.bZ.ProfileAvatar:case o.bZ.SearchResult:e.firstChild.style.objectFit="cover";break;case o.bZ.MiddleHeaderAvatar:e.classList.add("circle")}}var M=n(9107),T=n(6590),F=n(9204),A=n(126),L=n(2255),R=n(231),B=n(790),$=n(2340),D=n(172);const U=(0,s.c$)(((e,{chatId:t,messageId:n,isAvatar:a})=>{if(a&&t)return{sender:(0,u.YC)(t)?(0,m.dy)(e,t):(0,m.Z1)(e,t)};if(!n||!t)return{};const s=(0,m.hj)(e,t,n);return{message:s,sender:s&&(0,m.Ur)(e,s)}}),((e,t)=>(0,h.ei)(t,["closeMediaViewer","focusMessage"])))((({chatId:e,messageId:t,sender:n,isAvatar:s,message:r,closeMediaViewer:o,focusMessage:l})=>{const i=(0,a.I4)((()=>{o(),l({chatId:e,messageId:t})}),[e,l,t,o]),c=(0,M.Z)();if(!n||!r&&!s)return;const d=(0,u.OU)(c,n);return a.ZP.createElement("div",{className:"SenderInfo",onClick:i},(0,u.YC)(n.id)?a.ZP.createElement(D.Z,{key:n.id,size:"medium",user:n}):a.ZP.createElement(D.Z,{key:n.id,size:"medium",chat:n}),a.ZP.createElement("div",{className:"meta"},a.ZP.createElement("div",{className:"title",dir:"auto"},d&&(0,$.Z)(d)),a.ZP.createElement("div",{className:"date",dir:"auto"},s?c("lng_mediaview_profile_photo"):(0,B.ZK)(c,1e3*r.date,!0))))}));var O=n(3106),x=n(8964),G=n(9196);const J=(0,a.X$)((0,s.c$)(((e,{message:t})=>({isDownloading:!!t&&(0,m.te)(e,t)})),((e,t)=>(0,h.ei)(t,["downloadMessageMedia","cancelMessageMediaDownload"])))((({mediaData:e,isVideo:t,isZoomed:n,message:s,fileName:r,isAvatar:o,isDownloading:l,onCloseMediaViewer:c,onForward:d,onZoomToggle:m,downloadMessageMedia:h,cancelMessageMediaDownload:Z})=>{const{loadProgress:P}=(0,E.Z)(s&&(0,u.Ti)(s,"download"),!l),g=(0,a.I4)((()=>{l?Z({message:s}):h({message:s})}),[Z,h,l,s]),v=(0,M.Z)(),p=(0,a.Ye)((()=>({onTrigger:e,isOpen:t})=>a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent",className:t?"active":void 0,onClick:e,ariaLabel:"More actions"},a.ZP.createElement("i",{className:"icon-more"}))),[]);return i.wB?a.ZP.createElement("div",{className:"MediaViewerActions-mobile"},a.ZP.createElement(O.Z,{trigger:p,positionX:"right"},!o&&a.ZP.createElement(x.Z,{icon:"forward",onClick:d},v("Forward")),t?a.ZP.createElement(x.Z,{icon:l?"close":"download",onClick:g},l?`${Math.round(100*P)}% Downloading...`:"Download"):a.ZP.createElement(x.Z,{icon:"download",href:e,download:r},v("AccActionDownload"))),l&&a.ZP.createElement(G.Z,{progress:P,size:"s",noCross:!0})):a.ZP.createElement("div",{className:"MediaViewerActions"},!o&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:v("Forward"),onClick:d},a.ZP.createElement("i",{className:"icon-forward"}))),t?a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:v("AccActionDownload"),onClick:g},l?a.ZP.createElement(G.Z,{progress:P,size:"s",onClick:g}):a.ZP.createElement("i",{className:"icon-download"})):a.ZP.createElement(R.Z,{href:e,download:r,round:!0,size:"smaller",color:"translucent-white",ariaLabel:v("AccActionDownload")},a.ZP.createElement("i",{className:"icon-download"})),a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:n?"Zoom Out":"Zoom In",onClick:m},a.ZP.createElement("i",{className:n?"icon-zoom-out":"icon-zoom-in"})),a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:v("Close"),onClick:c},a.ZP.createElement("i",{className:"icon-close"})))})));var z=n(9118),X=n(6752);const _=({text:e="",isHidden:t,isForVideo:n,onClick:s})=>{const[r,o]=(0,a.eJ)(!1);(0,a.d4)((()=>{const e=document.querySelector(".MediaViewerFooter .media-text"),t=()=>{const t=e?e.clientHeight:0;o(t>2*d.Gw)};t();const n=(0,z.P2)(t,500,!0);return window.addEventListener("resize",n,!1),()=>{window.removeEventListener("resize",n,!1)}}),[]);const l=(0,X.Z)("MediaViewerFooter",n&&"is-for-video",t&&"is-hidden");return a.ZP.createElement("div",{className:l,onClick:function(t){e&&t.stopPropagation()}},e&&a.ZP.createElement("div",{className:"media-viewer-footer-content",onClick:i.wB?void 0:s},a.ZP.createElement("p",{className:"media-text custom-scroll "+(r?"multiline":""),dir:"auto"},e)))};var Y=n(1212),H=n(2019);const V=void 0!==document.fullscreenElement?"fullscreenElement":void 0!==document.mozFullScreenElement?"mozFullScreenElement":void 0!==document.webkitFullscreenElement?"webkitFullscreenElement":"";var j=n(6898),K=n(4753);const q=["bytes","kB","MB","GB","TB","PB"],W=e=>{const t=0===e?0:Math.floor(Math.log(e)/Math.log(1024));return`${(e/1024**Math.floor(t)).toFixed(1)} ${q[t]}`},Q=e=>{e.stopPropagation()},ee=({bufferedProgress:e,currentTime:t,duration:n,fileSize:s,isForceVisible:r,isForceMobileVersion:o,isPlayed:l,isFullscreenSupported:c,isFullscreen:d,onChangeFullscreen:m,onPlayPause:u,onSeek:h})=>{const[P,g]=(0,a.eJ)(!0),v=(0,a.sO)(null),p=(0,a.sO)(!1);(0,a.d4)((()=>{r&&g(r)}),[r]),(0,a.d4)((()=>{let e;return r||(i.wB?g(!1):e=window.setTimeout((()=>{g(!1)}),800)),()=>{e&&window.clearTimeout(e)}}),[r]),(0,a.d4)((()=>((P||r)&&document.body.classList.add("video-controls-visible"),()=>{document.body.classList.remove("video-controls-visible")})),[r,P]);const E=(0,M.Z)(),C=(0,a.I4)((e=>{if(p.current&&v.current){const{width:t,left:a}=v.current.getBoundingClientRect(),s=e instanceof MouseEvent?e.clientX:e.targetTouches[0].clientX;h(Math.max(Math.min(n*((s-a)/t),n),0))}}),[n,h]),f=(0,a.I4)((e=>{p.current=!0,C(e)}),[C]),b=(0,a.I4)((()=>{p.current=!1}),[]);var I,y;if((0,a.d4)((()=>{if(v.current&&P)return(0,Z.s)(v.current,{onCapture:f,onRelease:b,onClick:b,onDrag:C})}),[P,f,C,b]),P||r)return a.ZP.createElement("div",{className:"VideoPlayerControls "+(o?"mobile":""),onClick:Q},function(e,t,n,s){const r=e/t*100,o=100*n;return a.ZP.createElement("div",{className:"player-seekline",ref:s},a.ZP.createElement("div",{className:"player-seekline-track"},a.ZP.createElement("div",{className:"player-seekline-buffered",style:`width: ${o||0}%`}),a.ZP.createElement("div",{className:"player-seekline-played",style:`width: ${r||0}%`})))}(t,n,e,v),a.ZP.createElement(R.Z,{ariaLabel:E("AccActionPlay"),size:"tiny",ripple:!i.wB,color:"translucent-white",className:"play",onClick:u},a.ZP.createElement("i",{className:l?"icon-pause":"icon-play"})),function(e,t){return a.ZP.createElement("div",{className:"player-time"},`${(0,B.k9)(e)} / ${(0,B.k9)(t)}`)}(t,n),e<1&&(I=e,y=s,a.ZP.createElement("div",{className:"player-file-size"},`${W(y*I)} / ${W(y)}`)),c&&a.ZP.createElement(R.Z,{ariaLabel:"Fullscreen",size:"tiny",color:"translucent-white",className:"fullscreen",onClick:m},a.ZP.createElement("i",{className:d?"icon-smallscreen":"icon-fullscreen"})))};function te(){return(te=Object.assign||function(e){for(var t=1;t{const m=(0,a.sO)(null),[u,h]=(0,a.eJ)(!i.$b||!i.cj),[Z,P]=(0,a.eJ)(0),[g,v]=(0,a.eJ)(!0),[p,E,C]=function(e,t){const[n,s]=(0,a.eJ)(Boolean(V&&document[V]));return(0,a.bt)((()=>{const n=()=>{s(Boolean(V&&document[V]))},a=()=>{s(!0)},r=()=>{s(!1),t(!1)},o=e.current;return document.addEventListener("fullscreenchange",n,!1),document.addEventListener("webkitfullscreenchange",n,!1),document.addEventListener("mozfullscreenchange",n,!1),o&&(o.addEventListener("webkitbeginfullscreen",a,!1),o.addEventListener("webkitendfullscreen",r,!1)),()=>{document.removeEventListener("fullscreenchange",n,!1),document.removeEventListener("webkitfullscreenchange",n,!1),document.removeEventListener("mozfullscreenchange",n,!1),o&&(o.removeEventListener("webkitbeginfullscreen",a,!1),o.removeEventListener("webkitendfullscreen",r,!1))}}),[]),V||"iOS"===i.Lt?[n,()=>{e.current&&(V||"iOS"===i.Lt)&&(e.current.requestFullscreen?e.current.requestFullscreen():e.current.webkitRequestFullscreen?e.current.webkitRequestFullscreen():e.current.webkitEnterFullscreen?e.current.webkitEnterFullscreen():e.current.mozRequestFullScreen&&e.current.mozRequestFullScreen(),s(!0))},()=>{e.current&&(document.exitFullscreen?document.exitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.webkitExitFullscreen&&document.webkitExitFullscreen(),s(!1))}]:[!1]}(m,h),{isBuffered:f,bufferedProgress:b,bufferingHandlers:I}=(0,H.Z)(),{shouldRender:y,transitionClassNames:S}=(0,Y.Z)(!f,void 0,void 0,"slow"),{shouldRender:k,transitionClassNames:w}=(0,Y.Z)(i.cj&&!u&&!y,void 0,void 0,"slow");(0,a.d4)((()=>{c||!l?m.current.pause():e&&!i.$b&&(0,K.Z)(m.current)}),[c,l,e]),(0,a.d4)((()=>{m.current.currentTime===m.current.duration?(P(0),h(!1)):P(m.current.currentTime)}),[Z]);const N=(0,a.I4)((e=>{e.stopPropagation(),u?(m.current.pause(),h(!1)):((0,K.Z)(m.current),h(!0),i.wB&&v(!1))}),[u]);(0,j.Z)(m,[]);const M=(0,a.I4)((()=>{v(!0)}),[]),T=(0,a.I4)((()=>{v(!1)}),[]),F=(0,a.I4)((e=>{P(e.currentTarget.currentTime)}),[]),A=(0,a.I4)((()=>{P(0),h(!1),v(!0)}),[]),L=(0,a.I4)((()=>{p&&C?C():!p&&E&&E()}),[C,p,E]),B=(0,a.I4)((e=>{m.current.currentTime=e}),[]),$=(0,a.I4)((e=>{e.stopPropagation(),v(!g),g||(m.current.pause(),h(!1))}),[g]);(0,a.d4)((()=>{const e=e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),N(e))};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}}),[N]);const D=s&&`width: ${s.width}px; height: ${s.height}px`,U=`background-image: url(${n})`;return a.ZP.createElement("div",{className:"VideoPlayer",onClick:!t&&i.wB?$:void 0,onMouseOver:t||i.$b?void 0:M,onMouseOut:t||i.$b?void 0:T},a.ZP.createElement("div",{style:D},a.ZP.createElement("video",te({ref:m,autoPlay:i.$b,playsInline:!0,loop:t,muted:t,id:"media-viewer-video",style:U,onPlay:i.cj?()=>h(!0):void 0,onEnded:A,onClick:i.wB?void 0:N,onDoubleClick:L},I,{onTimeUpdate:F}),e&&a.ZP.createElement("source",{src:e}))),k&&a.ZP.createElement(R.Z,{round:!0,className:`play-button ${w}`,onClick:N},a.ZP.createElement("i",{className:"icon-play"})),y&&a.ZP.createElement("div",{className:["spinner-container",S].join(" ")},!f&&a.ZP.createElement("div",{className:"buffering"},"Buffering..."),a.ZP.createElement(G.Z,{size:"xl",progress:f?1:r,square:!0,onClick:d})),!t&&!y&&a.ZP.createElement(ee,{isPlayed:u,bufferedProgress:b,currentTime:Z,isFullscreenSupported:Boolean(E),isFullscreen:p,fileSize:o,duration:m.current?m.current.duration:0,isForceVisible:g,isForceMobileVersion:s&&s.width<400,onSeek:B,onChangeFullscreen:L,onPlayPause:N}))})),ae=(0,a.X$)((({isShown:e,onChangeZoom:t})=>{const{transitionClassNames:n}=(0,Y.Z)(e),s=(0,f.Z)(e),r=(0,a.sO)(null),[o,l]=(0,a.eJ)(1),c=(0,a.sO)(!1);(0,a.d4)((()=>{e&&!s&&l(1.5)}),[e,s]);const d=(0,a.I4)((()=>{c.current=!0}),[]),m=(0,a.I4)((()=>{c.current=!1,1===o&&t(o,!c.current)}),[t,o]);(0,a.d4)((()=>{t(o,!c.current)}),[o,t]);const u=(0,M.Z)(),h=(0,X.Z)("ZoomControls",n);return a.ZP.createElement("div",{className:h},a.ZP.createElement(R.Z,{disabled:1===o,size:"tiny",color:"translucent-white",ariaLabel:u("ZoomOut"),className:"zoom-out",ripple:!i.wB,onClick:()=>{r.current&&l(Math.max(1,o-.5))}},a.ZP.createElement("i",{className:"icon-zoom-out"})),a.ZP.createElement(R.Z,{disabled:3===o,size:"tiny",color:"translucent-white",ariaLabel:"Zoom In",className:"zoom-in",ripple:!i.wB,onClick:()=>{r.current&&l(Math.min(3,o+.5))}},a.ZP.createElement("i",{className:"icon-zoom-in"})),a.ZP.createElement("div",{className:"seekline"},a.ZP.createElement("div",{className:"seekline-track"},a.ZP.createElement("div",{className:"seekline-played",style:`width: ${50*(o-1)}%`}),a.ZP.createElement("input",{ref:r,min:1,max:3,step:"0.5",value:o,type:"range",className:"seekline-input",onChange:e=>{l(Math.min(3,Math.max(Number(e.target.value),1)))},onMouseDown:d,onMouseUp:m}))))})),se=[1,0,0,1,0,0],re={1:1,1.5:1.5,2:2.2,2.5:3.3,3:5.5},oe=150,le=(0,a.X$)((({children:e,className:t,noWrap:n,canPan:s,zoomLevel:r,panDeltaX:o,panDeltaY:l,onPan:i})=>{const c=re[r]||r,[d,m]=(0,a.eJ)(!1),[u,Z]=(0,a.eJ)({dx:o,dy:l,x:0,y:0}),[P,g]=(0,a.eJ)(se),v=(0,a.sO)(null),p=(0,a.sO)(null);return(0,a.d4)((()=>{const e=c||P[0],t=o||P[4],n=l||P[5],a=[...P];P[0]!==e&&(a[0]=e||a[0],a[3]=e||a[3]),P[4]!==t&&(a[4]=t),P[5]!==n&&(a[5]=n),(0,h.et)(P,a)||g(function(e,t,n){const a=n&&n.querySelector(".active img");if(!n||!a)return t;const s=n.getBoundingClientRect(),r=a.getBoundingClientRect(),o=r.width/e*t[0],l=r.height/e*t[3],i=(s.width-o)/2+t[4],c=(s.height-l)/2+t[5];return s.width&&s.width-oe{s||g(se)}),[s]),(0,a.d4)((()=>{p.current&&(p.current.style.transform=`matrix(${P.toString()})`)}),[n,P]),n?e:a.ZP.createElement("div",{ref:v,className:`pan-wrapper ${t||""}`,onMouseDown:e=>{if(!s)return;e.stopPropagation(),e.preventDefault();const t={dx:P[4],dy:P[5],x:e.pageX,y:e.pageY};Z(t),m(!0),v.current&&v.current.classList.add("move")},onMouseUp:()=>{m(!1),v.current&&v.current.classList.remove("move"),i&&i(P[4],P[5])},onMouseMove:e=>{if(d){const t=function(e,t){const n=[...P],a=u.x-e,s=u.y-t;return n[4]=u.dx-a,n[5]=u.dy-s,n}(e.pageX,e.pageY);g(t),p.current&&(p.current.style.transform=`matrix(${P.toString()})`)}}},a.ZP.createElement("div",{ref:p,className:"pan-container"},e))})),ie=350;function ce(e,t,n){return e?a.ZP.createElement("img",{src:e,alt:"",style:t?`width: ${t.width}px`:"",draggable:Boolean(n)}):a.ZP.createElement("div",{className:"spinner-wrapper",style:t?`width: ${t.width}px`:""},a.ZP.createElement(F.Z,{color:"white"}))}const de=(0,a.X$)((0,s.c$)((e=>{const{chatId:t,threadId:n,messageId:a,avatarOwnerId:s,profilePhotoIndex:r,origin:l}=e.mediaViewer,{animationLevel:i}=e.settings.byKey;if(l===o.bZ.SearchResult){if(!t||!a)return{animationLevel:i};const n=(0,m.hj)(e,t,a);return n?{chatId:t,messageId:a,senderId:n.senderId,origin:l,message:n,animationLevel:i}:{animationLevel:i}}if(s)return{messageId:-1,senderId:s,avatarOwner:(0,m.dy)(e,s)||(0,m.Z1)(e,s),profilePhotoIndex:r||0,animationLevel:i,origin:l};if(!(t&&n&&a))return{animationLevel:i};let c,d,u;if(c=l&&[o.bZ.ScheduledAlbum,o.bZ.ScheduledInline].includes(l)?(0,m.Tm)(e,t,a):(0,m.hj)(e,t,a),!c)return{animationLevel:i};if(d=l&&[o.bZ.ScheduledAlbum,o.bZ.ScheduledInline].includes(l)?(0,m.Fn)(e,t):(0,m.Zw)(e,t),l===o.bZ.Inline||l===o.bZ.Album)u=(0,m.qC)(e,t,n)||(0,m.gb)(e,t,n);else if(l===o.bZ.SharedMedia){const t=(0,m.we)(e),{foundIds:n}=t&&t.resultsByType&&t.resultsByType.media||{};u=n}return{chatId:t,threadId:n,messageId:a,senderId:c.senderId,origin:l,message:c,chatMessages:d,collectionIds:u,animationLevel:i}}),((e,t)=>(0,h.ei)(t,["openMediaViewer","closeMediaViewer","openForwardMenu","focusMessage"])))((({chatId:e,threadId:t,messageId:n,senderId:s,origin:m,avatarOwner:h,profilePhotoIndex:F,message:B,chatMessages:$,collectionIds:D,openMediaViewer:O,closeMediaViewer:x,openForwardMenu:G,focusMessage:z,animationLevel:X})=>{const Y=Boolean(h||n),H=m===o.bZ.SharedMedia,V=m===o.bZ.SearchResult,j=B?(0,u.O$)(B):void 0,K=B?(0,u.b7)(B):void 0,q=B?(0,u.F$)(B):void 0,W=B?(0,u.Cg)(B):void 0,Q=!!B&&(0,u.rl)(B),ee=!!B&&(0,u.hC)(B),te=Boolean(K||W||ee),se=Boolean(!te&&(j||q||Q)),{isGif:re}=K||W||{},oe=Boolean(h),de=Boolean(q||W),me=(0,a.Ye)((()=>de&&n?[n]:(0,u.N0)($||{},D||[],H)),[de,n,$,D,H]),ue=n?me.indexOf(n):-1,he=0===ue||-1===ue,Ze=ue===me.length-1||-1===ue,Pe=(0,a.sO)(),ge=(0,f.Z)(s);!Y||ge&&ge===s&&Pe.current||(Pe.current=ue);const ve=X>=1?"mv-slide":"none",pe=2===X?"slide-fade":"none",Ee=2===X,[Ce,fe]=(0,a.eJ)(!1),[be,Ie]=(0,a.eJ)(!1),[ye,Se]=(0,a.eJ)(!1),[ke,we]=(0,a.eJ)(1),[Ne,Me]=(0,a.eJ)({x:0,y:0});function Te(e){if(oe&&void 0!==F){const{photos:t}=h;return t&&t[F]?`photo${t[F].id}?size=c`:(0,u.RT)(h,e?"big":"normal")}return B&&(0,u.Ti)(B,e?"viewerFull":"viewerPreview")}const Fe=(0,p.Z)(B&&(H||V)&&(0,u.Ti)(B,"pictogram"),void 0,r.IU.BlobUrl,void 0,Ee&&ie),Ae=Te(),Le=(0,p.Z)(Ae,void 0,r.IU.BlobUrl,void 0,Ee&&ie),{mediaData:Re,loadProgress:Be}=(0,E.Z)(Te(!0),void 0,B&&(0,u.kG)(B,"viewerFull"),void 0,Ee&&ie),$e=j||K?(j||K).blobUrl:void 0;let De=!te&&($e||Re)||Le||Fe;const Ue=(0,C.Z)(!De&&B&&(0,u.DH)(B));De||m===o.bZ.SearchResult||(De=Ue);const Oe=B?(0,u.c0)(B):void 0,xe=B?(0,u.ep)(B):oe?`avatar${h.id}-${F}.jpg`:void 0;let Ge;B?Q||ee?Ge=(0,u.aE)(B).mediaSize:j||q?Ge=(0,u.bV)(j||q):(K||W)&&(Ge=(0,u.jC)(K||W)):Ge=d.vY,(0,a.d4)((()=>{i.wB&&document.body.classList.toggle("is-media-viewer-open",Y)}),[Y]);const Je=(0,v.Z)();(0,a.d4)((()=>{const e=window.matchMedia(d.L6);return"function"==typeof e.addEventListener?e.addEventListener("change",Je):"function"==typeof e.addListener&&e.addListener(Je),()=>{"function"==typeof e.removeEventListener?e.removeEventListener("change",Je):"function"==typeof e.removeListener&&e.removeListener(Je)}}),[Je]);const ze=(0,f.Z)(B),Xe=(0,f.Z)(m),_e=(0,f.Z)(h),Ye=(0,f.Z)(De);(0,a.d4)((()=>{if(Ee&&Y&&!ze&&!_e){(0,b.YW)(ie+l.fK);const e=B?(0,I.X)(B):void 0;!function(e,t,n,a,s,r){const{mediaEl:i}=w(t,r);if(!i)return;const{width:m}=c.Z.get(),{width:u,height:h}=(0,d.fM)(e,s),{width:Z,height:P}=(0,d.jg)(u,h,a.width,a.height),g=(m-Z)/2,v=function(e){const t=window.matchMedia(d.L6);let n=4.125;return e&&(n+=t.matches?.875:3.375),n*d.Gw}(e)+(h-P)/2;let{top:p,left:E,width:C,height:f}=i.getBoundingClientRect();if([o.bZ.SharedMedia,o.bZ.Album,o.bZ.ScheduledAlbum,o.bZ.SearchResult].includes(t)){const e=function(e,t,n,a,s,r){if(e===t){const o=Math.max(s,r)*(e/t);a-=(o-s)/2,n-=(o-r)/2,s=o,r=o}else if(e>t){const n=s;a-=((s=r*(e/t))-n)/2}else if(t>e){const a=r;n-=((r=s*(t/e))-a)/2}return{top:n,left:a,width:s,height:r}}(Z,P,p,E,C,f);p=e.top,E=e.left,C=e.width,f=e.height}const b=E+C/2-(g+Z/2),I=p+f/2-(v+P/2),S=C/Z,M=f/P,T=y(n||i);k(T,{top:`${v}px`,left:`${g}px`,width:`${Z}px`,height:`${P}px`,transform:`translate3d(${b}px, ${I}px, 0) scale(${S}, ${M})`}),N(T,t),document.body.classList.add("ghost-animating"),requestAnimationFrame((()=>{document.body.appendChild(T),requestAnimationFrame((()=>{T.style.transform="",function(e){e.firstChild.style.objectFit="default",e.classList.remove("rounded-corners","circle")}(T),setTimeout((()=>{requestAnimationFrame((()=>{document.body.contains(T)&&document.body.removeChild(T),document.body.classList.remove("ghost-animating")}))}),200+l.fK)}))}))}(Boolean(e),m,De,Ge,te,B)}Ee&&!Y&&(ze||_e)&&((0,b.YW)(ie+l.fK),function(e,t,n){const{container:a,mediaEl:s}=w(e,n);if(!s)return;const r=document.getElementById("MediaViewer").querySelector(".active .media-viewer-content img, .active .media-viewer-content video");if(!r||!s)return;const{top:i,left:d,width:m,height:u}=r.getBoundingClientRect(),{top:h,left:Z,width:P,height:g}=s.getBoundingClientRect();let v=h;if(!function(e){if("none"===e.style.display)return!1;const t=e.getBoundingClientRect(),{height:n}=c.Z.get();return t.top<=n&&t.top+t.height>=0}(a)){const{height:e}=c.Z.get();v=hf?C=f:f>C&&(f=C));const I=document.getElementsByClassName("ghost")[0],M=I||y(t||s,e);I||k(M,{top:`${v}px`,left:`${Z}px`,width:`${P}px`,height:`${g}px`,transform:`translate3d(${p}px, ${E}px, 0) scale(${C}, ${f})`}),requestAnimationFrame((()=>{if(I){const{top:e,left:t,width:n,height:a}=I.getBoundingClientRect();k(M,{transition:"none",top:`${v}px`,left:`${Z}px`,transformOrigin:"top left",transform:`translate3d(${t-Z}px, ${e-v}px, 0) scale(${n/P}, ${a/g})`,width:`${P}px`,height:`${g}px`})}document.body.classList.add("ghost-animating"),I||document.body.appendChild(M),requestAnimationFrame((()=>{I&&(I.style.transition=""),M.style.transform="",b&&(M.style.opacity="0"),N(M,e),setTimeout((()=>{requestAnimationFrame((()=>{document.body.contains(M)&&document.body.removeChild(M),document.body.classList.remove("ghost-animating")}))}),200+l.fK)}))}))}(Xe,Ye,ze||void 0))}),[Ee,Y,m,Xe,B,ze,_e,De,Ye,Ge,te]),(0,a.d4)((()=>{let e;return ye?Ie(!0):e=window.setTimeout((()=>{Ie(!1)}),ie),()=>{e&&window.clearTimeout(e)}}),[ye]);const He=()=>{Se(!1),we(1),Me({x:0,y:0})},Ve=(0,a.I4)((()=>{Se(!ye),we(ye?1:1.5),ye&&Me({x:0,y:0})}),[ye]),je=(0,a.I4)(((e,t=!1)=>{we(e),1===e&&t&&He()}),[]),Ke=(0,a.I4)((()=>{x(),He()}),[x]),qe=(0,a.I4)((()=>{Ke(),z({chatId:e,threadId:t,messageId:n})}),[Ke,e,t,z,n]),We=(0,a.I4)((()=>{G({fromChatId:e,messageIds:[n]}),He()}),[G,e,n]);(0,a.d4)((()=>Y?(0,P.Z)((()=>{ye?He():Ke()})):void 0),[Ke,Y,ye]),(0,a.d4)((()=>{te&&!re&&(0,g.Es)()}),[re,te]),(0,a.d4)((()=>{if(Y)return c.Z.disableRefresh(),()=>{c.Z.enableRefresh()}}),[Y]);const Qe=(0,a.I4)(((e,t)=>{let n=me.indexOf(e);return(-1===t&&n>0||1===t&&n{he||O({chatId:e,threadId:t,messageId:n?Qe(n,-1):void 0,origin:m})}),[e,t,Qe,he,n,O,m]),tt=(0,a.I4)((()=>{Ze||O({chatId:e,threadId:t,messageId:n?Qe(n,1):void 0,origin:m})}),[e,t,Qe,Ze,n,O,m]);(0,a.d4)((()=>{const e=e=>{switch(e.key){case"Left":case"ArrowLeft":et();break;case"Right":case"ArrowRight":tt()}};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}})),(0,a.d4)((()=>{const e=document.querySelector(".slide-container > .active, .slide-container > .to");if(!e)return;const t=re&&!i.cj;return(0,Z.s)(e,{excludedClosestSelector:".backdrop, .navigation, .media-viewer-head, .media-viewer-footer"+(t?"":", .VideoPlayer"),onClick:()=>{ye||i.$b||Ke()},onSwipe:i.$b?(e,t)=>(t===Z.e.Right?et():t===Z.e.Left?tt():e.target&&e.target.closest(".MediaViewerFooter")||Ke(),!0):void 0})}),[Ke,Ce,re,se,ye,tt,et]);const nt=(0,a.I4)(((e,t)=>{Me({x:e,y:t})}),[]),at=(0,a.I4)((()=>{i.$b&&(se||re)&&fe(!Ce)}),[Ce,re,se]),st=(0,M.Z)();function rt(t){if(oe)return a.ZP.createElement("div",{key:e,className:"media-viewer-content"},ce(Re||Le,(0,d.PA)(d.vY,!1),!i.wB&&!ye));if(B){const e=(0,I.X)(B),s=Boolean(e);return a.ZP.createElement("div",{key:n,className:"media-viewer-content "+(s?"has-footer":""),onClick:at},se&&ce($e||Re||Le||Fe,B&&(0,d.PA)(Ge,s),!i.wB&&!ye),te&&a.ZP.createElement(ne,{key:n,url:$e||Re,isGif:re,posterData:De,posterSize:B&&(0,d.PA)(Ge,s,!0),loadProgress:Be,fileSize:Oe,isMediaViewerOpen:Y,noPlay:!t,onClose:Ke}),e&&a.ZP.createElement(_,{text:e,onClick:qe,isHidden:Ce&&(!te||re),isForVideo:te&&!re}))}}function ot(){return oe?a.ZP.createElement(U,{key:h.id,chatId:h.id,isAvatar:!0}):a.ZP.createElement(U,{key:n,chatId:e,messageId:n})}return(0,T.ZP)(Y,x,O,{chatId:e,threadId:t,messageId:n,origin:m,avatarOwnerId:h&&h.id}),a.ZP.createElement(A.Z,{id:"MediaViewer",className:ye?"zoomed":"",isOpen:Y},(()=>a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("div",{className:"media-viewer-head",dir:st.isRtl?"rtl":void 0},i.wB&&a.ZP.createElement(R.Z,{className:"media-viewer-close",round:!0,size:"smaller",color:"translucent-white",ariaLabel:st("Close"),onClick:Ke},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement(L.Z,{activeKey:Pe.current,name:pe},ot),a.ZP.createElement(J,{mediaData:Re||Le,isVideo:te,isZoomed:ye,message:B,fileName:xe,onCloseMediaViewer:Ke,onForward:We,onZoomToggle:Ve,isAvatar:oe})),a.ZP.createElement(le,{noWrap:!be,canPan:ye,panDeltaX:Ne.x,panDeltaY:Ne.y,zoomLevel:ke,onPan:nt},a.ZP.createElement(L.Z,{className:"slide-container",activeKey:ue,name:ve},rt)),!he&&a.ZP.createElement("button",{type:"button",className:`navigation prev ${te&&!re&&"inline"}`,"aria-label":st("AccDescrPrevious"),dir:st.isRtl?"rtl":void 0,onClick:et}),!Ze&&a.ZP.createElement("button",{type:"button",className:`navigation next ${te&&!re&&"inline"}`,"aria-label":st("Next"),dir:st.isRtl?"rtl":void 0,onClick:tt}),a.ZP.createElement(ae,{isShown:ye,onChangeZoom:je}))))})));var me=n(5765),ue=n(7407),he=n(2313),Ze=n(2515),Pe=n(4288),ge=n(3103),ve=n(7687),pe=n(1273),Ee=n(1876),Ce=n(8799),fe=n(6058);const be=(0,a.X$)((({isOpen:e,currentUserId:t,chatOrUserIds:n,filterRef:s,filter:r,filterPlaceholder:o,onFilterChange:l,onClose:i,loadMore:c,onSelectChatOrUser:d})=>{const m=(0,M.Z)(),[h,Z]=(0,ue.Z)(c,n,Boolean(r));(0,Ze.Z)(s,e,(()=>{l("")}));const P=(0,a.sO)(null),g=(0,a.I4)((e=>{l(e.currentTarget.value)}),[l]),v=(0,he.Z)(P,e,(e=>{h&&h.length>0&&d(h[-1===e?0:e])}),".ListItem-button",!0),p=a.ZP.createElement("div",{className:"modal-header",dir:m.isRtl?"rtl":void 0},a.ZP.createElement(R.Z,{round:!0,color:"translucent",size:"smaller",ariaLabel:m("Close"),onClick:i},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement(ve.Z,{ref:s,value:r,onChange:g,onKeyDown:v,placeholder:o}));return a.ZP.createElement(ge.Z,{isOpen:e,onClose:i,className:"ChatOrUserPicker",header:p},null!=h&&h.length?a.ZP.createElement(pe.Z,{className:"picker-list custom-scroll",items:h,onLoadMore:Z,noScrollRestore:Boolean(r),ref:P,onKeyDown:v},h.map((e=>a.ZP.createElement(Ee.Z,{key:e,className:"chat-item-clickable force-rounded-corners",onClick:()=>d(e)},(0,u.YC)(e)?a.ZP.createElement(fe.Z,{status:e===t?m("SavedMessagesInfo"):void 0,userId:e}):a.ZP.createElement(Ce.Z,{chatId:e}))))):h&&!h.length?a.ZP.createElement("p",{className:"no-results"},m("lng_blocked_list_not_found")):a.ZP.createElement(Pe.Z,null))})),Ie=(0,a.X$)((0,s.c$)((e=>{const{chats:{byId:t,listIds:n,orderedPinnedIds:a},currentUserId:s}=e;return{chatsById:t,pinnedIds:a.active,activeListIds:n.active,archivedListIds:n.archived,currentUserId:s}}),((e,t)=>(0,h.ei)(t,["setForwardChatId","exitForwardMode","loadMoreChats"])))((({chatsById:e,pinnedIds:t,activeListIds:n,archivedListIds:s,currentUserId:o,isOpen:l,setForwardChatId:i,exitForwardMode:c,loadMoreChats:d})=>{const m=(0,M.Z)(),[Z,P]=(0,a.eJ)(""),g=(0,a.sO)(null),v=(0,a.Ye)((()=>{const a=[...n||[],...s||[]];let l=t||[];return o&&(l=(0,h.Tw)([o,...l])),(0,u.ih)([...a.filter((t=>{const n=e[t];return!n||!!(0,u.Qm)(n,r._f)&&(!Z||(0,me.Z)((0,u.U)(m,e[t],void 0,t===o),Z))}))],e,void 0,l)}),[n,s,e,o,Z,m,t]),p=(0,a.I4)((e=>{i({id:e})}),[i]);return a.ZP.createElement(be,{currentUserId:o,isOpen:l,chatOrUserIds:v,filterRef:g,filterPlaceholder:m("ForwardTo"),filter:Z,onFilterChange:P,loadMore:d,onSelectChatOrUser:p,onClose:c})})));var ye=n(1947);function Se(e){return e.isSlowMode?"Slowmode enabled":e.hasErrorKey?"Something went wrong":"Telegram"}const ke=(0,a.X$)((0,s.c$)((e=>(0,h.ei)(e,["dialogs"])),((e,t)=>(0,h.ei)(t,["dismissDialog","acceptInviteConfirmation"])))((({dialogs:e,dismissDialog:t,acceptInviteConfirmation:n})=>{const s=(0,M.Z)();if(e.length)return a.ZP.createElement("div",{id:"Dialogs"},e.map((e=>{return"hash"in e?(e=>{const{hash:r,title:o,participantsCount:l,isChannel:i}=e,c=s(i?"Subscribers":"Members",l,"i"),d=s(i?"ChannelJoin":"JoinGroup");return a.ZP.createElement(ge.Z,{isOpen:!0,onClose:t,className:"error",title:o},void 0!==l&&a.ZP.createElement("p",null,c),a.ZP.createElement(R.Z,{isText:!0,className:"confirm-dialog-button",onClick:()=>{n({hash:r}),t()}},d),a.ZP.createElement(R.Z,{isText:!0,className:"confirm-dialog-button",onClick:t},s("Cancel")))})(e):(r=e,a.ZP.createElement(ge.Z,{isOpen:!0,onClose:t,className:"error",title:Se(r)},r.hasErrorKey?(0,ye.ZP)(r):(0,$.Z)(r.message,["emoji","br"]),a.ZP.createElement("div",null,a.ZP.createElement(R.Z,{isText:!0,onClick:t},s("OK")))));var r})))})));var we=n(6937);const Ne=(0,a.X$)((0,s.c$)((e=>(0,h.ei)(e,["notifications"])),((e,t)=>(0,h.ei)(t,["dismissNotification"])))((({notifications:e,dismissNotification:t})=>{if(e.length)return a.ZP.createElement("div",{id:"Notifications"},e.map((({message:e,localId:n})=>a.ZP.createElement(we.Z,{message:(0,$.Z)(e,["emoji","br","links","simple_markdown"]),onDismiss:()=>t({localId:n})}))))})));var Me=n(1396),Te=n(8360),Fe=n(7551);const Ae=(0,a.X$)((0,s.c$)(void 0,((e,t)=>(0,h.ei)(t,["toggleSafeLinkModal"])))((({url:e,toggleSafeLinkModal:t})=>{const n=(0,M.Z)(),s=(0,a.I4)((()=>{window.open((0,Me.X)(e)),t({url:void 0})}),[t,e]),r=(0,a.I4)((()=>{t({url:void 0})}),[t]),o=(0,Te.Z)(e);return a.ZP.createElement(Fe.Z,{isOpen:Boolean(e),onClose:r,title:n("OpenUrlTitle"),textParts:(0,$.Z)(n("OpenUrlAlert2",o),["links"]),confirmLabel:n("OpenUrlTitle"),confirmHandler:s})})));var Le=n(706);const Re=["lng_weekday1","lng_weekday2","lng_weekday3","lng_weekday4","lng_weekday5","lng_weekday6","lng_weekday7"];function Be(e,t,n,a,s){const r=new Date(e,t,n,0,0,0,0),o=a&&new Date(a.getFullYear(),a.getMonth(),a.getDate(),0,0,0,0),l=s&&new Date(s.getFullYear(),s.getMonth(),s.getDate(),0,0,0,0);return!!(l&&r>l)||!!(o&&r{const u=(0,M.Z)(),h=new Date,Z=(0,a.Ye)((()=>e?new Date(e):new Date),[e]),P=t?new Date(t):void 0,g=(0,f.Z)(r),[v,p,E]=(0,Le.Z)(!1),[C,b]=(0,a.eJ)(Z),[I,y]=(0,a.eJ)(new Date(C.getFullYear(),C.getMonth(),1)),[S,k]=(0,a.eJ)($e(Z.getHours())),[w,N]=(0,a.eJ)($e(Z.getMinutes())),T=De(C.getFullYear(),C.getMonth(),C.getDate()),F=I.getFullYear(),A=I.getMonth();(0,a.d4)((()=>{!g&&r&&(b(Z),y(new Date(Z.getFullYear(),Z.getMonth(),1)))}),[Z,r,g]),(0,a.d4)((()=>{n&&!v&&C.getTime()=h.getFullYear()&&A>=h.getMonth()||P&&F>=P.getFullYear()&&A>=P.getMonth(),$=n&&F<=h.getFullYear()&&A<=h.getMonth(),{prevMonthGrid:D,currentMonthGrid:U,nextMonthGrid:O}=(0,a.Ye)((()=>function(e,t){const n=[],a=[],s=[],r=new Date;r.setDate(1),r.setMonth(t),r.setFullYear(e);const o=r.getDay(),l=new Date(e,t,0).getDate();for(let e=1;e0)for(let e=1;e<=7-i;e++)s.push(e);return{prevMonthGrid:n,currentMonthGrid:a,nextMonthGrid:s}}(F,A)),[A,F]),x=(0,a.I4)((e=>{const t=e.target.value.replace(/[^\d]+/g,"");if(!t.length)return k(""),void(e.target.value="");const n=Math.max(0,Math.min(Number(t),23)),a=new Date(C.getTime());a.setHours(n),b(a);const s=$e(n);k(s),e.target.value=s}),[C]),G=(0,a.I4)((e=>{const t=e.target.value.replace(/[^\d]+/g,"");if(!t.length)return N(""),void(e.target.value="");const n=Math.max(0,Math.min(Number(t),59)),a=new Date(C.getTime());a.setMinutes(n),b(a);const s=$e(n);N(s),e.target.value=s}),[C]);return a.ZP.createElement(ge.Z,{isOpen:r,onClose:c,className:"CalendarModal"},a.ZP.createElement("div",{className:"container"},a.ZP.createElement("div",{className:"month-selector"},a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent",onClick:c},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement("h4",null,u(`lng_month${A+1}`)," ",F),a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent",disabled:$,onClick:$?void 0:function(){y((e=>{const t=new Date(e);return t.setMonth(t.getMonth()-1),t}))}},a.ZP.createElement("i",{className:"icon-previous"})),a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent",disabled:L,onClick:L?void 0:function(){y((e=>{const t=new Date(e);return t.setMonth(t.getMonth()+1),t}))}},a.ZP.createElement("i",{className:"icon-next"})))),a.ZP.createElement("div",{className:"calendar-wrapper"},a.ZP.createElement("div",{className:"calendar-grid"},Re.map((e=>a.ZP.createElement("div",{className:"day-button faded weekday"},a.ZP.createElement("span",null,u(e))))),D.map((e=>a.ZP.createElement("div",{className:"day-button disabled"},a.ZP.createElement("span",null,e)))),U.map((e=>a.ZP.createElement("div",{role:"button",tabIndex:0,onClick:()=>{return t=e,void b((e=>{const n=new Date(e);return n.setDate(t),n.setMonth(A),n.setFullYear(F),n}));var t},className:(0,X.Z)("day-button",Be(F,A,e,n?h:void 0,s?h:P)?"disabled":e?"clickable":"",T===De(F,A,e)&&"selected")},!!e&&a.ZP.createElement("span",null,e)))),O.map((e=>a.ZP.createElement("div",{className:"day-button disabled"},a.ZP.createElement("span",null,e)))))),o&&a.ZP.createElement("div",{className:"timepicker"},a.ZP.createElement("input",{type:"text",className:"form-control",inputMode:"decimal",value:S,onChange:x,onFocus:p,onBlur:E}),":",a.ZP.createElement("input",{type:"text",className:"form-control",inputMode:"decimal",value:w,onChange:G,onFocus:p,onBlur:E})),a.ZP.createElement("div",{className:"footer"},a.ZP.createElement(R.Z,{onClick:function(){d(C)}},o?function(e,t){const n=(0,B.xH)(t,e.code);return n===(0,B.xH)(new Date,e.code)?e("Conversation.ScheduleMessage.SendToday",(0,B.mr)(t,e)):e("Conversation.ScheduleMessage.SendOn",[n,(0,B.mr)(t,e)])}(u,C):l),i&&a.ZP.createElement(R.Z,{onClick:m,isText:!0},i)))})),Oe=(0,a.X$)((0,s.c$)((e=>({selectedAt:e.historyCalendarSelectedAt})),((e,t)=>(0,h.ei)(t,["searchMessagesByDate","closeHistoryCalendar"])))((({isOpen:e,selectedAt:t,searchMessagesByDate:n,closeHistoryCalendar:s})=>{const r=(0,a.I4)((e=>{n({timestamp:e.valueOf()/1e3}),s()}),[s,n]),o=(0,M.Z)();return a.ZP.createElement(Ue,{isOpen:e,selectedAt:t,isPastMode:!0,submitButtonLabel:o("JumpToDate"),onClose:s,onSubmit:r})}))),xe=(0,a.X$)((0,s.c$)(((e,{message:t,isSchedule:n})=>{const{threadId:a}=(0,m.Bt)(e)||{},{canDeleteForAll:s}=a&&(0,m._k)(e,t,a)||{},r=(0,m.Z1)(e,t.chatId);return{canDeleteForAll:!n&&s,contactName:r&&(0,u.YC)(r.id)?(0,u.Vl)((0,m.dy)(e,(0,u.zX)(r))):void 0,willDeleteForCurrentUserOnly:r&&(0,u.G9)(r)&&!s,willDeleteForAll:r&&(0,u.ZV)(r)}}),((e,t)=>(0,h.ei)(t,["deleteMessages","deleteScheduledMessages"])))((({isOpen:e,isSchedule:t,message:n,album:s,canDeleteForAll:r,contactName:o,willDeleteForCurrentUserOnly:l,willDeleteForAll:i,onClose:c,deleteMessages:d,deleteScheduledMessages:m})=>{const u=(0,a.I4)((()=>{const e=null!=s&&s.messages?s.messages.map((({id:e})=>e)):[n.id];d({messageIds:e,shouldDeleteForAll:!0}),c()}),[d,n.id,c,s]),h=(0,a.I4)((()=>{const e=null!=s&&s.messages?s.messages.map((({id:e})=>e)):[n.id];t?m({messageIds:e}):d({messageIds:e,shouldDeleteForAll:!1}),c()}),[s,n.id,t,c,m,d]),Z=(0,M.Z)();return a.ZP.createElement(ge.Z,{isOpen:e,onClose:c,onEnter:e&&!r?h:void 0,className:"delete",title:Z("DeleteSingleMessagesTitle")},a.ZP.createElement("p",null,Z("AreYouSureDeleteSingleMessage")),l&&a.ZP.createElement("p",null,Z("lng_delete_for_me_chat_hint",1,"i")),i&&a.ZP.createElement("p",null,Z("lng_delete_for_everyone_hint",1,"i")),r&&a.ZP.createElement(R.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:u},o&&(0,$.Z)(Z("Conversation.DeleteMessagesFor",o)),!o&&Z("Conversation.DeleteMessagesForEveryone")),a.ZP.createElement(R.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:h},Z(r?"ChatList.DeleteForCurrentUser":"Delete")),a.ZP.createElement(R.Z,{className:"confirm-dialog-button",isText:!0,onClick:c},Z("Cancel")))}))),Ge=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,u.YC)(t),a=(0,m.FM)(e,t),s=(0,m.Z1)(e,t),r=!!s&&(0,u.eA)(s),o=!!s&&(0,u.G9)(s),l=!!s&&(0,u.ZV)(s);return{isPrivateChat:n,isChatWithSelf:a,isChannel:r,isGroup:o,isSuperGroup:l,canPinForAll:n&&!a||l||o,contactName:s&&(0,u.YC)(s.id)?(0,u.Vl)((0,m.dy)(e,(0,u.zX)(s))):void 0}}),((e,t)=>(0,h.ei)(t,["pinMessage"])))((({isOpen:e,messageId:t,chatId:n,isChannel:s,isGroup:r,isSuperGroup:o,canPinForAll:l,contactName:i,onClose:c,pinMessage:d})=>{const m=(0,a.I4)((()=>{d({chatId:n,messageId:t,isUnpin:!1}),c()}),[d,n,t,c]),u=(0,a.I4)((()=>{d({chatId:n,messageId:t,isUnpin:!1,isOneSide:!0,isSilent:!0}),c()}),[n,t,c,d]),h=(0,M.Z)();return a.ZP.createElement(ge.Z,{isOpen:e,onClose:c,className:"pin",title:h("PinMessageAlertTitle")},a.ZP.createElement("p",null,h(s?"PinMessageAlertChannel":r||o?"PinMessageAlert":"PinMessageAlertChat")),a.ZP.createElement(R.Z,{className:"confirm-dialog-button",isText:!0,onClick:u},h("DialogPin")),l&&a.ZP.createElement(R.Z,{className:"confirm-dialog-button",isText:!0,onClick:m},i?(0,$.Z)(h("Conversation.PinMessagesFor",i)):h("Conversation.PinMessageAlert.PinAndNotifyMembers")),a.ZP.createElement(R.Z,{className:"confirm-dialog-button",isText:!0,onClick:c},h("Cancel")))}))),Je=(0,a.X$)((({isOpen:e,pinnedMessagesCount:t=0,onClose:n,onUnpin:s})=>{const r=(0,M.Z)();return a.ZP.createElement(ge.Z,{isOpen:e,onClose:n,className:"unpin-all",title:r("Chat.PanelUnpinAllMessages")},a.ZP.createElement("p",null,r("Chat.UnpinAllMessagesConfirmation",t,"i")),a.ZP.createElement(R.Z,{className:"confirm-dialog-button",isText:!0,onClick:s},r("DialogUnpin")),a.ZP.createElement(R.Z,{className:"confirm-dialog-button",isText:!0,onClick:n},r("Cancel")))}));var ze=n(517);const Xe=(0,a.X$)((0,s.c$)(((e,{isSchedule:t})=>{const{messageIds:n}=e.selectedMessages||{},{canDeleteForAll:a}=(0,m.xl)(e),s=(0,m.jr)(e);return{selectedMessageIds:n,canDeleteForAll:!t&&a,contactName:s&&(0,u.YC)(s.id)?(0,u.Vl)((0,m.dy)(e,(0,u.zX)(s))):void 0,willDeleteForCurrentUserOnly:s&&(0,u.G9)(s)&&!a,willDeleteForAll:s&&(0,u.ZV)(s)}}),((e,t)=>(0,h.ei)(t,["deleteMessages","deleteScheduledMessages","exitMessageSelectMode"])))((({isOpen:e,isSchedule:t,selectedMessageIds:n,canDeleteForAll:s,contactName:r,willDeleteForCurrentUserOnly:o,willDeleteForAll:l,onClose:i,deleteMessages:c,deleteScheduledMessages:d,exitMessageSelectMode:m})=>{const u=(0,f.Z)(e),h=(0,a.I4)((()=>{i(),c({messageIds:n,shouldDeleteForAll:!0})}),[c,n,i]),Z=(0,a.I4)((()=>{t?d({messageIds:n}):c({messageIds:n,shouldDeleteForAll:!1}),i()}),[t,i,d,n,c]),P=(0,M.Z)();if((0,a.d4)((()=>{!e&&u&&m()}),[m,e,u]),n)return a.ZP.createElement(ge.Z,{isOpen:e,onClose:i,onEnter:s?void 0:Z,className:"delete",title:P("Conversation.DeleteManyMessages")},a.ZP.createElement("p",null,P("AreYouSureDeleteFewMessages")),o&&a.ZP.createElement("p",null,"This will delete them just for you, not for other participants in the chat."),l&&a.ZP.createElement("p",null,"This will delete them for everyone in this chat."),s&&a.ZP.createElement(R.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:h},r?(0,$.Z)(P("ChatList.DeleteForEveryone",r)):P("Conversation.DeleteMessagesForEveryone")),a.ZP.createElement(R.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:Z},P(s?"ChatList.DeleteForCurrentUser":"Delete")),a.ZP.createElement(R.Z,{className:"confirm-dialog-button",isText:!0,onClick:i},P("Cancel")))})));var _e=n(4434);const Ye=(0,a.X$)((0,s.c$)(void 0,((e,t)=>(0,h.ei)(t,["reportMessages","exitMessageSelectMode"])))((({isOpen:e,messageIds:t,reportMessages:n,exitMessageSelectMode:s,onClose:r})=>{const[o,l]=(0,a.eJ)("spam"),[i,c]=(0,a.eJ)(""),d=()=>{n({messageIds:t,reason:o,description:i}),s(),r()},m=(0,a.I4)((e=>{l(e)}),[]),u=(0,a.I4)((e=>{c(e.target.value)}),[]),h=(0,M.Z)(),Z=[{value:"spam",label:h("lng_report_reason_spam")},{value:"violence",label:h("lng_report_reason_violence")},{value:"pornography",label:h("lng_report_reason_pornography")},{value:"childAbuse",label:h("lng_report_reason_child_abuse")},{value:"copyright",label:h("ReportPeer.ReasonCopyright")},{value:"other",label:h("lng_report_reason_other")}];if(t)return a.ZP.createElement(ge.Z,{isOpen:e,onClose:r,onEnter:e?d:void 0,className:"report",title:h("lng_report_message_title")},a.ZP.createElement(_e.Z,{name:"report-message",options:Z,onChange:m,selected:o}),a.ZP.createElement(ve.Z,{label:h("lng_report_reason_description"),value:i,onChange:u}),a.ZP.createElement(R.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:d},h("lng_report_button")),a.ZP.createElement(R.Z,{className:"confirm-dialog-button",isText:!0,onClick:r},h("Cancel")))}))),He=(0,a.X$)((0,s.c$)((e=>{const{type:t}=(0,m.Bt)(e)||{},{canDelete:n}=(0,m.xl)(e),a=(0,m.nB)(e),s=(0,m.Nu)(e),{messageIds:r}=e.selectedMessages||{};return{isSchedule:"scheduled"===t,selectedMessagesCount:(0,m.D7)(e),canDeleteMessages:n,canReportMessages:a,canDownloadMessages:s,selectedMessageIds:r}}),((e,t)=>(0,h.ei)(t,["exitMessageSelectMode","openForwardMenuForSelectedMessages","downloadSelectedMessages"])))((({canPost:e,isActive:t,messageListType:n,isSchedule:s,selectedMessagesCount:r,canDeleteMessages:o,canReportMessages:l,canDownloadMessages:i,selectedMessageIds:c,exitMessageSelectMode:d,openForwardMenuForSelectedMessages:m,downloadSelectedMessages:u})=>{const[h,Z,P]=(0,Le.Z)(),[g,v,p]=(0,Le.Z)();(0,a.d4)((()=>!t||h||g?void 0:(0,ze.Z)({onBackspace:Z,onDelete:Z,onEsc:d})),[t,h,g,Z,d]);const E=(0,a.I4)((()=>{u(),d()}),[u,d]),C=(0,f.Z)(r||void 0,!0),b=t?r:C,I=(0,M.Z)(),y=I("VoiceOver.Chat.MessagesSelected",b,"i"),S=(0,X.Z)("MessageSelectToolbar",e&&"with-composer",t&&"shown"),k=(e,t,n,s,r)=>a.ZP.createElement("div",{role:"button",tabIndex:0,className:(0,X.Z)("item",s&&"disabled",r&&"destructive"),onClick:s?void 0:n,title:t},a.ZP.createElement("i",{className:`icon-${e}`}));return a.ZP.createElement("div",{className:S},a.ZP.createElement("div",{className:"MessageSelectToolbar-inner"},a.ZP.createElement(R.Z,{color:"translucent",round:!0,onClick:d,ariaLabel:"Exit select mode"},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement("span",{className:"MessageSelectToolbar-count",title:y},y),!!r&&a.ZP.createElement("div",{className:"MessageSelectToolbar-actions"},"scheduled"!==n&&k("forward",I("Chat.ForwardActionHeader"),m),l&&k("flag",I("Conversation.ReportMessages"),v),i&&k("download",I("lng_media_download"),E),k("delete",I("EditAdminGroupDeleteMessages"),Z,!o,!0))),a.ZP.createElement(Xe,{isOpen:h,isSchedule:s,onClose:P}),a.ZP.createElement(Ye,{isOpen:g,onClose:p,messageIds:c}))})));var Ve=n(3133),je=n(735),Ke=n(1470);const qe=e=>{const t=(0,a.sO)(null),n=(0,a.I4)((n=>{"Enter"===n.key&&t.current===document.activeElement&&e()}),[e]);return(0,a.d4)((()=>(window.addEventListener("keydown",n,!1),()=>window.removeEventListener("keydown",n))),[n]),t};var We=n(329),Qe=n(742);const et=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,m.Z1)(e,t),a=n&&(0,u.zX)(n);return{chat:n,privateChatUser:a?(0,m.dy)(e,a):void 0,isPinned:(0,m.ep)(e,t),isMuted:n?(0,u.i4)(n,(0,m.dZ)(e),(0,m.NJ)(e)):void 0}}))((({chatId:e,chat:t,privateChatUser:n,isPinned:s,isMuted:r,withUsername:o,onClick:l})=>{const[i,c,d]=(0,Le.Z)(),[m,h,Z]=(0,Le.Z)(),P=(0,Ke.Z)({chat:t,privateChatUser:n,isPinned:s,isMuted:r,handleDelete:c,handleChatFolderChange:h},!0),g=()=>{l(e)},v=qe(g);if(t)return a.ZP.createElement(Ee.Z,{className:"chat-item-clickable search-result",onClick:g,contextActions:P,buttonRef:v},(0,u.YC)(e)?a.ZP.createElement(fe.Z,{userId:e,withUsername:o,avatarSize:"large"}):a.ZP.createElement(Ce.Z,{chatId:e,withUsername:o,avatarSize:"large"}),a.ZP.createElement(We.Z,{isOpen:i,onClose:d,chat:t}),a.ZP.createElement(Qe.Z,{isOpen:m,onClose:Z,chatId:e}))})));var tt=n(8781);const nt=(0,z.P2)((e=>e()),6e4,!0),at=(0,a.X$)((0,s.c$)((e=>{const{userIds:t}=e.topPeers,n=e.users.byId,{recentlyFoundChatIds:a}=e.globalSearch;return{topUserIds:t,usersById:n,recentlyFoundChatIds:a}}),((e,t)=>(0,h.ei)(t,["loadTopUsers","loadContactList","openChat","addRecentlyFoundChatId","clearRecentlyFoundChats"])))((({topUserIds:e,usersById:t,recentlyFoundChatIds:n,onReset:s,loadTopUsers:r,loadContactList:o,openChat:l,addRecentlyFoundChatId:i,clearRecentlyFoundChats:c})=>{const d=(0,a.sO)(null);(0,a.d4)((()=>{nt((()=>{r(),o()}))}),[r,o]),(0,tt.Z)(d.current,!e);const m=(0,a.I4)((e=>{l({id:e,shouldReplaceHistory:!0}),s(),setTimeout((()=>{i({id:e})}),250)}),[l,i,s]),h=(0,M.Z)();return a.ZP.createElement("div",{className:"RecentContacts custom-scroll"},e&&a.ZP.createElement("div",{className:"top-peers-section",dir:h.isRtl?"rtl":void 0},a.ZP.createElement("div",{ref:d,className:"top-peers no-selection"},e.map((e=>a.ZP.createElement("div",{className:"top-peer-item",onClick:()=>m(e),dir:h.isRtl?"rtl":void 0},a.ZP.createElement(D.Z,{user:t[e]}),a.ZP.createElement("div",{className:"top-peer-name"},(0,$.Z)((0,u.Vl)(t[e])||" "))))))),n&&a.ZP.createElement("div",{className:"search-section pt-1"},a.ZP.createElement("h3",{className:"section-heading mt-0 recent-chats-header",dir:h.isRtl?"rtl":void 0},h("Recent"),a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent",ariaLabel:"Clear recent chats",onClick:c,isRtl:h.isRtl},a.ZP.createElement("i",{className:"icon-close"}))),n.map((e=>a.ZP.createElement(et,{chatId:e,onClick:m})))))})));var st=n(9411),rt=n(8033);const ot=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,m.Z1)(e,t);if(!n)return{};const a=(0,u.zX)(n);return{chat:n,lastSyncTime:e.lastSyncTime,...a&&{privateChatUser:(0,m.dy)(e,a)}}}),((e,t)=>(0,h.ei)(t,["focusMessage"])))((({message:e,searchQuery:t,chatId:n,chat:s,privateChatUser:r,focusMessage:o,lastSyncTime:l})=>{const c=(0,u.DH)(e),d=(0,p.Z)((0,u.Ti)(e,"micro")),m=Boolean((0,u.Y5)(e)),h=(0,a.I4)((()=>{o({chatId:n,messageId:e.id})}),[n,o,e.id]),Z=(0,M.Z)(),P=qe(h);if(s)return a.ZP.createElement(Ee.Z,{className:"ChatMessage chat-item-clickable",ripple:!i.wB,onClick:h,buttonRef:P},a.ZP.createElement(D.Z,{chat:s,user:r,withOnlineStatus:!0,isSavedMessages:null==r?void 0:r.isSelf,lastSyncTime:l}),a.ZP.createElement("div",{className:"info"},a.ZP.createElement("div",{className:"info-row"},a.ZP.createElement("div",{className:"title"},a.ZP.createElement("h3",{dir:"auto"},(0,$.Z)((0,u.U)(Z,s,r))),s.isVerified&&a.ZP.createElement(st.Z,null)),a.ZP.createElement("div",{className:"message-date"},a.ZP.createElement(rt.Z,{className:"date"},(0,B.VX)(Z,1e3*e.date)))),a.ZP.createElement("div",{className:"subtitle"},a.ZP.createElement("div",{className:"message",dir:"auto"},function(e,t,n,s,r){return n?a.ZP.createElement("span",{className:"media-preview"},a.ZP.createElement("img",{src:n,alt:"",className:r?"round":void 0}),(0,u.b7)(t)&&a.ZP.createElement("i",{className:"icon-play"}),(0,$.Z)((0,u.MK)(e,t,!0),["emoji","highlight"],{highlight:s})):(0,$.Z)((0,u.MK)(e,t))}(Z,e,d||c,t,m)))))}))),lt=(0,a.X$)((({searchDate:e,onSelect:t})=>{const n=(0,a.Ye)((()=>function(e){if(e.match(/^\d{2,4}-\d{2}-\d{2}$/g)){const t=new Date(e);return[{date:t,text:(0,B.xH)(t)}]}const t=[],n=new Date,a=n.getFullYear(),s=n.getTime()>new Date(`${a}-${e}`).getTime()?a:a-1;for(let n=0;n<8;n++){const a=new Date(`${s-n}-${e}`);t.push({date:a,text:(0,B.xH)(a)})}return t}(e)),[e]);return a.ZP.createElement("section",{className:"DateSuggest custom-scroll custom-scroll-x"},n.map((({date:e,text:n})=>a.ZP.createElement("div",{onClick:()=>t(e),className:"date-item",key:n},a.ZP.createElement("i",{className:"icon-calendar"}),a.ZP.createElement("span",null,n)))))}));var it=n(7262),ct=n(9187);const dt=(0,z.P2)((e=>e()),500,!0),mt=(0,a.X$)((0,s.c$)((e=>{var t;const{byId:n}=e.chats,{byId:a}=e.users,{userIds:s}=e.contactList||{};if(!s)return{chatsById:n,usersById:a};const{currentUserId:r,messages:o,lastSyncTime:l}=e,{fetchingStatus:i,globalResults:c,localResults:d,resultsByType:m}=e.globalSearch,{chatIds:u,userIds:h}=c||{},{chatIds:Z,userIds:P}=d||{},{byChatId:g}=o;return{currentUserId:r,localContactIds:s,localChatIds:Z,localUserIds:P,globalChatIds:u,globalUserIds:h,foundIds:null==m||null===(t=m.text)||void 0===t?void 0:t.foundIds,globalMessagesByChatId:g,chatsById:n,usersById:a,fetchingStatus:i,lastSyncTime:l}}),((e,t)=>(0,h.ei)(t,["openChat","addRecentlyFoundChatId","searchMessagesGlobal","setGlobalSearchChatId"])))((({searchQuery:e,searchDate:t,dateSearchQuery:n,currentUserId:s,localContactIds:r,localChatIds:l,localUserIds:c,globalChatIds:d,globalUserIds:m,foundIds:Z,globalMessagesByChatId:P,chatsById:g,usersById:v,fetchingStatus:p,lastSyncTime:E,onReset:C,onSearchDateSelect:f,openChat:b,addRecentlyFoundChatId:I,searchMessagesGlobal:y,setGlobalSearchChatId:S})=>{const k=(0,M.Z)(),[w,N]=(0,a.eJ)(!1),[T,F]=(0,a.eJ)(!1),A=(0,a.I4)((({direction:t})=>{E&&t===o.Uq.Backwards&&dt((()=>{y({type:"text",query:e})}))}),[E,y,e]),L=(0,a.I4)((e=>{b({id:e,shouldReplaceHistory:!0}),e!==s&&I({id:e}),i.wB||C()}),[s,b,I,C]),R=(0,a.I4)((e=>{S({id:e})}),[S]),B=(0,a.Ye)((()=>{if(!e||e.startsWith("@")&&e.length<2)return je.D;const t=r?r.filter((t=>{const n=v[t];if(!n)return!1;const a=(0,u.Js)(n);return a&&(0,me.Z)(a,e)||(0,me.Z)(n.username,e)})):[];return[...s&&(0,me.Z)(k("SavedMessages"),e)?[s]:[],...(0,u.ih)((0,h.Tw)([...t,...l||[],...c||[]]),g)]}),[e,r,s,k,l,c,g,v]),$=(0,a.Ye)((()=>!e||e.length<4||!d||!m?je.D:(0,u.ih)((0,h.Tw)([...d,...m]),g,!0)),[g,d,m,e]),D=(0,a.Ye)((()=>(e||t)&&Z&&0!==Z.length?Z.map((e=>{var t;const[n,a]=e.split("_");return null==P||null===(t=P[n])||void 0===t?void 0:t.byId[Number(a)]})).filter(Boolean).sort(((e,t)=>t.date-e.date)):je.D),[Z,P,e,t]),U=(0,a.I4)((()=>{N(!w)}),[w]),O=(0,a.I4)((()=>{F(!T)}),[T]),x=p&&!p.chats&&!p.messages&&!B.length&&!$.length&&!D.length;return e||t?a.ZP.createElement(pe.Z,{className:"LeftSearch custom-scroll",items:D,onLoadMore:A,noScrollRestoreOnTop:!0,noFastList:!0},n&&a.ZP.createElement("div",{className:"chat-selection no-selection no-scrollbar"},a.ZP.createElement(lt,{searchDate:n,onSelect:f})),x&&a.ZP.createElement(it.Z,{text:k("ChatList.Search.NoResults"),description:k("ChatList.Search.NoResultsDescription")}),!!B.length&&a.ZP.createElement("div",{className:"chat-selection no-selection no-scrollbar",dir:k.isRtl?"rtl":void 0},B.map((e=>a.ZP.createElement(ct.Z,{chatOrUserId:e,onClick:R,clickArg:e})))),!!B.length&&a.ZP.createElement("div",{className:"search-section"},a.ZP.createElement("h3",{className:"section-heading",dir:k.isRtl?"auto":void 0},B.length>3&&a.ZP.createElement(rt.Z,{onClick:U},k(w?"ChatList.Search.ShowLess":"ChatList.Search.ShowMore")),k("DialogList.SearchSectionDialogs")),B.map(((e,t)=>{if(w||!(t>=3))return a.ZP.createElement(et,{chatId:e,onClick:L})}))),!!$.length&&a.ZP.createElement("div",{className:"search-section"},a.ZP.createElement("h3",{className:"section-heading",dir:k.isRtl?"auto":void 0},$.length>3&&a.ZP.createElement(rt.Z,{onClick:O},k(T?"ChatList.Search.ShowLess":"ChatList.Search.ShowMore")),k("DialogList.SearchSectionGlobal")),$.map(((e,t)=>{if(T||!(t>=3))return a.ZP.createElement(et,{chatId:e,withUsername:!0,onClick:L})}))),!!D.length&&a.ZP.createElement("div",{className:"search-section"},a.ZP.createElement("h3",{className:"section-heading",dir:k.isRtl?"auto":void 0},k("SearchMessages")),D.map((function(t){const n=(0,u.MK)(k,t),s=g[t.chatId];if(n&&s)return a.ZP.createElement(ot,{chatId:t.chatId,message:t,searchQuery:e})})))):a.ZP.createElement(at,{onReset:C})}))),ut=(0,z.P2)((e=>e()),500,!0),ht=(0,a.X$)((0,s.c$)((e=>{const{byId:t}=e.chats,{currentUserId:n,messages:{byChatId:a},lastSyncTime:s}=e,{fetchingStatus:r,resultsByType:o}=e.globalSearch,{foundIds:l}=(null==o?void 0:o.text)||{};return{currentUserId:n,foundIds:l,globalMessagesByChatId:a,chatsById:t,fetchingStatus:r,lastSyncTime:s}}),((e,t)=>(0,h.ei)(t,["searchMessagesGlobal"])))((({searchQuery:e,currentUserId:t,dateSearchQuery:n,foundIds:s,globalMessagesByChatId:r,chatsById:l,fetchingStatus:i,lastSyncTime:c,searchMessagesGlobal:d,onSearchDateSelect:m})=>{const h=(0,M.Z)(),Z=(0,a.I4)((({direction:n})=>{c&&n===o.Uq.Backwards&&ut((()=>{d({type:"text",query:e,chatId:t})}))}),[t,c,d,e]),P=(0,a.Ye)((()=>s&&0!==s.length?s.map((e=>{var t;const[n,a]=e.split("_");return null==r||null===(t=r[n])||void 0===t?void 0:t.byId[Number(a)]})).filter(Boolean).sort(((e,t)=>t.date-e.date)):je.D),[s,r]),g=i&&!i.chats&&!i.messages&&!P.length;return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(pe.Z,{className:"search-content custom-scroll chat-list",items:P,onLoadMore:Z,noFastList:!0},n&&a.ZP.createElement("div",{className:"chat-selection no-selection no-scrollbar"},a.ZP.createElement(lt,{searchDate:n,onSelect:m})),g&&a.ZP.createElement(it.Z,{text:h("ChatList.Search.NoResults"),description:h("ChatList.Search.NoResultsDescription")}),!!P.length&&P.map((function(t){const n=(0,u.MK)(h,t),s=l[t.chatId];if(n&&s)return a.ZP.createElement(ot,{chatId:t.chatId,message:t,searchQuery:e})}))))})));function Zt(e){return(t,n)=>{var a;const{byId:s}=t.chats,{byId:r}=t.users,{fetchingStatus:o,resultsByType:l,chatId:i}=t.globalSearch,c="audio"!==e?e:null!=n&&n.isVoice?"voice":"audio",{byChatId:d}=t.messages,u=null==l||null===(a=l[c])||void 0===a?void 0:a.foundIds,h=t.activeDownloads.byChatId;return{theme:(0,m.Pu)(t),isLoading:void 0===u||!!o&&Boolean(o.chats||o.messages),chatsById:s,usersById:r,globalMessagesByChatId:d,foundIds:u,searchChatId:i,activeDownloads:h,lastSyncTime:t.lastSyncTime}}}var Pt=n(7891),gt=n(3709);const vt="media",pt=(0,z.P2)((e=>e()),500,!0),Et=(0,a.X$)((0,s.c$)(Zt(vt),((e,t)=>(0,h.ei)(t,["searchMessagesGlobal","openMediaViewer"])))((({searchQuery:e,searchChatId:t,isLoading:n,globalMessagesByChatId:s,foundIds:r,lastSyncTime:i,searchMessagesGlobal:c,openMediaViewer:d})=>{const m=(0,M.Z)(),u=(0,a.I4)((({direction:n})=>{i&&n===o.Uq.Backwards&&pt((()=>{c({type:vt,query:e,chatId:t})}))}),[i,c,e,t]),h=(0,a.Ye)((()=>r&&s?r.map((e=>{var t;const[n,a]=e.split("_");return null===(t=s[n])||void 0===t?void 0:t.byId[Number(a)]})).filter(Boolean):je.D),[s,r]),Z=(0,a.I4)(((e,t)=>{d({chatId:t,messageId:e,origin:o.bZ.SearchResult})}),[d]),P=(0,Pt.Z)([e],l.Y)&&!n,g=P&&r&&r.length>0&&!e,v=P&&r&&r.length>0&&e,p=(0,X.Z)("search-content custom-scroll",v&&"chat-list");return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(pe.Z,{className:p,items:h,itemSelector:e?".ListItem":".Media",onLoadMore:u,noFastList:!0},!P&&a.ZP.createElement(Pe.Z,null),P&&(!r||0===r.length)&&a.ZP.createElement(it.Z,{text:m("ChatList.Search.NoResults"),description:m("ChatList.Search.NoResultsDescription")}),g&&a.ZP.createElement("div",{className:"media-list",dir:m.isRtl?"rtl":void 0},h.map((e=>a.ZP.createElement(gt.Z,{key:e.id,idPrefix:"search-media",message:e,onClick:Z})))),v&&h.map((e=>a.ZP.createElement(ot,{key:e.id,chatId:e.chatId,message:e})))))})));var Ct=n(91),ft=n(5418);const bt="links",It=(0,z.P2)((e=>e()),500,!0),yt=(0,a.X$)((0,s.c$)(Zt(bt),((e,t)=>(0,h.ei)(t,["searchMessagesGlobal","focusMessage"])))((({searchQuery:e,searchChatId:t,isLoading:n,chatsById:s,usersById:r,globalMessagesByChatId:i,foundIds:c,lastSyncTime:d,searchMessagesGlobal:m,focusMessage:u})=>{const h=(0,M.Z)(),Z=(0,a.I4)((({direction:n})=>{d&&n===o.Uq.Backwards&&It((()=>{m({type:bt,query:e,chatId:t})}))}),[d,m,e,t]),P=(0,a.Ye)((()=>c&&i?c.map((e=>{var t;const[n,a]=e.split("_");return null===(t=i[n])||void 0===t?void 0:t.byId[Number(a)]})).filter(Boolean):je.D),[i,c]),g=(0,a.I4)(((e,t)=>{u({chatId:t,messageId:e})}),[u]),v=(0,Pt.Z)([e],l.Y)&&!n;return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(pe.Z,{className:"search-content documents-list custom-scroll",items:P,onLoadMore:Z,noFastList:!0},!v&&a.ZP.createElement(Pe.Z,null),v&&(!c||0===c.length)&&a.ZP.createElement(it.Z,{text:h("ChatList.Search.NoResults"),description:h("ChatList.Search.NoResultsDescription")}),v&&c&&c.length>0&&P.map(((e,t)=>{const n=0===t||(0,B.kj)(e.date)!==(0,B.kj)(P[t-1].date);return a.ZP.createElement("div",{className:"ListItem small-icon",dir:h.isRtl?"rtl":void 0,key:e.id},n&&a.ZP.createElement("p",{className:"section-heading",dir:h.isRtl?"rtl":void 0},(0,B.np)(h,new Date(1e3*e.date))),a.ZP.createElement(ft.Z,{key:e.id,message:e,senderTitle:(0,Ct.F)(h,e,s,r),onMessageClick:g}))}))))})));var St=n(2535);const kt="documents",wt=(0,z.P2)((e=>e()),500,!0),Nt=(0,a.X$)((0,s.c$)(Zt(kt),((e,t)=>(0,h.ei)(t,["searchMessagesGlobal","focusMessage"])))((({searchQuery:e,searchChatId:t,isLoading:n,chatsById:s,usersById:r,globalMessagesByChatId:i,foundIds:c,activeDownloads:d,lastSyncTime:m,searchMessagesGlobal:h,focusMessage:Z})=>{const P=(0,M.Z)(),g=(0,a.I4)((({direction:n})=>{m&&n===o.Uq.Backwards&&wt((()=>{h({type:kt,query:e,chatId:t})}))}),[m,h,e,t]),v=(0,a.Ye)((()=>c&&i?c.map((e=>{var t;const[n,a]=e.split("_"),s=null===(t=i[n])||void 0===t?void 0:t.byId[Number(a)];return s&&(0,u.aE)(s)?s:void 0})).filter(Boolean):je.D),[i,c]),p=(0,a.I4)(((e,t)=>{Z({chatId:t,messageId:e})}),[Z]),E=(0,Pt.Z)([e],l.Y)&&!n;return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(pe.Z,{className:"search-content documents-list custom-scroll",items:v,onLoadMore:g,noFastList:!0},!E&&a.ZP.createElement(Pe.Z,null),E&&(!c||0===c.length)&&a.ZP.createElement(it.Z,{text:P("ChatList.Search.NoResults"),description:P("ChatList.Search.NoResultsDescription")}),E&&c&&c.length>0&&v.map(((e,t)=>{var n;const o=0===t||(0,B.kj)(e.date)!==(0,B.kj)(v[t-1].date);return a.ZP.createElement("div",{className:"ListItem small-icon",key:e.id},o&&a.ZP.createElement("p",{className:"section-heading"},(0,B.np)(P,new Date(1e3*e.date))),a.ZP.createElement(St.Z,{message:e,withDate:!0,datetime:e.date,smaller:!0,sender:(0,Ct.F)(P,e,s,r),className:"scroll-item",onDateClick:p,isDownloading:null===(n=d[e.chatId])||void 0===n?void 0:n.includes(e.id)}))}))))})));var Mt=n(4752);const Tt=(0,z.P2)((e=>e()),500,!0),Ft=(0,a.X$)((0,s.c$)(Zt("audio"),((e,t)=>(0,h.ei)(t,["searchMessagesGlobal","focusMessage","openAudioPlayer"])))((({theme:e,isVoice:t,searchQuery:n,searchChatId:s,isLoading:r,chatsById:i,usersById:c,globalMessagesByChatId:d,foundIds:m,lastSyncTime:u,activeDownloads:h,searchMessagesGlobal:Z,focusMessage:P,openAudioPlayer:g})=>{const v=(0,M.Z)(),p=t?"voice":"audio",E=(0,a.I4)((({direction:e})=>{u&&e===o.Uq.Backwards&&Tt((()=>{Z({type:p,query:n,chatId:s})}))}),[p,u,Z,n,s]),C=(0,a.Ye)((()=>m&&d?m.map((e=>{var t;const[n,a]=e.split("_");return null===(t=d[n])||void 0===t?void 0:t.byId[Number(a)]})).filter(Boolean):je.D),[d,m]),f=(0,a.I4)(((e,t)=>{P({chatId:t,messageId:e})}),[P]),b=(0,a.I4)(((e,t)=>{g({chatId:t,messageId:e})}),[g]),I=(0,Pt.Z)([n],l.Y)&&!r;return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(pe.Z,{className:"search-content documents-list custom-scroll",items:C,onLoadMore:E,noFastList:!0},!I&&a.ZP.createElement(Pe.Z,null),I&&(!m||0===m.length)&&a.ZP.createElement(it.Z,{text:v("ChatList.Search.NoResults"),description:v("ChatList.Search.NoResultsDescription")}),I&&m&&m.length>0&&C.map(((t,n)=>{var s;const r=0===n||(0,B.kj)(t.date)!==(0,B.kj)(C[n-1].date);return a.ZP.createElement("div",{className:"ListItem small-icon",key:t.id},r&&a.ZP.createElement("p",{className:"section-heading",dir:v.isRtl?"rtl":void 0},(0,B.np)(v,new Date(1e3*t.date))),a.ZP.createElement(Mt.Z,{key:t.id,theme:e,message:t,origin:o.Cr.Search,senderTitle:(0,Ct.F)(v,t,i,c),date:t.date,lastSyncTime:u,className:"scroll-item",onPlay:b,onDateClick:f,isDownloading:null===(s=h[t.chatId])||void 0===s?void 0:s.includes(t.id)}))}))))}))),At=[{type:o.nJ.ChatList,title:"SearchAllChatsShort"},{type:o.nJ.Media,title:"SharedMediaTab2"},{type:o.nJ.Links,title:"SharedLinksTab2"},{type:o.nJ.Files,title:"SharedFilesTab2"},{type:o.nJ.Music,title:"SharedMusicTab2"},{type:o.nJ.Voice,title:"SharedVoiceTab2"}],Lt=[{type:o.nJ.ChatList,title:"All Messages"},...At.slice(1)],Rt=Object.keys(o.nJ).length/2,Bt=(0,a.X$)((0,s.c$)((e=>{const{currentContent:t,chatId:n}=e.globalSearch;return{currentContent:t,chatId:n}}),((e,t)=>(0,h.ei)(t,["setGlobalSearchContent","setGlobalSearchDate"])))((({searchQuery:e,searchDate:t,isActive:n,currentContent:s=o.nJ.ChatList,chatId:r,setGlobalSearchContent:l,setGlobalSearchDate:i,onReset:c})=>{const d=(0,M.Z)(),[m,u]=(0,a.eJ)(s),h=(0,a.Ye)((()=>(0,B.xk)(e)),[e]),Z=(0,a.I4)((e=>{const t=At[e];l({content:t.type}),u(e)}),[l]),P=(0,a.I4)((e=>{i({date:e.getTime()/1e3})}),[i]);(0,T.ZP)(n,c,void 0,void 0,!0);const g=(0,a.sO)(null),v=(0,he.Z)(g,n,void 0,".ListItem-button",!0);return a.ZP.createElement("div",{className:"LeftSearch",ref:g,onKeyDown:v},a.ZP.createElement(Ve.Z,{activeTab:m,tabs:r?Lt:At,onSwitchTab:Z}),a.ZP.createElement(L.Z,{name:d.isRtl?"slide-reversed":"slide",renderCount:Rt,activeKey:s},(()=>{switch(s){case o.nJ.ChatList:return r?a.ZP.createElement(ht,{searchQuery:e,dateSearchQuery:h,onReset:c,onSearchDateSelect:P}):a.ZP.createElement(mt,{searchQuery:e,searchDate:t,dateSearchQuery:h,onReset:c,onSearchDateSelect:P});case o.nJ.Media:return a.ZP.createElement(Et,{searchQuery:e});case o.nJ.Links:return a.ZP.createElement(yt,{searchQuery:e});case o.nJ.Files:return a.ZP.createElement(Nt,{searchQuery:e});case o.nJ.Music:return a.ZP.createElement(Ft,{key:"audio",searchQuery:e});case o.nJ.Voice:return a.ZP.createElement(Ft,{key:"voice",isVoice:!0,searchQuery:e});default:return}})))})));var $t=n(1090);const Dt={currentPassword:"",password:"",hint:"",email:""},Ut=(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 Dt;default:return e}},Ot=(0,a.X$)((0,s.c$)(void 0,((e,t)=>(0,h.ei)(t,["signOut","deleteChatFolder"])))((({currentScreen:e,editedFolderId:t,onReset:n,onSaveFilter:s,signOut:r,deleteChatFolder:l,onScreenSelect:c})=>{const[d,m]=(0,a.eJ)(!1),[u,h]=(0,a.eJ)(!1),Z=(0,a.I4)((()=>{m(!0)}),[]),P=(0,a.I4)((()=>{m(!1)}),[]),g=(0,a.I4)((()=>{h(!0)}),[]),v=(0,a.I4)((()=>{h(!1)}),[]),p=(0,a.I4)((()=>{P(),r()}),[P,r]),E=(0,a.I4)((()=>{v(),l({id:t}),n()}),[t,v,l,n]),C=(0,a.Ye)((()=>({onTrigger:e,isOpen:t})=>a.ZP.createElement(R.Z,{round:!0,ripple:!i.wB,size:"smaller",color:"translucent",className:t?"active":"",onClick:e,ariaLabel:"More actions"},a.ZP.createElement("i",{className:"icon-more"}))),[]),f=(0,M.Z)();return a.ZP.createElement("div",{className:"left-header"},a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent",onClick:n,ariaLabel:f("AccDescrGoBack")},a.ZP.createElement("i",{className:"icon-arrow-left"})),function(){switch(e){case o.MT.EditProfile:return a.ZP.createElement("h3",null,f("lng_settings_information"));case o.MT.General:return a.ZP.createElement("h3",null,f("General"));case o.MT.Notifications:return a.ZP.createElement("h3",null,f("Notifications"));case o.MT.DataStorage:return a.ZP.createElement("h3",null,f("DataSettings"));case o.MT.Privacy:return a.ZP.createElement("h3",null,f("PrivacySettings"));case o.MT.Language:return a.ZP.createElement("h3",null,f("Language"));case o.MT.GeneralChatBackground:return a.ZP.createElement("h3",null,f("ChatBackground"));case o.MT.GeneralChatBackgroundColor:return a.ZP.createElement("h3",null,f("SetColor"));case o.MT.PrivacyPhoneNumber:return a.ZP.createElement("h3",null,f("PrivacyPhone"));case o.MT.PrivacyLastSeen:return a.ZP.createElement("h3",null,f("PrivacyLastSeen"));case o.MT.PrivacyProfilePhoto:return a.ZP.createElement("h3",null,f("Privacy.ProfilePhoto"));case o.MT.PrivacyForwarding:return a.ZP.createElement("h3",null,f("PrivacyForwards"));case o.MT.PrivacyGroupChats:return a.ZP.createElement("h3",null,f("AutodownloadGroupChats"));case o.MT.PrivacyPhoneNumberAllowedContacts:case o.MT.PrivacyLastSeenAllowedContacts:case o.MT.PrivacyProfilePhotoAllowedContacts:case o.MT.PrivacyForwardingAllowedContacts:case o.MT.PrivacyGroupChatsAllowedContacts:return a.ZP.createElement("h3",null,f("AlwaysShareWith"));case o.MT.PrivacyPhoneNumberDeniedContacts:case o.MT.PrivacyLastSeenDeniedContacts:case o.MT.PrivacyProfilePhotoDeniedContacts:case o.MT.PrivacyForwardingDeniedContacts:case o.MT.PrivacyGroupChatsDeniedContacts:return a.ZP.createElement("h3",null,f("NeverShareWith"));case o.MT.PrivacyActiveSessions:return a.ZP.createElement("h3",null,f("SessionsTitle"));case o.MT.PrivacyBlockedUsers:return a.ZP.createElement("h3",null,f("BlockedUsers"));case o.MT.TwoFaDisabled:case o.MT.TwoFaEnabled:return a.ZP.createElement("h3",null,f("TwoStepVerification"));case o.MT.TwoFaNewPassword:case o.MT.TwoFaChangePasswordNew:case o.MT.TwoFaChangePasswordConfirm:return a.ZP.createElement("h3",null,f("PleaseEnterCurrentPassword"));case o.MT.TwoFaNewPasswordConfirm:return a.ZP.createElement("h3",null,f("PleaseReEnterPassword"));case o.MT.TwoFaNewPasswordHint:case o.MT.TwoFaChangePasswordHint:return a.ZP.createElement("h3",null,f("PasswordHint"));case o.MT.TwoFaNewPasswordEmail:case o.MT.TwoFaRecoveryEmail:return a.ZP.createElement("h3",null,f("RecoveryEmailTitle"));case o.MT.TwoFaNewPasswordEmailCode:case o.MT.TwoFaRecoveryEmailCode:return a.ZP.createElement("h3",null,"Recovery Email Code");case o.MT.TwoFaCongratulations:return a.ZP.createElement("h3",null,f("TwoStepVerificationPasswordSet"));case o.MT.TwoFaChangePasswordCurrent:case o.MT.TwoFaTurnOff:case o.MT.TwoFaRecoveryEmailCurrentPassword:return a.ZP.createElement("h3",null,f("PleaseEnterCurrentPassword"));case o.MT.Folders:return a.ZP.createElement("h3",null,f("Filters"));case o.MT.FoldersCreateFolder:return a.ZP.createElement("h3",null,f("FilterNew"));case o.MT.FoldersEditFolder:case o.MT.FoldersEditFolderFromChatList:return a.ZP.createElement("div",{className:"settings-main-header"},a.ZP.createElement("h3",null,f("FilterEdit")),t&&a.ZP.createElement(O.Z,{className:"settings-more-menu",trigger:C,positionX:"right"},a.ZP.createElement(x.Z,{icon:"delete",destructive:!0,onClick:g},f("Delete"))));case o.MT.FoldersIncludedChats:case o.MT.FoldersIncludedChatsFromChatList:case o.MT.FoldersExcludedChats:case o.MT.FoldersExcludedChatsFromChatList:return a.ZP.createElement("div",{className:"settings-main-header"},e===o.MT.FoldersIncludedChats||e===o.MT.FoldersIncludedChatsFromChatList?a.ZP.createElement("h3",null,f("FilterInclude")):a.ZP.createElement("h3",null,f("FilterExclude")),a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent",className:"color-primary",onClick:s,ariaLabel:f("AutoDeleteConfirm")},a.ZP.createElement("i",{className:"icon-check"})));default:return a.ZP.createElement("div",{className:"settings-main-header"},a.ZP.createElement("h3",null,f("SETTINGS")),a.ZP.createElement(R.Z,{round:!0,ripple:!i.wB,size:"smaller",color:"translucent",onClick:()=>c(o.MT.EditProfile),ariaLabel:f("lng_settings_information")},a.ZP.createElement("i",{className:"icon-edit"})),a.ZP.createElement(O.Z,{className:"settings-more-menu",trigger:C,positionX:"right"},a.ZP.createElement(x.Z,{icon:"logout",onClick:Z},f("LogOutTitle"))))}}(),a.ZP.createElement(Fe.Z,{isOpen:d,onClose:P,text:f("lng_sure_logout"),confirmLabel:f("AccountSettings.Logout"),confirmHandler:p,confirmIsDestructive:!0}),a.ZP.createElement(Fe.Z,{isOpen:u,onClose:v,text:f("FilterDeleteAlert"),confirmLabel:f("Delete"),confirmHandler:E,confirmIsDestructive:!0}))})));var xt=n(787),Gt=n(180);const Jt=(0,a.X$)((0,s.c$)((e=>{const{currentUserId:t,lastSyncTime:n}=e;return{currentUser:t?(0,m.dy)(e,t):void 0,lastSyncTime:n}}),((e,t)=>(0,h.ei)(t,["loadProfilePhotos"])))((({isActive:e,onScreenSelect:t,onReset:n,loadProfilePhotos:s,currentUser:r,lastSyncTime:l})=>{const i=(0,M.Z)(),c=null==r?void 0:r.id;return(0,a.d4)((()=>{c&&l&&s({profileId:c})}),[l,c,s]),(0,T.ZP)(e,n,t,o.MT.Main),a.ZP.createElement("div",{className:"settings-content custom-scroll"},a.ZP.createElement("div",{className:"settings-main-menu"},r&&a.ZP.createElement(xt.Z,{userId:r.id,forceShowSelf:!0}),r&&a.ZP.createElement(Gt.Z,{chatOrUserId:r.id,forceShowSelf:!0}),a.ZP.createElement(Ee.Z,{icon:"settings",onClick:()=>t(o.MT.General)},i("Telegram.GeneralSettingsViewController")),a.ZP.createElement(Ee.Z,{icon:"unmute",onClick:()=>t(o.MT.Notifications)},i("Notifications")),a.ZP.createElement(Ee.Z,{icon:"lock",onClick:()=>t(o.MT.Privacy)},i("PrivacySettings")),a.ZP.createElement(Ee.Z,{icon:"data",onClick:()=>t(o.MT.DataStorage)},i("DataSettings")),a.ZP.createElement(Ee.Z,{icon:"folder",onClick:()=>t(o.MT.Folders)},i("Filters")),a.ZP.createElement(Ee.Z,{icon:"language",onClick:()=>t(o.MT.Language)},i("Language"))))})));var zt=n(710),Xt=n(1151);const _t="https://t.me/",Yt=/https:\/\/t\.me\/?/i,Ht=/^([a-zA-Z0-9_]+)$/,Vt=(0,z.Ds)((e=>e()),250,!1),jt=(0,a.X$)((({currentUsername:e,asLink:t,isLoading:n,isUsernameAvailable:s,checkUsername:r,onChange:o})=>{const[l,i]=(0,a.eJ)(e||""),c=(0,M.Z)(),d=t?"SetUrl":"Username",m=c(t?"SetUrlPlaceholder":"Username"),[u,h]=(0,a.Ye)((()=>l.length?l.length<5?[void 0,`${m} is too short`]:l.length>32?[void 0,`${m} is too long`]:Ht.test(l)?void 0===s?[]:[s?c(`${d}Available`,"Username"):void 0,!1===s?c(`${d}InUse`):void 0]:[void 0,`${m} contains invalid characters`]:[]),[l,s,c,d,m]);(0,a.d4)((()=>{i(e||"")}),[t,e]);const Z=(0,a.I4)((e=>{const n=e.target.value.trim().replace(Yt,"");i(n),e.target.value=`${t?_t:""}${n}`;const a=function(e){return e.length>=5&&e.length<=32&&Ht.test(e)}(n);a&&Vt((()=>{r({username:n})})),o&&o(!!a&&n)}),[t,r,o]);return a.ZP.createElement(ve.Z,{value:`${t?_t:""}${l}`,onChange:Z,label:m,error:h,success:u,readOnly:n})})),Kt=(0,z.P2)((e=>e()),6e4,!0),qt="Please provide your first name",Wt="Bio can' be longer than 70 characters",Qt=(0,a.X$)((0,s.c$)((e=>{const{currentUserId:t}=e,{progress:n,isUsernameAvailable:a}=e.profileEdit||{},s=t?(0,m.dy)(e,t):void 0;if(!s)return{progress:n,isUsernameAvailable:a};const{firstName:r,lastName:o,username:l,fullInfo:i}=s,{bio:c}=i||{};return{currentAvatarHash:(0,u.RT)(s),currentFirstName:r,currentLastName:o,currentBio:c,currentUsername:l,progress:n,isUsernameAvailable:a}}),((e,t)=>(0,h.ei)(t,["loadCurrentUser","updateProfile","checkUsername"])))((({isActive:e,onScreenSelect:t,onReset:n,currentAvatarHash:s,currentFirstName:l,currentLastName:i,currentBio:c,currentUsername:d,progress:m,isUsernameAvailable:u,loadCurrentUser:h,updateProfile:Z,checkUsername:P})=>{const g=(0,M.Z)(),[v,E]=(0,a.eJ)(!1),[C,f]=(0,a.eJ)(!1),[b,I]=(0,a.eJ)(),[y,S]=(0,a.eJ)(),[k,w]=(0,a.eJ)(l||""),[N,A]=(0,a.eJ)(i||""),[L,R]=(0,a.eJ)(c||""),[B,D]=(0,a.eJ)(d||""),U=(0,p.Z)(s,!1,r.IU.BlobUrl),O=m===o.rN.InProgress,x=!1===B,G=(0,a.Ye)((()=>!x&&(Boolean(y)||C||!0===u)),[y,C,x,u]);(0,T.ZP)(e,n,t,o.MT.EditProfile),(0,a.d4)((()=>{Kt((()=>{h()}))}),[h]),(0,a.d4)((()=>{S(void 0)}),[U]),(0,a.d4)((()=>{w(l||""),A(i||""),R(c||"")}),[l,i,c]),(0,a.d4)((()=>{D(d||"")}),[d]),(0,a.d4)((()=>{m===o.rN.Complete&&(f(!1),E(!1),I(void 0))}),[m]);const J=(0,a.I4)((e=>{S(e)}),[]),z=(0,a.I4)((e=>{w(e.target.value),f(!0)}),[]),X=(0,a.I4)((e=>{A(e.target.value),f(!0)}),[]),_=(0,a.I4)((e=>{R(e.target.value),f(!0)}),[]),Y=(0,a.I4)((e=>{D(e),E(!0)}),[]),H=(0,a.I4)((()=>{const e=k.trim(),t=N.trim(),n=L.trim();e.length?n.length>70?I(Wt):Z({photo:y,...C&&{firstName:e,lastName:t,bio:n},...v&&{username:B}}):I(qt)}),[y,k,N,L,C,B,v,Z]);return a.ZP.createElement("div",{className:"settings-fab-wrapper"},a.ZP.createElement("div",{className:"settings-content custom-scroll"},a.ZP.createElement("div",{className:"settings-edit-profile"},a.ZP.createElement(zt.Z,{currentAvatarBlobUrl:U,onChange:J,title:"Edit your profile photo",disabled:O}),a.ZP.createElement(ve.Z,{value:k,onChange:z,label:g("FirstName"),disabled:O,error:b===qt?b:void 0}),a.ZP.createElement(ve.Z,{value:N,onChange:X,label:g("LastName"),disabled:O}),a.ZP.createElement(ve.Z,{value:L,onChange:_,label:g("UserBio"),disabled:O,error:b===Wt?b:void 0}),a.ZP.createElement("p",{className:"settings-item-description",dir:g.isRtl?"rtl":void 0},(0,$.Z)(g("lng_settings_about_bio"),["br","simple_markdown"]))),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:g.isRtl?"rtl":void 0},g("Username")),a.ZP.createElement(jt,{currentUsername:B||"",isLoading:O,isUsernameAvailable:u,checkUsername:P,onChange:Y}),a.ZP.createElement("p",{className:"settings-item-description",dir:g.isRtl?"rtl":void 0},(0,$.Z)(g("UsernameHelp"),["br","simple_markdown"])),B&&a.ZP.createElement("p",{className:"settings-item-description",dir:g.isRtl?"rtl":void 0},g("lng_username_link"),a.ZP.createElement("br",null),a.ZP.createElement("span",{className:"username-link"},"https://t.me/",B)))),a.ZP.createElement(Xt.Z,{isShown:G,onClick:H,disabled:O,ariaLabel:"Save changes"},O?a.ZP.createElement(F.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})))})));var en=n(4605),tn=n(8051);const nn=(0,a.X$)((0,s.c$)((e=>(0,h.ei)(e.settings.byKey,["canAutoLoadPhotoFromContacts","canAutoLoadPhotoInPrivateChats","canAutoLoadPhotoInGroups","canAutoLoadPhotoInChannels","canAutoLoadVideoFromContacts","canAutoLoadVideoInPrivateChats","canAutoLoadVideoInGroups","canAutoLoadVideoInChannels","canAutoLoadFileFromContacts","canAutoLoadFileInPrivateChats","canAutoLoadFileInGroups","canAutoLoadFileInChannels","canAutoPlayGifs","canAutoPlayVideos","autoLoadFileMaxSizeMb"])),((e,t)=>(0,h.ei)(t,["setSettingOption"])))((({isActive:e,onScreenSelect:t,onReset:n,canAutoLoadPhotoFromContacts:s,canAutoLoadPhotoInPrivateChats:r,canAutoLoadPhotoInGroups:i,canAutoLoadPhotoInChannels:c,canAutoLoadVideoFromContacts:d,canAutoLoadVideoInPrivateChats:m,canAutoLoadVideoInGroups:u,canAutoLoadVideoInChannels:h,canAutoLoadFileFromContacts:Z,canAutoLoadFileInPrivateChats:P,canAutoLoadFileInGroups:g,canAutoLoadFileInChannels:v,canAutoPlayGifs:p,canAutoPlayVideos:E,autoLoadFileMaxSizeMb:C,setSettingOption:f})=>{const b=(0,M.Z)();(0,T.ZP)(e,n,t,o.MT.General);const I=(0,a.I4)((e=>b("AutodownloadSizeLimitUpTo",b("FileSize.MB",String(l.by[e]),"i"))),[b]),y=(0,a.I4)((e=>{f({autoLoadFileMaxSizeMb:l.by[e]})}),[f]);function S(e,t,n,s,r,o){return a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:b.isRtl?"rtl":void 0},e),a.ZP.createElement(en.Z,{label:b("AutoDownloadSettings.Contacts"),checked:n,onCheck:e=>f({[`canAutoLoad${t}FromContacts`]:e})}),a.ZP.createElement(en.Z,{label:b("AutoDownloadSettings.PrivateChats"),checked:s,onCheck:e=>f({[`canAutoLoad${t}InPrivateChats`]:e})}),a.ZP.createElement(en.Z,{label:b("AutoDownloadSettings.GroupChats"),checked:r,onCheck:e=>f({[`canAutoLoad${t}InGroups`]:e})}),a.ZP.createElement(en.Z,{label:b("AutoDownloadSettings.Channels"),checked:o,onCheck:e=>f({[`canAutoLoad${t}InChannels`]:e})}),"File"===t&&function(){const e=l.by.indexOf(C);return a.ZP.createElement("div",{className:"pt-5"},a.ZP.createElement(tn.Z,{label:b("AutoDownloadMaxFileSize"),min:0,max:5,value:-1!==e?e:2,renderValue:I,onChange:y}))}())}return a.ZP.createElement("div",{className:"settings-content custom-scroll"},S(b("AutoDownloadPhotosTitle"),"Photo",s,r,i,c),S(b("AutoDownloadVideosTitle"),"Video",d,m,u,h),S("Auto-download files","File",Z,P,g,v),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:b.isRtl?"rtl":void 0},b("AutoplayMedia")),a.ZP.createElement(en.Z,{label:b("GifsTab2"),checked:p,onCheck:e=>f({canAutoPlayGifs:e})}),a.ZP.createElement(en.Z,{label:b("DataAndStorage.Autoplay.Videos"),checked:E,onCheck:e=>f({canAutoPlayVideos:e})})))})));var an=n(7324),sn=n(7799);const rn=(0,z.P2)((e=>e()),6e4,!0),on=(0,a.X$)((0,s.c$)((e=>{const{chats:{byId:t},users:{byId:n}}=e,{orderedIds:a,byId:s,recommended:r}=e.chatFolders;return{chatsById:t,usersById:n,orderedFolderIds:a,foldersById:s,recommendedChatFolders:r,notifySettings:(0,m.dZ)(e),notifyExceptions:(0,m.NJ)(e)}}),((e,t)=>(0,h.ei)(t,["loadRecommendedChatFolders","addChatFolder","showDialog"])))((({onCreateFolder:e,onEditFolder:t,isActive:n,onScreenSelect:s,onReset:r,chatsById:i,usersById:c,orderedFolderIds:d,foldersById:m,recommendedChatFolders:h,notifySettings:Z,notifyExceptions:P,loadRecommendedChatFolders:g,addChatFolder:v,showDialog:p})=>{const[E,C]=(0,a.eJ)(),[f,b]=(0,a.eJ)(!1),I=(0,a.I4)((()=>b(!0)),[]);(0,a.d4)((()=>{E||(0,an.Z)("FoldersAll").then(C)}),[E]),(0,a.d4)((()=>{rn((()=>{g()}))}),[g]);const y=(0,a.I4)((()=>{Object.keys(m).length>=10?p({data:{message:"DIALOG_FILTERS_TOO_MUCH",hasErrorKey:!0}}):e()}),[m,p,e]),S=(0,M.Z)();(0,T.ZP)(n,r,s,o.MT.Folders);const k=(0,a.Ye)((()=>{if(!d)return;const e=Object.keys(i);return d.map((t=>{const n=m[t];return{id:n.id,title:n.title,subtitle:(0,u.SB)(S,i,c,n,e,Z,P)}}))}),[d,i,m,c,Z,P,S]),w=(0,a.I4)((e=>{Object.keys(m).length>=10?p({data:{message:"DIALOG_FILTERS_TOO_MUCH",hasErrorKey:!0}}):v({folder:e})}),[m,v,p]);return a.ZP.createElement("div",{className:"settings-content custom-scroll"},a.ZP.createElement("div",{className:"settings-content-header"},a.ZP.createElement("div",{className:"settings-content-icon"},E&&a.ZP.createElement(sn.Z,{id:"settingsFoldersMain",size:l.ku,animationData:E,play:f,noLoop:!0,onLoad:I})),a.ZP.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},S("CreateNewFilterInfo")),a.ZP.createElement(R.Z,{className:"with-icon mb-2",color:"primary",size:"smaller",pill:!0,fluid:!0,onClick:y,isRtl:S.isRtl},a.ZP.createElement("i",{className:"icon-add"}),S("CreateNewFilter"))),a.ZP.createElement("div",{className:"settings-item pt-3"},a.ZP.createElement("h4",{className:"settings-item-header mb-3",dir:S.isRtl?"rtl":void 0},S("Filters")),null!=k&&k.length?k.map((e=>a.ZP.createElement(Ee.Z,{className:"mb-2 no-icon",narrow:!0,multiline:!0,onClick:()=>t(m[e.id])},a.ZP.createElement("span",{className:"title"},e.title),a.ZP.createElement("span",{className:"subtitle"},e.subtitle)))):k&&!k.length?a.ZP.createElement("p",{className:"settings-item-description my-4",dir:"auto"},"You have no folders yet."):a.ZP.createElement(Pe.Z,null)),h&&!!h.length&&a.ZP.createElement("div",{className:"settings-item pt-3"},a.ZP.createElement("h4",{className:"settings-item-header mb-3",dir:S.isRtl?"rtl":void 0},S("FilterRecommended")),h.map((e=>a.ZP.createElement(Ee.Z,{className:"mb-2",narrow:!0,onClick:()=>w(e)},a.ZP.createElement("div",{className:"settings-folders-recommended-item"},a.ZP.createElement("div",{className:"multiline-item"},a.ZP.createElement("span",{className:"title"},e.title),a.ZP.createElement("span",{className:"subtitle"},e.description)),a.ZP.createElement(R.Z,{className:"px-3",color:"primary",size:"tiny",pill:!0,fluid:!0,isRtl:S.isRtl},S("Add"))))))))})));var ln=n(3455);const cn=({count:e,itemName:t,itemPluralName:n,isLoading:s,onClick:r})=>{const o=(0,M.Z)();return a.ZP.createElement(R.Z,{className:"ShowMoreButton",color:"translucent",size:"smaller",isText:!0,isLoading:s,isRtl:o.isRtl,onClick:r},a.ZP.createElement("i",{className:"icon-down"}),"Show ",e," more ",e>1?n||`${t}s`:t)},dn="Please provide a title for this folder.",mn="ChatList.Filter.Error.Empty",un=(0,a.X$)((0,s.c$)((e=>{const{listIds:t}=e.chats;return{loadedActiveChatIds:t.active,loadedArchivedChatIds:t.archived}}),((e,t)=>(0,h.ei)(t,["editChatFolder","addChatFolder","loadMoreChats"])))((({state:e,dispatch:t,onAddIncludedChats:n,onAddExcludedChats:s,isActive:r,onScreenSelect:i,onReset:c,onBack:d,loadedActiveChatIds:m,loadedArchivedChatIds:Z,editChatFolder:P,addChatFolder:g,loadMoreChats:v})=>{const[p,E]=(0,a.eJ)(),[C,f]=(0,a.eJ)(!1),b=(0,a.I4)((()=>f(!0)),[]),[I,y]=(0,a.eJ)(!1),[S,k]=(0,a.eJ)(!1),{selectedChatIds:w,selectedChatTypes:N}=(0,ln.vb)(e,"included"),{selectedChatIds:A,selectedChatTypes:L}=(0,ln.vb)(e,"excluded");(0,a.d4)((()=>{p||(0,an.Z)("FoldersNew").then(E)}),[p]),(0,a.d4)((()=>{y(!1),k(!1)}),[e.folderId]);const[R,B]=(0,a.Ye)((()=>{const e=new Set([...m||[],...Z||[]]),t=(0,h.eL)(w,e),n=(0,h.eL)(A,e);return[I?t:t.slice(0,5-N.length),S?n:n.slice(0,5-L.length)]}),[A,w,N,L,S,I,m,Z]);(0,a.d4)((()=>{(R.lengthy(!0):()=>k(!0);return a.ZP.createElement(a.ZP.Fragment,null,t.map((t=>function(e,t){const n="included"===t?ln.fi.find((({key:t})=>t===e)):ln.Yy.find((({key:t})=>t===e));if(n)return a.ZP.createElement(Ee.Z,{key:n.key,className:"settings-folders-list-item mb-1",icon:n.icon,narrow:!0,inactive:!0},$(n.title))}(t,e))),n.map((e=>a.ZP.createElement(Ee.Z,{className:"settings-folders-list-item mb-1",narrow:!0,inactive:!0},(0,u.YC)(e)?a.ZP.createElement(fe.Z,{avatarSize:"small",userId:e}):a.ZP.createElement(Ce.Z,{avatarSize:"small",chatId:e})))),!s&&r>0&&a.ZP.createElement(cn,{count:r,itemName:"chat",onClick:o}))}return(0,T.ZP)(r,d,i,"edit"===e.mode?o.MT.FoldersEditFolder:o.MT.FoldersCreateFolder),a.ZP.createElement("div",{className:"settings-fab-wrapper"},a.ZP.createElement("div",{className:"settings-content custom-scroll"},a.ZP.createElement("div",{className:"settings-content-header"},a.ZP.createElement("div",{className:"settings-content-icon"},p&&a.ZP.createElement(sn.Z,{id:"settingsFoldersEdit",size:l.ku,animationData:p,play:C&&String(e.folderId),noLoop:!0,onLoad:b})),"create"===e.mode&&a.ZP.createElement("p",{className:"settings-item-description mb-3",dir:$.isRtl?"rtl":void 0},$("FilterIncludeInfo")),a.ZP.createElement(ve.Z,{className:"mb-0",label:$("FilterNameHint"),value:e.folder.title,onChange:function(e){const{currentTarget:n}=e;t({type:"setTitle",payload:n.value.trim()})},error:e.error&&e.error===dn?dn:void 0})),a.ZP.createElement("div",{className:"settings-item no-border pt-3"},e.error&&e.error===mn&&a.ZP.createElement("p",{className:"settings-item-description color-danger mb-2",dir:$.isRtl?"rtl":void 0},$(e.error)),a.ZP.createElement("h4",{className:"settings-item-header mb-3",dir:$.isRtl?"rtl":void 0},$("FilterInclude")),a.ZP.createElement(Ee.Z,{className:"settings-folders-list-item color-primary mb-0",icon:"add",onClick:n},$("FilterAddChats")),D("included")),a.ZP.createElement("div",{className:"settings-item no-border pt-3"},a.ZP.createElement("h4",{className:"settings-item-header mb-3",dir:$.isRtl?"rtl":void 0},$("FilterExclude")),a.ZP.createElement(Ee.Z,{className:"settings-folders-list-item color-primary mb-0",icon:"add",onClick:s},$("FilterAddChats")),D("excluded"))),a.ZP.createElement(Xt.Z,{isShown:!!e.isTouched,disabled:e.isLoading,onClick:function(){const{title:n}=e.folder;n?w.length||Object.keys(N).length?(t({type:"setIsLoading",payload:!0}),"edit"===e.mode?P({id:e.folderId,folderUpdate:e.folder}):g({folder:e.folder}),setTimeout((()=>{c()}),500)):t({type:"setError",payload:mn}):t({type:"setError",payload:dn})},ariaLabel:"edit"===e.mode?"Save changes":"Create folder"},e.isLoading?a.ZP.createElement(F.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})))}))),hn=(0,a.X$)((({mode:e,chatIds:t,selectedIds:n,selectedChatTypes:s,filterValue:r,onSelectedIdsChange:o,onSelectedChatTypesChange:l,onFilterChange:i,onLoadMore:c})=>{const d=(0,a.sO)(null),m="included"===e?ln.fi:ln.Yy,h=n.length+s.length>10,Z=n.length>=100;(0,a.d4)((()=>{setTimeout((()=>{requestAnimationFrame((()=>{d.current.focus()}))}),500)}),[]);const P=(0,a.I4)((e=>{const t=[...n];t.includes(e)?t.splice(t.indexOf(e),1):t.push(e),o(t)}),[n,o]),g=(0,a.I4)((e=>{const t=[...s];t.includes(e)?t.splice(t.indexOf(e),1):t.push(e),l(t)}),[s,l]),v=(0,a.I4)((e=>{const{value:t}=e.currentTarget;i(t)}),[i]),p=(0,M.Z)(),[E,C]=(0,ue.Z)(c,t,Boolean(r));return a.ZP.createElement("div",{className:"Picker SettingsFoldersChatsPicker"},a.ZP.createElement("div",{className:"picker-header custom-scroll"},s.map((function(e){const t=m.find((({key:t})=>e===t));if(t)return a.ZP.createElement(ct.Z,{icon:t.icon,title:p(t.title),isMinimized:h,canClose:!0,onClick:g,clickArg:t.key})})),n.map(((e,t)=>a.ZP.createElement(ct.Z,{chatOrUserId:e,isMinimized:h&&tg(e.key),ripple:!0},a.ZP.createElement("i",{className:`icon-${e.icon}`}),a.ZP.createElement("h3",{className:"chat-type",dir:"auto"},p(e.title)),a.ZP.createElement(en.Z,{label:"",checked:s.includes(e.key),round:!0}))})),a.ZP.createElement("div",{key:"divider",className:"picker-list-divider"}),a.ZP.createElement("h4",{key:"header2",className:"settings-item-header",dir:p.isRtl?"rtl":void 0},p("FilterChats"))),null!=E&&E.length?E.map((function(e){const t=n.includes(e);return a.ZP.createElement(Ee.Z,{key:e,className:"chat-item-clickable picker-list-item chat-item",onClick:()=>P(e),ripple:!0,disabled:!t&&Z},(0,u.YC)(e)?a.ZP.createElement(fe.Z,{userId:e}):a.ZP.createElement(Ce.Z,{chatId:e,withChatType:!0}),a.ZP.createElement(en.Z,{label:"",checked:t,round:!0}))})):E&&!E.length?a.ZP.createElement("p",{className:"no-results",key:"no-results"},"Sorry, nothing found."):a.ZP.createElement(Pe.Z,{key:"loading"})))})),Zn=(0,a.X$)((0,s.c$)((e=>{const{chats:{byId:t,listIds:n,orderedPinnedIds:a}}=e;return{chatsById:t,listIds:n.active,orderedPinnedIds:a.active,archivedPinnedIds:a.archived,archivedListIds:n.archived}}),((e,t)=>(0,h.ei)(t,["loadMoreChats"])))((({isActive:e,onScreenSelect:t,onReset:n,mode:s,state:r,dispatch:l,chatsById:i,listIds:c,orderedPinnedIds:d,archivedListIds:m,archivedPinnedIds:h,loadMoreChats:Z})=>{const{chatFilter:P}=r,{selectedChatIds:g,selectedChatTypes:v}=(0,ln.vb)(r,s,!0),p=(0,M.Z)(),E=(0,a.Ye)((()=>{const e=c?(0,u.O)(i,c,d,"all"):void 0,t=m?(0,u.O)(i,m,h,"archived"):void 0;if(e||t)return[...e?[...e.pinnedChats,...e.otherChats]:[],...t?t.otherChats:[]]}),[i,c,d,m,h]),C=(0,a.Ye)((()=>{if(E)return E.filter((e=>!P||(0,me.Z)((0,u.U)(p,e),P)||g.includes(e.id))).map((({id:e})=>e))}),[E,P,p,g]),f=(0,a.I4)((e=>{l({type:"setChatFilter",payload:e})}),[l]),b=(0,a.I4)((e=>{l("included"===s?{type:"setIncludeFilters",payload:{...r.includeFilters,includedChatIds:e}}:{type:"setExcludeFilters",payload:{...r.excludeFilters,excludedChatIds:e}})}),[s,r,l]),I=(0,a.I4)((e=>{const t={};e.forEach((e=>{t[e]=!0})),l("included"===s?{type:"setIncludeFilters",payload:{includedChatIds:g,...t}}:{type:"setExcludeFilters",payload:{excludedChatIds:g,...t}})}),[s,g,l]);return(0,T.ZP)(e,n,t,"included"===s?o.MT.FoldersIncludedChats:o.MT.FoldersExcludedChats),C?a.ZP.createElement(hn,{mode:s,chatIds:C,selectedIds:g,selectedChatTypes:v,filterValue:P,onSelectedIdsChange:b,onSelectedChatTypesChange:I,onFilterChange:f,onLoadMore:Z}):a.ZP.createElement(Pe.Z,null)}))),Pn=(0,a.X$)((({currentScreen:e,shownScreen:t,state:n,dispatch:s,isActive:r,onScreenSelect:l,onReset:i})=>{const c=(0,a.I4)((()=>{e!==o.MT.FoldersCreateFolder&&e!==o.MT.FoldersEditFolder&&e!==o.MT.FoldersEditFolderFromChatList||setTimeout((()=>{s({type:"reset"})}),200),e!==o.MT.FoldersIncludedChats&&e!==o.MT.FoldersExcludedChats?i():"create"===n.mode?l(o.MT.FoldersCreateFolder):l(o.MT.FoldersEditFolder)}),[n.mode,s,e,i,l]),d=(0,a.I4)((()=>{s({type:"reset"}),l(o.MT.FoldersCreateFolder)}),[l,s]),m=(0,a.I4)((e=>{s({type:"editFolder",payload:e}),l(o.MT.FoldersEditFolder)}),[s,l]),u=(0,a.I4)((()=>{s({type:"editIncludeFilters"}),l(e===o.MT.FoldersEditFolderFromChatList?o.MT.FoldersIncludedChatsFromChatList:o.MT.FoldersIncludedChats)}),[e,s,l]),h=(0,a.I4)((()=>{s({type:"editExcludeFilters"}),l(e===o.MT.FoldersEditFolderFromChatList?o.MT.FoldersExcludedChatsFromChatList:o.MT.FoldersExcludedChats)}),[e,s,l]);switch(e){case o.MT.Folders:return a.ZP.createElement(on,{onCreateFolder:d,onEditFolder:m,onScreenSelect:l,isActive:r||[o.MT.FoldersCreateFolder,o.MT.FoldersEditFolder,o.MT.FoldersIncludedChats,o.MT.FoldersExcludedChats].includes(t),onReset:i});case o.MT.FoldersCreateFolder:case o.MT.FoldersEditFolder:case o.MT.FoldersEditFolderFromChatList:return a.ZP.createElement(un,{state:n,dispatch:s,onAddIncludedChats:u,onAddExcludedChats:h,onReset:c,onScreenSelect:l,isActive:r||[o.MT.FoldersIncludedChats,o.MT.FoldersExcludedChats].includes(t),onBack:i});case o.MT.FoldersIncludedChats:case o.MT.FoldersIncludedChatsFromChatList:return a.ZP.createElement(Zn,{mode:"included",state:n,dispatch:s,onReset:c,onScreenSelect:l,isActive:r});case o.MT.FoldersExcludedChats:case o.MT.FoldersExcludedChatsFromChatList:return a.ZP.createElement(Zn,{mode:"excluded",state:n,dispatch:s,onReset:c,onScreenSelect:l,isActive:r});default:return}}));var gn=n(663),vn=n(3657),pn=n(692),En=n(2155);const Cn=(0,a.X$)((({size:e=l.DC,stickerSet:t,observeIntersection:n})=>{const s=(0,a.sO)(null),o=(0,vn.Op)(s,n),i=`stickerSet${t.id}`,c=(0,p.Z)(i,!o,r.IU.Lottie),d=(0,pn.Z)(c),m=(0,a.Ye)((()=>{if(!c)return(0,En.Xv)(t.title,2)}),[c,t.title]);return a.ZP.createElement("div",{ref:s,className:"sticker-set-cover"},m,c&&a.ZP.createElement(sn.Z,{id:i,size:e,animationData:c,className:d}))})),fn=(0,a.X$)((({stickerSet:e,observeIntersection:t})=>{const n=(0,a.sO)(null),s=(0,vn.Op)(n,t),r=(0,p.Z)(e.hasThumbnail&&`stickerSet${e.id}`,!s),o=(0,pn.Z)(r),l=(0,a.Ye)((()=>{if(!r)return(0,En.Xv)(e.title,2)}),[r,e.title]);return a.ZP.createElement("div",{ref:n,className:"sticker-set-cover"},l,a.ZP.createElement("img",{src:r,className:o,alt:""}))}));var bn=n(3547);const In=(0,a.X$)((({stickerSet:e,observeIntersection:t,onClick:n})=>{var s;const r=(0,M.Z)();if(!e||!e.stickers)return;const o=null===(s=e.stickers)||void 0===s?void 0:s[0];return e.hasThumbnail||!o?a.ZP.createElement(Ee.Z,{narrow:!0,className:"SettingsStickerSet",inactive:!o,onClick:()=>o&&n(o)},a.ZP.createElement(R.Z,{ariaLabel:e.title,color:"translucent",isRtl:r.isRtl},e.isAnimated?a.ZP.createElement(Cn,{size:l.Mw,stickerSet:e,observeIntersection:t}):a.ZP.createElement(fn,{stickerSet:e,observeIntersection:t})),a.ZP.createElement("div",{className:"multiline-menu-item"},a.ZP.createElement("div",{className:"title"},e.title),a.ZP.createElement("div",{className:"subtitle"},r("StickerPack.StickerCount",e.count,"i")))):a.ZP.createElement(Ee.Z,{narrow:!0,className:"SettingsStickerSet",onClick:()=>n(o)},a.ZP.createElement(bn.Z,{sticker:o,size:l.Mw,title:e.title,observeIntersection:t}),a.ZP.createElement("div",{className:"multiline-menu-item"},a.ZP.createElement("div",{className:"title"},e.title),a.ZP.createElement("div",{className:"subtitle"},r("StickerPack.StickerCount",e.count,"i"))))}));var yn=n(4851);const Sn=["Solid and Steady","Nice and Fast","Lots of Stuff"],kn=[{label:"12-hour",value:"12h"},{label:"24-hour",value:"24h"}],wn=(0,a.X$)((0,s.c$)((e=>({...(0,h.ei)(e.settings.byKey,["messageTextSize","animationLevel","messageSendKeyCombo","shouldSuggestStickers","shouldLoopStickers","isSensitiveEnabled","canChangeSensitive","timeFormat"]),stickerSetIds:e.stickers.added.setIds,stickerSetsById:e.stickers.setsById})),((e,t)=>(0,h.ei)(t,["setSettingOption","loadStickerSets","loadAddedStickers"])))((({isActive:e,onScreenSelect:t,onReset:n,stickerSetIds:s,stickerSetsById:r,messageTextSize:l,animationLevel:c,messageSendKeyCombo:d,shouldSuggestStickers:m,shouldLoopStickers:u,timeFormat:h,setSettingOption:Z,loadStickerSets:P,loadAddedStickers:g})=>{const v=(0,a.sO)(null),{observe:p}=(0,vn.S1)({rootRef:v}),[E,C,f]=(0,Le.Z)(),[b,I]=(0,a.eJ)(),y=(0,M.Z)(),S=i.$b?void 0:[{value:"enter",label:y("lng_settings_send_enter"),subLabel:"New line by Shift + Enter"},{value:"ctrl-enter",label:y(i.jm?"lng_settings_send_cmdenter":"lng_settings_send_ctrlenter"),subLabel:"New line by Enter"}];(0,a.d4)((()=>{P()}),[P]),(0,a.d4)((()=>{null!=s&&s.length&&g()}),[s,g]);const k=(0,a.I4)((e=>{Sn.forEach(((t,n)=>{document.body.classList.toggle(`animation-level-${n}`,e===n)})),Z({animationLevel:e})}),[Z]),w=(0,a.I4)((e=>{document.documentElement.style.setProperty("--composer-text-size",`${Math.max(e,i.cj?16:15)}px`),document.documentElement.style.setProperty("--message-meta-height",`${Math.floor(1.3125*e)}px`),document.documentElement.style.setProperty("--message-text-size",`${e}px`),document.documentElement.setAttribute("data-message-text-size",e.toString()),Z({messageTextSize:e})}),[Z]),N=(0,a.I4)((e=>{Z({timeFormat:e}),Z({wasTimeFormatSetManually:!0}),(0,gn.qf)(e)}),[Z]),F=(0,a.I4)((e=>{I(e),C()}),[C]),A=s&&s.map((e=>{var t;return!(null==r||null===(t=r[e])||void 0===t||!t.installedDate)&&r[e]})).filter(Boolean);return(0,T.ZP)(e,n,t,o.MT.General),a.ZP.createElement("div",{className:"settings-content custom-scroll"},a.ZP.createElement("div",{className:"settings-item pt-3"},a.ZP.createElement("h4",{className:"settings-item-header",dir:y.isRtl?"rtl":void 0},y("SETTINGS")),a.ZP.createElement(tn.Z,{label:y("TextSize"),min:12,max:20,value:l,onChange:w}),a.ZP.createElement(Ee.Z,{icon:"photo",onClick:()=>t(o.MT.GeneralChatBackground)},y("ChatBackground"))),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:y.isRtl?"rtl":void 0},"Time Format"),a.ZP.createElement(_e.Z,{name:"timeformat",options:kn,selected:h,onChange:N})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:y.isRtl?"rtl":void 0},"Animation Level"),a.ZP.createElement("p",{className:"settings-item-description",dir:y.isRtl?"rtl":void 0},"Choose the desired animations amount."),a.ZP.createElement(tn.Z,{options:Sn,value:c,onChange:k})),S&&a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:y.isRtl?"rtl":void 0},y("VoiceOver.Keyboard")),a.ZP.createElement(_e.Z,{name:"keyboard-send-settings",options:S,onChange:e=>Z({messageSendKeyCombo:e}),selected:d})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:y.isRtl?"rtl":void 0},y("AccDescrStickers")),a.ZP.createElement(en.Z,{label:y("SuggestStickers"),checked:m,onCheck:e=>Z({shouldSuggestStickers:e})}),a.ZP.createElement(en.Z,{label:y("LoopAnimatedStickers"),checked:u,onCheck:e=>Z({shouldLoopStickers:e})}),a.ZP.createElement("div",{className:"mt-4",ref:v},A&&A.map((e=>a.ZP.createElement(In,{key:e.id,stickerSet:e,observeIntersection:p,onClick:F})))),b&&a.ZP.createElement(yn.Z,{isOpen:E,fromSticker:b,onClose:f})))})));let Nn;function Mn(e="*",t,n=!1){Nn||(Nn=document.createElement("input"),Nn.setAttribute("type","file")),Nn.setAttribute("accept",e),n?Nn.removeAttribute("multiple"):Nn.setAttribute("multiple","multiple"),Nn.onchange=null,Nn.value="",Nn.onchange=t,Nn.click()}var Tn=n(1394);function Fn(e){return[parseInt(e.substring(0,2),16),parseInt(e.substring(2,4),16),parseInt(e.substring(4,6),16)]}function An(e){const t=e[0].toString(16),n=e[1].toString(16),a=e[2].toString(16);return(1==t.length?"0"+t:t)+(1==n.length?"0"+n:n)+(1==a.length?"0"+a:a)}function Ln([e,t,n]){e/=255,t/=255,n/=255;let a,s,r=Math.max(e,t,n),o=Math.min(e,t,n),l=r,i=r-o;if(s=0==r?0:i/r,r==o)a=0;else{switch(r){case e:a=(t-n)/i+(t.5?Math.max(0,.65*a):Math.max(0,Math.min(1,1-.65*a)),`hsla(${360*t}, ${100*n}%, ${100*a}%, .4)`}var $n=n(9524),Dn=n(5866);const Un=(0,a.X$)((({wallpaper:e,theme:t,isSelected:n,onClick:s})=>{var r;const{slug:i,document:c}=e,d=`wallpaper${c.id}`,m=c.previewBlobUrl,u=(0,p.Z)(`${d}?size=m`),h=(0,Dn.Z)(null===(r=c.thumbnail)||void 0===r?void 0:r.dataUri,Boolean(u),!0),{transitionClassNames:Z}=(0,Y.Z)(Boolean(u||m),void 0,void 0,"slow"),[P,g]=(0,a.eJ)(!1),{mediaData:v,loadProgress:C}=(0,E.Z)(d,!P),b=!1===(0,f.Z)(P),{shouldRender:I,transitionClassNames:y}=(0,Y.Z)(P&&!v||i===o.mp,void 0,b,"slow"),S=(0,a.sO)();S.current=t;const k=(0,a.I4)((()=>{(async()=>{const e=await(0,Tn.gm)(v);await $n.save(l.fo,S.current,e),s(i)})()}),[v,s,i]);(0,a.d4)((()=>{v&&k()}),[v,k]);const w=(0,a.I4)((()=>{v?k():g((e=>!e))}),[v,k]),N=(0,X.Z)("WallpaperTile",n&&"selected");return a.ZP.createElement("div",{className:N,onClick:w},a.ZP.createElement("div",{className:"media-inner"},a.ZP.createElement("canvas",{ref:h,className:"thumbnail"}),a.ZP.createElement("img",{src:u||m,className:(0,X.Z)("full-media",Z),alt:""}),I&&a.ZP.createElement("div",{className:(0,X.Z)("spinner-container",y)},a.ZP.createElement(G.Z,{progress:C,onClick:w}))))})),On=(0,z.P2)((e=>e()),6e4,!0),xn=(0,a.X$)((0,s.c$)((e=>{const t=(0,m.Pu)(e),{background:n,isBlurred:a}=e.settings.themes[t]||{},{loadedWallpapers:s}=e.settings;return{background:n,isBlurred:a,loadedWallpapers:s,theme:t}}),((e,t)=>(0,h.ei)(t,["loadWallpapers","uploadWallpaper","setThemeSettings"])))((({isActive:e,onScreenSelect:t,onReset:n,background:s,isBlurred:r,loadedWallpapers:i,theme:c,loadWallpapers:d,uploadWallpaper:m,setThemeSettings:u})=>{const h=(0,a.sO)();h.current=c,(0,a.d4)((()=>{On((()=>{d()}))}),[d]);const Z=(0,a.I4)((e=>{const{files:t}=e.target;t&&t.length>0&&m(t[0])}),[m]),P=(0,a.I4)((()=>{Mn("image/jpeg",Z,!0)}),[Z]),g=(0,a.I4)((()=>{t(o.MT.GeneralChatBackgroundColor)}),[t]),v=(0,a.I4)((()=>{u({theme:c,background:void 0,backgroundColor:void 0,isBlurred:!0,patternColor:"dark"===c?l.Vv:l.g})}),[u,c]),p=(0,a.I4)((e=>{u({theme:h.current,background:e});const t=i&&i.find((t=>t.slug===e));null!=t&&t.document.thumbnail&&async function(e){const t=[0,0,0];let n,a,s,r,o=-4,l=[0,0,0],i=0;const c=document.createElement("canvas"),d=c.getContext&&c.getContext("2d");if(!d)return t;const m=await(0,Tn.pt)(e);s=m.naturalHeight||m.offsetHeight||m.height,a=m.naturalWidth||m.offsetWidth||m.width,c.height=s,c.width=a,d.drawImage(m,0,0);try{n=d.getImageData(0,0,a,s)}catch(e){return t}for(r=n.data.length;(o+=20){const t=Bn(e),n=`#${An(e)}`;u({theme:h.current,backgroundColor:n,patternColor:t})}))}),[i,u]),E=(0,a.I4)((e=>{u({theme:h.current,isBlurred:e.target.checked})}),[u]),C=(0,M.Z)();(0,T.ZP)(e,n,t,o.MT.GeneralChatBackground);const f=(null==i?void 0:i[0])&&i[0].slug===o.mp;return a.ZP.createElement("div",{className:"SettingsGeneralBackground settings-content custom-scroll"},a.ZP.createElement("div",{className:"settings-item pt-3"},a.ZP.createElement(Ee.Z,{icon:"camera-add",className:"mb-0",disabled:f,onClick:P},C("UploadImage")),a.ZP.createElement(Ee.Z,{icon:"colorize",className:"mb-0",onClick:g},C("SetColor")),a.ZP.createElement(Ee.Z,{icon:"favorite",onClick:v},C("ThemeResetToDefaults")),a.ZP.createElement(en.Z,{label:C("BackgroundBlurred"),checked:Boolean(r),onChange:E})),i?a.ZP.createElement("div",{className:"settings-wallpapers"},i.map((e=>a.ZP.createElement(Un,{wallpaper:e,theme:c,isSelected:s===e.slug,onClick:p})))):a.ZP.createElement(Pe.Z,null))}))),Gn=Ln(Fn("e6ebee")),Jn=["#e6ebee","#b2cee1","#008dd0","#c6e7cb","#c4e1a6","#60b16e","#ccd0af","#a6a997","#7a7072","#fdd7af","#fdb76e","#dd8851"];function zn(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 Xn({colorPosition:e,huePosition:t},n){return[t/(n.hueRect.width-1),e[0]/(n.colorRect.width-1),1-e[1]/(n.colorRect.height-1)]}const _n=(0,a.X$)((0,s.c$)((e=>{const t=(0,m.Pu)(e),{backgroundColor:n}=e.settings.themes[t]||{};return{backgroundColor:n,theme:t}}),((e,t)=>(0,h.ei)(t,["setThemeSettings"])))((({isActive:e,onScreenSelect:t,onReset:n,theme:s,backgroundColor:r,setThemeSettings:l})=>{const i=(0,a.sO)();i.current=s;const c=(0,a.sO)(null),d=(0,a.sO)(null),m=(0,a.sO)(null),u=(0,a.sO)(!0),[P,g]=(0,a.eJ)(function(e){return e&&e.startsWith("#")?Ln(Fn(e.replace("#",""))):Gn}(r)),v=(0,a.sO)(P);(0,a.d4)((()=>{v.current=P}),[P]);const[p,E,C]=(0,Le.Z)(),[f,b]=(0,a.eJ)(""),[I,y]=(0,a.eJ)(""),S=(0,a.sO)(),k=(0,a.sO)();(0,a.d4)((()=>{const e={offsetLeft:d.current.offsetLeft,...(0,h.ei)(d.current.getBoundingClientRect(),["top","width","height"])},t={offsetLeft:m.current.offsetLeft,...(0,h.ei)(m.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+c.current.scrollTop),e.height-1)],{huePosition:a}=zn(v.current,S.current);return g(Xn({colorPosition:n,huePosition:a},S.current)),E(),!0}function a(e){const{colorPosition:n}=zn(v.current,S.current),a=Math.min(Math.max(0,e.pageX-t.offsetLeft),t.width-1);return g(Xn({colorPosition:n,huePosition:a},S.current)),E(),!0}S.current={colorRect:e,hueRect:t},(0,Z.s)(d.current,{onCapture:n,onDrag:n,onRelease:C,onClick:C,selectorToPreventScroll:".SettingsGeneralBackgroundColor",withCursor:!0}),(0,Z.s)(m.current,{onCapture:a,onDrag:a,onRelease:C,onClick:C,selectorToPreventScroll:".SettingsGeneralBackgroundColor",withCursor:!0})}),[E,C]);const{colorPosition:w=[0,0],huePosition:N=0}=S.current?zn(P,S.current):{},M=An(Rn(P)),F=P[0],A=An(Rn([F,1,1]));(0,a.d4)((()=>{const e=Rn(P),t=`#${An(e)}`;if(b(e.join(", ")),y(t),!u.current){const n=Bn(e);l({theme:i.current,background:void 0,backgroundColor:t,patternColor:n})}u.current=!1}),[P,l]),(0,a.d4)((()=>{!function(e,t,n,a){let s,r,o;n.current&&a.current?(s=a.current.colorRect.width,r=a.current.colorRect.height,o=n.current):(s=e.offsetWidth,r=e.offsetHeight,o=e.getContext("2d"),e.width=s,e.height=r,n.current=o);const l=o.createImageData(s,r),i=l.data,c=Rn([t,1,1]);let d=0;for(let e=0;e{!function(e){const t=e.offsetWidth;e.width=t,e.height=1;const n=e.getContext("2d"),a=n.createImageData(t,1),s=a.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())));g(Ln(e))}e.currentTarget.value=t}),[]),R=(0,a.I4)((e=>{const t=e.currentTarget.value.replace(/[^0-9a-fA-F]/g,"").slice(0,6);t.match(/^#?[0-9a-fA-F]{6}$/)&&g(Ln(Fn(t.replace("#","")))),e.currentTarget.value=t}),[]),B=(0,a.I4)((e=>{g(Ln(Fn(e.currentTarget.dataset.color.replace("#",""))))}),[]),$=(0,X.Z)("SettingsGeneralBackgroundColor settings-content custom-scroll",p&&"is-dragging");return(0,T.ZP)(e,n,t,o.MT.GeneralChatBackgroundColor),a.ZP.createElement("div",{ref:c,className:$},a.ZP.createElement("div",{className:"settings-item pt-3"},a.ZP.createElement("div",{ref:d,className:"color-picker"},a.ZP.createElement("canvas",null),a.ZP.createElement("div",{className:"handle",style:`transform: translate(${w[0]}px, ${w[1]}px); background-color: #${M};`})),a.ZP.createElement("div",{ref:m,className:"hue-picker"},a.ZP.createElement("canvas",null),a.ZP.createElement("div",{className:"handle",style:`transform: translateX(${N}px); background-color: #${A};`})),a.ZP.createElement("div",{className:"tools"},a.ZP.createElement(ve.Z,{value:I,label:"HEX",onChange:R}),a.ZP.createElement(ve.Z,{value:f,label:"RGB",onChange:L}))),a.ZP.createElement("div",{className:"predefined-colors"},Jn.map((e=>a.ZP.createElement("div",{className:e===`#${M}`?"active":void 0,"data-color":e,style:`background-color: ${e};`,onClick:B})))))})));var Yn=n(2202),Hn=n(8406);const Vn=(0,a.X$)((0,s.c$)((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),hasWebNotifications:e.settings.byKey.hasWebNotifications,hasPushNotifications:e.settings.byKey.hasPushNotifications,notificationSoundVolume:e.settings.byKey.notificationSoundVolume})),((e,t)=>(0,h.ei)(t,["loadNotificationSettings","updateContactSignUpNotification","updateNotificationSettings","updateWebNotificationSettings"])))((({isActive:e,onScreenSelect:t,onReset:n,hasPrivateChatsNotifications:s,hasPrivateChatsMessagePreview:r,hasGroupNotifications:l,hasGroupMessagePreview:i,hasBroadcastNotifications:c,hasBroadcastMessagePreview:d,hasContactJoinedNotifications:m,hasPushNotifications:u,hasWebNotifications:h,notificationSoundVolume:Z,loadNotificationSettings:P,updateContactSignUpNotification:g,updateNotificationSettings:v,updateWebNotificationSettings:p})=>{(0,a.d4)((()=>{P()}),[P]);const E=(0,Yn.Z)(500,!1,!0),C=(0,a.I4)(((e,t,n)=>{const a="contact"===t?!s:!("group"===t?l:c),o="contact"===t?r:"group"===t?i:d;v({peerType:t,..."silent"===n&&{isSilent:!e.target.checked,shouldShowPreviews:o},..."showPreviews"===n&&{shouldShowPreviews:e.target.checked,isSilent:a}})}),[d,c,i,l,r,s,v]),f=(0,a.I4)((e=>{g({isSilent:!e.target.checked})}),[g]),b=(0,M.Z)();return(0,T.ZP)(e,n,t,o.MT.Notifications),a.ZP.createElement("div",{className:"settings-content custom-scroll"},a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:b.isRtl?"rtl":void 0},"Web notifications"),a.ZP.createElement(en.Z,{label:"Web notifications",subLabel:b(h?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:h,onChange:e=>{p({hasWebNotifications:e.target.checked})}}),a.ZP.createElement(en.Z,{label:"Offline notifications",disabled:!h,subLabel:b(u?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:u,onChange:e=>{p({hasPushNotifications:e.target.checked})}}),a.ZP.createElement("div",{className:"settings-item-slider"},a.ZP.createElement(tn.Z,{label:"Sound",min:0,max:10,value:Z,onChange:e=>{p({notificationSoundVolume:e}),E((()=>(0,Hn.q3)(void 0,e)))}}))),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:b.isRtl?"rtl":void 0},b("AutodownloadPrivateChats")),a.ZP.createElement(en.Z,{label:b("NotificationsForPrivateChats"),subLabel:b(s?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:s,onChange:e=>{C(e,"contact","silent")}}),a.ZP.createElement(en.Z,{label:b("MessagePreview"),disabled:!s,subLabel:b(r?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:r,onChange:e=>{C(e,"contact","showPreviews")}})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:b.isRtl?"rtl":void 0},b("FilterGroups")),a.ZP.createElement(en.Z,{label:b("NotificationsForGroups"),subLabel:b(l?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:l,onChange:e=>{C(e,"group","silent")}}),a.ZP.createElement(en.Z,{label:b("MessagePreview"),disabled:!l,subLabel:b(i?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:i,onChange:e=>{C(e,"group","showPreviews")}})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:b.isRtl?"rtl":void 0},b("FilterChannels")),a.ZP.createElement(en.Z,{label:b("NotificationsForChannels"),subLabel:b(c?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:c,onChange:e=>{C(e,"broadcast","silent")}}),a.ZP.createElement(en.Z,{label:b("MessagePreview"),disabled:!c,subLabel:b(d?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:d,onChange:e=>{C(e,"broadcast","showPreviews")}})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:b.isRtl?"rtl":void 0},b("PhoneOther")),a.ZP.createElement(en.Z,{label:b("ContactJoined"),checked:m,onChange:f})))}))),jn=(0,a.X$)((0,s.c$)((e=>{var t,n,a,s,r;const{settings:{byKey:{hasPassword:o,isSensitiveEnabled:l,canChangeSensitive:i},privacy:c},blocked:d,activeSessions:m}=e;return{hasPassword:o,blockedCount:d.totalCount,sessionsCount:m.length,isSensitiveEnabled:l,canChangeSensitive:i,visibilityPrivacyPhoneNumber:null===(t=c.phoneNumber)||void 0===t?void 0:t.visibility,visibilityPrivacyLastSeen:null===(n=c.lastSeen)||void 0===n?void 0:n.visibility,visibilityPrivacyProfilePhoto:null===(a=c.profilePhoto)||void 0===a?void 0:a.visibility,visibilityPrivacyForwarding:null===(s=c.forwards)||void 0===s?void 0:s.visibility,visibilityPrivacyGroupChats:null===(r=c.chatInvite)||void 0===r?void 0:r.visibility}}),((e,t)=>(0,h.ei)(t,["loadBlockedContacts","loadAuthorizations","loadPrivacySettings","loadContentSettings","updateContentSettings"])))((({isActive:e,onScreenSelect:t,onReset:n,hasPassword:s,blockedCount:r,sessionsCount:l,isSensitiveEnabled:i,canChangeSensitive:c,visibilityPrivacyPhoneNumber:d,visibilityPrivacyLastSeen:m,visibilityPrivacyProfilePhoto:u,visibilityPrivacyForwarding:h,visibilityPrivacyGroupChats:Z,loadPrivacySettings:P,loadBlockedContacts:g,loadAuthorizations:v,loadContentSettings:p,updateContentSettings:E})=>{(0,a.d4)((()=>{g(),v(),P(),p()}),[g,v,P,p]);const C=(0,M.Z)();function f(e){switch(e){case"everybody":return C("P2PEverybody");case"contacts":return C("P2PContacts");case"nobody":return C("P2PNobody")}}return(0,T.ZP)(e,n,t,o.MT.Privacy),a.ZP.createElement("div",{className:"settings-content custom-scroll"},a.ZP.createElement("div",{className:"settings-item pt-3"},a.ZP.createElement(Ee.Z,{icon:"delete-user",narrow:!0,onClick:()=>t(o.MT.PrivacyBlockedUsers)},a.ZP.createElement("div",{className:"multiline-menu-item"},a.ZP.createElement("span",{className:"title"},C("BlockedUsers")),r>0&&a.ZP.createElement("span",{className:"subtitle",dir:"auto"},C("Users",r)))),a.ZP.createElement(Ee.Z,{icon:"lock",narrow:!0,onClick:()=>t(s?o.MT.TwoFaEnabled:o.MT.TwoFaDisabled)},a.ZP.createElement("div",{className:"multiline-menu-item"},a.ZP.createElement("span",{className:"title"},C("TwoStepVerification")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},C(s?"PasswordOn":"PasswordOff")))),a.ZP.createElement(Ee.Z,{icon:"active-sessions",narrow:!0,onClick:()=>t(o.MT.PrivacyActiveSessions)},a.ZP.createElement("div",{className:"multiline-menu-item"},a.ZP.createElement("span",{className:"title"},C("SessionsTitle")),l>0&&a.ZP.createElement("span",{className:"subtitle",dir:"auto"},1===l?"1 session":`${l} sessions`)))),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header mb-4",dir:C.isRtl?"rtl":void 0},C("PrivacyTitle")),a.ZP.createElement(Ee.Z,{narrow:!0,className:"no-icon",onClick:()=>t(o.MT.PrivacyPhoneNumber)},a.ZP.createElement("div",{className:"multiline-menu-item"},a.ZP.createElement("span",{className:"title"},C("PrivacyPhoneTitle")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},f(d)))),a.ZP.createElement(Ee.Z,{narrow:!0,className:"no-icon",onClick:()=>t(o.MT.PrivacyLastSeen)},a.ZP.createElement("div",{className:"multiline-menu-item"},a.ZP.createElement("span",{className:"title"},C("LastSeenTitle")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},f(m)))),a.ZP.createElement(Ee.Z,{narrow:!0,className:"no-icon",onClick:()=>t(o.MT.PrivacyProfilePhoto)},a.ZP.createElement("div",{className:"multiline-menu-item"},a.ZP.createElement("span",{className:"title"},C("PrivacyProfilePhotoTitle")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},f(u)))),a.ZP.createElement(Ee.Z,{narrow:!0,className:"no-icon",onClick:()=>t(o.MT.PrivacyForwarding)},a.ZP.createElement("div",{className:"multiline-menu-item"},a.ZP.createElement("span",{className:"title"},C("PrivacyForwardsTitle")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},f(h)))),a.ZP.createElement(Ee.Z,{narrow:!0,className:"no-icon",onClick:()=>t(o.MT.PrivacyGroupChats)},a.ZP.createElement("div",{className:"multiline-menu-item"},a.ZP.createElement("span",{className:"title"},C("WhoCanAddMe")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},f(Z))))),c&&a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:C.isRtl?"rtl":void 0},C("lng_settings_sensitive_title")),a.ZP.createElement(en.Z,{label:C("lng_settings_sensitive_disable_filtering"),subLabel:C("lng_settings_sensitive_about"),checked:Boolean(i),disabled:!c,onCheck:E})))}))),Kn=(0,a.X$)((0,s.c$)((e=>({languages:e.settings.byKey.languages,language:e.settings.byKey.language})),((e,t)=>(0,h.ei)(t,["loadLanguages","setSettingOption"])))((({isActive:e,onScreenSelect:t,onReset:n,languages:s,language:r,loadLanguages:l,setSettingOption:i})=>{const[c,d]=(0,a.eJ)(r),[m,u,h]=(0,Le.Z)();(0,a.d4)((()=>{l()}),[l]);const Z=(0,a.I4)((e=>{d(e),u(),(0,gn.m0)(e,(()=>{h(),i({language:e})}))}),[u,h,i]),P=(0,a.Ye)((()=>s?function(e){const t=(window.navigator.language||"en").toLowerCase(),n=t.substr(0,2);return e.map((({langCode:e,nativeName:t,name:n})=>({value:e,label:t,subLabel:n}))).sort((e=>!t||e.value!==t&&e.value!==n?0:-1))}(s):void 0),[s]);return(0,T.ZP)(e,n,t,o.MT.Language),a.ZP.createElement("div",{className:"settings-content settings-item settings-language custom-scroll"},P?a.ZP.createElement(_e.Z,{name:"keyboard-send-settings",options:P,selected:c,loadingOption:m?c:void 0,onChange:Z}):a.ZP.createElement(Pe.Z,null))})));function qn(e){switch(e){case o.MT.PrivacyPhoneNumber:case o.MT.PrivacyPhoneNumberAllowedContacts:case o.MT.PrivacyPhoneNumberDeniedContacts:return"phoneNumber";case o.MT.PrivacyLastSeen:case o.MT.PrivacyLastSeenAllowedContacts:case o.MT.PrivacyLastSeenDeniedContacts:return"lastSeen";case o.MT.PrivacyProfilePhoto:case o.MT.PrivacyProfilePhotoAllowedContacts:case o.MT.PrivacyProfilePhotoDeniedContacts:return"profilePhoto";case o.MT.PrivacyForwarding:case o.MT.PrivacyForwardingAllowedContacts:case o.MT.PrivacyForwardingDeniedContacts:return"forwards";case o.MT.PrivacyGroupChats:case o.MT.PrivacyGroupChatsAllowedContacts:case o.MT.PrivacyGroupChatsDeniedContacts:return"chatInvite"}}const Wn=(0,a.X$)((0,s.c$)(((e,{screen:t})=>{let n;const{chats:{byId:a},settings:{privacy:s}}=e;switch(t){case o.MT.PrivacyPhoneNumber:n=s.phoneNumber;break;case o.MT.PrivacyLastSeen:n=s.lastSeen;break;case o.MT.PrivacyProfilePhoto:n=s.profilePhoto;break;case o.MT.PrivacyForwarding:n=s.forwards;break;case o.MT.PrivacyGroupChats:n=s.chatInvite}return n?{...n,chatsById:a}:{}}),((e,t)=>(0,h.ei)(t,["setPrivacyVisibility"])))((({screen:e,isActive:t,onScreenSelect:n,onReset:s,visibility:r,allowUserIds:l,allowChatIds:i,blockUserIds:c,blockChatIds:d,chatsById:m,setPrivacyVisibility:u})=>{const h=(0,M.Z)(),Z=(0,a.Ye)((()=>{switch(e){case o.MT.PrivacyProfilePhoto:case o.MT.PrivacyGroupChats:return[{value:"everybody",label:h("P2PEverybody")},{value:"contacts",label:h("P2PContacts")}];default:return[{value:"everybody",label:h("P2PEverybody")},{value:"contacts",label:h("P2PContacts")},{value:"nobody",label:h("P2PNobody")}]}}),[h,e]),P={shouldShowDenied:"nobody"!==r,shouldShowAllowed:"everybody"!==r},g=qn(e),v=(0,a.Ye)((()=>{switch(e){case o.MT.PrivacyPhoneNumber:return h("PrivacyPhoneTitle");case o.MT.PrivacyLastSeen:return h("LastSeenTitle");case o.MT.PrivacyProfilePhoto:return h("PrivacyProfilePhotoTitle");case o.MT.PrivacyForwarding:return h("PrivacyForwardsTitle");case o.MT.PrivacyGroupChats:return h("WhoCanAddMe");default:return}}),[h,e]);(0,T.ZP)(t,s,n,e);const p=(0,a.Ye)((()=>{switch(e){case o.MT.PrivacyLastSeen:return h("CustomHelp");default:return}}),[h,e]),E=(()=>{switch(e){case o.MT.PrivacyPhoneNumber:return o.MT.PrivacyPhoneNumberAllowedContacts;case o.MT.PrivacyLastSeen:return o.MT.PrivacyLastSeenAllowedContacts;case o.MT.PrivacyProfilePhoto:return o.MT.PrivacyProfilePhotoAllowedContacts;case o.MT.PrivacyForwarding:return o.MT.PrivacyForwardingAllowedContacts;default:return o.MT.PrivacyGroupChatsAllowedContacts}})(),C=(()=>{switch(e){case o.MT.PrivacyPhoneNumber:return o.MT.PrivacyPhoneNumberDeniedContacts;case o.MT.PrivacyLastSeen:return o.MT.PrivacyLastSeenDeniedContacts;case o.MT.PrivacyProfilePhoto:return o.MT.PrivacyProfilePhotoDeniedContacts;case o.MT.PrivacyForwarding:return o.MT.PrivacyForwardingDeniedContacts;default:return o.MT.PrivacyGroupChatsDeniedContacts}})(),f=(0,a.Ye)((()=>l&&i&&m?i.reduce(((e,t)=>e+(m[t]?m[t].membersCount:0)),l.length):0),[i,l,m]),b=(0,a.Ye)((()=>c&&d&&m?d.reduce(((e,t)=>e+(m[t]?m[t].membersCount:0)),c.length):0),[d,c,m]),I=(0,a.I4)((e=>{u({privacyKey:g,visibility:e})}),[g,u]);return a.ZP.createElement("div",{className:"settings-content custom-scroll"},a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:h.isRtl?"rtl":void 0},v),a.ZP.createElement(_e.Z,{name:`visibility-${g}`,options:Z,onChange:I,selected:r}),p&&a.ZP.createElement("p",{className:"settings-item-description-larger",dir:h.isRtl?"rtl":void 0},p)),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header mb-4",dir:h.isRtl?"rtl":void 0},h("PrivacyExceptions")),P.shouldShowAllowed&&a.ZP.createElement(Ee.Z,{narrow:!0,icon:"add-user",onClick:()=>{n(E)}},a.ZP.createElement("div",{className:"multiline-menu-item full-size"},f>0&&a.ZP.createElement("span",{className:"date",dir:"auto"},"+",f),a.ZP.createElement("span",{className:"title"},h("AlwaysShareWith")),a.ZP.createElement("span",{className:"subtitle"},h("EditAdminAddUsers")))),P.shouldShowDenied&&a.ZP.createElement(Ee.Z,{narrow:!0,icon:"delete-user",onClick:()=>{n(C)}},a.ZP.createElement("div",{className:"multiline-menu-item full-size"},b>0&&a.ZP.createElement("span",{className:"date",dir:"auto"},"−",b),a.ZP.createElement("span",{className:"title"},h("NeverShareWith")),a.ZP.createElement("span",{className:"subtitle"},h("EditAdminAddUsers"))))))})));function Qn(e){return[e.region,e.country].filter(Boolean).join(", ")}function ea(e){return`${e.deviceModel}${e.deviceModel?", ":""} ${e.platform} ${e.systemVersion}`}const ta=(0,a.X$)((0,s.c$)((e=>({activeSessions:e.activeSessions})),((e,t)=>(0,h.ei)(t,["loadAuthorizations","terminateAuthorization","terminateAllAuthorizations"])))((({isActive:e,onScreenSelect:t,onReset:n,activeSessions:s,loadAuthorizations:r,terminateAuthorization:l,terminateAllAuthorizations:i})=>{const[c,d,m]=(0,Le.Z)();(0,a.d4)((()=>{r()}),[r]);const u=(0,a.I4)((e=>{l({hash:e})}),[l]),h=(0,a.I4)((()=>{m(),i()}),[m,i]),Z=(0,a.Ye)((()=>s.find((e=>e.isCurrent))),[s]),P=(0,a.Ye)((()=>s.filter((e=>!e.isCurrent))),[s]),g=(0,M.Z)();return(0,T.ZP)(e,n,t,o.MT.PrivacyActiveSessions),a.ZP.createElement("div",{className:"settings-content custom-scroll"},Z&&(p=Z,a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header mb-4",dir:g.isRtl?"rtl":void 0},g("AuthSessions.CurrentSession")),a.ZP.createElement(Ee.Z,{narrow:!0,inactive:!0,className:"no-icon"},a.ZP.createElement("div",{className:"multiline-menu-item",dir:"auto"},a.ZP.createElement("span",{className:"title",dir:"auto"},p.appName),a.ZP.createElement("span",{className:"subtitle black tight"},ea(p)),a.ZP.createElement("span",{className:"subtitle"},p.ip," - ",Qn(p)))),a.ZP.createElement(Ee.Z,{className:"destructive mb-0 no-icon",icon:"stop",ripple:!0,narrow:!0,onClick:d},g("TerminateAllSessions")))),P&&(v=P,a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header mb-4",dir:g.isRtl?"rtl":void 0},g("OtherSessions")),v.map((function(e){return a.ZP.createElement(Ee.Z,{key:e.hash,ripple:!0,narrow:!0,contextActions:[{title:"Terminate",icon:"stop",handler:()=>{u(e.hash)}}],className:"no-icon"},a.ZP.createElement("div",{className:"multiline-menu-item full-size",dir:"auto"},a.ZP.createElement("span",{className:"date"},(0,B.VX)(g,1e3*e.dateActive)),a.ZP.createElement("span",{className:"title"},e.appName),a.ZP.createElement("span",{className:"subtitle black tight"},ea(e)),a.ZP.createElement("span",{className:"subtitle"},e.ip," - ",Qn(e))))})))),P&&a.ZP.createElement(Fe.Z,{isOpen:c,onClose:m,text:"Are you sure you want to terminate all other sessions?",confirmLabel:"Terminate All Other Sessions",confirmHandler:h,confirmIsDestructive:!0}));var v,p})));var na=n(6272);const aa=(0,a.X$)((0,s.c$)((e=>{const{users:{byId:t},blocked:{ids:n},contactList:a,currentUserId:s}=e;return{usersById:t,blockedIds:n,contactIds:null==a?void 0:a.userIds,localContactIds:e.userSearch.localUserIds,currentUserId:s}}),((e,t)=>(0,h.ei)(t,["loadContactList","setUserSearchQuery","blockContact"])))((({usersById:e,blockedIds:t,contactIds:n,localContactIds:s,currentUserId:r,isOpen:o,onClose:l,loadContactList:i,setUserSearchQuery:c,blockContact:d})=>{const m=(0,M.Z)(),[Z,P]=(0,a.eJ)(""),g=(0,a.sO)(null);(0,a.d4)((()=>{c({query:Z})}),[Z,c]);const v=(0,a.Ye)((()=>{const a=(n||[]).concat(s||[]).filter((e=>!t.includes(e)&&e!==r));return(0,h.Tw)(a).reduce(((t,n)=>{var a;return(!Z||!e[n]||(0,me.Z)((0,u.Js)(e[n])||"",Z)||null!==(a=e[n])&&void 0!==a&&a.username.toLowerCase().includes(Z))&&t.push(n),t}),[]).sort(((t,n)=>{const a=(0,u.Js)(e[t])||"",s=(0,u.Js)(e[n])||"";return a.localeCompare(s)}))}),[t,n,r,Z,s,e]),p=(0,a.I4)((t=>{const{id:n,accessHash:a}=e[t]||{};n&&a&&(d({contactId:n,accessHash:a}),l())}),[d,l,e]);return a.ZP.createElement(be,{isOpen:o,chatOrUserIds:v,filterRef:g,filterPlaceholder:m("BlockedUsers.BlockUser"),filter:Z,onFilterChange:P,loadMore:i,onSelectChatOrUser:p,onClose:l})}))),sa=(0,a.X$)((0,s.c$)((e=>{const{chats:{byId:t},users:{byId:n},blocked:{ids:a},countryList:{phoneCodes:s}}=e;return{chatsByIds:t,usersByIds:n,blockedIds:a,phoneCodeList:s}}),((e,t)=>(0,h.ei)(t,["unblockContact"])))((({isActive:e,onScreenSelect:t,onReset:n,chatsByIds:s,usersByIds:r,blockedIds:i,phoneCodeList:c,unblockContact:d})=>{const m=(0,M.Z)(),[h,Z,P]=(0,Le.Z)(),g=(0,a.I4)((e=>{d({contactId:e})}),[d]);return(0,T.ZP)(e,n,t,o.MT.PrivacyBlockedUsers),a.ZP.createElement("div",{className:"settings-fab-wrapper"},a.ZP.createElement("div",{className:"settings-content infinite-scroll"},a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("p",{className:"settings-item-description-larger mt-0 mb-2",dir:m.isRtl?"rtl":void 0},m("BlockedUsersInfo"))),a.ZP.createElement("div",{className:"chat-list custom-scroll"},null!=i&&i.length?a.ZP.createElement("div",{className:"scroll-container"},i.map(((e,t)=>function(e,t,n){const o=(0,u.YC)(e),i=o?r[e]:void 0,d=o?void 0:s[e],h=(0,X.Z)("Chat chat-item-clickable blocked-list-item small-icon",o?"private":"group");return a.ZP.createElement(Ee.Z,{key:e,className:h,ripple:!0,narrow:!0,contextActions:[{title:"Unblock",icon:"unlock",handler:()=>{g(e)}}],style:`top: ${(0+t)*l.rS}px;`},a.ZP.createElement(D.Z,{size:"medium",user:i,chat:d}),a.ZP.createElement("div",{className:"contact-info",dir:"auto"},a.ZP.createElement("h3",{dir:"auto"},(0,$.Z)((o?(0,u.Js)(i):(0,u.U)(m,d))||"")),(null==i?void 0:i.phoneNumber)&&a.ZP.createElement("div",{className:"contact-phone",dir:"auto"},(0,na.WZ)(c,i.phoneNumber)),i&&!i.phoneNumber&&i.username&&a.ZP.createElement("div",{className:"contact-username",dir:"auto"},"@",i.username)))}(e,t)))):i&&!i.length?a.ZP.createElement("div",{className:"no-results",dir:"auto"},m("NoBlocked")):a.ZP.createElement(Pe.Z,{key:"loading"}))),a.ZP.createElement(Xt.Z,{isShown:!0,onClick:Z,ariaLabel:m("BlockContact")},a.ZP.createElement("i",{className:"icon-add"})),a.ZP.createElement(aa,{isOpen:h,onClose:P}))})));var ra=n(7854);const oa=(0,a.X$)((0,s.c$)((e=>({animatedEmoji:(0,m.zB)(e,"🔐")})))((({isActive:e,onReset:t,animatedEmoji:n,onScreenSelect:s})=>{const r=(0,M.Z)();return(0,T.ZP)(e,t,s,o.MT.TwoFaEnabled),a.ZP.createElement("div",{className:"settings-content two-fa custom-scroll"},a.ZP.createElement("div",{className:"settings-content-header"},a.ZP.createElement(ra.Z,{sticker:n,size:"large"}),a.ZP.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},(0,$.Z)(r("EnabledPasswordText"),["br"]))),a.ZP.createElement("div",{className:"settings-item pt-0 no-border"},a.ZP.createElement(Ee.Z,{icon:"edit",onClick:()=>s(o.MT.TwoFaChangePasswordCurrent)},r("ChangePassword")),a.ZP.createElement(Ee.Z,{icon:"password-off",onClick:()=>s(o.MT.TwoFaTurnOff)},r("TurnPasswordOff")),a.ZP.createElement(Ee.Z,{icon:"email",onClick:()=>s(o.MT.TwoFaRecoveryEmailCurrentPassword)},r("SetRecoveryEmail"))))})));var la=n(3490),ia=n(9364);const ca=(0,a.X$)((({screen:e,isActive:t,onScreenSelect:n,onReset:s,error:r,isLoading:o,expectedPassword:l,placeholder:i="Current Password",hint:c,submitLabel:d,clearError:m,onSubmit:u})=>{const[h,Z]=(0,a.eJ)(""),[P,g]=(0,a.eJ)(!1),v=(0,a.I4)((e=>{l&&e!==l?Z("Passwords Should Be Equal"):u(e)}),[u,l]),p=(0,a.I4)((()=>{m&&m(),Z("")}),[m]),E=(0,M.Z)();return(0,T.ZP)(t,s,n,e),a.ZP.createElement("div",{className:"settings-content two-fa custom-scroll"},a.ZP.createElement("div",{className:"settings-content-header"},a.ZP.createElement(la.Z,{isBig:!0,isPasswordVisible:P})),a.ZP.createElement("div",{className:"settings-item pt-0 no-border"},a.ZP.createElement(ia.Z,{error:h||r,hint:c,placeholder:i,submitLabel:d||E("Next"),clearError:p,isLoading:o,isPasswordVisible:P,onChangePasswordVisibility:g,onSubmit:v})))})),da=(0,a.X$)((0,s.c$)((e=>({animatedEmoji:(0,m.zB)(e,"🔐")})))((({isActive:e,onScreenSelect:t,onReset:n,animatedEmoji:s,onStart:r})=>{const l=(0,M.Z)();return(0,T.ZP)(e,n,t,o.MT.TwoFaDisabled),a.ZP.createElement("div",{className:"settings-content two-fa custom-scroll"},a.ZP.createElement("div",{className:"settings-content-header"},a.ZP.createElement(ra.Z,{sticker:s,size:"large"}),a.ZP.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},l("SetAdditionalPasswordInfo"))),a.ZP.createElement("div",{className:"settings-item pt-0 no-border"},a.ZP.createElement(R.Z,{onClick:r},l("EditAdminTransferSetPassword"))))}))),ma=i.wB?550:400,ua=(0,a.X$)((0,s.c$)(((e,{icon:t})=>({animatedEmoji:(0,m.zB)(e,"email"===t?"💌":"💡")})))((({animatedEmoji:e,type:t="text",isLoading:n,error:s,placeholder:r,shouldConfirm:o,clearError:l,onSubmit:c,isActive:d,onScreenSelect:m,onReset:u,screen:h})=>{const Z=(0,a.sO)(null),[P,g]=(0,a.eJ)(""),[v,p,E]=(0,Le.Z)(!1);(0,a.d4)((()=>{i.$b||setTimeout((()=>{Z.current.focus()}),ma)}),[]);const C=(0,M.Z)();return(0,T.ZP)(d,u,m,h),a.ZP.createElement("div",{className:"settings-content two-fa custom-scroll"},a.ZP.createElement("div",{className:"settings-content-header"},a.ZP.createElement(ra.Z,{sticker:e,size:"large"})),a.ZP.createElement("div",{className:"settings-item pt-0 no-border"},a.ZP.createElement("form",{action:"",onSubmit:e=>{e.preventDefault(),Z.current&&c(P)}},a.ZP.createElement(ve.Z,{ref:Z,value:P,inputMode:t,label:r,error:s,onChange:e=>{s&&l&&l(),g(e.target.value)}}),P?a.ZP.createElement(R.Z,{type:"submit",isLoading:n,ripple:!0},C("Continue")):a.ZP.createElement(R.Z,{isText:!0,isLoading:n,ripple:!0,onClick:o?p:()=>{c()}},C("YourEmailSkip"))),o&&a.ZP.createElement(ge.Z,{className:"narrow",isOpen:v,title:C("YourEmailSkipWarning"),onClose:E},(0,$.Z)(C("YourEmailSkipWarningText"),["br","simple_markdown"]),a.ZP.createElement("div",{className:"dialog-buttons"},a.ZP.createElement(R.Z,{color:"danger",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:()=>{E(),c()}},C("YourEmailSkip")),a.ZP.createElement(R.Z,{color:"primary",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:E},C("Cancel"))))))}))),ha=(0,a.X$)((0,s.c$)((e=>({animatedEmoji:(0,m.zB)(e,"🥳")})))((({isActive:e,onReset:t,animatedEmoji:n,onScreenSelect:s})=>{const r=(0,M.Z)();return(0,T.ZP)(e,t,s,o.MT.TwoFaCongratulations),a.ZP.createElement("div",{className:"settings-content two-fa custom-scroll"},a.ZP.createElement("div",{className:"settings-content-header"},a.ZP.createElement(ra.Z,{sticker:n,size:"large"}),a.ZP.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},r("TwoStepVerificationPasswordSetInfo"))),a.ZP.createElement("div",{className:"settings-item pt-0 no-border"},a.ZP.createElement(R.Z,{onClick:()=>{s(o.MT.Privacy)}},r("TwoStepVerificationPasswordReturnSettings"))))}))),Za=i.wB?550:400,Pa=(0,a.X$)((0,s.c$)((e=>({animatedEmoji:(0,m.zB)(e,"💌"),codeLength:e.twoFaSettings.waitingEmailCodeLength})))((({animatedEmoji:e,codeLength:t,isLoading:n,error:s,clearError:r,onSubmit:o,isActive:l,onScreenSelect:c,onReset:d,screen:m})=>{const u=(0,a.sO)(null),[h,Z]=(0,a.eJ)("");(0,a.d4)((()=>{i.$b||setTimeout((()=>{u.current.focus()}),Za)}),[]);const P=(0,M.Z)();return(0,T.ZP)(l,d,c,m),a.ZP.createElement("div",{className:"settings-content two-fa custom-scroll"},a.ZP.createElement("div",{className:"settings-content-header"},a.ZP.createElement(ra.Z,{sticker:e,size:"large"})),a.ZP.createElement("div",{className:"settings-item pt-0 no-border"},a.ZP.createElement(ve.Z,{value:h,ref:u,inputMode:"decimal",label:P("YourEmailCode"),error:s,onChange:e=>{s&&r&&r();const n=e.target.value.slice(0,t);n.length===t&&o(n),Z(n),e.target.value=n}}),n&&a.ZP.createElement(Pe.Z,null)))}))),ga=(0,a.X$)((0,s.c$)((e=>({...e.twoFaSettings})),((e,t)=>(0,h.ei)(t,["updatePassword","updateRecoveryEmail","clearPassword","provideTwoFaEmailCode","checkPassword","clearTwoFaError"])))((({currentScreen:e,shownScreen:t,state:n,hint:s,isLoading:r,error:l,waitingEmailCodeLength:i,dispatch:c,isActive:d,onScreenSelect:m,onReset:u,updatePassword:h,checkPassword:Z,clearTwoFaError:P,updateRecoveryEmail:g,provideTwoFaEmailCode:v,clearPassword:p})=>{(0,a.d4)((()=>{i&&(e===o.MT.TwoFaNewPasswordEmail?m(o.MT.TwoFaNewPasswordEmailCode):e===o.MT.TwoFaRecoveryEmail&&m(o.MT.TwoFaRecoveryEmailCode))}),[e,m,i]);const E=(0,a.I4)((()=>{c({type:"reset"}),m(o.MT.TwoFaNewPassword)}),[c,m]),C=(0,a.I4)((e=>{c({type:"setPassword",payload:e}),m(o.MT.TwoFaNewPasswordConfirm)}),[c,m]),f=(0,a.I4)((()=>{m(o.MT.TwoFaNewPasswordHint)}),[m]),b=(0,a.I4)((e=>{c({type:"setHint",payload:e}),m(o.MT.TwoFaNewPasswordEmail)}),[c,m]),I=(0,a.I4)((e=>{c({type:"setEmail",payload:e}),h({...n,email:e,onSuccess:()=>{m(o.MT.TwoFaCongratulations)}})}),[c,m,n,h]),y=(0,a.I4)((e=>{c({type:"setCurrentPassword",payload:e}),Z({currentPassword:e,onSuccess:()=>{m(o.MT.TwoFaChangePasswordNew)}})}),[Z,c,m]),S=(0,a.I4)((e=>{c({type:"setPassword",payload:e}),m(o.MT.TwoFaChangePasswordConfirm)}),[c,m]),k=(0,a.I4)((()=>{m(o.MT.TwoFaChangePasswordHint)}),[m]),w=(0,a.I4)((e=>{c({type:"setHint",payload:e}),h({...n,hint:e,onSuccess:()=>{m(o.MT.TwoFaCongratulations)}})}),[c,m,n,h]),N=(0,a.I4)((e=>{p({currentPassword:e,onSuccess:()=>{m(o.MT.Privacy)}})}),[p,m]),T=(0,a.I4)((e=>{c({type:"setCurrentPassword",payload:e}),Z({currentPassword:e,onSuccess:()=>{m(o.MT.TwoFaRecoveryEmail)}})}),[Z,c,m]),F=(0,a.I4)((e=>{c({type:"setEmail",payload:e}),g({...n,email:e,onSuccess:()=>{m(o.MT.TwoFaCongratulations)}})}),[c,m,n,g]),A=(0,a.I4)((e=>{v({code:e})}),[v]),L=(0,M.Z)();switch(e){case o.MT.TwoFaDisabled:return a.ZP.createElement(da,{onStart:E,onScreenSelect:m,isActive:d||[o.MT.TwoFaNewPassword,o.MT.TwoFaNewPasswordConfirm,o.MT.TwoFaNewPasswordHint,o.MT.TwoFaNewPasswordEmail,o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:u});case o.MT.TwoFaNewPassword:return a.ZP.createElement(ca,{screen:e,placeholder:L("PleaseEnterPassword"),submitLabel:L("Continue"),onSubmit:C,onScreenSelect:m,isActive:d||[o.MT.TwoFaNewPasswordConfirm,o.MT.TwoFaNewPasswordHint,o.MT.TwoFaNewPasswordEmail,o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:u});case o.MT.TwoFaNewPasswordConfirm:return a.ZP.createElement(ca,{screen:e,expectedPassword:n.password,placeholder:L("PleaseReEnterPassword"),submitLabel:L("Continue"),onSubmit:f,onScreenSelect:m,isActive:d||[o.MT.TwoFaNewPasswordHint,o.MT.TwoFaNewPasswordEmail,o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:u});case o.MT.TwoFaNewPasswordHint:return a.ZP.createElement(ua,{icon:"hint",placeholder:L("PasswordHintPlaceholder"),onSubmit:b,screen:e,onScreenSelect:m,isActive:d||[o.MT.TwoFaNewPasswordEmail,o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:u});case o.MT.TwoFaNewPasswordEmail:return a.ZP.createElement(ua,{icon:"email",type:"email",isLoading:r,error:l,clearError:P,placeholder:L("RecoveryEmailTitle"),shouldConfirm:!0,onSubmit:I,screen:e,onScreenSelect:m,isActive:d||[o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:u});case o.MT.TwoFaNewPasswordEmailCode:return a.ZP.createElement(Pa,{isLoading:r,error:l,clearError:P,onSubmit:A,screen:e,onScreenSelect:m,isActive:d||t===o.MT.TwoFaCongratulations,onReset:u});case o.MT.TwoFaCongratulations:return a.ZP.createElement(ha,{onScreenSelect:m,isActive:d,onReset:u});case o.MT.TwoFaEnabled:return a.ZP.createElement(oa,{onScreenSelect:m,isActive:d||[o.MT.TwoFaChangePasswordCurrent,o.MT.TwoFaChangePasswordNew,o.MT.TwoFaChangePasswordConfirm,o.MT.TwoFaChangePasswordHint,o.MT.TwoFaTurnOff,o.MT.TwoFaRecoveryEmailCurrentPassword,o.MT.TwoFaRecoveryEmail,o.MT.TwoFaRecoveryEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:u});case o.MT.TwoFaChangePasswordCurrent:return a.ZP.createElement(ca,{screen:e,isLoading:r,error:l,clearError:P,hint:s,onSubmit:y,onScreenSelect:m,isActive:d||[o.MT.TwoFaChangePasswordNew,o.MT.TwoFaChangePasswordConfirm,o.MT.TwoFaChangePasswordHint,o.MT.TwoFaCongratulations].includes(t),onReset:u});case o.MT.TwoFaChangePasswordNew:return a.ZP.createElement(ca,{screen:e,placeholder:L("PleaseEnterNewFirstPassword"),onSubmit:S,onScreenSelect:m,isActive:d||[o.MT.TwoFaChangePasswordConfirm,o.MT.TwoFaChangePasswordHint,o.MT.TwoFaCongratulations].includes(t),onReset:u});case o.MT.TwoFaChangePasswordConfirm:return a.ZP.createElement(ca,{screen:e,expectedPassword:n.password,placeholder:L("PleaseReEnterPassword"),onSubmit:k,onScreenSelect:m,isActive:d||[o.MT.TwoFaChangePasswordHint,o.MT.TwoFaCongratulations].includes(t),onReset:u});case o.MT.TwoFaChangePasswordHint:return a.ZP.createElement(ua,{isLoading:r,error:l,clearError:P,icon:"hint",placeholder:L("PasswordHintPlaceholder"),onSubmit:w,onScreenSelect:m,isActive:d||t===o.MT.TwoFaCongratulations,onReset:u,screen:e});case o.MT.TwoFaTurnOff:return a.ZP.createElement(ca,{isLoading:r,error:l,clearError:P,hint:s,onSubmit:N,onScreenSelect:m,isActive:d,onReset:u,screen:e});case o.MT.TwoFaRecoveryEmailCurrentPassword:return a.ZP.createElement(ca,{screen:e,isLoading:r,error:l,clearError:P,hint:s,onSubmit:T,onScreenSelect:m,isActive:d||[o.MT.TwoFaRecoveryEmail,o.MT.TwoFaRecoveryEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:u});case o.MT.TwoFaRecoveryEmail:return a.ZP.createElement(ua,{screen:e,icon:"email",type:"email",placeholder:L("RecoveryEmailTitle"),onSubmit:F,onScreenSelect:m,isActive:d||[o.MT.TwoFaRecoveryEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:u});case o.MT.TwoFaRecoveryEmailCode:return a.ZP.createElement(Pa,{screen:e,isLoading:r,error:l,clearError:P,onSubmit:A,onScreenSelect:m,isActive:d||t===o.MT.TwoFaCongratulations,onReset:u});default:return}})));var va=n(1820);function pa(e,t){const{privacy:n}=e.settings;switch(t){case o.MT.PrivacyPhoneNumberAllowedContacts:case o.MT.PrivacyPhoneNumberDeniedContacts:return n.phoneNumber;case o.MT.PrivacyLastSeenAllowedContacts:case o.MT.PrivacyLastSeenDeniedContacts:return n.lastSeen;case o.MT.PrivacyProfilePhotoAllowedContacts:case o.MT.PrivacyProfilePhotoDeniedContacts:return n.profilePhoto;case o.MT.PrivacyForwardingAllowedContacts:case o.MT.PrivacyForwardingDeniedContacts:return n.forwards;case o.MT.PrivacyGroupChatsDeniedContacts:case o.MT.PrivacyGroupChatsAllowedContacts:return n.chatInvite}}const Ea=(0,a.X$)((0,s.c$)(((e,{screen:t})=>{const{chats:{byId:n,listIds:a,orderedPinnedIds:s},currentUserId:r}=e;return{currentUserId:r,chatsById:n,listIds:a.active,orderedPinnedIds:s.active,archivedPinnedIds:s.archived,archivedListIds:a.archived,settings:pa(e,t)}}),((e,t)=>(0,h.ei)(t,["setPrivacySettings"])))((({currentUserId:e,isAllowList:t,screen:n,settings:s,chatsById:r,listIds:l,orderedPinnedIds:i,archivedListIds:c,archivedPinnedIds:d,setPrivacySettings:m,isActive:h,onScreenSelect:Z,onReset:P})=>{const g=(0,M.Z)(),v=(0,a.Ye)((()=>s?t?[...s.allowUserIds,...s.allowChatIds]:[...s.blockUserIds,...s.blockChatIds]:[]),[t,s]),[p,E]=(0,a.eJ)(""),[C,f]=(0,a.eJ)(!1),[b,I]=(0,a.eJ)(v),y=(0,a.Ye)((()=>{const e=l?(0,u.O)(r,l,i,"all"):void 0,t=c?(0,u.O)(r,c,d,"archived"):void 0;if(e||t)return[...e?[...e.pinnedChats,...e.otherChats]:[],...t?t.otherChats:[]]}),[r,l,i,c,d]),S=(0,a.Ye)((()=>{if(y)return y.filter((t=>((0,u.YC)(t.id)&&t.id!==e||(0,u.Bf)(t))&&(!p||(0,me.Z)((0,u.U)(g,t),p)||v.includes(t.id)))).map((({id:e})=>e))}),[y,e,g,p,v]),k=(0,a.I4)((e=>{I(e),f(!0)}),[]),w=(0,a.I4)((()=>{m({privacyKey:qn(n),isAllowList:Boolean(t),contactsIds:b}),Z(o.MT.Privacy)}),[t,b,Z,n,m]);return(0,T.ZP)(h,P,Z,n),a.ZP.createElement("div",{className:"NewChat-inner step-1"},a.ZP.createElement(va.Z,{itemIds:S||[],selectedIds:b,filterValue:p,filterPlaceholder:g(t?"AlwaysShareWithPlaceholder":"NeverShareWithPlaceholder"),searchInputId:"new-group-picker-search",onSelectedIdsChange:k,onFilterChange:E}),a.ZP.createElement(Xt.Z,{isShown:C,onClick:w,ariaLabel:g(t?"AlwaysShareWithTitle":"NeverShareWithTitle")},a.ZP.createElement("i",{className:"icon-arrow-right"})))}))),Ca=Object.keys(o.MT).length/2,fa=[o.MT.TwoFaDisabled,o.MT.TwoFaNewPassword,o.MT.TwoFaNewPasswordConfirm,o.MT.TwoFaNewPasswordHint,o.MT.TwoFaNewPasswordEmail,o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations,o.MT.TwoFaEnabled,o.MT.TwoFaChangePasswordCurrent,o.MT.TwoFaChangePasswordNew,o.MT.TwoFaChangePasswordConfirm,o.MT.TwoFaChangePasswordHint,o.MT.TwoFaTurnOff,o.MT.TwoFaRecoveryEmailCurrentPassword,o.MT.TwoFaRecoveryEmail,o.MT.TwoFaRecoveryEmailCode],ba=[o.MT.Folders,o.MT.FoldersCreateFolder,o.MT.FoldersEditFolder,o.MT.FoldersEditFolderFromChatList,o.MT.FoldersIncludedChats,o.MT.FoldersIncludedChatsFromChatList,o.MT.FoldersExcludedChats,o.MT.FoldersExcludedChatsFromChatList],Ia=[o.MT.PrivacyBlockedUsers,o.MT.PrivacyActiveSessions],ya=[o.MT.PrivacyPhoneNumberAllowedContacts,o.MT.PrivacyPhoneNumberDeniedContacts],Sa=[o.MT.PrivacyLastSeenAllowedContacts,o.MT.PrivacyLastSeenDeniedContacts],ka=[o.MT.PrivacyProfilePhotoAllowedContacts,o.MT.PrivacyProfilePhotoDeniedContacts],wa=[o.MT.PrivacyForwardingAllowedContacts,o.MT.PrivacyForwardingDeniedContacts],Na=[o.MT.PrivacyGroupChatsAllowedContacts,o.MT.PrivacyGroupChatsDeniedContacts],Ma=(0,a.X$)((({isActive:e,currentScreen:t,foldersState:n,foldersDispatch:s,onScreenSelect:r,onReset:l,shouldSkipTransition:c})=>{const[d,m]=(0,$t.Z)(Ut,Dt),u=(0,a.I4)((()=>{t!==o.MT.FoldersCreateFolder&&t!==o.MT.FoldersEditFolder&&t!==o.MT.FoldersEditFolderFromChatList||setTimeout((()=>{s({type:"reset"})}),200),t!==o.MT.FoldersIncludedChats&&t!==o.MT.FoldersExcludedChats?l():"create"===n.mode?r(o.MT.FoldersCreateFolder):r(o.MT.FoldersEditFolder)}),[n.mode,s,t,l,r]),h=(0,a.I4)((()=>{s({type:"saveFilters"}),u()}),[s,u]);function Z(l,i,c){return a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(Ot,{currentScreen:t,onReset:u,onSaveFilter:h,onScreenSelect:r,editedFolderId:n.folderId}),function(l,i){const c={[o.MT.PrivacyPhoneNumber]:ya.includes(i),[o.MT.PrivacyLastSeen]:Sa.includes(i),[o.MT.PrivacyProfilePhoto]:ka.includes(i),[o.MT.PrivacyForwarding]:wa.includes(i),[o.MT.PrivacyGroupChats]:Na.includes(i)},h=fa.includes(i),Z=ba.includes(i),P=Ia.includes(i)||h||Object.keys(c).includes(i.toString())||Object.values(c).find((e=>!0===e));switch(t){case o.MT.Main:return a.ZP.createElement(Jt,{onScreenSelect:r,isActive:e,onReset:u});case o.MT.EditProfile:return a.ZP.createElement(Qt,{onScreenSelect:r,isActive:e&&l,onReset:u});case o.MT.General:return a.ZP.createElement(wn,{onScreenSelect:r,isActive:l||i===o.MT.GeneralChatBackgroundColor||i===o.MT.GeneralChatBackground||P||Z,onReset:u});case o.MT.Notifications:return a.ZP.createElement(Vn,{onScreenSelect:r,isActive:l,onReset:u});case o.MT.DataStorage:return a.ZP.createElement(nn,{onScreenSelect:r,isActive:l,onReset:u});case o.MT.Privacy:return a.ZP.createElement(jn,{onScreenSelect:r,isActive:l||P||h,onReset:u});case o.MT.Language:return a.ZP.createElement(Kn,{onScreenSelect:r,isActive:l,onReset:u});case o.MT.GeneralChatBackground:return a.ZP.createElement(xn,{onScreenSelect:r,isActive:l||i===o.MT.GeneralChatBackgroundColor,onReset:u});case o.MT.GeneralChatBackgroundColor:return a.ZP.createElement(_n,{onScreenSelect:r,isActive:l,onReset:u});case o.MT.PrivacyActiveSessions:return a.ZP.createElement(ta,{onScreenSelect:r,isActive:l,onReset:u});case o.MT.PrivacyBlockedUsers:return a.ZP.createElement(sa,{onScreenSelect:r,isActive:l,onReset:u});case o.MT.PrivacyPhoneNumber:case o.MT.PrivacyLastSeen:case o.MT.PrivacyProfilePhoto:case o.MT.PrivacyForwarding:case o.MT.PrivacyGroupChats:return a.ZP.createElement(Wn,{screen:t,onScreenSelect:r,isActive:l||c[t],onReset:u});case o.MT.PrivacyPhoneNumberAllowedContacts:case o.MT.PrivacyLastSeenAllowedContacts:case o.MT.PrivacyProfilePhotoAllowedContacts:case o.MT.PrivacyForwardingAllowedContacts:case o.MT.PrivacyGroupChatsAllowedContacts:return a.ZP.createElement(Ea,{isAllowList:!0,screen:t,onScreenSelect:r,isActive:l||c[t],onReset:u});case o.MT.PrivacyPhoneNumberDeniedContacts:case o.MT.PrivacyLastSeenDeniedContacts:case o.MT.PrivacyProfilePhotoDeniedContacts:case o.MT.PrivacyForwardingDeniedContacts:case o.MT.PrivacyGroupChatsDeniedContacts:return a.ZP.createElement(Ea,{screen:t,onScreenSelect:r,isActive:l,onReset:u});case o.MT.Folders:case o.MT.FoldersCreateFolder:case o.MT.FoldersEditFolder:case o.MT.FoldersEditFolderFromChatList:case o.MT.FoldersIncludedChats:case o.MT.FoldersIncludedChatsFromChatList:case o.MT.FoldersExcludedChats:case o.MT.FoldersExcludedChatsFromChatList:return a.ZP.createElement(Pn,{currentScreen:t,shownScreen:i,state:n,dispatch:s,isActive:l,onScreenSelect:r,onReset:u});case o.MT.TwoFaDisabled:case o.MT.TwoFaNewPassword:case o.MT.TwoFaNewPasswordConfirm:case o.MT.TwoFaNewPasswordHint:case o.MT.TwoFaNewPasswordEmail:case o.MT.TwoFaNewPasswordEmailCode:case o.MT.TwoFaCongratulations:case o.MT.TwoFaEnabled:case o.MT.TwoFaChangePasswordCurrent:case o.MT.TwoFaChangePasswordNew:case o.MT.TwoFaChangePasswordConfirm:case o.MT.TwoFaChangePasswordHint:case o.MT.TwoFaTurnOff:case o.MT.TwoFaRecoveryEmailCurrentPassword:case o.MT.TwoFaRecoveryEmail:case o.MT.TwoFaRecoveryEmailCode:return a.ZP.createElement(ga,{currentScreen:t,state:d,dispatch:m,shownScreen:i,isActive:l,onScreenSelect:r,onReset:u});default:return}}(l,c))}return a.ZP.createElement(L.Z,{id:"Settings",name:c?"none":i.s0,activeKey:t,renderCount:Ca},Z)})),Ta=(0,z.P2)((e=>e()),6e4,!0),Fa=(0,a.X$)((0,s.c$)((e=>{const{userIds:t}=e.contactList||{},{byId:n}=e.users;return{usersById:n,contactIds:t,serverTimeOffset:e.serverTimeOffset}}),((e,t)=>(0,h.ei)(t,["loadContactList","openChat"])))((({isActive:e,onReset:t,filter:n,usersById:s,contactIds:r,loadContactList:o,openChat:l,serverTimeOffset:c})=>{(0,a.d4)((()=>{Ta((()=>{o()}))})),(0,T.ZP)(e,t);const d=(0,a.I4)((e=>{l({id:e,shouldReplaceHistory:!0})}),[l]),m=(0,a.Ye)((()=>{if(!r)return;const e=n?r.filter((e=>{const t=s[e];if(!t)return!1;const a=(0,u.Js)(t);return a&&(0,me.Z)(a,n)})):r;return(0,u.Z0)(e,s,void 0,c)}),[r,n,s,c]),[h,Z]=(0,ue.Z)(void 0,m,Boolean(n));return a.ZP.createElement(pe.Z,{items:h,onLoadMore:Z,className:"chat-list custom-scroll"},null!=h&&h.length?h.map((e=>a.ZP.createElement(Ee.Z,{key:e,className:"chat-item-clickable",onClick:()=>d(e),ripple:!i.wB},a.ZP.createElement(fe.Z,{userId:e,forceShowSelf:!0,avatarSize:"large"})))):h&&!h.length?a.ZP.createElement("p",{className:"no-results",key:"no-results",dir:"auto"},n.length?"No contacts matched your search.":"Contact list is empty."):a.ZP.createElement(Pe.Z,{key:"loading"}))}))),Aa=(0,z.P2)((e=>e()),6e4,!0),La=(0,a.X$)((0,s.c$)((e=>{const{userIds:t}=e.contactList||{},{byId:n}=e.users,{byId:a}=e.chats,{currentUserId:s}=e,{query:r,fetchingStatus:o,globalResults:l,localResults:i}=e.globalSearch,{userIds:c}=l||{},{userIds:d}=i||{};return{currentUserId:s,usersById:n,chatsById:a,localContactIds:t,searchQuery:r,isSearching:null==o?void 0:o.chats,globalUserIds:c,localUserIds:d}}),((e,t)=>(0,h.ei)(t,["loadContactList","setGlobalSearchQuery"])))((({isChannel:e,isActive:t,selectedMemberIds:n,onSelectedMemberIdsChange:s,onNextStep:r,onReset:o,currentUserId:l,usersById:i,chatsById:c,localContactIds:d,searchQuery:m,isSearching:Z,localUserIds:P,globalUserIds:g,loadContactList:v,setGlobalSearchQuery:p})=>{(0,a.d4)((()=>{Aa((()=>{v()}))}));const E=(0,M.Z)();(0,T.ZP)(t,o);const C=(0,a.I4)((e=>{p({query:e})}),[p]),f=(0,a.Ye)((()=>{const e=d?(0,u.ih)(d.filter((e=>e!==l)),c):[];if(!m)return e;const t=e.filter((e=>{const t=i[e];if(!t)return!1;const n=(0,u.Js)(t);return n&&(0,me.Z)(n,m)}));return(0,u.ih)((0,h.Tw)([...t,...P||[],...g||[]]).filter((e=>{const t=i[e];return!t||!(0,u.cS)(t)||t.canBeInvitedToGroup})),c,!1,n)}),[d,c,m,P,g,n,l,i]),b=(0,a.I4)((()=>{(n.length||e)&&(p({query:""}),r())}),[n.length,e,p,r]);return a.ZP.createElement("div",{className:"NewChat step-1"},a.ZP.createElement("div",{className:"left-header"},a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent",onClick:o,ariaLabel:"Return to Chat List"},a.ZP.createElement("i",{className:"icon-arrow-left"})),a.ZP.createElement("h3",null,E("GroupAddMembers"))),a.ZP.createElement("div",{className:"NewChat-inner step-1"},a.ZP.createElement(va.Z,{itemIds:f,selectedIds:n,filterValue:m,filterPlaceholder:E("SendMessageTo"),searchInputId:"new-group-picker-search",isLoading:Z,onSelectedIdsChange:s,onFilterChange:C}),a.ZP.createElement(Xt.Z,{isShown:Boolean(n.length||e),onClick:b,ariaLabel:e?"Continue To Channel Info":"Continue To Group Info"},a.ZP.createElement("i",{className:"icon-arrow-right"}))))}))),Ra=(0,a.X$)((0,s.c$)((e=>{const{progress:t,error:n}=e.chatCreation||{};return{creationProgress:t,creationError:n}}),((e,t)=>(0,h.ei)(t,["createGroupChat","createChannel"])))((({isChannel:e,isActive:t,memberIds:n,onReset:s,creationProgress:r,creationError:l,createGroupChat:i,createChannel:c})=>{const d=(0,M.Z)();(0,T.ZP)(t,s);const[m,u]=(0,a.eJ)(""),[h,Z]=(0,a.eJ)(""),[P,g]=(0,a.eJ)(),[v,p]=(0,a.eJ)(),E="Chat title can't be empty",C="Channel title can't be empty",f="Sorry, creating supergroups is not yet supported",b=r===o.Nh.InProgress,I=(0,a.I4)((e=>{const{value:t}=e.currentTarget,n=t.replace(/^\s+/,"");u(n),n!==t&&(e.currentTarget.value=n)}),[]),y=(0,a.I4)((e=>{Z(e.currentTarget.value)}),[]),S=(0,a.I4)((()=>{m.length?n.length>199?p(f):i({title:m,photo:P,memberIds:n}):p(E)}),[m,n,i,P,E,f]),k=(0,a.I4)((()=>{m.length?c({title:m,about:h,photo:P,memberIds:n}):p(C)}),[m,c,h,P,n,C]);(0,a.d4)((()=>{r===o.Nh.Complete&&s(!0)}),[r,s]);const w=l&&d(l)||(v!==E&&v!==C?v:void 0);return a.ZP.createElement("div",{className:"NewChat"},a.ZP.createElement("div",{className:"left-header"},a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent",onClick:()=>s(),ariaLabel:"Return to member selection"},a.ZP.createElement("i",{className:"icon-arrow-left"})),a.ZP.createElement("h3",null,d(e?"NewChannel":"NewGroup"))),a.ZP.createElement("div",{className:"NewChat-inner step-2"},a.ZP.createElement(zt.Z,{onChange:g,title:d("AddPhoto")}),a.ZP.createElement(ve.Z,{value:m,onChange:I,label:d(e?"EnterChannelName":"GroupName"),error:v===E||v===C?v:void 0}),e&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(ve.Z,{value:h,onChange:y,label:d("DescriptionOptionalPlaceholder")}),a.ZP.createElement("p",{className:"note"},d("DescriptionInfo"))),w&&a.ZP.createElement("p",{className:"error"},w),n.length>0&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("h3",{className:"chat-members-heading"},d("GroupInfo.ParticipantCount",n.length,"i")),a.ZP.createElement("div",{className:"chat-members-list custom-scroll"},n.map((e=>a.ZP.createElement(Ee.Z,{inactive:!0,className:"chat-item-clickable"},a.ZP.createElement(fe.Z,{userId:e}))))))),a.ZP.createElement(Xt.Z,{isShown:0!==m.length,onClick:e?k:S,disabled:b,ariaLabel:e?d("ChannelIntro.CreateChannel"):"Create Group"},b?a.ZP.createElement(F.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-arrow-right"})))}))),Ba=Object.keys(o.du).length/2,$a=(0,a.X$)((({isActive:e,isChannel:t=!1,content:n,onContentChange:s,onReset:r})=>{const[l,c]=(0,a.eJ)([]),d=(0,a.I4)((()=>{s(t?o.du.NewChannelStep2:o.du.NewGroupStep2)}),[t,s]);return a.ZP.createElement(L.Z,{id:"NewChat",name:i.s0,renderCount:Ba,activeKey:n},(s=>{switch(n){case o.du.NewChannelStep1:case o.du.NewGroupStep1:return a.ZP.createElement(La,{isChannel:t,isActive:e,selectedMemberIds:l,onSelectedMemberIdsChange:c,onNextStep:d,onReset:r});case o.du.NewChannelStep2:case o.du.NewGroupStep2:return a.ZP.createElement(Ra,{isChannel:t,isActive:s&&e,memberIds:l,onReset:r});default:return}}))}));var Da=n(1080);const Ua=(0,a.X$)((({isActive:e,onReset:t,onContentChange:n})=>{const s=(0,M.Z)();return(0,T.ZP)(e,t,n,o.du.Archived),a.ZP.createElement("div",{className:"ArchivedChats"},a.ZP.createElement("div",{className:"left-header"},a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent",onClick:t,ariaLabel:"Return to chat list"},a.ZP.createElement("i",{className:"icon-arrow-left"})),a.ZP.createElement("h3",null,s("ArchivedChats"))),a.ZP.createElement(Da.Z,{folderType:"archived",isActive:e}))}));var Oa=n(1218);const xa=(0,a.X$)((0,s.c$)((e=>{const{byId:t,orderedIds:n}=e.chatFolders;return{foldersById:t,folderOrderedIds:n}}),((e,t)=>(0,h.ei)(t,["editChatFolders"])))((({isOpen:e,chatId:t,foldersById:n,folderOrderedIds:s,onClose:r,onCloseAnimationEnd:o,editChatFolders:l})=>{const i=(0,M.Z)(),c=(0,a.Ye)((()=>n?Object.keys(n).reduce(((e,a)=>{const{includedChatIds:s,pinnedChatIds:r}=n[Number(a)];return(s.includes(t)||null!=r&&r.includes(t))&&e.push(a),e}),[]):[]),[t,n]),[d,m]=(0,a.eJ)(c),u=(0,a.Ye)((()=>(null==s?void 0:s.map((e=>({label:n?n[e].title:"",value:String(e)}))))||[]),[s,n]),h=(0,a.I4)((()=>{const e=c.filter((e=>!d.includes(e))),n=d.filter((e=>!c.includes(e)));l({chatId:t,idsToRemove:e,idsToAdd:n}),r()}),[t,l,c,r,d]);if(n&&s)return a.ZP.createElement(ge.Z,{isOpen:e,onClose:r,onCloseAnimationEnd:o,onEnter:h,className:"delete",title:i("FilterAddTo")},a.ZP.createElement(Oa.Z,{options:u,selected:d,onChange:m,round:!0}),a.ZP.createElement(R.Z,{color:"primary",className:"confirm-dialog-button",isText:!0,onClick:h},i("FilterAddTo")),a.ZP.createElement(R.Z,{className:"confirm-dialog-button",isText:!0,onClick:r},i("Cancel")))})));var Ga=n(647),Ja=n(4319);function za(e){return e?"lng_context_copy_selected":"lng_context_copy_text"}let Xa;const _a={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},Ya=e=>{const t="deltaY"in e?e.deltaY:(e=>"changedTouches"in e?e.changedTouches[0].clientY:0)(e);(!Xa||!Xa.contains(e.target)||Xa.scrollTop<=0&&t<=0||Xa.scrollTop>=Xa.scrollHeight-Xa.offsetHeight&&t>=0)&&e.preventDefault()};function Ha(e){_a[e.key]&&!function(e){if(!(e&&e instanceof HTMLElement))return!1;const t=e,n=t.tagName.toLowerCase();if("textarea"===n)return!0;if("input"!==n)return!1;const a=t.getAttribute("type");return!!a&&["text","password","number","email","tel","url","search","date","datetime","datetime-local","time","month","week"].indexOf(a.toLowerCase())>-1}(e.target)&&e.preventDefault()}function Va(e){Xa=e,document.addEventListener("wheel",Ya,{passive:!1}),document.addEventListener("touchmove",Ya,{passive:!1}),document.onkeydown=Ha}function ja(){Xa=void 0,document.removeEventListener("wheel",Ya),document.removeEventListener("touchmove",Ya),document.onkeydown=null}var Ka=n(3394),qa=n(2328);const Wa=({isOpen:e,message:t,anchor:n,canSendNow:s,canReschedule:o,canReply:l,canEdit:i,canPin:c,canUnpin:d,canDelete:m,canReport:h,canForward:Z,canFaveSticker:P,canUnfaveSticker:g,canCopy:v,canCopyLink:p,canSelect:E,canDownload:C,isDownloading:f,onReply:b,onEdit:I,onPin:y,onUnpin:S,onForward:k,onDelete:w,onReport:N,onFaveSticker:T,onUnfaveSticker:F,onSelect:A,onSend:L,onReschedule:R,onClose:B,onCloseAnimationEnd:$,onCopyLink:D,onDownload:U})=>{const O=(0,a.sO)(null),G=function(e,t,n){const a=[],s=(0,u.UD)(e),o=(0,u.O$)(e)||((0,u.Cg)(e)?void 0:(0,u.F$)(e)),l=(0,u.Ti)(e,"inline"),i=o&&(l||(0,u.BM)(e))&&Ja.yl,c=window.getSelection();if(i&&a.push({label:"lng_context_copy_image",handler:()=>{Promise.resolve(l?Ga.he(l,r.IU.BlobUrl):o.blobUrl).then(Ja.VP),t&&t()}}),s){var d;const e=Boolean((null==c||null===(d=c.anchorNode)||void 0===d?void 0:d.parentNode)&&c.anchorNode.parentNode.closest(".Message .content-inner")&&""!==c.toString().replace(/(?:\r\n|\r|\n)/g,""));a.push({label:za(e),handler:()=>{const n=e&&c?c.toString():s;(0,Ja.TE)(n),t&&t()}})}return n&&a.push({label:"lng_context_copy_message_link",handler:()=>{n(),t&&t()}}),a}(t,B,p?D:void 0),J=(0,a.I4)((()=>document.querySelector(`.active > .MessageList div[data-message-id="${t.id}"]`)),[t.id]),z=(0,a.I4)((()=>document.querySelector(".active > .MessageList")),[]),X=(0,a.I4)((()=>document.querySelector(".MessageContextMenu .bubble")),[]),{positionX:_,positionY:Y,style:H,menuStyle:V,withScroll:j}=(0,Ka.Z)(n,J,z,X,10,document.querySelector(".MiddleHeader").offsetHeight);(0,a.d4)((()=>(Va(j?O.current:void 0),ja)),[j]);const K=(0,M.Z)();return a.ZP.createElement(qa.Z,{ref:O,isOpen:e,positionX:_,positionY:Y,style:H,menuStyle:V,className:"MessageContextMenu fluid",onClose:B,onCloseAnimationEnd:$},s&&a.ZP.createElement(x.Z,{icon:"send-outline",onClick:L},K("MessageScheduleSend")),o&&a.ZP.createElement(x.Z,{icon:"schedule",onClick:R},K("MessageScheduleEditTime")),l&&a.ZP.createElement(x.Z,{icon:"reply",onClick:b},K("Reply")),i&&a.ZP.createElement(x.Z,{icon:"edit",onClick:I},K("Edit")),P&&a.ZP.createElement(x.Z,{icon:"favorite",onClick:T},K("AddToFavorites")),g&&a.ZP.createElement(x.Z,{icon:"favorite",onClick:F},K("Stickers.RemoveFromFavorites")),v&&G.map((e=>a.ZP.createElement(x.Z,{key:e.label,icon:"copy",onClick:e.handler},K(e.label)))),c&&a.ZP.createElement(x.Z,{icon:"pin",onClick:y},K("DialogPin")),d&&a.ZP.createElement(x.Z,{icon:"unpin",onClick:S},K("DialogUnpin")),C&&a.ZP.createElement(x.Z,{icon:"download",onClick:U},K(f?"lng_context_cancel_download":"lng_media_download")),Z&&a.ZP.createElement(x.Z,{icon:"forward",onClick:k},K("Forward")),E&&a.ZP.createElement(x.Z,{icon:"select",onClick:A},K("Common.Select")),h&&a.ZP.createElement(x.Z,{icon:"flag",onClick:N},K("lng_context_report_msg")),m&&a.ZP.createElement(x.Z,{destructive:!0,icon:"delete",onClick:w},K("Delete")))},Qa=(0,a.X$)((0,s.c$)(((e,{message:t,messageListType:n})=>{const{threadId:a}=(0,m.Bt)(e)||{},s=(0,m.xs)(e,t.chatId),{noOptions:r,canReply:o,canPin:l,canUnpin:i,canDelete:c,canReport:d,canEdit:u,canForward:h,canFaveSticker:Z,canUnfaveSticker:P,canCopy:g,canCopyLink:v,canSelect:p,canDownload:E}=a&&(0,m._k)(e,t,a)||{},C="pinned"===n,f="scheduled"===n;return{noOptions:r,canSendNow:f,canReschedule:f,canReply:!C&&!f&&o,canPin:!f&&l,canUnpin:!f&&i,canDelete:c,canReport:d,canEdit:!C&&u,canForward:!f&&h,canFaveSticker:!f&&Z,canUnfaveSticker:!f&&P,canCopy:g,canCopyLink:!f&&v,canSelect:p,canDownload:E,activeDownloads:s}}),((e,t)=>(0,h.ei)(t,["setReplyingToId","setEditingId","pinMessage","openForwardMenu","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","downloadMessageMedia","cancelMessageMediaDownload"])))((({isOpen:e,messageListType:t,chatUsername:n,message:s,album:r,anchor:o,onClose:l,onCloseAnimationEnd:i,noOptions:c,canSendNow:d,canReschedule:m,canReply:u,canPin:h,canUnpin:Z,canDelete:P,canReport:g,canEdit:v,canForward:p,canFaveSticker:E,canUnfaveSticker:C,canCopy:f,canCopyLink:b,canSelect:I,canDownload:y,activeDownloads:S,setReplyingToId:k,setEditingId:w,pinMessage:N,openForwardMenu:M,faveSticker:T,unfaveSticker:F,toggleMessageSelection:A,sendScheduledMessages:L,rescheduleMessage:R,downloadMessageMedia:$,cancelMessageMediaDownload:D})=>{const{transitionClassNames:U}=(0,Y.Z)(e,i,void 0,!1),[O,x]=(0,a.eJ)(!0),[G,J]=(0,a.eJ)(!1),[z,X]=(0,a.eJ)(!1),[_,H]=(0,a.eJ)(!1),[V,j,K]=(0,Le.Z)(),q=r?r.messages.some((e=>S.includes(e.id))):S.includes(s.id),W=(0,a.I4)((()=>{x(!1),J(!0)}),[]),Q=(0,a.I4)((()=>{x(!1),X(!0)}),[]),ee=(0,a.I4)((()=>{x(!1),l()}),[l]),te=(0,a.I4)((()=>{J(!1),l()}),[l]),ne=(0,a.I4)((()=>{X(!1),l()}),[l]),ae=(0,a.I4)((()=>{H(!1),l()}),[l]),se=(0,a.I4)((()=>{K(),l()}),[K,l]),re=(0,a.I4)((()=>{k({messageId:s.id}),ee()}),[k,s.id,ee]),oe=(0,a.I4)((()=>{w({messageId:s.id}),ee()}),[w,s.id,ee]),le=(0,a.I4)((()=>{x(!1),H(!0)}),[]),ie=(0,a.I4)((()=>{N({messageId:s.id,isUnpin:!0}),ee()}),[N,s.id,ee]),ce=(0,a.I4)((()=>{if(ee(),null!=r&&r.messages){const e=r.messages.map((({id:e})=>e));M({fromChatId:s.chatId,messageIds:e})}else M({fromChatId:s.chatId,messageIds:[s.id]})}),[M,s,ee,r]),de=(0,a.I4)((()=>{ee(),T({sticker:s.content.sticker})}),[ee,s.content.sticker,T]),me=(0,a.I4)((()=>{ee(),F({sticker:s.content.sticker})}),[ee,s.content.sticker,F]),ue=(0,a.I4)((()=>{const e=null!=r&&r.messages?{messageId:s.id,childMessageIds:r.messages.map((({id:e})=>e)),withShift:!1}:{messageId:s.id,withShift:!1};A(e),ee()}),[ee,s.id,A,r]),he=(0,a.I4)((()=>{L({chatId:s.chatId,id:s.id}),ee()}),[ee,s.chatId,s.id,L]),Ze=(0,a.I4)((()=>{x(!1),j()}),[j]),Pe=(0,a.I4)((e=>{R({chatId:s.chatId,messageId:s.id,scheduledAt:Math.round(e.getTime()/1e3)})}),[s.chatId,s.id,R]),ge=(0,a.I4)((()=>{(0,Ja.TE)(`https://t.me/${n||`c/${s.chatId.replace("-","")}`}/${s.id}`),ee()}),[n,ee,s.chatId,s.id]),ve=(0,a.I4)((()=>{((null==r?void 0:r.messages)||[s]).forEach((e=>{q?D({message:e}):$({message:e})})),ee()}),[r,s,ee,q,D,$]),pe=(0,a.Ye)((()=>(r?r.messages:[s]).map((({id:e})=>e))),[r,s]);if(c)return void ee();const Ee=new Date;return Ee.setFullYear(Ee.getFullYear()+1),a.ZP.createElement("div",{className:["ContextMenuContainer",U].join(" ")},a.ZP.createElement(Wa,{message:s,isOpen:O,anchor:o,canSendNow:d,canReschedule:m,canReply:u,canDelete:P,canReport:g,canPin:h,canUnpin:Z,canEdit:v,canForward:p,canFaveSticker:E,canUnfaveSticker:C,canCopy:f,canCopyLink:b,canSelect:I,canDownload:y,isDownloading:q,onReply:re,onEdit:oe,onPin:le,onUnpin:ie,onForward:ce,onDelete:W,onReport:Q,onFaveSticker:de,onUnfaveSticker:me,onSelect:ue,onSend:he,onReschedule:Ze,onClose:ee,onCopyLink:ge,onDownload:ve}),a.ZP.createElement(xe,{isOpen:G,isSchedule:"scheduled"===t,onClose:te,album:r,message:s}),a.ZP.createElement(Ye,{isOpen:z,onClose:ne,messageIds:pe}),a.ZP.createElement(Ge,{isOpen:_,messageId:s.id,chatId:s.chatId,onClose:ae}),a.ZP.createElement(Ue,{isOpen:V,withTimePicker:!0,selectedAt:1e3*s.date,maxAt:(0,B._F)(Ee),isFutureMode:!0,onClose:se,onSubmit:Pe}))}))),es=(0,a.X$)((0,s.c$)(((e,{fromSticker:t,stickerSetShortName:n})=>{const a=(0,m.Bt)(e),{chatId:s,threadId:r}=a||{},o=s&&(0,m.Z1)(e,s),l=o?(0,u.H5)(o):void 0;return{canSendStickers:Boolean(o&&r&&(0,u.Qm)(o,r)&&(null==l?void 0:l.canSendStickers)),stickerSet:t?(0,m.Ny)(e,t.stickerSetId):n?(0,m.E_)(e,n):void 0}}),((e,t)=>(0,h.ei)(t,["loadStickers","toggleStickerSet","sendMessage"])))((({isOpen:e,fromSticker:t,stickerSetShortName:n,stickerSet:s,canSendStickers:r,onClose:o,loadStickers:i,toggleStickerSet:c,sendMessage:d})=>{const m=(0,a.sO)(null),u=(0,M.Z)(),{observe:h}=(0,vn.S1)({rootRef:m,throttleMs:200,isDisabled:!e});(0,a.d4)((()=>{if(e)if(t){const{stickerSetId:e,stickerSetAccessHash:n}=t;i({stickerSetId:e,stickerSetAccessHash:n})}else n&&i({stickerSetShortName:n})}),[e,t,i,n]);const Z=(0,a.I4)((e=>{e={...e,isPreloadedGlobally:!0},d({sticker:e}),o()}),[o,d]),P=(0,a.I4)((()=>{s&&(c({stickerSetId:s.id}),o())}),[o,s,c]);return a.ZP.createElement(ge.Z,{className:"StickerSetModal",isOpen:e,onClose:o,hasCloseButton:!0,title:s?(0,$.Z)(s.title,["emoji","links"]):u("AccDescrStickerSet")},null!=s&&s.stickers?a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("div",{ref:m,className:"stickers custom-scroll"},s.stickers.map((e=>a.ZP.createElement(bn.Z,{sticker:e,size:l.yK,observeIntersection:h,onClick:r?Z:void 0,clickArg:e})))),a.ZP.createElement("div",{className:"button-wrapper"},a.ZP.createElement(R.Z,{size:"smaller",fluid:!0,color:s.installedDate?"danger":"primary",onClick:P},u(s.installedDate?"StickerPack.RemoveStickerCount":"StickerPack.AddStickerCount",s.count,"i")))):a.ZP.createElement(Pe.Z,null))})));var ts=n(2898);const ns=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,m.Z1)(e,t);if(!a||a.isRestricted)return{};const s=(0,u.YC)(a.id),r=s?(0,m.dy)(e,t):void 0,o=r&&(0,u.kw)(r);return{chat:a,isMuted:(0,u.i4)(a,(0,m.dZ)(e),(0,m.NJ)(e)),isPrivate:s,canAddContact:o,canDeleteChat:(0,u.cc)(a),hasLinkedChat:Boolean(null==a||null===(n=a.fullInfo)||void 0===n?void 0:n.linkedChatId)}}),((e,t)=>(0,h.ei)(t,["updateChatMutedState","enterMessageSelectMode","sendBotCommand","restartBot","joinGroupCall","createGroupCall","openLinkedChat","addContact"])))((({chatId:e,isOpen:t,withExtraActions:n,anchor:s,isChannel:r,canStartBot:o,canRestartBot:l,canSubscribe:c,canSearch:d,canMute:m,canLeave:u,canEnterVoiceChat:h,canCreateVoiceChat:Z,chat:P,isPrivate:g,isMuted:v,canDeleteChat:p,hasLinkedChat:E,canAddContact:C,onSubscribeChannel:f,onSearchClick:b,onClose:I,onCloseAnimationEnd:y,updateChatMutedState:S,enterMessageSelectMode:k,sendBotCommand:w,restartBot:N,joinGroupCall:T,createGroupCall:F,openLinkedChat:A,addContact:L})=>{const[R,B]=(0,a.eJ)(!0),[$,D]=(0,a.eJ)(!1),{x:U,y:O}=s;(0,Y.Z)(t,y,void 0,!1);const G=(0,a.I4)((()=>{B(!1),D(!0)}),[]),J=(0,a.I4)((()=>{B(!1),I()}),[I]),z=(0,a.I4)((()=>{D(!1),I()}),[I]),X=(0,a.I4)((()=>{w({command:"/start"})}),[w]),_=(0,a.I4)((()=>{N({chatId:e})}),[e,N]),H=(0,a.I4)((()=>{S({chatId:e,isMuted:!v}),J()}),[e,J,v,S]),V=(0,a.I4)((()=>{Z?F({chatId:e}):T({chatId:e}),J()}),[J,Z,e,T,F]),j=(0,a.I4)((()=>{A({id:e}),J()}),[e,J,A]),K=(0,a.I4)((()=>{L({userId:e}),J()}),[L,e,J]),q=(0,a.I4)((()=>{f(),J()}),[J,f]),W=(0,a.I4)((()=>{b(),J()}),[J,b]),Q=(0,a.I4)((()=>{k(),J()}),[J,k]);(0,a.d4)((()=>(Va(),ja)),[]);const ee=(0,M.Z)();return a.ZP.createElement(ts.Z,null,a.ZP.createElement("div",{className:"HeaderMenuContainer"},a.ZP.createElement(qa.Z,{isOpen:R,positionX:"right",style:`left: ${U}px;top: ${O}px;`,onClose:J},n&&o&&a.ZP.createElement(x.Z,{icon:"bots",onClick:X},ee("BotStart")),n&&l&&a.ZP.createElement(x.Z,{icon:"bots",onClick:_},ee("BotRestart")),n&&c&&a.ZP.createElement(x.Z,{icon:r?"channel":"group",onClick:q},ee(r?"ProfileJoinChannel":"ProfileJoinGroup")),C&&a.ZP.createElement(x.Z,{icon:"add-user",onClick:K},ee("AddContact")),i.wB&&d&&a.ZP.createElement(x.Z,{icon:"search",onClick:W},ee("Search")),m&&a.ZP.createElement(x.Z,{icon:v?"unmute":"mute",onClick:H},ee(v?"ChatsUnmute":"ChatsMute")),(h||Z)&&a.ZP.createElement(x.Z,{icon:"voice-chat",onClick:V},ee(Z?"StartVoipChat":"VoipGroupJoinCall")),E&&a.ZP.createElement(x.Z,{icon:r?"comments":"channel",onClick:j},ee(r?"ViewDiscussion":"lng_profile_view_channel")),a.ZP.createElement(x.Z,{icon:"select",onClick:Q},ee("ReportSelectMessages")),u&&a.ZP.createElement(x.Z,{destructive:!0,icon:"delete",onClick:G},ee(g?"DeleteChatUser":p?"GroupInfo.DeleteAndExit":r?"LeaveChannel":"Group.LeaveGroup"))),P&&a.ZP.createElement(We.Z,{isOpen:$,onClose:z,chat:P})))})));var as=n(9589);const ss=(0,z.Ds)((e=>e()),200,!1),rs=(0,a.X$)((0,s.c$)((e=>{const t=(0,m.jr)(e);if(!t)return{};const{query:n,results:a}=(0,m.n5)(e)||{},{totalCount:s,foundIds:r}=a||{};return{chat:t,query:n,totalCount:s,foundIds:r,isHistoryCalendarOpen:Boolean(e.historyCalendarSelectedAt)}}),((e,t)=>(0,h.ei)(t,["setLocalTextSearchQuery","searchTextMessagesLocal","focusMessage","closeLocalTextSearch","openHistoryCalendar"])))((({isActive:e,chat:t,query:n,totalCount:s,foundIds:r,isHistoryCalendarOpen:o,setLocalTextSearchQuery:l,searchTextMessagesLocal:i,focusMessage:c,closeLocalTextSearch:d,openHistoryCalendar:m})=>{const u=(0,a.sO)(null),[h,Z]=(0,a.eJ)(0);(0,a.d4)((()=>{const{visualViewport:e}=window;if(!e)return;const t=document.getElementById("Main"),n=()=>{const{activeElement:n}=document;if(n&&n===u.current){const{pageTop:n,height:a}=e;t.style.transform=`translateY(${n}px)`,t.style.height=`${a}px`,document.documentElement.scrollTop=n}else t.style.transform="",t.style.height=""};return e.addEventListener("resize",n),()=>{e.removeEventListener("resize",n)}}),[]),(0,a.d4)((()=>{t&&r&&r.length?(c({chatId:t.id,messageId:r[r.length-1]}),Z(0)):Z(-1)}),[t,c,r]),(0,a.d4)((()=>{Array.from(document.querySelectorAll("input")).forEach((t=>{t.disabled=Boolean(e&&t!==u.current)})),Array.from(document.querySelectorAll("div[contenteditable]")).forEach((t=>{t.contentEditable=e?"false":"true"}))}),[e]),(0,a.d4)((()=>{e||u.current.blur()}),[e]),(0,a.bt)((()=>{document.querySelector("#MobileSearch input").blur()}),[o]);const P=(0,a.I4)((e=>{l({query:e}),e.length&&ss(i)}),[i,l]),g=(0,a.I4)((()=>{if(t&&r){const e=h+1;c({chatId:t.id,messageId:r[r.length-1-e]}),Z(e)}}),[t,h,c,r]),v=(0,a.I4)((()=>{if(t&&r){const e=h-1;c({chatId:t.id,messageId:r[r.length-1-e]}),Z(e)}}),[t,h,c,r]);return a.ZP.createElement("div",{id:"MobileSearch",className:e?"active":""},a.ZP.createElement("div",{className:"header"},a.ZP.createElement(R.Z,{size:"smaller",round:!0,color:"translucent",onClick:d},a.ZP.createElement("i",{className:"icon-arrow-left"})),a.ZP.createElement(as.Z,{ref:u,value:n,onChange:P})),a.ZP.createElement("div",{className:"footer"},a.ZP.createElement("div",{className:"counter"},n?null!=r&&r.length?`${h+1} of ${s}`:r&&!r.length?"No results":"":a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent",onClick:()=>m({selectedAt:(0,B._F)(Date.now())}),ariaLabel:"Search messages by date"},a.ZP.createElement("i",{className:"icon-calendar"}))),a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent",onClick:g,disabled:!r||!r.length||h===r.length-1},a.ZP.createElement("i",{className:"icon-up"})),a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent",onClick:v,disabled:!r||!r.length||0===h},a.ZP.createElement("i",{className:"icon-down"}))))})));var os=n(5376),ls=n(2365),is=n(8353),cs=n(7002),ds=n(3616);function ms(e,t,n=0,a=!1,s=!1,r=!1){const o=e[r?"scrollLeft":"scrollTop"],l=o+e[r?"offsetWidth":"offsetHeight"],i="string"==typeof t?e.querySelectorAll(t):t,{length:c}=i,d=[];let m=!1;for(let e=0;e=o-n&&u<=l+n:c<=l+n&&u>=o-n)d.push(e),m=!0;else if(m&&!a)break}return{allElements:i,visibleIndexes:d}}const us=function(e,t,n=!1){const a=e[n?"scrollLeft":"scrollTop"],s=a+e[n?"offsetWidth":"offsetHeight"],r=t[n?"offsetLeft":"offsetTop"],o=r+t[n?"offsetWidth":"offsetHeight"];return r>a&&os[s.length-1]?"start":"end";(0,hs.Z)(a,r[t],e,10)}}var Ps=n(3570);function gs({isActive:e,isHorizontal:t,shouldSaveSelectionOnUpdateItems:n,shouldRemoveSelectionOnReset:s,noArrowNavigation:r,items:o,shouldSelectOnTab:l,onSelect:i,onClose:c}){const[d,m]=(0,a.eJ)(-1),u=(0,a.I4)((e=>o?(0,Ps.Z)(o.length,e):-1),[o]),h=(0,a.I4)(((e,t)=>{t.preventDefault(),m((t=>u(t+e)))}),[m,u]),Z=(0,a.I4)((e=>{if(o&&o.length&&d>-1){const t=o[d];t&&(e.preventDefault(),i(t))}}),[o,i,d]),P=!o||d>o.length-1;return(0,a.d4)((()=>{n&&!P||m(s?-1:0)}),[P,s,n]),(0,a.d4)((()=>e?(0,ze.Z)({onEsc:c,onUp:r||t?void 0:e=>h(-1,e),onDown:r||t?void 0:e=>h(1,e),onLeft:r||!t?void 0:e=>h(-1,e),onRight:r||!t?void 0:e=>h(1,e),onTab:l?Z:void 0,onEnter:Z}):void 0),[r,h,Z,e,t,c,l]),d}const vs=(0,a.X$)((({isOpen:e,onClose:t,onInsertUserName:n,usersById:s,filteredUsers:r})=>{const o=(0,a.sO)(null),{shouldRender:l,transitionClassNames:i}=(0,Y.Z)(e,void 0,void 0,!1),c=(0,a.I4)(((e,t=!1)=>{const a=null==s?void 0:s[e];a&&n(a,t)}),[s,n]),d=(0,a.I4)((e=>{c(e.id,!0)}),[c]),m=gs({isActive:e,items:r,onSelect:d,shouldSelectOnTab:!0,shouldSaveSelectionOnUpdateItems:!0,onClose:t});(0,a.d4)((()=>{Zs(".chat-item-clickable",m,o)}),[m]),(0,a.d4)((()=>{r&&!r.length&&t()}),[r,t]);const u=(0,f.Z)(null!=r&&r.length?r:void 0,l),h=r&&!r.length?u:r;if(!l||h&&!h.length)return;const Z=(0,X.Z)("MentionTooltip composer-tooltip custom-scroll",i);return a.ZP.createElement("div",{className:Z,ref:o},null==h?void 0:h.map((({id:e},t)=>a.ZP.createElement(Ee.Z,{key:e,className:"chat-item-clickable scroll-item",onClick:()=>c(e),focus:m===t},a.ZP.createElement(fe.Z,{userId:e,avatarSize:"small",withUsername:!0})))))}));var ps=n(9830);const Es=(0,a.X$)((({attachments:e,caption:t,isReady:n,currentUserId:s,groupChatMembers:r,usersById:o,recentEmojis:i,baseEmojiKeywords:c,emojiKeywords:d,addRecentEmoji:m,onCaptionUpdate:u,onSend:h,onFileAppend:Z,onClear:g})=>{const v=(0,a.sO)(null),p=(0,f.Z)(e),E=e.length?e:p,C=Boolean(e.length),[b,I,y]=(0,Le.Z)(),S=Boolean(E&&E.every((e=>e.quick))),k=(0,M.Z)(),{isMentionTooltipOpen:w,closeMentionTooltip:N,insertMention:T,mentionFilteredUsers:F}=(0,ls.Z)(C,t,u,l.nY,r,void 0,s,o),{isEmojiTooltipOpen:A,closeEmojiTooltip:L,filteredEmojis:B,insertEmoji:$}=(0,is.Z)(C,t,i,l.nY,u,c,d,!n);(0,a.d4)((()=>C?(0,P.Z)(g):void 0),[C,g]);const D=(0,a.I4)((()=>{C&&h()}),[C,h]),U=(0,a.I4)((e=>{e.preventDefault(),y();const{dataTransfer:{files:t}}=e;if(null!=t&&t.length){const e=S?Array.from(t).filter((e=>e.type&&l.dI.has(e.type))):Array.from(t);Z(e,S)}}),[S,Z,y]);if(!E)return;const O=E.every((e=>l.oG.has(e.mimeType))),x=E.every((e=>l.wG.has(e.mimeType))),G=E.every((e=>e.mimeType.startsWith("audio/")));let J="";return J=k(O?"PreviewSender.SendPhoto":x?"PreviewSender.SendVideo":G?"PreviewSender.SendAudio":"PreviewSender.SendFile",E.length,"i"),a.ZP.createElement(ge.Z,{isOpen:C,onClose:g,header:function(){if(E)return a.ZP.createElement("div",{className:"modal-header-condensed",dir:k.isRtl?"rtl":void 0},a.ZP.createElement(R.Z,{round:!0,color:"translucent",size:"smaller",ariaLabel:"Cancel attachments",onClick:g},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement("div",{className:"modal-title"},J),a.ZP.createElement(R.Z,{color:"primary",size:"smaller",className:"modal-action-button",onClick:D},k("Send")))}(),className:"AttachmentModal "+(b?"hovered":"")},a.ZP.createElement("div",{className:"drop-target",onDragEnter:I,onDrop:U,onDragOver:function(e){e.preventDefault(),e.stopPropagation(),v.current&&window.clearTimeout(v.current)},onDragLeave:e=>{const{relatedTarget:t,target:n}=e;n.matches(".drop-target")&&!t&&(v.current=window.setTimeout(y,150)),n&&n.closest(".AttachmentModal.hovered")||(t&&e.stopPropagation(),y())},"data-attach-description":k("Preview.Dragging.AddItems",10)},S?a.ZP.createElement("div",{className:"media-wrapper custom-scroll"},E.map((e=>e.mimeType.startsWith("image/")?a.ZP.createElement("img",{src:e.blobUrl,alt:""}):a.ZP.createElement("video",{src:e.blobUrl,autoPlay:!0,muted:!0,loop:!0})))):a.ZP.createElement("div",{className:"document-wrapper custom-scroll"},E.map((e=>a.ZP.createElement(cs.Z,{name:e.filename,extension:(0,os.mD)(e.filename,e.mimeType),previewData:e.previewBlobUrl,size:e.size,smaller:!0})))),a.ZP.createElement("div",{className:"attachment-caption-wrapper"},a.ZP.createElement(vs,{isOpen:w,onClose:N,onInsertUserName:T,filteredUsers:F,usersById:o}),a.ZP.createElement(ps.Z,{isOpen:A,emojis:B,onClose:L,onEmojiSelect:$,addRecentEmoji:m}),a.ZP.createElement(ds.Z,{id:"caption-input-text",isAttachmentModalInput:!0,html:t,editableInputId:l.nY,placeholder:k("Caption"),onUpdate:u,onSend:h,shouldSetFocus:Boolean(e.length)}))))}));var Cs=n(3099);const fs=(0,a.X$)((({isOpen:e,onSend:t,onClear:n})=>{const s=(0,a.sO)(null),r=(0,a.sO)(null),o=(0,a.sO)(null),[l,i]=(0,a.eJ)(""),[c,d]=(0,a.eJ)([""]),[m,u]=(0,a.eJ)(!0),[h,Z]=(0,a.eJ)(!1),[g,v]=(0,a.eJ)(!1),[p,E]=(0,a.eJ)(),[C,f]=(0,a.eJ)(),[b,I]=(0,a.eJ)(!1),y=(0,M.Z)(),S=(0,a.I4)((t=>{e&&t.current&&t.current.focus()}),[e]);(0,a.d4)((()=>e?(0,P.Z)(n):void 0),[e,n]),(0,a.d4)((()=>{e||(i(""),d([""]),u(!0),Z(!1),v(!1),E(""),f(""),I(!1))}),[e]),(0,a.d4)((()=>S(s)),[S,e]),(0,a.bt)((()=>{const e=o.current;e&&p!==e.innerHTML&&(e.innerHTML=p)}),[p]);const k=(0,a.I4)(((e=[])=>{d([...e,""]),requestAnimationFrame((()=>{const e=r.current;e&&(e.classList.toggle("overflown",e.scrollHeight>320),e.scrollTo({top:e.scrollHeight,behavior:"smooth"}))}))}),[]),w=(0,a.I4)((()=>{if(I(!1),!e)return;const n=l.trim().substring(0,255),a=c.map((e=>e.trim().substring(0,100))).filter((e=>e.length));if(!n||a.length<2)return i(n),a.length?a.length<2?k(a):d(a):k(),void I(!0);if(g&&(!C||!a[Number(C)]))return void I(!0);const s={summary:{question:n,answers:a.map(((e,t)=>({text:e.trim(),option:String(t),...String(t)===C&&{correct:!0}}))),...!m&&{isPublic:!0},...h&&{multipleChoice:!0},...g&&{quiz:!0}}};if(g){const{text:e,entities:t}=p&&(0,Cs.Z)(p.substring(0,200))||{};s.quiz={correctAnswers:[C],...e&&{solution:e},...t&&{solutionEntities:t}}}t(s)}),[e,l,c,g,C,m,h,t,k,p]),N=(0,a.I4)(((e,t)=>{const n=[...c];n[e]=t,n[n.length-1].trim().length&&n.length<10?k(n):d(n)}),[c,k]),T=(0,a.I4)((e=>{const t=[...c];t.splice(e,1),d(t),requestAnimationFrame((()=>{r.current&&r.current.classList.toggle("overflown",r.current.scrollHeight>320)}))}),[c]),F=(0,a.I4)((e=>{f(e)}),[f]),A=(0,a.I4)((e=>{u(e.target.checked)}),[]),L=(0,a.I4)((e=>{Z(e.target.checked)}),[]),B=(0,a.I4)((e=>{v(e.target.checked)}),[]),$=(0,a.I4)((e=>{13===e.keyCode&&w()}),[w]),D=(0,a.I4)((()=>{if(b&&!l.trim().length)return y("lng_polls_choose_question")}),[b,y,l]),U=(0,a.I4)((e=>{const t=c.map((e=>e.trim())).filter((e=>e.length));if(b&&t.length<2&&!c[e].trim().length)return y("lng_polls_choose_answers")}),[b,y,c]);function O(){return c.map(((e,t)=>a.ZP.createElement("div",{className:"option-wrapper"},a.ZP.createElement(ve.Z,{label:t!==c.length-1||10===c.length?y("OptionHint"):y("CreatePoll.AddOption"),error:U(t),value:e,onChange:e=>N(t,e.currentTarget.value),onKeyPress:$}),t!==c.length-1&&a.ZP.createElement(R.Z,{className:"option-remove-button",round:!0,color:"translucent",size:"smaller",ariaLabel:y("Delete"),onClick:()=>T(t)},a.ZP.createElement("i",{className:"icon-close"})))))}return a.ZP.createElement(ge.Z,{isOpen:e,onClose:n,header:a.ZP.createElement("div",{className:"modal-header-condensed"},a.ZP.createElement(R.Z,{round:!0,color:"translucent",size:"smaller",ariaLabel:"Cancel poll creation",onClick:n},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement("div",{className:"modal-title"},y("NewPoll")),a.ZP.createElement(R.Z,{color:"primary",size:"smaller",className:"modal-action-button",onClick:w},y("Create"))),className:"PollModal"},a.ZP.createElement(ve.Z,{ref:s,label:y("AskAQuestion"),value:l,error:D(),onChange:e=>i(e.currentTarget.value),onKeyPress:$}),a.ZP.createElement("div",{className:"options-divider"}),a.ZP.createElement("div",{className:"options-list custom-scroll",ref:r},a.ZP.createElement("h3",{className:"options-header"},y("PollOptions")),b&&function(){const e=c.map((e=>e.trim())).filter((e=>e.length));return g&&(!C||!e[Number(C)])&&a.ZP.createElement("p",{className:"error"},y("lng_polls_choose_correct"))}(),g?a.ZP.createElement(_e.Z,{name:"correctOption",options:O().map(((e,t)=>({value:String(t),label:e,hidden:t===c.length-1}))),onChange:F}):O()),a.ZP.createElement("div",{className:"options-divider"}),a.ZP.createElement("div",{className:"quiz-mode"},a.ZP.createElement(en.Z,{label:y("PollAnonymous"),checked:m,onChange:A}),a.ZP.createElement(en.Z,{label:y("PollMultiple"),checked:h,disabled:g,onChange:L}),a.ZP.createElement(en.Z,{label:y("PollQuiz"),checked:g,disabled:h,onChange:B}),g&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("h3",{className:"options-header"},y("lng_polls_solution_title")),a.ZP.createElement("div",{ref:o,className:"form-control",contentEditable:!0,dir:"auto",onChange:e=>E(e.currentTarget.innerHTML)}),a.ZP.createElement("div",{className:"note"},y("CreatePoll.ExplanationInfo")))))}));var bs=n(6503),Is=n(4284),ys=n(1367);const Ss=(0,a.X$)((({emoji:e,focus:t,onClick:n})=>{const s=(0,a.I4)((t=>{t.preventDefault(),n(e.native,e.id)}),[e,n]);return a.ZP.createElement("div",{className:"EmojiButton "+(t?"focus":""),onMouseDown:s,title:`:${e.names[0]}:`},i.op?e.native:a.ZP.createElement("img",{src:`./img-apple-64/${e.image}.png`,alt:"",loading:"lazy"}))})),ks=(0,a.X$)((({category:e,index:t,allEmojis:n,observeIntersection:s,shouldRender:r,onEmojiSelect:o})=>{const l=(0,a.sO)(null);(0,vn._N)(l,s);const d=(0,pn.Z)(r),m=(0,M.Z)(),u=i.wB?Math.floor((c.Z.get().width-8)/44):9,h=44*Math.ceil(e.emojis.length/u);return a.ZP.createElement("div",{ref:l,key:e.id,id:`emoji-category-${t}`,className:"symbol-set"},a.ZP.createElement("p",{className:"symbol-set-name",dir:"auto"},m("recent"===e.id?"RecentStickers":`Emoji${t}`)),a.ZP.createElement("div",{className:(0,X.Z)("symbol-set-container",d),style:`height: ${h}px;`,dir:m.isRtl?"rtl":void 0},r&&e.emojis.map((e=>{const t=n[e];if(!t)return;const s="id"in t?t:t[1];return a.ZP.createElement(Ss,{key:s.id,emoji:s,onClick:o})}))))})),ws={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"},Ns=[];let Ms,Ts,Fs;const As=(0,a.X$)((0,s.c$)((e=>(0,h.ei)(e,["recentEmojis"])))((({className:e,onEmojiSelect:t,recentEmojis:s})=>{const r=(0,a.sO)(null),o=(0,a.sO)(null),[c,d]=(0,a.eJ)(),[m,u]=(0,a.eJ)(),[h,Z]=(0,a.eJ)(0),{observe:P}=(0,vn.S1)({rootRef:r,throttleMs:200},(e=>{e.forEach((e=>{const{id:t}=e.target;if(!t||!t.startsWith("emoji-category-"))return;const n=Number(t.replace("emoji-category-",""));Ns[n]=e.isIntersecting}));const t=Ns.map(((e,t)=>({index:t,isIntersecting:e}))).filter((({isIntersecting:e})=>e));t.length&&Z(t[Math.floor(t.length/2)].index)}));(0,tt.Z)(o.current,!i.wB),(0,a.d4)((()=>{if(!c)return;const e=o.current;if(!e)return;const t=42*h-e.offsetWidth/2+21;(0,ys.Z)(e,t)}),[c,h]);const g=(0,M.Z)(),v=(0,a.Ye)((()=>{if(!c)return je.D;const e=[...c];return null!=s&&s.length&&e.unshift({id:"recent",name:g("RecentStickers"),emojis:s}),e}),[c,g,s]);(0,a.d4)((()=>{setTimeout((()=>{const e=()=>{d(Fs.categories),u(Fs.emojis)};Fs?e():async function(){return Ms||(Ms=n.e(501).then(n.t.bind(n,7501,19)),Ts=(await Ms).default,Fs=(0,Is.NM)(Ts)),Ms}().then(e)}),200)}),[]);const p=(0,a.I4)((e=>{Z(e);const t=document.getElementById(`emoji-category-${e}`);(0,hs.Z)(r.current,t,"start",50,800)}),[]),E=(0,a.I4)(((e,n)=>{t(e,n)}),[t]),C=(0,Pt.Z)([],l.kU),f=(0,X.Z)("EmojiPicker",e);return m&&C?a.ZP.createElement("div",{className:f},a.ZP.createElement("div",{ref:o,className:"EmojiPicker-header",dir:g.isRtl?"rtl":""},v.map((function(e,t){const n=ws[e.id];return n&&a.ZP.createElement(R.Z,{className:"symbol-set-button "+(t===h?"activated":""),round:!0,faded:!0,color:"translucent",onClick:()=>p(t),ariaLabel:e.name},a.ZP.createElement("i",{className:n}))}))),a.ZP.createElement("div",{ref:r,className:(0,X.Z)("EmojiPicker-main no-selection",i.$b?"no-scrollbar":"custom-scroll")},v.map(((e,t)=>a.ZP.createElement(ks,{category:e,index:t,allEmojis:m,observeIntersection:P,shouldRender:h>=t-1&&h<=t+1,onEmojiSelect:E}))))):a.ZP.createElement("div",{className:f},a.ZP.createElement(Pe.Z,null))}))),Ls=i.wB?8:16,Rs=(0,a.X$)((({stickerSet:e,loadAndPlay:t,index:n,observeIntersection:s,shouldRender:r,onStickerSelect:o,onStickerUnfave:d})=>{const m=(0,a.sO)(null);(0,vn._N)(m,s);const u=(0,pn.Z)(r),h=i.wB?Math.floor((c.Z.get().width-8)/(l.Q+Ls)):5,Z=Math.ceil(e.count/h)*(l.Q+Ls);return a.ZP.createElement("div",{ref:m,key:e.id,id:`sticker-set-${n}`,className:"symbol-set"},a.ZP.createElement("p",{className:"symbol-set-name"},e.title),a.ZP.createElement("div",{className:(0,X.Z)("symbol-set-container",u),style:`height: ${Z}px;`},r&&e.stickers&&e.stickers.map((n=>a.ZP.createElement(bn.Z,{key:n.id,sticker:n,size:l.Q,observeIntersection:s,noAnimate:!t,onClick:o,clickArg:n,onUnfaveClick:"favorite"===e.id?d:void 0})))))})),Bs=[],$s=(0,a.X$)((0,s.c$)((e=>{const{setsById:t,added:n,recent:a,favorite:s}=e.stickers;return{recentStickers:a.stickers,favoriteStickers:s.stickers,stickerSetsById:t,addedSetIds:n.setIds,shouldPlay:e.settings.byKey.shouldLoopStickers}}),((e,t)=>(0,h.ei)(t,["loadStickerSets","loadRecentStickers","loadFavoriteStickers","loadAddedStickers","addRecentSticker","unfaveSticker"])))((({className:e,loadAndPlay:t,canSendStickers:n,recentStickers:s,favoriteStickers:r,addedSetIds:o,stickerSetsById:c,shouldPlay:d,onStickerSelect:m,loadStickerSets:u,loadRecentStickers:h,loadFavoriteStickers:Z,loadAddedStickers:P,addRecentSticker:g,unfaveSticker:v})=>{const p=(0,a.sO)(null),E=(0,a.sO)(null),[C,f]=(0,a.eJ)(0),{observe:b}=(0,vn.S1)({rootRef:p,throttleMs:200},(e=>{e.forEach((e=>{const{id:t}=e.target;if(!t||!t.startsWith("sticker-set-"))return;const n=Number(t.replace("sticker-set-",""));Bs[n]=e.isIntersecting}));const t=Bs.map(((e,t)=>({index:t,isIntersecting:e}))).filter((({isIntersecting:e})=>e));t.length&&f(t[Math.floor(t.length/2)].index)})),{observe:I}=(0,vn.S1)({rootRef:E}),y=(0,M.Z)(),S=Boolean(o),k=(0,a.Ye)((()=>o?[{id:"recent",title:y("RecentStickers"),stickers:s,count:s.length},{id:"favorite",title:y("FavoriteStickers"),stickers:r,count:r.length},...o.map((e=>c[e])).filter(Boolean)]:je.D),[o,y,s,r,c]),w=(0,a.Ye)((()=>S&&0===k.filter((e=>{var t;return null===(t=e.stickers)||void 0===t?void 0:t.length})).length),[k,S]);(0,a.d4)((()=>{t&&(u(),h(),Z())}),[t,Z,h,u]),(0,a.d4)((()=>{null!=o&&o.length&&P()}),[o,P]),(0,tt.Z)(E.current),(0,a.d4)((()=>{if(!S)return;const e=E.current;if(!e)return;const t=52*C-(e.offsetWidth/2-26);(0,ys.Z)(e,t)}),[S,C]);const N=(0,a.I4)((e=>{f(e);const t=document.getElementById(`sticker-set-${e}`);(0,hs.Z)(p.current,t,"start",void 0,500)}),[]),T=(0,a.I4)((e=>{m(e),g({sticker:e})}),[g,m]),F=(0,a.I4)((e=>{v({sticker:e})}),[v]),A=(0,Pt.Z)([],l.Y),L=(0,X.Z)("StickerPicker",e);return S&&A&&!w&&n?a.ZP.createElement("div",{className:L},a.ZP.createElement("div",{ref:E,className:"StickerPicker-header no-selection no-scrollbar"},k.map((function(e,t){var n;const s=null===(n=e.stickers)||void 0===n?void 0:n[0],r=(0,X.Z)("symbol-set-button sticker-set-button",t===C&&"activated");return"recent"===e.id||"favorite"===e.id||e.hasThumbnail||!s?a.ZP.createElement(R.Z,{key:e.id,className:r,ariaLabel:e.title,round:!0,faded:"recent"===e.id||"favorite"===e.id,color:"translucent",onClick:()=>N(t)},"recent"===e.id?a.ZP.createElement("i",{className:"icon-recent"}):"favorite"===e.id?a.ZP.createElement("i",{className:"icon-favorite"}):e.isAnimated?a.ZP.createElement(Cn,{stickerSet:e,observeIntersection:I}):a.ZP.createElement(fn,{stickerSet:e,observeIntersection:I})):a.ZP.createElement(bn.Z,{key:e.id,sticker:s,size:l.DC,title:e.title,className:r,observeIntersection:I,onClick:N,clickArg:t})}))),a.ZP.createElement("div",{ref:p,className:(0,X.Z)("StickerPicker-main no-selection",i.$b?"no-scrollbar":"custom-scroll")},k.map(((e,n)=>a.ZP.createElement(Rs,{key:e.id,stickerSet:e,loadAndPlay:Boolean(d&&t),index:n,observeIntersection:b,shouldRender:C>=n-1&&C<=n+1,onStickerSelect:T,onStickerUnfave:F}))))):a.ZP.createElement("div",{className:L},n?w?a.ZP.createElement("div",{className:"picker-disabled"},y("NoStickers")):a.ZP.createElement(Pe.Z,null):a.ZP.createElement("div",{className:"picker-disabled"},y("ErrorSendRestrictedStickersAll")))})));var Ds=n(386);function Us(){return(Us=Object.assign||function(e){for(var t=1;t{var l,i;const c=(0,a.sO)(null),d=(0,a.sO)(null),m=Boolean(null===(l=e.thumbnail)||void 0===l?void 0:l.dataUri),u=`gif${e.id}`,h=(0,vn.Op)(c,t)&&!n,Z=(0,p.Z)(`${u}?size=m`,!h,r.IU.BlobUrl),P=(0,Dn.Z)(null===(i=e.thumbnail)||void 0===i?void 0:i.dataUri,Boolean(Z)),g=(0,p.Z)(u,!h,r.IU.BlobUrl),v=Boolean(h&&g),{isBuffered:E,bufferingHandlers:C}=(0,H.Z)(!0),f=h&&!E,b=h&&E;(0,j.Z)(d,[v]);const I=(0,a.I4)((()=>o({...e,blobUrl:g})),[o,e,g]),y=(0,X.Z)("GifButton",e.width&&e.height&&e.width({savedGifs:e.gifs.saved.gifs})),((e,t)=>(0,h.ei)(t,["loadSavedGifs"])))((({className:e,loadAndPlay:t,canSendGifs:n,savedGifs:s,onGifSelect:r,loadSavedGifs:o})=>{const c=(0,a.sO)(null),{observe:d}=(0,vn.S1)({rootRef:c,debounceMs:300});(0,a.d4)((()=>{t&&o()}),[t,o]);const m=(0,Pt.Z)([],l.Y);return a.ZP.createElement("div",{ref:c,className:(0,X.Z)("GifPicker",e,i.$b?"no-scrollbar":"custom-scroll")},n?m&&s&&s.length?s.map((e=>a.ZP.createElement(Os,{key:e.id,gif:e,observeIntersection:d,isDisabled:!t,onClick:r}))):m&&s?a.ZP.createElement("div",{className:"picker-disabled"},"No saved GIFs."):a.ZP.createElement(Pe.Z,null):a.ZP.createElement("div",{className:"picker-disabled"},"Sending GIFs is not allowed in this chat."))})));let Gs;!function(e){e[e.Emoji=0]="Emoji",e[e.Stickers=1]="Stickers",e[e.GIFs=2]="GIFs"}(Gs||(Gs={}));const Js=Object.values(Gs).filter((e=>"string"==typeof e)),zs={[Gs.Emoji]:"icon-smile",[Gs.Stickers]:"icon-stickers",[Gs.GIFs]:"icon-gifs"},Xs=(0,a.X$)((({activeTab:e,onSwitchTab:t,onRemoveSymbol:n,onSearchOpen:s})=>{const r=(0,M.Z)();function o(n){return a.ZP.createElement(R.Z,{className:"symbol-tab-button "+(e===n?"activated":""),onClick:()=>t(n),ariaLabel:Js[n],round:!0,faded:!0,color:"translucent"},a.ZP.createElement("i",{className:zs[n]}))}const l=(0,a.I4)((()=>{s(e===Gs.Stickers?"stickers":"gifs")}),[e,s]);return a.ZP.createElement("div",{className:"SymbolMenu-footer",onClick:function(e){e.stopPropagation()},dir:r.isRtl?"rtl":void 0},e!==Gs.Emoji&&a.ZP.createElement(R.Z,{className:"symbol-search-button",ariaLabel:e===Gs.Stickers?"Search Stickers":"Search GIFs",round:!0,faded:!0,color:"translucent",onClick:l},a.ZP.createElement("i",{className:"icon-search"})),o(Gs.Emoji),o(Gs.Stickers),o(Gs.GIFs),e===Gs.Emoji&&a.ZP.createElement(R.Z,{className:"symbol-delete-button",onClick:n,ariaLabel:"Remove Symbol",round:!0,faded:!0,color:"translucent"},a.ZP.createElement("i",{className:"icon-delete-left"})))}));let _s=!1;const Ys=(0,a.X$)((0,s.c$)((e=>({isLeftColumnShown:e.isLeftColumnShown})))((({isOpen:e,allowedAttachmentOptions:t,isLeftColumnShown:n,onLoad:s,onClose:r,onEmojiSelect:o,onStickerSelect:l,onGifSelect:c,onRemoveSymbol:d,onSearchOpen:m,addRecentEmoji:u})=>{const[h,Z]=(0,a.eJ)(0),[P,g]=(0,a.eJ)([]),[v,p]=(0,bs.Z)(e,r,void 0,i.wB),{shouldRender:E,transitionClassNames:C}=(0,Y.Z)(e,r,!1,!1);!_s&&e&&(_s=!0),(0,a.d4)((()=>{s()}),[s]),(0,a.bt)((()=>{if(i.wB)return e&&(document.body.classList.add("enable-symbol-menu-transforms"),document.body.classList.add("is-symbol-menu-open")),()=>{e&&(0,z.T2)((()=>{document.body.classList.remove("is-symbol-menu-open"),setTimeout((()=>{document.body.classList.remove("enable-symbol-menu-transforms")}),350)}))}}),[e]);const f=(0,a.sO)(P);f.current=P,(0,a.d4)((()=>{f.current.length&&(f.current.forEach((e=>{u({emoji:e})})),g([]))}),[e,h,u]);const b=(0,a.I4)(((e,t)=>{g((e=>[...e,t])),o(e)}),[o]),I=(0,a.I4)((e=>{r(),m(e)}),[r,m]),y=(0,a.I4)((e=>{l(e,!0)}),[l]),S=(0,M.Z)(),{canSendStickers:k,canSendGifs:w}=t;function N(t,n){switch(h){case Gs.Emoji:return a.ZP.createElement(As,{className:"picker-tab",onEmojiSelect:b});case Gs.Stickers:return a.ZP.createElement($s,{className:"picker-tab",loadAndPlay:!!k&&e&&(t||n),canSendStickers:k,onStickerSelect:y});case Gs.GIFs:return a.ZP.createElement(xs,{className:"picker-tab",loadAndPlay:!!w&&e&&(t||n),canSendGifs:w,onGifSelect:c})}}const T=a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("div",{className:"SymbolMenu-main",onClick:function(e){e.stopPropagation()}},_s&&a.ZP.createElement(L.Z,{name:"slide",activeKey:h,renderCount:Js.length},N)),i.wB&&a.ZP.createElement(R.Z,{round:!0,faded:!0,color:"translucent",ariaLabel:S("Close"),className:"symbol-close-button",size:"tiny",onClick:r},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement(Xs,{activeTab:h,onSwitchTab:Z,onRemoveSymbol:d,onSearchOpen:I}));if(i.wB){if(!E)return;const e=(0,X.Z)("SymbolMenu mobile-menu",C,!n&&"middle-column-open");return a.ZP.createElement(ts.Z,null,a.ZP.createElement("div",{className:e},T))}return a.ZP.createElement(qa.Z,{isOpen:e,positionX:"left",positionY:"bottom",onClose:r,className:"SymbolMenu",onCloseAnimationEnd:r,onMouseEnter:i.$b?void 0:v,onMouseLeave:i.$b?void 0:p,noCloseOnBackdrop:!i.$b},T)}))),Hs=(0,a.X$)((({isOpen:e,allowedAttachmentOptions:t,onFileSelect:n,onPollCreate:s,onClose:r})=>{const[o,c]=(0,bs.Z)(e,r),d=(0,a.I4)(((e,t)=>{const{files:a}=e.target;a&&a.length>0&&n(Array.from(a),t)}),[n]),m=(0,a.I4)((()=>{Mn(Array.from(l.dI).join(","),(e=>d(e,!0)))}),[d]),u=(0,a.I4)((()=>{Mn("*",(e=>d(e,!1)))}),[d]),h=(0,M.Z)(),{canAttachMedia:Z,canAttachPolls:P}=t;return a.ZP.createElement(qa.Z,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",onClose:r,className:"AttachMenu fluid",onCloseAnimationEnd:r,onMouseEnter:i.$b?void 0:o,onMouseLeave:i.$b?void 0:c,noCloseOnBackdrop:!i.$b},!Z&&a.ZP.createElement(x.Z,{className:"media-disabled",disabled:!0},"Posting media content is not allowed in this group."),Z&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(x.Z,{icon:"photo",onClick:m},h("AttachmentMenu.PhotoOrVideo")),a.ZP.createElement(x.Z,{icon:"document",onClick:u},h("AttachDocument"))),P&&a.ZP.createElement(x.Z,{icon:"poll",onClick:s},h("Poll")))})),Vs=(0,a.X$)((({withAvatar:e,focus:t,botCommand:n,bot:s,onClick:r})=>a.ZP.createElement(Ee.Z,{key:n.command,className:(0,X.Z)("BotCommand chat-item-clickable scroll-item",e&&"with-avatar"),multiline:!0,onClick:()=>r(n),focus:t},e&&a.ZP.createElement(D.Z,{size:"small",user:s}),a.ZP.createElement("div",{className:"content-inner"},a.ZP.createElement("span",{className:"title"},"/",n.command),a.ZP.createElement("span",{className:"subtitle"},(0,$.Z)(n.description)))))),js=(0,a.X$)((0,s.c$)((e=>({usersById:e.users.byId})),((e,t)=>(0,h.ei)(t,["sendBotCommand"])))((({usersById:e,isOpen:t,withUsername:n,botCommands:s,onClick:r,onClose:o,sendBotCommand:l})=>{const i=(0,a.sO)(null),{shouldRender:c,transitionClassNames:d}=(0,Y.Z)(t,void 0,void 0,!1),m=(0,a.I4)((({botId:t,command:a})=>{const s=e[t];l({command:`/${a}${n&&s?`@${s.username}`:""}`,botId:t}),r()}),[r,l,e,n]),u=gs({isActive:t,items:s,onSelect:m,onClose:o});(0,a.d4)((()=>{s&&!s.length&&o()}),[s,o]),(0,a.d4)((()=>{Zs(".chat-item-clickable",u,i)}),[u]);const h=(0,f.Z)(s&&s.length?s:void 0,c),Z=s&&!s.length?h:s;if(!c||Z&&!Z.length)return;const P=(0,X.Z)("BotCommandTooltip composer-tooltip custom-scroll",d);return a.ZP.createElement("div",{className:P,ref:i},Z&&Z.map(((t,n)=>a.ZP.createElement(Vs,{key:`${t.botId}_${t.command}`,botCommand:t,bot:e[t.botId],withAvatar:!0,onClick:m,focus:u===n}))))}))),Ks=(0,a.X$)((0,s.c$)(void 0,((e,t)=>(0,h.ei)(t,["sendBotCommand"])))((({isOpen:e,botCommands:t,onClose:n,sendBotCommand:s})=>{const[r,o]=(0,bs.Z)(e,n,void 0,i.wB),l=(0,a.I4)((e=>{s({command:`/${e.command}`,botId:e.botId}),n()}),[n,s]);return a.ZP.createElement(qa.Z,{isOpen:e,positionX:"left",positionY:"bottom",onClose:n,className:"BotCommandMenu",onCloseAnimationEnd:n,onMouseEnter:i.$b?void 0:r,onMouseLeave:i.$b?void 0:o,noCloseOnBackdrop:!i.$b},t.map((e=>a.ZP.createElement(Vs,{key:e.command,botCommand:e,onClick:l}))))}))),qs=(0,a.X$)((0,s.c$)((e=>{const{stickers:t}=e.stickers.forEmoji;return{stickers:t}}),((e,t)=>(0,h.ei)(t,["clearStickersForEmoji"])))((({isOpen:e,onStickerSelect:t,stickers:n,clearStickersForEmoji:s})=>{const r=(0,a.sO)(null),{shouldRender:o,transitionClassNames:c}=(0,Y.Z)(e,void 0,void 0,!1),d=(0,f.Z)(n,!0),m=n||d,{observe:u}=(0,vn.S1)({rootRef:r,throttleMs:200});(0,a.d4)((()=>e?(0,P.Z)(s):void 0),[e,s]);const h=(0,X.Z)("StickerTooltip composer-tooltip custom-scroll",c,!(null!=m&&m.length)&&"hidden");return a.ZP.createElement("div",{ref:r,className:h,onMouseEnter:i.$b?void 0:()=>{document.body.classList.add("no-select")},onMouseLeave:i.$b?void 0:()=>{document.body.classList.remove("no-select")}},o&&m?m.map((e=>a.ZP.createElement(bn.Z,{key:e.id,sticker:e,size:l.Q,observeIntersection:u,onClick:t,clickArg:e}))):o?a.ZP.createElement(Pe.Z,null):void 0)}))),Ws=(0,a.X$)((({isOpen:e,onSilentSend:t,onScheduleSend:n,onClose:s,onCloseAnimationEnd:r})=>{const[o,l]=(0,bs.Z)(e,s),c=(0,M.Z)();return a.ZP.createElement(qa.Z,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",className:"CustomSendMenu",onClose:s,onCloseAnimationEnd:r,onMouseEnter:i.$b?void 0:o,onMouseLeave:i.$b?void 0:l,noCloseOnBackdrop:!i.$b},t&&a.ZP.createElement(x.Z,{icon:"mute",onClick:t},c("SendWithoutSound")),n&&a.ZP.createElement(x.Z,{icon:"schedule",onClick:n},c("ScheduleMessage")))}));var Qs=n(2420),er=n(3283),tr=n(2678);const nr=(0,a.X$)((({isOpen:e,emojis:t,onClose:n,onEmojiSelect:s,addRecentEmoji:r})=>{const o=(0,a.sO)(null),{shouldRender:l,transitionClassNames:c}=(0,Y.Z)(e,void 0,void 0,!1),d=(0,tr.Z)(t.length?t:void 0,350)||[],m=(0,a.I4)((e=>{s(e.native),r({emoji:e.id})}),[r,s]),u=(0,a.I4)(((e,t)=>{s(e),r({emoji:t})}),[r,s]),h=gs({isActive:e,isHorizontal:!0,items:t,onSelect:m,onClose:n});(0,a.d4)((()=>{!function(e,t){const n=t.current;if(!n)return;const{visibleIndexes:a,allElements:s}=ms(n,".EmojiButton",8,!0,!0,!0);if(!s.length||!s[e])return;const r=a[0];if(!a.includes(e)||e===r&&!us(n,s[r],!0)){const t="start"==(e>a[a.length-1]?"start":"end")?44*e:0;(0,ys.Z)(n,t)}}(h,o)}),[h]);const Z=(0,X.Z)("EmojiTooltip composer-tooltip custom-scroll-x",c);return a.ZP.createElement("div",{ref:o,className:Z,onMouseEnter:i.$b?void 0:()=>{document.body.classList.add("no-select")},onMouseLeave:i.$b?void 0:()=>{document.body.classList.remove("no-select")}},l&&d?d.map(((e,t)=>a.ZP.createElement(Ss,{key:e.id,emoji:e,focus:h===t,onClick:u}))):l?a.ZP.createElement(Pe.Z,null):void 0)})),ar=(0,a.X$)((({title:e,description:t,thumbnail:n,thumbUrl:s,focus:r,transitionClassNames:o="",onClick:l})=>{let i="";const c=(0,p.Z)(n?`webDocument:${n.url}`:void 0);return(s=s||c)?i=a.ZP.createElement("img",{src:s,className:o,alt:"",decoding:"async",draggable:"false"}):e&&(i=(0,En.Xv)(e,1)),a.ZP.createElement(Ee.Z,{focus:r,className:"BaseResult chat-item-clickable",onMouseDown:Ds.b,onClick:l},a.ZP.createElement("span",{className:"thumb"},"string"==typeof i?(0,$.Z)(i):i),a.ZP.createElement("div",{className:"content-inner"},e&&a.ZP.createElement("div",{className:"title"},e),t&&a.ZP.createElement("div",{className:"description"},t)))})),sr=(0,a.X$)((({focus:e,isForGallery:t,inlineResult:n,onClick:s})=>{var r;let o,l,i;"photo"in n&&(o=n.photo),"thumbnail"in n&&(l=n.thumbnail),"webThumbnail"in n&&t&&(i=n.webThumbnail);const c=(0,p.Z)(i?`webDocument:${i.url}`:void 0),d=(0,p.Z)(o&&`photo${o.id}?size=m`),m=(0,pn.Z)(d),u=(0,a.I4)((()=>{s(n)}),[n,s]);var h,Z;if(t)return a.ZP.createElement("div",{className:"MediaResult chat-item-clickable",onClick:u},a.ZP.createElement("img",{src:(null===(h=o)||void 0===h||null===(Z=h.thumbnail)||void 0===Z?void 0:Z.dataUri)||c,alt:""}),a.ZP.createElement("img",{src:d,className:(0,X.Z)("full-media",m),alt:""}));const{title:P,description:g}=n;return a.ZP.createElement(ar,{focus:e,thumbUrl:d||(null===(r=l)||void 0===r?void 0:r.dataUri)||c,transitionClassNames:m,title:P,description:g,onClick:u})})),rr=(0,a.X$)((({focus:e,inlineResult:t,onClick:n})=>{const{title:s,url:r,description:o,webThumbnail:l}=t,i=(0,a.I4)((()=>{n(t)}),[t,n]);return a.ZP.createElement(ar,{focus:e,thumbnail:l,title:s||r,description:o,onClick:i})})),or=(0,a.X$)((({inlineResult:e,observeIntersection:t,onClick:n})=>{const{gif:s}=e,r=(0,a.I4)((()=>{n(e)}),[e,n]);if(s)return a.ZP.createElement(Os,{gif:s,observeIntersection:t,className:"chat-item-clickable",onClick:r})})),lr=(0,a.X$)((({inlineResult:e,observeIntersection:t,onClick:n})=>{const{sticker:s}=e;if(s)return a.ZP.createElement(bn.Z,{sticker:s,size:l.zq,observeIntersection:t,title:s.emoji,className:"chat-item-clickable",onClick:n,clickArg:e})})),ir=(0,z.P2)((e=>e()),500,!0),cr=(0,a.X$)((0,s.c$)(void 0,((e,t)=>(0,h.ei)(t,["startBot","openChat","sendInlineBotResult"])))((({isOpen:e,botId:t,isGallery:n,inlineBotResults:s,switchPm:r,loadMore:l,onClose:c,openChat:d,startBot:m,onSelectResult:u})=>{const h=(0,a.sO)(null),{shouldRender:Z,transitionClassNames:P}=(0,Y.Z)(e,void 0,void 0,!1),{observe:g}=(0,vn.S1)({rootRef:h,debounceMs:200,isDisabled:!e}),v=(0,a.I4)((({direction:e})=>{e===o.Uq.Backwards&&ir(l)}),[l]),p=gs({isActive:e,shouldRemoveSelectionOnReset:n,noArrowNavigation:n,items:s,onSelect:u,onClose:c});(0,a.d4)((()=>{Zs(".chat-item-clickable",p,h)}),[p]);const E=(0,a.I4)((()=>{d({id:t}),m({botId:t,param:r.startParam})}),[t,d,m,r]),C=(0,f.Z)(null!=s&&s.length?s:void 0,Z),b=s&&!s.length?C:s;if(!Z||!b||!b.length&&!r)return;const I=(0,X.Z)("InlineBotTooltip composer-tooltip",i.$b?"no-scrollbar":"custom-scroll",n&&"gallery",P);return a.ZP.createElement(pe.Z,{ref:h,className:I,items:b,itemSelector:".chat-item-clickable",noFastList:!0,onLoadMore:v,sensitiveArea:160},r&&a.ZP.createElement(Ee.Z,{ripple:!0,className:"switch-pm scroll-item",onClick:E},a.ZP.createElement("span",{className:"title"},r.text)),b.map(((e,t)=>{switch(e.type){case"gif":return a.ZP.createElement(or,{key:e.id,inlineResult:e,observeIntersection:g,onClick:u});case"photo":return a.ZP.createElement(sr,{key:e.id,isForGallery:n,inlineResult:e,onClick:u});case"sticker":return a.ZP.createElement(lr,{key:e.id,inlineResult:e,observeIntersection:g,onClick:u});case"video":case"game":return a.ZP.createElement(sr,{key:e.id,focus:p===t,inlineResult:e,onClick:u});case"article":case"audio":return a.ZP.createElement(rr,{key:e.id,focus:p===t,inlineResult:e,onClick:u});default:return}})))})));var dr=n(6844);const mr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,m.Z1)(e,t),a=n&&(0,m.Zw)(e,n.id);if(!n||!a)return{};const{query:s,results:r}=(0,m.n5)(e)||{},{totalCount:o,foundIds:l}=r||{};return{chat:n,messagesById:a,query:s,totalCount:o,foundIds:l}}),((e,t)=>(0,h.ei)(t,["searchTextMessagesLocal","focusMessage"])))((({chatId:e,threadId:t,onClose:n,isActive:r,chat:o,messagesById:l,query:i,totalCount:c,foundIds:d,searchTextMessagesLocal:Z,focusMessage:P})=>{const g=(0,M.Z)(),v=(0,a.Ye)((()=>{if(!(i&&d&&d.length&&l))return je.D;const n=d.map((n=>{const a=l[n];if(!a)return;const r=a.senderId?(0,m.dy)((0,s.Rd)(),a.senderId):void 0;let i;if(o&&(0,u.eA)(o))i=o;else if(a.forwardInfo){const{isChannelPost:e,fromChatId:t}=a.forwardInfo;i=e&&t?(0,m.Z1)((0,s.Rd)(),t):void 0}else i=a.senderId?(0,m.Z1)((0,s.Rd)(),a.senderId):void 0;return{message:a,senderUser:r,senderChat:i,onClick:()=>P({chatId:e,threadId:t,messageId:n})}})).filter(Boolean);return(0,h.Xo)(n,(({message:e})=>e.date),"desc")}),[e,t,P,d,o,l,i]);(0,T.ZP)(r,n);const p=(0,a.sO)(null),E=(0,he.Z)(p,!0,(e=>{const t=null==v?void 0:v[-1===e?0:e];t&&t.onClick()}),".ListItem-button",!0);return a.ZP.createElement(pe.Z,{className:"RightSearch custom-scroll",items:v,preloadBackwards:0,onLoadMore:Z,noFastList:!0,onKeyDown:E,ref:p},a.ZP.createElement("p",{className:"helper-text",dir:"auto"},i?0!==c&&v.length?1===c?"1 message found":`${v.length&&(c||v.length)} messages found`:g("lng_search_no_results"):g("lng_dlg_search_for_messages")),v.map((({message:e,senderUser:t,senderChat:n,onClick:s})=>{const r=n?(0,u.U)(g,n):(0,u.Js)(t),o=(0,u.MK)(g,e);return a.ZP.createElement(Ee.Z,{className:"chat-item-clickable search-result-message m-0",onClick:s},a.ZP.createElement(D.Z,{chat:n,user:t}),a.ZP.createElement("div",{className:"info"},a.ZP.createElement("div",{className:"title"},a.ZP.createElement("h3",{dir:"auto"},r&&(0,$.Z)(r)),a.ZP.createElement(dr.Z,{message:e})),a.ZP.createElement("div",{className:"subtitle",dir:"auto"},(0,$.Z)(o,["emoji","highlight"],{highlight:i}))))})))})));var ur=n(9290);const hr=(0,a.X$)((0,s.c$)(((e,{stickerSetId:t})=>({set:(0,m.Ny)(e,t),shouldPlay:(0,m.yB)(e)})),((e,t)=>(0,h.ei)(t,["loadStickers","toggleStickerSet"])))((({stickerSetId:e,observeIntersection:t,set:n,shouldPlay:s,loadStickers:r,toggleStickerSet:o,isSomeModalOpen:i,onModalToggle:c})=>{const d=(0,M.Z)(),m=n&&Boolean(n.installedDate),u=Boolean(null==n?void 0:n.stickers),[h,Z,P]=(0,Le.Z)();(0,ur.Z)((()=>{c(h)}),[h,c]);const g=(0,a.Ye)((()=>{if(!n)return[];const e=(n.covers||[]).map((({id:e})=>e)),t=n.stickers?n.stickers.filter((({id:t})=>!e.includes(t))):[];return[...n.covers||[],...t].slice(0,5)}),[n]);(0,a.d4)((()=>{!u&&g.length<5&&r({stickerSetId:e})}),[u,g.length,r,e]);const v=(0,a.I4)((()=>{o({stickerSetId:e})}),[o,e]);if(!n)return;const p=g.length>0;return a.ZP.createElement("div",{key:n.id,className:"sticker-set",dir:d.isRtl?"rtl":void 0},a.ZP.createElement("div",{className:"sticker-set-header"},a.ZP.createElement("div",{className:"title-wrapper"},a.ZP.createElement("h3",{className:"title",dir:"auto"},n.title),a.ZP.createElement("p",{className:"count",dir:"auto"},d("Stickers",n.count,"i"))),a.ZP.createElement(R.Z,{className:m?"is-added":void 0,color:"primary",size:"tiny",pill:!0,fluid:!0,onClick:v},d(m?"Stickers.Installed":"Stickers.Install"))),a.ZP.createElement("div",{className:"sticker-set-main"},!p&&a.ZP.createElement(F.Z,null),p&&g.map((e=>a.ZP.createElement(bn.Z,{sticker:e,size:l.Y7,observeIntersection:t,noAnimate:!s||h||i,onClick:Z})))),p&&a.ZP.createElement(yn.Z,{isOpen:h,fromSticker:g[0],onClose:P}))}))),Zr=(0,z.P2)((e=>e()),6e4,!0),Pr=(0,a.X$)((0,s.c$)((e=>{const t=(0,m.y5)(e),{query:n,resultIds:a}=t||{},{featured:s}=e.stickers;return{query:n,featuredIds:s.setIds,resultIds:a}}),((e,t)=>(0,h.ei)(t,["loadFeaturedStickers"])))((({onClose:e,isActive:t,query:n,featuredIds:s,resultIds:r,loadFeaturedStickers:o})=>{const l=(0,a.sO)(null),i=(0,M.Z)(),[c,d]=(0,a.eJ)(!1),{observe:m}=(0,vn.S1)({rootRef:l,throttleMs:200});return(0,a.d4)((()=>{Zr((()=>{o()}))})),(0,T.ZP)(t,e),a.ZP.createElement("div",{ref:l,className:"StickerSearch custom-scroll",dir:i.isRtl?"rtl":void 0},function(){if(void 0!==n)return!n&&s?s.map((e=>a.ZP.createElement(hr,{key:e,stickerSetId:e,observeIntersection:m,isSomeModalOpen:c,onModalToggle:d}))):r?r.length?r.map((e=>a.ZP.createElement(hr,{key:e,stickerSetId:e,observeIntersection:m,isSomeModalOpen:c,onModalToggle:d}))):a.ZP.createElement("p",{className:"helper-text",dir:"auto"},"Nothing found."):a.ZP.createElement(Pe.Z,null)}())}))),gr=(0,a.X$)((0,s.c$)((e=>{const t=(0,m.yN)(e),{query:n,results:a}=t||{},{chatId:s}=(0,m.Bt)(e)||{},r=s?(0,m.Z1)(e,s):void 0;return{query:n,results:a,chat:r,isChatWithBot:r?(0,m.xo)(e,r):void 0}}),((e,t)=>(0,h.ei)(t,["searchMoreGifs","sendMessage","setGifSearchQuery"])))((({onClose:e,isActive:t,query:n,results:s,chat:r,isChatWithBot:o,searchMoreGifs:l,sendMessage:c,setGifSearchQuery:d})=>{const m=(0,a.sO)(null),{observe:h}=(0,vn.S1)({rootRef:m,debounceMs:300}),{canSendGifs:Z}=(0,u.H5)(r,o),P=(0,a.I4)((e=>{Z&&c({gif:e}),i.$b&&d({query:void 0})}),[Z,c,d]),g=(0,M.Z)();(0,T.ZP)(t,e);const v=Boolean(void 0!==n&&s&&s.length);return a.ZP.createElement("div",{className:"GifSearch",dir:g.isRtl?"rtl":void 0},a.ZP.createElement(pe.Z,{ref:m,className:(0,X.Z)("gif-container custom-scroll",v&&"grid"),items:s,itemSelector:".GifButton",preloadBackwards:96,noFastList:!0,onLoadMore:l},function(){if(void 0!==n)return s?s.length?s.map((e=>a.ZP.createElement(Os,{key:e.id,gif:e,observeIntersection:h,onClick:P}))):a.ZP.createElement("p",{className:"helper-text",dir:"auto"},g("NoGIFsFound")):a.ZP.createElement(Pe.Z,null)}()))}))),vr=(0,a.X$)((0,s.c$)(((e,{answer:t})=>{const{voters:n,offsets:a}=e.pollResults;return{voters:null==n?void 0:n[t.option],offset:(null==a?void 0:a[t.option])||""}}),((e,t)=>(0,h.ei)(t,["loadPollOptionResults","openChat","closePollResults"])))((({chat:e,message:t,answer:n,answerVote:s,totalVoters:r,voters:o,offset:l,loadPollOptionResults:i,openChat:c,closePollResults:d})=>{const m=(0,f.Z)(s.votersCount),[u,h]=(0,a.eJ)(!0),Z=Boolean(o),{option:P,text:g}=n,v=(0,M.Z)();(0,a.d4)((()=>{Z&&m===s.votersCount||i({chat:e,messageId:t.id,option:P,offset:l,limit:4,shouldResetVoters:!0})}),[s.votersCount,Z]);const p=(0,a.I4)((()=>{h(!0),i({chat:e,messageId:t.id,option:P,offset:l,limit:50})}),[e,i,t.id,l,P]);(0,a.d4)((()=>{h(!1)}),[o]);const E=(0,a.I4)((e=>{c({id:e}),d()}),[d,c]);return a.ZP.createElement("div",{className:"PollAnswerResults"},a.ZP.createElement("div",{className:"poll-voters"},o?o.map((e=>a.ZP.createElement(Ee.Z,{key:e,className:"chat-item-clickable",onClick:()=>E(e)},a.ZP.createElement(fe.Z,{avatarSize:"tiny",userId:e,forceShowSelf:!0,noStatusOrTyping:!0})))):a.ZP.createElement(Pe.Z,null),o&&function(){const e=s.votersCount-o.length;return s.votersCount>4&&e>0&&a.ZP.createElement(cn,{count:e,itemName:"voter",isLoading:u,onClick:p})}()),a.ZP.createElement("div",{className:"answer-head",dir:v.isRtl?"rtl":void 0},a.ZP.createElement("span",{className:"answer-title",dir:"auto"},g),a.ZP.createElement("span",{className:"answer-percent",dir:v.isRtl?"auto":void 0},(C=s.votersCount,(b=r)>0?(C/b*100).toFixed():0),"%")));var C,b}))),pr=(0,a.X$)((0,s.c$)((e=>{const{pollResults:{chatId:t,messageId:n},lastSyncTime:a}=e;return t&&n?{chat:(0,m.Z1)(e,t),message:(0,m.hj)(e,t,n),lastSyncTime:a}:{}}))((({onClose:e,isActive:t,chat:n,message:s,lastSyncTime:r})=>{const o=(0,M.Z)();if((0,T.ZP)(t,e),!s||!n)return a.ZP.createElement(Pe.Z,null);const{summary:l,results:i}=(0,u.t9)(s);if(!i.results)return;const c=(0,h.ee)(i.results,"option");return a.ZP.createElement("div",{className:"PollResults",dir:o.isRtl?"rtl":void 0},a.ZP.createElement("h3",{className:"poll-question",dir:"auto"},(0,$.Z)(l.question,["emoji","br"])),a.ZP.createElement("div",{className:"poll-results-list custom-scroll"},r&&l.answers.map((e=>a.ZP.createElement(vr,{key:`${s.id}-${e.option}`,chat:n,message:s,answer:e,answerVote:c[e.option],totalVoters:i.totalVoters}))),!r&&a.ZP.createElement(Pe.Z,null)))}))),Er="Please provide first name",Cr=(0,a.X$)((0,s.c$)(((e,{userId:t})=>{const n=(0,m.dy)(e,t),a=(0,m.Z1)(e,t),{progress:s}=e.management;return{user:n,chat:a,progress:s,isMuted:(0,u.i4)(a,(0,m.dZ)(e),(0,m.NJ)(e))}}),((e,t)=>(0,h.ei)(t,["updateContact","deleteUser","closeManagement","openChat","deleteHistory"])))((({userId:e,user:t,chat:n,progress:s,isMuted:r,updateContact:l,deleteUser:i,deleteHistory:c,closeManagement:d,openChat:m,onClose:u,isActive:h})=>{const[Z,P,g]=(0,Le.Z)(),[v,p]=(0,a.eJ)(!1),[E,C]=(0,a.eJ)(),f=(0,M.Z)();(0,T.ZP)(h,u);const b=t&&t.firstName||"",I=t&&t.lastName||"",[y,S]=(0,a.eJ)(b),[k,w]=(0,a.eJ)(I),[N,A]=(0,a.eJ)(!r);(0,a.d4)((()=>{A(!r)}),[r]),(0,a.d4)((()=>{p(!1),g()}),[g,e]),(0,a.d4)((()=>{S(b),w(I)}),[b,I,t]),(0,a.d4)((()=>{s===o.wv.Complete&&(p(!1),C(void 0),g())}),[g,s]);const L=(0,a.I4)((e=>{S(e.target.value),p(!0)}),[]),R=(0,a.I4)((e=>{w(e.target.value),p(!0)}),[]),B=(0,a.I4)((e=>{A(e.target.checked),p(!0)}),[]),$=(0,a.I4)((()=>{const t=y.trim(),n=k.trim();t.length||C(Er),l({userId:e,isMuted:!N,firstName:t,lastName:n})}),[y,k,l,e,N]),D=(0,a.I4)((()=>{c({chatId:n.id,shouldDeleteForAll:!1}),i({userId:e}),g(),d(),m({id:void 0})}),[n.id,g,d,c,i,m,e]);if(!t)return;const U=s===o.wv.InProgress;return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement(fe.Z,{userId:t.id,avatarSize:"jumbo",status:"original name",withFullInfo:!0}),a.ZP.createElement(ve.Z,{id:"user-first-name",label:f("UserInfo.FirstNamePlaceholder"),onChange:L,value:y,error:E===Er?E:void 0}),a.ZP.createElement(ve.Z,{id:"user-last-name",label:f("UserInfo.LastNamePlaceholder"),onChange:R,value:k}),a.ZP.createElement("div",{className:"ListItem no-selection narrow"},a.ZP.createElement(en.Z,{checked:N,label:f("Notifications"),subLabel:f(N?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),onChange:B}))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Ee.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:P},f("DeleteContact")))),a.ZP.createElement(Xt.Z,{isShown:v,onClick:$,disabled:U,ariaLabel:f("Save")},U?a.ZP.createElement(F.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Fe.Z,{isOpen:Z,onClose:g,text:f("AreYouSureDeleteContact"),confirmLabel:f("DeleteContact"),confirmHandler:D,confirmIsDestructive:!0}))}))),fr="Group title can't be empty",br=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,m.Z1)(e,t),{progress:s}=e.management,r=Boolean(null===(n=a.fullInfo)||void 0===n?void 0:n.linkedChatId),o=(0,u.G9)(a);return{chat:a,progress:s,isBasicGroup:o,hasLinkedChannel:r,canChangeInfo:o?a.isCreator:(0,u.VE)(a,"changeInfo"),canBanUsers:o?a.isCreator:(0,u.VE)(a,"banUsers")}}),((e,t)=>(0,h.ei)(t,["togglePreHistoryHidden","updateChat","closeManagement","leaveChannel","deleteChannel","deleteChat","openChat"])))((({chatId:e,chat:t,progress:n,isBasicGroup:s,hasLinkedChannel:l,canChangeInfo:i,canBanUsers:c,onScreenSelect:d,togglePreHistoryHidden:m,updateChat:h,deleteChat:Z,leaveChannel:P,deleteChannel:g,closeManagement:v,openChat:E,onClose:C,isActive:f})=>{var b,I,y;const[S,k,w]=(0,Le.Z)(),N=t.title,A=t.fullInfo&&t.fullInfo.about||"",[L,R]=(0,a.eJ)(!1),[B,D]=(0,a.eJ)(N),[U,O]=(0,a.eJ)(A),[x,G]=(0,a.eJ)(),[J,z]=(0,a.eJ)(),X=(0,u.RT)(t),_=(0,p.Z)(X,!1,r.IU.BlobUrl),Y=(0,M.Z)();(0,T.ZP)(f,C),(0,a.d4)((()=>{n===o.wv.Complete&&(R(!1),z(void 0))}),[n]);const H=(0,a.I4)((()=>{d(o.u1.ChatPrivacyType)}),[d]),V=(0,a.I4)((()=>{d(o.u1.Discussion)}),[d]),j=(0,a.I4)((()=>{d(o.u1.GroupPermissions)}),[d]),K=(0,a.I4)((()=>{d(o.u1.ChatAdministrators)}),[d]),q=(0,a.I4)((e=>{G(e),R(!0)}),[]),W=(0,a.I4)((e=>{D(e.target.value),R(!0)}),[]),Q=(0,a.I4)((e=>{O(e.target.value),R(!0)}),[]),ee=(0,a.I4)((()=>{const t=B.trim(),n=U.trim();t.length?h({chatId:e,title:t,about:n,photo:x}):z(fr)}),[U,e,x,B,h]),te=(0,a.I4)((()=>{d(o.u1.GroupMembers)}),[d]),ne=(0,a.I4)((()=>{if(!t.fullInfo)return;const{isPreHistoryHidden:e}=t.fullInfo;m({chatId:t.id,isEnabled:!e})}),[t,m]),ae=(0,a.Ye)((()=>{if(!t.defaultBannedRights)return 0;let e=["sendMessages","sendMedia","embedLinks","sendPolls","changeInfo","inviteUsers","pinMessages"].filter((e=>!t.defaultBannedRights[e])).length;const{sendStickers:n,sendGifs:a}=t.defaultBannedRights;return n||a||(e+=1),e}),[t]),se=(null===(b=t.fullInfo)||void 0===b||null===(I=b.adminMembers)||void 0===I?void 0:I.length)||0,re=(0,a.I4)((()=>{s?Z({chatId:t.id}):t.isCreator?g({chatId:t.id}):P({chatId:t.id}),w(),v(),E({id:void 0})}),[s,t.isCreator,t.id,w,v,P,g,Z,E]);if(t.isRestricted)return;const oe=n===o.wv.InProgress;return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement(zt.Z,{currentAvatarBlobUrl:_,onChange:q,disabled:!i}),a.ZP.createElement(ve.Z,{id:"group-title",label:Y("GroupName"),onChange:W,value:B,error:J===fr?J:void 0,disabled:!i}),a.ZP.createElement(ve.Z,{id:"group-about",className:"mb-2",label:Y("DescriptionPlaceholder"),onChange:Q,value:U,disabled:!i}),t.isCreator&&a.ZP.createElement(Ee.Z,{icon:"lock",multiline:!0,onClick:H},a.ZP.createElement("span",{className:"title"},Y("GroupType")),a.ZP.createElement("span",{className:"subtitle"},t.username?Y("TypePublic"):Y("TypePrivate"))),l&&a.ZP.createElement(Ee.Z,{icon:"message",multiline:!0,onClick:V},a.ZP.createElement("span",{className:"title"},Y("LinkedChannel")),a.ZP.createElement("span",{className:"subtitle"},Y("DiscussionUnlink"))),a.ZP.createElement(Ee.Z,{icon:"permissions",multiline:!0,onClick:j,disabled:!c},a.ZP.createElement("span",{className:"title"},Y("ChannelPermissions")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},ae,"/",8)),a.ZP.createElement(Ee.Z,{icon:"admin",multiline:!0,onClick:K},a.ZP.createElement("span",{className:"title"},Y("ChannelAdministrators")),a.ZP.createElement("span",{className:"subtitle"},(0,En.kh)(se)))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Ee.Z,{icon:"group",multiline:!0,onClick:te},a.ZP.createElement("span",{className:"title"},Y("GroupMembers")),a.ZP.createElement("span",{className:"subtitle"},(0,En.kh)(null!==(y=t.membersCount)&&void 0!==y?y:0))),t.fullInfo&&a.ZP.createElement("div",{className:"ListItem narrow no-selection"},a.ZP.createElement(en.Z,{checked:!t.fullInfo.isPreHistoryHidden,label:Y("ChatHistory"),onChange:ne,disabled:!c}))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Ee.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:k},Y("DeleteMega")))),a.ZP.createElement(Xt.Z,{isShown:L,onClick:ee,disabled:oe,ariaLabel:Y("Save")},oe?a.ZP.createElement(F.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Fe.Z,{isOpen:S,onClose:w,textParts:(0,$.Z)(s||!t.isCreator?Y("AreYouSureDeleteAndExit"):Y("AreYouSureDeleteThisChatWithGroup",t.title),["br","simple_markdown"]),confirmLabel:s||!t.isCreator?Y("DeleteMega"):Y("DeleteGroupForAll"),confirmHandler:re,confirmIsDestructive:!0}))}))),Ir=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>({chat:(0,m.Z1)(e,t),currentUserId:e.currentUserId})),((e,t)=>(0,h.ei)(t,["updateChatDefaultBannedRights"])))((({onScreenSelect:e,onChatMemberSelect:t,chat:n,currentUserId:s,updateChatDefaultBannedRights:r,onClose:l,isActive:i})=>{const[c,d]=(0,a.eJ)({}),[m,u]=(0,a.eJ)(!1),[h,Z]=(0,a.eJ)(!1),P=(0,M.Z)();(0,T.ZP)(i,l);const g=(0,a.I4)((()=>{e(o.u1.GroupRemovedUsers)}),[e]),v=(0,a.I4)((()=>{e(o.u1.GroupUserPermissionsCreate)}),[e]),p=(0,a.I4)((n=>{t(n.userId,n.promotedByUserId===s),e(o.u1.GroupUserPermissions)}),[s,t,e]);(0,a.d4)((()=>{d((null==n?void 0:n.defaultBannedRights)||{}),u(!1),setTimeout((()=>{Z(!1)}),250)}),[n]);const E=(0,a.I4)((e=>{const{name:t}=e.target;function n(e){return!e||void 0}d((e=>({...e,[t]:n(e[t]),..."sendStickers"===t&&{sendGifs:n(e[t])}}))),u(!0)}),[]),C=(0,a.I4)((()=>{n&&(Z(!0),r({chatId:n.id,bannedRights:c}))}),[n,c,r]),f=(0,a.Ye)((()=>n&&n.fullInfo&&n.fullInfo.kickedMembers?n.fullInfo.kickedMembers.length:0),[n]),b=(0,a.Ye)((()=>n&&n.fullInfo&&n.fullInfo.members?n.fullInfo.members.filter((({bannedRights:e})=>!!e)):[]),[n]),I=(0,a.I4)((e=>{const{bannedRights:t}=e;if(!t||!n)return;const{defaultBannedRights:a}=n;return Object.keys(t).reduce(((e,n)=>{if(!t[n]||null!=a&&a[n]||"sendInline"===n||"viewMessages"===n||"sendGames"===n)return e;const s=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}}(n);if(!s)return e;const r=P(s);return`${e}${e.length?`, ${r}`:r}`}),"")}),[n,P]);return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement("h3",{className:"section-heading",dir:"auto"},P("ChannelPermissionsHeader")),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"sendMessages",checked:!c.sendMessages,label:P("UserRestrictionsSend"),blocking:!0,onChange:E})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"sendMedia",checked:!c.sendMedia,label:P("UserRestrictionsSendMedia"),blocking:!0,onChange:E})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"sendStickers",checked:!c.sendStickers&&!c.sendGifs,label:P("UserRestrictionsSendStickers"),blocking:!0,onChange:E})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"sendPolls",checked:!c.sendPolls,label:P("UserRestrictionsSendPolls"),blocking:!0,onChange:E})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"embedLinks",checked:!c.embedLinks,label:P("UserRestrictionsEmbedLinks"),blocking:!0,onChange:E})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"inviteUsers",checked:!c.inviteUsers,label:P("UserRestrictionsInviteUsers"),blocking:!0,onChange:E})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"pinMessages",checked:!c.pinMessages,label:P("UserRestrictionsPinMessages"),blocking:!0,onChange:E})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"changeInfo",checked:!c.changeInfo,label:P("UserRestrictionsChangeInfo"),blocking:!0,onChange:E}))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Ee.Z,{icon:"delete-user",multiline:!0,narrow:!0,onClick:g},a.ZP.createElement("span",{className:"title"},P("ChannelBlockedUsers")),a.ZP.createElement("span",{className:"subtitle"},f))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement("h3",{className:"section-heading",dir:"auto"},P("PrivacyExceptions")),a.ZP.createElement(Ee.Z,{icon:"add-user",onClick:v},P("ChannelAddException")),b.map((e=>a.ZP.createElement(Ee.Z,{key:e.userId,className:"chat-item-clickable exceptions-member",onClick:()=>p(e)},a.ZP.createElement(fe.Z,{userId:e.userId,status:I(e)})))))),a.ZP.createElement(Xt.Z,{isShown:m,onClick:C,ariaLabel:P("Save"),disabled:h},h?a.ZP.createElement(F.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})))}))),yr=(0,a.X$)((0,s.c$)((e=>{const{users:{byId:t},currentUserId:n}=e;return{usersById:t,currentUserId:n}}),((e,t)=>(0,h.ei)(t,["loadMoreMembers","deleteChatMember"])))((({chat:e,usersById:t,currentUserId:n,isOpen:s,onClose:r,loadMoreMembers:o,deleteChatMember:l})=>{var i;const c=(0,M.Z)(),[d,m]=(0,a.eJ)(""),h=(0,a.sO)(null),Z=(0,a.Ye)((()=>{var a;return((null===(a=e.fullInfo)||void 0===a?void 0:a.members)||[]).filter((e=>!e.isAdmin&&!e.isOwner&&e.userId!==n)).reduce(((e,n)=>(d&&t[n.userId]&&!(0,me.Z)((0,u.Js)(t[n.userId])||"",d)||e.push(n.userId),e)),[])}),[null===(i=e.fullInfo)||void 0===i?void 0:i.members,n,d,t]),P=(0,a.I4)((t=>{l({chatId:e.id,userId:t}),r()}),[e.id,l,r]);return a.ZP.createElement(be,{isOpen:s,chatOrUserIds:Z,filterRef:h,filterPlaceholder:c("ChannelBlockUser"),filter:d,onFilterChange:m,loadMore:o,onSelectChatOrUser:P,onClose:r})}))),Sr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,m.Z1)(e,t),{byId:a}=e.users;return{chat:n,usersById:a,canDeleteMembers:n&&((0,u.VE)(n,"banUsers")||n.isCreator)}}),((e,t)=>(0,h.ei)(t,["updateChatMemberBannedRights"])))((({chat:e,usersById:t,canDeleteMembers:n,updateChatMemberBannedRights:s,onClose:r,isActive:o})=>{const l=(0,M.Z)(),[i,c,d]=(0,Le.Z)();(0,T.ZP)(o,r);const m=(0,a.Ye)((()=>e&&e.fullInfo&&e.fullInfo.kickedMembers?e.fullInfo.kickedMembers:[]),[e]),h=(0,a.I4)((e=>{if(!e.kickedByUserId)return;const n=t[e.kickedByUserId];return n?l("UserRemovedBy",(0,u.Js)(n)):void 0}),[l,t]),Z=(0,a.I4)((t=>{if(e)return[{title:l("Unblock"),icon:"delete",destructive:!0,handler:()=>s({chatId:e.id,userId:t.userId,bannedRights:{}})}]}),[l,e,s]);return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section",dir:l.isRtl?"rtl":void 0},a.ZP.createElement("p",{className:"text-muted"},l("NoBlockedGroup2")),m.map((e=>a.ZP.createElement(Ee.Z,{key:e.userId,className:"chat-item-clickable",ripple:!0,contextActions:Z(e)},a.ZP.createElement(fe.Z,{userId:e.userId,status:h(e)})))),n&&a.ZP.createElement(Xt.Z,{isShown:!0,onClick:c,ariaLabel:l("Channel.EditAdmin.Permission.BanUsers")},a.ZP.createElement("i",{className:"icon-add-user-filled"})),e&&n&&a.ZP.createElement(yr,{chat:e,isOpen:i,onClose:d}))))}))),kr="Channel title can't be empty",wr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,m.Z1)(e,t),{progress:a}=e.management;return{chat:n,progress:a,isSignaturesShown:Boolean(null==n?void 0:n.isSignaturesShown),canChangeInfo:(0,u.VE)(n,"changeInfo")}}),((e,t)=>(0,h.ei)(t,["toggleSignatures","updateChat","closeManagement","leaveChannel","deleteChannel","openChat"])))((({chatId:e,chat:t,progress:n,isSignaturesShown:s,canChangeInfo:l,onScreenSelect:i,updateChat:c,toggleSignatures:d,closeManagement:m,leaveChannel:h,deleteChannel:Z,openChat:P,onClose:g,isActive:v})=>{var E,C,f,b;const I=t&&t.title||"",y=null!=t&&t.fullInfo&&t.fullInfo.about||"",S=null==t||null===(E=t.fullInfo)||void 0===E?void 0:E.linkedChatId,[k,w,N]=(0,Le.Z)(),[A,L]=(0,a.eJ)(!1),[R,B]=(0,a.eJ)(I),[$,D]=(0,a.eJ)(y),[U,O]=(0,a.eJ)(),[x,G]=(0,a.eJ)(),J=t&&(0,u.RT)(t),z=(0,p.Z)(J,!1,r.IU.BlobUrl),X=(0,M.Z)();(0,T.ZP)(v,g),(0,a.d4)((()=>{n===o.wv.Complete&&(L(!1),G(void 0))}),[n]);const _=(null==t||null===(C=t.fullInfo)||void 0===C||null===(f=C.adminMembers)||void 0===f?void 0:f.length)||0,Y=(0,a.I4)((()=>{i(o.u1.ChatPrivacyType)}),[i]),H=(0,a.I4)((()=>{i(o.u1.Discussion)}),[i]),V=(0,a.I4)((()=>{i(o.u1.ChatAdministrators)}),[i]),j=(0,a.I4)((e=>{O(e),L(!0)}),[]),K=(0,a.I4)((e=>{B(e.target.value),L(!0)}),[]),q=(0,a.I4)((e=>{D(e.target.value),L(!0)}),[]),W=(0,a.I4)((()=>{const t=R.trim(),n=$.trim();t.length?c({chatId:e,title:t,about:n,photo:U}):G(kr)}),[$,e,U,R,c]),Q=(0,a.I4)((()=>{d({chatId:e,isEnabled:!s})}),[e,s,d]),ee=(0,a.I4)((()=>{i(o.u1.ChannelSubscribers)}),[i]),te=(0,a.I4)((()=>{t.isCreator?Z({chatId:t.id}):h({chatId:t.id}),N(),m(),P({id:void 0})}),[t.isCreator,t.id,N,m,h,Z,P]);if(t.isRestricted)return;const ne=n===o.wv.InProgress;return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement(zt.Z,{currentAvatarBlobUrl:z,onChange:j,disabled:!l}),a.ZP.createElement(ve.Z,{id:"channel-title",label:X("EnterChannelName"),onChange:K,value:R,error:x===kr?x:void 0,disabled:!l}),a.ZP.createElement(ve.Z,{id:"channel-about",className:"mb-2",label:X("DescriptionPlaceholder"),onChange:q,value:$,disabled:!l}),t.isCreator&&a.ZP.createElement(Ee.Z,{icon:"lock",multiline:!0,onClick:Y},a.ZP.createElement("span",{className:"title"},X("ChannelType")),a.ZP.createElement("span",{className:"subtitle"},t.username?X("TypePublic"):X("TypePrivate"))),a.ZP.createElement(Ee.Z,{icon:"message",multiline:!0,onClick:H,disabled:!l},a.ZP.createElement("span",{className:"title"},X("Discussion")),a.ZP.createElement("span",{className:"subtitle"},X(S?"DiscussionUnlink":"Add"))),a.ZP.createElement(Ee.Z,{icon:"admin",multiline:!0,onClick:V},a.ZP.createElement("span",{className:"title"},X("ChannelAdministrators")),a.ZP.createElement("span",{className:"subtitle"},_)),a.ZP.createElement("div",{className:"ListItem no-selection narrow"},a.ZP.createElement(en.Z,{checked:s,label:X("ChannelSignMessages"),onChange:Q}))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Ee.Z,{icon:"group",multiline:!0,onClick:ee},a.ZP.createElement("span",{className:"title",dir:"auto"},X("ChannelSubscribers")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},X("Subscribers",null!==(b=t.membersCount)&&void 0!==b?b:0,"i")))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Ee.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:w},t.isCreator?X("ChannelDelete"):X("LeaveChannel")))),a.ZP.createElement(Xt.Z,{isShown:A,onClick:W,disabled:ne,ariaLabel:X("Save")},ne?a.ZP.createElement(F.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Fe.Z,{isOpen:k,onClose:N,text:t.isCreator?X("ChannelDeleteAlert"):X("ChannelLeaveAlert"),confirmLabel:t.isCreator?X("ChannelDelete"):X("LeaveChannel"),confirmHandler:te,confirmIsDestructive:!0}))})));var Nr=n(88);const Mr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,m.Z1)(e,t),{isUsernameAvailable:a}=(0,m.aW)(e,t);return{chat:n,isChannel:(0,u.eA)(n),progress:e.management.progress,isUsernameAvailable:a}}),((e,t)=>(0,h.ei)(t,["checkPublicLink","updatePublicLink","updatePrivateLink"])))((({chat:e,onClose:t,isActive:n,isChannel:s,progress:r,isUsernameAvailable:l,checkPublicLink:i,updatePublicLink:c,updatePrivateLink:d})=>{var m;const u=Boolean(e.username),h=null===(m=e.fullInfo)||void 0===m?void 0:m.inviteLink,[Z,P]=(0,a.eJ)(u?"public":"private"),[g,v]=(0,a.eJ)(),[p,E,C]=(0,Le.Z)(),f=Boolean("public"===Z&&g&&l||"private"===Z&&u);(0,T.ZP)(n,t),(0,a.d4)((()=>{Z&&!h&&d()}),[Z,h,d]);const b=(0,a.I4)((e=>{P(e)}),[]),I=(0,a.I4)((()=>{c({username:"public"===Z?g:""})}),[Z,c,g]),y=(0,a.I4)((()=>{C(),d()}),[C,d]),S=(0,M.Z)(),k=s?"Channel":"Mega",w=s?"Channel":"Group",N=[{value:"private",label:S(`${k}Private`),subLabel:S(`${k}PrivateInfo`)},{value:"public",label:S(`${k}Public`),subLabel:S(`${k}PublicInfo`)}],A=r===o.wv.InProgress;return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section",dir:S.isRtl?"rtl":void 0},a.ZP.createElement("h3",{className:"section-heading"},S(`${w}Type`)),a.ZP.createElement(_e.Z,{selected:Z,name:"channel-type",options:N,onChange:b})),"private"===Z?a.ZP.createElement("div",{className:"section",dir:S.isRtl?"rtl":void 0},h?a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(Nr.Z,{url:h,className:"group-link",text:h}),a.ZP.createElement("p",{className:"section-info",dir:S.isRtl?"rtl":void 0},S(`${k}PrivateLinkHelp`)),a.ZP.createElement(Ee.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:E},S("RevokeLink")),a.ZP.createElement(Fe.Z,{isOpen:p,onClose:C,text:S("RevokeAlert"),confirmLabel:S("RevokeButton"),confirmHandler:y,confirmIsDestructive:!0})):a.ZP.createElement(Pe.Z,null)):a.ZP.createElement("div",{className:"section no-border"},a.ZP.createElement(jt,{asLink:!0,currentUsername:e.username,isLoading:A,isUsernameAvailable:l,checkUsername:i,onChange:v}),a.ZP.createElement("p",{className:"section-info",dir:"auto"},S(`${w}.Username.CreatePublicLinkHelp`)))),a.ZP.createElement(Xt.Z,{isShown:f,disabled:A,ariaLabel:S("Save"),onClick:I},A?a.ZP.createElement(F.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})))}))),Tr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,m.Z1)(e,t),{forDiscussionIds:s,byId:r}=e.chats;return{chat:a,chatsByIds:r,forDiscussionIds:s,linkedChat:null!=a&&null!==(n=a.fullInfo)&&void 0!==n&&n.linkedChatId?(0,m.Z1)(e,a.fullInfo.linkedChatId):void 0,isChannel:a&&(0,u.eA)(a)}}),((e,t)=>(0,h.ei)(t,["loadGroupsForDiscussion","linkDiscussionGroup","unlinkDiscussionGroup"])))((({chat:e,onClose:t,isActive:n,chatId:s,chatsByIds:r,linkedChat:i,forDiscussionIds:c,isChannel:d,onScreenSelect:m,loadGroupsForDiscussion:u,linkDiscussionGroup:h,unlinkDiscussionGroup:Z})=>{const[P,g]=(0,a.eJ)(),[v,p]=(0,a.eJ)(),[E,C]=(0,a.eJ)(!1),f=(0,a.I4)((()=>C(!0)),[]),[b,I,y]=(0,Le.Z)(),[S,k,w]=(0,Le.Z)(),N=(0,M.Z)(),F=null==i?void 0:i.id;(0,T.ZP)(n,t),(0,a.d4)((()=>{u()}),[u]),(0,a.d4)((()=>{v||(0,an.Z)("DiscussionGroups").then(p)}),[v]);const A=(0,a.I4)((()=>{y(),Z({channelId:d?s:F}),d||m(o.u1.Initial)}),[y,Z,d,s,F,m]),L=(0,a.I4)((()=>{w(),h({channelId:s,chatId:P})}),[w,h,s,P]);return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement("div",{className:"section-icon"},v&&a.ZP.createElement(sn.Z,{id:"discussionGroupsDucks",size:l.bM,animationData:v,play:E,noLoop:!0,onLoad:f})),i&&a.ZP.createElement("div",null,a.ZP.createElement(Ee.Z,{className:"chat-item-clickable",inactive:!0},a.ZP.createElement(Ce.Z,{chatId:i.id})),a.ZP.createElement(Ee.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:I},N(d?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel")),a.ZP.createElement(Fe.Z,{isOpen:b,onClose:y,header:a.ZP.createElement("div",{className:"modal-header"},a.ZP.createElement(D.Z,{size:"tiny",chat:i}),a.ZP.createElement("div",{className:"modal-title"},N(d?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"))),textParts:(0,$.Z)(N(d?"DiscussionUnlinkChannelAlert":"DiscussionUnlinkGroupAlert",i.title),["br","simple_markdown"]),confirmLabel:N(d?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"),confirmHandler:A,confirmIsDestructive:!0})),!i&&a.ZP.createElement("div",null,a.ZP.createElement("p",{className:"section-help",dir:"auto"},N("DiscussionChannelHelp")),a.ZP.createElement("div",{teactFastList:!0},a.ZP.createElement(Ee.Z,{key:"create-group",icon:"group",ripple:!0,teactOrderKey:0,className:"not-implemented"},N("DiscussionCreateGroup")),c?c.map(((e,t)=>a.ZP.createElement(Ee.Z,{key:e,teactOrderKey:t+1,className:"chat-item-clickable scroll-item",onClick:()=>{g(e),k()}},a.ZP.createElement(Ce.Z,{chatId:e})))):a.ZP.createElement(it.Z,{key:"nothing-found",teactOrderKey:0,text:"No discussion groups found"})),a.ZP.createElement("p",{className:"mt-4 mb-0 section-help",dir:"auto"},N("DiscussionChannelHelp2")),a.ZP.createElement(Fe.Z,{isOpen:S,onClose:w,header:function(){const e=r[P];if(e)return a.ZP.createElement("div",{className:"modal-header"},a.ZP.createElement(D.Z,{size:"tiny",chat:e}),a.ZP.createElement("div",{className:"modal-title"},N("Channel.DiscussionGroup.LinkGroup")))}(),textParts:function(){const t=r[P];if(t)return t.hasPrivateLink?(0,$.Z)(`Do you want to make **${t.title}** the discussion board for **${e.title}**?`,["br","simple_markdown"]):(0,$.Z)(`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"])}(),confirmLabel:N("DiscussionLinkGroup"),confirmHandler:L,isButtonsInOneRow:!0})))))}))),Fr=(0,a.X$)((0,s.c$)(((e,{chatId:t,isPromotedByCurrentUser:n})=>{const a=(0,m.Z1)(e,t);return{chat:a,isFormFullyDisabled:!(a.isCreator||n)}}),((e,t)=>(0,h.ei)(t,["updateChatMemberBannedRights"])))((({chat:e,selectedChatMemberId:t,onScreenSelect:n,updateChatMemberBannedRights:s,isFormFullyDisabled:r,onClose:l,isActive:i})=>{const[c,d]=(0,a.eJ)({}),[m,u]=(0,a.eJ)(!1),[h,Z]=(0,a.eJ)(!1),[P,g,v]=(0,Le.Z)(),p=(0,M.Z)();(0,T.ZP)(i,l);const E=(0,a.Ye)((()=>{if(e&&e.fullInfo&&e.fullInfo.members)return e.fullInfo.members.find((({userId:e})=>e===t))}),[e,t]);(0,a.d4)((()=>{null!=e&&e.fullInfo&&t&&!E&&n(o.u1.GroupPermissions)}),[e,n,E,t]),(0,a.d4)((()=>{d((null==E?void 0:E.bannedRights)||(null==e?void 0:e.defaultBannedRights)||{}),u(!1),Z(!1)}),[e,E]);const C=(0,a.I4)((e=>{const{name:t}=e.target;function n(e){return!e||void 0}d((e=>({...e,[t]:n(e[t]),..."sendStickers"===t&&{sendGifs:n(e[t])}}))),u(!0)}),[]),f=(0,a.I4)((()=>{e&&t&&(Z(!0),s({chatId:e.id,userId:t,bannedRights:c}))}),[e,t,c,s]),b=(0,a.I4)((()=>{e&&t&&s({chatId:e.id,userId:t,bannedRights:{viewMessages:!0}})}),[e,t,s]),I=(0,a.I4)((t=>!!r||!(!e||!e.defaultBannedRights)&&e.defaultBannedRights[t]),[e,r]);if(E)return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Ee.Z,{inactive:!0,className:"chat-item-clickable"},a.ZP.createElement(fe.Z,{userId:E.userId})),a.ZP.createElement("h3",{className:"section-heading mt-4",dir:"auto"},p("UserRestrictionsCanDo")),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"sendMessages",checked:!c.sendMessages,label:p("UserRestrictionsSend"),blocking:!0,disabled:I("sendMessages"),onChange:C})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"sendMedia",checked:!c.sendMedia,label:p("UserRestrictionsSendMedia"),blocking:!0,disabled:I("sendMedia"),onChange:C})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"sendStickers",checked:!c.sendStickers&&!c.sendGifs,label:p("UserRestrictionsSendStickers"),blocking:!0,disabled:I("sendStickers"),onChange:C})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"sendPolls",checked:!c.sendPolls,label:p("UserRestrictionsSendPolls"),blocking:!0,disabled:I("sendPolls"),onChange:C})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"embedLinks",checked:!c.embedLinks,label:p("UserRestrictionsEmbedLinks"),blocking:!0,disabled:I("embedLinks"),onChange:C})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"inviteUsers",checked:!c.inviteUsers,label:p("UserRestrictionsInviteUsers"),blocking:!0,disabled:I("inviteUsers"),onChange:C})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"pinMessages",checked:!c.pinMessages,label:p("UserRestrictionsPinMessages"),blocking:!0,disabled:I("pinMessages"),onChange:C})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"changeInfo",checked:!c.changeInfo,label:p("UserRestrictionsChangeInfo"),blocking:!0,disabled:I("changeInfo"),onChange:C}))),!r&&a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Ee.Z,{icon:"delete-user",ripple:!0,destructive:!0,onClick:g},p("UserRestrictionsBlock")))),a.ZP.createElement(Xt.Z,{isShown:m,onClick:f,ariaLabel:p("Save"),disabled:h},h?a.ZP.createElement(F.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Fe.Z,{isOpen:P,onClose:v,text:"Are you sure you want to ban and remove this user from the group?",confirmLabel:"Remove",confirmHandler:b,confirmIsDestructive:!0}))}))),Ar=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,m.Z1)(e,t),{byId:a}=e.users;return{chat:n,currentUserId:e.currentUserId,isChannel:(0,u.eA)(n),usersById:a}}))((({chat:e,isChannel:t,currentUserId:n,usersById:s,onScreenSelect:r,onChatMemberSelect:l,onClose:i,isActive:c})=>{const d=(0,M.Z)();(0,T.ZP)(c,i);const m=(0,a.Ye)((()=>e.fullInfo&&e.fullInfo.adminMembers?e.fullInfo.adminMembers.sort(((e,t)=>e.isOwner?-1:t.isOwner?1:0)):[]),[e]),h=(0,a.I4)((e=>{l(e.userId,e.promotedByUserId===n),r(o.u1.ChatAdminRights)}),[n,l,r]),Z=(0,a.I4)((e=>{if(e.isOwner)return d("ChannelCreator");const t=e.promotedByUserId?s[e.promotedByUserId]:void 0;return t?d("EditAdminPromotedBy",(0,u.Js)(t)):d("ChannelAdmin")}),[d,s]);return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Ee.Z,{icon:"recent",multiline:!0,onClick:function(){r(o.u1.GroupRecentActions)}},a.ZP.createElement("span",{className:"title"},d("EventLog")),a.ZP.createElement("span",{className:"subtitle"},d(t?"EventLogInfoDetailChannel":"EventLogInfoDetail")))),a.ZP.createElement("div",{className:"section",dir:d.isRtl?"rtl":void 0},a.ZP.createElement("p",{className:"text-muted",dir:"auto"},t?"You can add administrators to help you manage your channel.":"You can add administrators to help you manage your group."),m.map((e=>a.ZP.createElement(Ee.Z,{key:e.userId,className:"chat-item-clickable",onClick:()=>h(e)},a.ZP.createElement(fe.Z,{userId:e.userId,status:Z(e),forceShowSelf:!0})))))))}))),Lr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>({chat:(0,m.Z1)(e,t)})))((({chat:e,onClose:t,isActive:n})=>{const s=(0,M.Z)();(0,T.ZP)(n,t);const r=(0,a.Ye)((()=>e&&e.fullInfo&&e.fullInfo.adminMembers?e.fullInfo.adminMembers.sort(((e,t)=>e.isOwner?-1:t.isOwner?1:0)):[]),[e]),o=(0,a.I4)((e=>e.isOwner?s("ChannelCreator"):s("ChannelAdmin")),[s]);return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section not-implemented",dir:s.isRtl?"rtl":void 0},a.ZP.createElement("h3",{className:"section-heading",dir:"auto"},"Actions"),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"changeInfo",checked:!0,label:s("EventLogAllEvents"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterNewAdmins"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterNewMembers"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterChannelInfo"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterDeletedMessages"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterEditedMessages"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterLeavingMembers"),onChange:void 0}))),a.ZP.createElement("div",{className:"section not-implemented",dir:s.isRtl?"rtl":void 0},a.ZP.createElement("h3",{className:"section-heading",dir:"auto"},s("Channel.Management.Title")),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"changeInfo",checked:!0,label:s("EventLogAllAdmins"),onChange:void 0})),r.map((e=>a.ZP.createElement(Ee.Z,{key:e.userId,className:"chat-item-clickable picker-list-item",onClick:void 0,ripple:!0},a.ZP.createElement(en.Z,{label:"",checked:!0}),a.ZP.createElement(fe.Z,{userId:e.userId,status:o(e),forceShowSelf:!0})))))))}))),Rr=(0,a.X$)((0,s.c$)(((e,{chatId:t,isPromotedByCurrentUser:n})=>{const a=(0,m.Z1)(e,t),{byId:s}=e.users,{currentUserId:r}=e;return{chat:a,usersById:s,currentUserId:r,isChannel:(0,u.eA)(a),isFormFullyDisabled:!(a.isCreator||n)}}),((e,t)=>(0,h.ei)(t,["updateChatAdmin"])))((({selectedChatMemberId:e,onScreenSelect:t,chat:n,usersById:s,currentUserId:r,isChannel:l,isFormFullyDisabled:i,updateChatAdmin:c,onClose:d,isActive:m})=>{const[h,Z]=(0,a.eJ)({}),[P,g]=(0,a.eJ)(!1),[v,p]=(0,a.eJ)(!1),[E,C,f]=(0,Le.Z)(),[b,I]=(0,a.eJ)(""),y=(0,M.Z)();(0,T.ZP)(m,d);const S=(0,a.Ye)((()=>{if(n.fullInfo&&n.fullInfo.adminMembers)return n.fullInfo.adminMembers.find((({userId:t})=>t===e))}),[n,e]);(0,a.d4)((()=>{null!=n&&n.fullInfo&&e&&!S&&t(o.u1.ChatAdministrators)}),[n,t,S,e]),(0,a.d4)((()=>{Z((null==S?void 0:S.adminRights)||{}),I(((null==S?void 0:S.customTitle)||"").substr(0,16)),g(!1),p(!1)}),[S]);const k=(0,a.I4)((e=>{const{name:t}=e.target;Z((e=>{return{...e,[t]:(n=e[t],!n||void 0)};var n})),g(!0)}),[]),w=(0,a.I4)((()=>{e&&(p(!0),c({chatId:n.id,userId:e,adminRights:h,customTitle:b}))}),[n,e,h,b,c]),N=(0,a.I4)((()=>{e&&(c({chatId:n.id,userId:e,adminRights:{}}),f())}),[n.id,f,e,c]),A=(0,a.I4)((e=>!((0,u.G9)(n)||!i&&n.adminRights&&n.adminRights[e])),[n,i]),L=(0,a.Ye)((()=>{if(!S)return;if(S.isOwner)return y("ChannelCreator");const e=S.promotedByUserId?s[S.promotedByUserId]:void 0;return e?y("EditAdminPromotedBy",(0,u.Js)(e)):y("ChannelAdmin")}),[S,s,y]),R=(0,a.I4)((e=>{const{value:t}=e.target;I(t),g(!0)}),[]);if(S)return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Ee.Z,{inactive:!0,className:"chat-item-clickable"},a.ZP.createElement(fe.Z,{userId:S.userId,status:L,forceShowSelf:!0})),a.ZP.createElement("h3",{className:"section-heading mt-4",dir:"auto"},y("EditAdminWhatCanDo")),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"changeInfo",checked:!!h.changeInfo,label:y(l?"EditAdminChangeChannelInfo":"EditAdminChangeGroupInfo"),blocking:!0,disabled:A("changeInfo"),onChange:k})),l&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"postMessages",checked:!!h.postMessages,label:y("EditAdminPostMessages"),blocking:!0,disabled:A("postMessages"),onChange:k})),l&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"editMessages",checked:!!h.editMessages,label:y("EditAdminEditMessages"),blocking:!0,disabled:A("editMessages"),onChange:k})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"deleteMessages",checked:!!h.deleteMessages,label:y(l?"EditAdminDeleteMessages":"EditAdminGroupDeleteMessages"),blocking:!0,disabled:A("deleteMessages"),onChange:k})),!l&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"banUsers",checked:!!h.banUsers,label:y("EditAdminBanUsers"),blocking:!0,disabled:A("banUsers"),onChange:k})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"inviteUsers",checked:!!h.inviteUsers,label:y("EditAdminAddUsers"),blocking:!0,disabled:A("inviteUsers"),onChange:k})),!l&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"pinMessages",checked:!!h.pinMessages,label:y("EditAdminPinMessages"),blocking:!0,disabled:A("pinMessages"),onChange:k})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"addAdmins",checked:!!h.addAdmins,label:y("EditAdminAddAdmins"),blocking:!0,disabled:A("addAdmins"),onChange:k})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"manageCall",checked:!!h.manageCall,label:y("StartVoipChatPermission"),blocking:!0,disabled:A("manageCall"),onChange:k})),!l&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"anonymous",checked:!!h.anonymous,label:y("EditAdminSendAnonymously"),blocking:!0,disabled:A("anonymous"),onChange:k})),i&&a.ZP.createElement("p",{className:"section-info mb-4",dir:"auto"},y("Channel.EditAdmin.CannotEdit")),!l&&a.ZP.createElement(ve.Z,{id:"admin-title",label:y("EditAdminRank"),onChange:R,value:b,disabled:i,maxLength:16}),r!==e&&!i&&a.ZP.createElement(Ee.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:C},y("EditAdminRemoveAdmin")))),a.ZP.createElement(Xt.Z,{isShown:P,onClick:w,ariaLabel:y("Save"),disabled:v},v?a.ZP.createElement(F.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Fe.Z,{isOpen:E,onClose:f,text:"Are you sure you want to dismiss this admin?",confirmLabel:"Dismiss",confirmHandler:N,confirmIsDestructive:!0}))}))),Br=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,m.Z1)(e,t),{byId:s}=e.users;return{members:null==a||null===(n=a.fullInfo)||void 0===n?void 0:n.members,usersById:s,isChannel:a&&(0,u.eA)(a),serverTimeOffset:e.serverTimeOffset}}),((e,t)=>(0,h.ei)(t,["openUserInfo"])))((({members:e,usersById:t,isChannel:n,openUserInfo:s,onClose:r,isActive:o,serverTimeOffset:l})=>{const i=(0,a.Ye)((()=>{if(e&&t)return(0,u.Z0)(e.map((({userId:e})=>e)),t,void 0,l)}),[e,l,t]),c=(0,a.I4)((e=>{s({id:e})}),[s]);return(0,T.ZP)(o,r),a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section",teactFastList:!0},i?i.map(((e,t)=>a.ZP.createElement(Ee.Z,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>c(e)},a.ZP.createElement(fe.Z,{userId:e,forceShowSelf:!0})))):a.ZP.createElement(it.Z,{teactOrderKey:0,key:"nothing-found",text:n?"No subscribers found":"No members found"}))))}))),$r=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,m.Z1)(e,t),{byId:s}=e.users;return{members:null==a||null===(n=a.fullInfo)||void 0===n?void 0:n.members,usersById:s,isChannel:a&&(0,u.eA)(a),serverTimeOffset:e.serverTimeOffset}}))((({usersById:e,members:t,isChannel:n,onScreenSelect:s,onChatMemberSelect:r,onClose:l,isActive:i,serverTimeOffset:c})=>{(0,T.ZP)(i,l);const d=(0,a.Ye)((()=>{if(t&&e)return(0,u.Z0)(t.filter((e=>!e.isOwner)).map((({userId:e})=>e)),e,void 0,c)}),[t,c,e]),m=(0,a.I4)((e=>{r(e),s(o.u1.GroupUserPermissions)}),[r,s]);return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section",teactFastList:!0},d?d.map(((e,t)=>a.ZP.createElement(Ee.Z,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>m(e)},a.ZP.createElement(fe.Z,{userId:e,forceShowSelf:!0})))):a.ZP.createElement(it.Z,{teactOrderKey:0,key:"nothing-found",text:n?"No subscribers found":"No members found"}))))}))),Dr=(0,a.X$)((0,s.c$)((e=>({managementType:(0,m.pP)(e)})))((({chatId:e,currentScreen:t,selectedChatMemberId:n,isPromotedByCurrentUser:s,onScreenSelect:r,onChatMemberSelect:l,onClose:i,isActive:c,managementType:d})=>{switch(t){case o.u1.Initial:switch(d){case"user":return a.ZP.createElement(Cr,{key:e,userId:e,onClose:i,isActive:c});case"group":return a.ZP.createElement(br,{key:e,chatId:e,onScreenSelect:r,onClose:i,isActive:c||[o.u1.ChatPrivacyType,o.u1.Discussion,o.u1.GroupPermissions,o.u1.ChatAdministrators,o.u1.GroupRemovedUsers,o.u1.GroupUserPermissionsCreate,o.u1.GroupUserPermissions,o.u1.ChatAdminRights,o.u1.GroupRecentActions].includes(t)});case"channel":return a.ZP.createElement(wr,{key:e,chatId:e,onScreenSelect:r,onClose:i,isActive:c||[o.u1.ChannelSubscribers,o.u1.ChatAdministrators,o.u1.Discussion,o.u1.ChatPrivacyType,o.u1.ChatAdminRights,o.u1.GroupRecentActions].includes(t)})}break;case o.u1.ChatPrivacyType:return a.ZP.createElement(Mr,{chatId:e,isActive:c,onClose:i});case o.u1.Discussion:return a.ZP.createElement(Tr,{chatId:e,onScreenSelect:r,isActive:c,onClose:i});case o.u1.GroupPermissions:return a.ZP.createElement(Ir,{chatId:e,onScreenSelect:r,onChatMemberSelect:l,isActive:c||[o.u1.GroupRemovedUsers,o.u1.GroupUserPermissionsCreate,o.u1.GroupUserPermissions].includes(t),onClose:i});case o.u1.GroupRemovedUsers:return a.ZP.createElement(Sr,{chatId:e,isActive:c,onClose:i});case o.u1.GroupUserPermissionsCreate:return a.ZP.createElement($r,{chatId:e,onChatMemberSelect:l,onScreenSelect:r,isActive:c||[o.u1.GroupUserPermissions].includes(t),onClose:i});case o.u1.GroupUserPermissions:return a.ZP.createElement(Fr,{chatId:e,selectedChatMemberId:n,isPromotedByCurrentUser:s,onScreenSelect:r,isActive:c,onClose:i});case o.u1.ChatAdministrators:return a.ZP.createElement(Ar,{chatId:e,onScreenSelect:r,onChatMemberSelect:l,isActive:c||[o.u1.ChatAdminRights,o.u1.GroupRecentActions].includes(t),onClose:i});case o.u1.GroupRecentActions:return a.ZP.createElement(Lr,{chatId:e,isActive:c,onClose:i});case o.u1.ChatAdminRights:return a.ZP.createElement(Rr,{chatId:e,selectedChatMemberId:n,isPromotedByCurrentUser:s,onScreenSelect:r,isActive:c,onClose:i});case o.u1.ChannelSubscribers:case o.u1.GroupMembers:return a.ZP.createElement(Br,{chatId:e,isActive:c,onClose:i})}})));var Ur=n(9937);const Or=/^4[0-9]{12}(?:[0-9]{1,3})?$/,xr=/^5[1-5][0-9]{11,14}$/,Gr=/^2[2-7][0-9]{11,14}$/;let Jr;!function(e){e[e.Default=0]="Default",e[e.Visa=1]="Visa",e[e.Mastercard=2]="Mastercard"}(Jr||(Jr={}));const zr={[Jr.Default]:"",[Jr.Visa]:"visa",[Jr.Mastercard]:"mastercard"};function Xr(e){return e=e.replace(/\s/g,""),Or.test(e)?Jr.Visa:xr.test(e)||Gr.test(e)?Jr.Mastercard:Jr.Default}const _r={},Yr=/(\d{1,3})(\d{1,3})?(\d{1,3})?(\d{1,3})?(\d{1,3})?/,Hr="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 Caledonia6\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 Yr;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+$/))}))),Vr={streetLine1:"",streetLine2:"",city:"",state:"",countryIso2:"",postCode:"",fullName:"",email:"",phone:"",shipping:"",cardNumber:"",cardholder:"",expiry:"",cvv:"",billingCountry:"",billingZip:"",saveInfo:!0,saveCredentials:!1,formErrors:{}},jr=(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:Kr(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:Kr(t.payload.countryIso2)}:{...e,...t.payload};case"setFormErrors":return{...e,formErrors:{...e.formErrors,...t.payload}};default:return e}};function Kr(e){const t=Hr.find((({id:t})=>t===e));return t?t.name:""}function qr(e,t=400){(0,a.d4)((()=>{i.$b||setTimeout((()=>{(0,z.T2)((()=>{e.current&&e.current.focus()}))}),t)}),[e,t])}const Wr=(0,a.X$)((e=>{const{id:t,value:n,label:s,hasArrow:r,error:o,ref:l,placeholder:i,onChange:c,children:d}=e,m=o||s,u=(0,X.Z)("input-group",n&&"touched",o&&"error",m&&"with-label",r&&"with-arrow","input-group");return a.ZP.createElement("div",{className:u},a.ZP.createElement("select",{className:"form-control",id:t,value:n||"",onChange:c,placeholder:i||s,ref:l},d),m&&t&&a.ZP.createElement("label",{htmlFor:t},m))})),Qr=(0,a.X$)((({state:e,needEmail:t,needPhone:n,needName:s,needAddress:r,dispatch:o})=>{const l=(0,a.sO)(null),i=(0,a.sO)(null),c=(0,a.sO)(null);(0,a.d4)((()=>{c.current&&c.current.value!==e.countryIso2&&(c.current.value=e.countryIso2)}),[e.countryIso2]);const d=(0,M.Z)();qr(l);const m=(0,a.I4)((e=>{o({type:"changeAddress1",payload:e.target.value})}),[o]),u=(0,a.I4)((e=>{o({type:"changeAddress2",payload:e.target.value})}),[o]),h=(0,a.I4)((e=>{o({type:"changeCity",payload:e.target.value})}),[o]),Z=(0,a.I4)((e=>{o({type:"changeState",payload:e.target.value})}),[o]),P=(0,a.I4)((e=>{o({type:"changeCountry",payload:e.target.value})}),[o]),g=(0,a.I4)((e=>{o({type:"changePostCode",payload:e.target.value})}),[o]),v=(0,a.I4)((e=>{o({type:"changeFullName",payload:e.target.value})}),[o]),p=(0,a.I4)((e=>{o({type:"changeEmail",payload:e.target.value})}),[o]),E=(0,a.I4)((e=>{let{value:t}=e.target;t=`+${t.replace(/\D/g,"")}`,i.current&&(i.current.value=t),o({type:"changePhone",payload:t})}),[o]),C=(0,a.I4)((e=>{o({type:"changeSaveInfo",payload:e.target.value})}),[o]),{formErrors:f}=e;return a.ZP.createElement("div",{className:"ShippingInfo"},a.ZP.createElement("form",null,r?a.ZP.createElement("div",null,a.ZP.createElement("h5",null,d("PaymentShippingAddress")),a.ZP.createElement(ve.Z,{ref:l,label:"Address1 (Street)",onChange:m,value:e.streetLine1,inputMode:"text",error:f.streetLine1}),a.ZP.createElement(ve.Z,{label:"Address2 (Street)",onChange:u,value:e.streetLine2,inputMode:"text",error:f.streetLine2}),a.ZP.createElement(ve.Z,{label:"City",onChange:h,value:e.city,inputMode:"text",error:f.city}),a.ZP.createElement(ve.Z,{label:"State",onChange:Z,value:e.state,inputMode:"text",error:f.state}),a.ZP.createElement(Wr,{label:"Country",placeholder:"Country",onChange:P,value:e.countryIso2,hasArrow:Boolean(!0),id:"shipping-country",error:f.countryIso2,ref:c},Hr.map((({name:e,id:t})=>a.ZP.createElement("option",{value:t,className:"county-item"},e)))),a.ZP.createElement(ve.Z,{label:"Post Code",onChange:g,value:e.postCode,inputMode:"text",error:f.postCode})):void 0,s||t||n?a.ZP.createElement("h5",null,d("PaymentShippingReceiver")):void 0,s&&a.ZP.createElement(ve.Z,{label:"Full name",onChange:v,value:e.fullName,inputMode:"text",error:f.fullName}),t&&a.ZP.createElement(ve.Z,{label:"Email",onChange:p,value:e.email,inputMode:"email",error:f.email}),n&&a.ZP.createElement(ve.Z,{label:"Phone number",onChange:E,value:e.phone,inputMode:"tel",error:f.phone,ref:i}),a.ZP.createElement(en.Z,{label:d("PaymentShippingSave"),subLabel:d("PaymentShippingSaveInfo"),checked:Boolean(e.saveInfo),onChange:C})))})),eo=(0,a.X$)((({state:e,shippingOptions:t,currency:n,dispatch:s})=>{const r=(0,M.Z)();(0,a.d4)((()=>{t&&!e.shipping&&s({type:"changeShipping",payload:t[0].id})}),[t,e.shipping,s]);const o=(0,a.I4)((e=>{s({type:"changeShipping",payload:e})}),[s]),l=(0,a.Ye)((()=>t.map((({id:e,title:t,amount:a})=>({label:t,subLabel:(0,Ur.x)(a,n,r.code),value:e})))),[t,n,r.code]);return a.ZP.createElement("div",{className:"Shipping"},a.ZP.createElement("form",null,a.ZP.createElement("p",null,"Select shipping method"),a.ZP.createElement(_e.Z,{name:"shipping-options",options:l,onChange:o,selected:e.shipping})))}));function to(e,t,n,s,r=!1){return a.ZP.createElement("div",{className:"price-info-item "+(r?"price-info-item-main":"")},a.ZP.createElement("div",{className:"title"},t),a.ZP.createElement("div",{className:"value"},(0,Ur.x)(n,s,e)))}function no(e,t,n){return a.ZP.createElement("div",{className:"checkout-info-item"},a.ZP.createElement("i",{className:e}," "),a.ZP.createElement("div",{className:"info"},a.ZP.createElement("div",{className:"title"},t),a.ZP.createElement("p",{className:"data"},n)))}const ao=(0,a.X$)((({invoiceContent:e,prices:t,shippingPrices:n,checkoutInfo:s,currency:r,totalPrice:o})=>{const l=(0,M.Z)(),{photoUrl:i,title:c,text:d}=e||{},{paymentMethod:m,paymentProvider:u,shippingAddress:h,name:Z,phone:P,shippingMethod:g}=s||{};return a.ZP.createElement("div",{className:"Checkout"},a.ZP.createElement("div",{className:"description has-image"},i&&a.ZP.createElement("img",{src:i,alt:""}),a.ZP.createElement("div",{className:"text"},a.ZP.createElement("h5",null,c),a.ZP.createElement("p",null,d))),a.ZP.createElement("div",{className:"price-info"},t&&t.map((e=>to(l.code,e.label,e.amount,r))),n&&n.map((e=>to(l.code,e.label,e.amount,r))),void 0!==o&&to(l.code,l("Checkout.TotalAmount"),o,r,!0)),a.ZP.createElement("div",{className:"invoice-info"},m&&no("icon-card",m,"Payment method"),u&&no("stripe-provider",u,"Payment provider"),h&&no("icon-location",h,"Shipping address"),Z&&no("icon-user",Z,"Name"),P&&no("icon-phone",P,"Phone number"),g&&no("icon-truck",g,"Shipping method")))})),so=(0,a.X$)((({value:e,error:t,onChange:n})=>{const s=(0,a.sO)(null),r=(0,a.I4)((t=>{if("Backspace"===t.key&&"/"===e.charAt(e.length-1)){const t=e.slice(0,e.length-1);s.current&&(s.current.value=t)}}),[e]),o=(0,a.I4)((e=>{n(function(e){const t=(e=e.replace(/[^\d]/g,"").slice(0,4)).match(/.{1,2}/g);return null!=t&&t[0]&&Number(t[0])>12&&(t[0]="12"),null!=t&&t[0]&&2===t[0].length&&!t[1]&&(t[1]=""),t?t.join("/"):""}(e.target.value))}),[n]);return a.ZP.createElement(ve.Z,{label:"Expiry date",ref:s,onChange:o,onKeyDown:r,value:e,error:t,inputMode:"numeric",maxLength:5})}));var ro=n(6352),oo=n(5753);const lo=(0,a.X$)((({value:e,error:t,onChange:n})=>{const s=(0,a.sO)(null);qr(s);const[r,o]=(0,a.eJ)(Jr.Default);(0,a.d4)((()=>{const t=Xr(e);o(t)}),[]);const l=(0,a.I4)((e=>{const t=function(e){const t=(e=e.replace(/[^\d]/g,"")).match(/.{1,4}/g);return t?t.join(" "):""}(e.target.value),a=Xr(e.target.value);o(a),n(t),s.current&&(s.current.value=t)}),[n,s]),i=function(e){switch(e){case Jr.Mastercard:return a.ZP.createElement("img",{src:ro,alt:""});case Jr.Visa:return a.ZP.createElement("img",{src:oo,alt:""});default:return}}(r);return a.ZP.createElement("div",{className:"CardInput"},a.ZP.createElement("span",{className:"left-addon"},i),a.ZP.createElement(ve.Z,{ref:s,label:"Card number",onChange:l,value:e,inputMode:"numeric",className:r?"has-left-addon":"",error:t,maxLength:23}))})),io=(0,a.X$)((({state:e,canSaveCredentials:t,needCardholderName:n,needCountry:s,needZip:r,dispatch:o})=>{const l=(0,a.sO)(null);(0,a.d4)((()=>{l.current&&l.current.value!==e.billingCountry&&(l.current.value=e.billingCountry)}),[e.billingCountry]);const i=(0,a.I4)((e=>{o({type:"changeCardNumber",payload:e})}),[o]),c=(0,a.I4)((e=>{o({type:"changeCardholder",payload:e.target.value.toUpperCase()})}),[o]),d=(0,a.I4)((e=>{o({type:"changeExpiryDate",payload:e})}),[o]),m=(0,a.I4)((e=>{o({type:"changeCvvCode",payload:e.target.value})}),[o]),u=(0,a.I4)((e=>{o({type:"changeBillingCountry",payload:e.target.value})}),[o]),h=(0,a.I4)((e=>{o({type:"changeBillingZip",payload:e.target.value})}),[o]),Z=(0,a.I4)((e=>{o({type:"changeSaveCredentials",payload:e.target.value})}),[o]),P=(0,M.Z)(),{formErrors:g={}}=e;return a.ZP.createElement("div",{className:"PaymentInfo"},a.ZP.createElement("form",null,a.ZP.createElement("h5",null,P("PaymentCardTitle")),a.ZP.createElement(lo,{onChange:i,value:e.cardNumber,error:g.cardNumber}),n&&a.ZP.createElement(ve.Z,{label:"Name on card",onChange:c,value:e.cardholder,inputMode:"text",error:g.cardholder}),a.ZP.createElement("section",{className:"inline-inputs"},a.ZP.createElement(so,{value:e.expiry,onChange:d,error:g.expiry}),a.ZP.createElement(ve.Z,{label:"CVV code",onChange:m,value:e.cvv,inputMode:"numeric",maxLength:3,error:g.cvv})),s||r?a.ZP.createElement("h5",null,P("PaymentBillingAddress")):void 0,s&&a.ZP.createElement(Wr,{label:"Country",placeholder:"Country",onChange:u,value:e.billingCountry,hasArrow:Boolean(!0),id:"billing-country",error:g.billingCountry,ref:l},Hr.map((({name:e})=>a.ZP.createElement("option",{value:e,className:"county-item"},e)))),r&&a.ZP.createElement(ve.Z,{label:"Post Code",onChange:h,value:e.billingZip,inputMode:"text",error:g.billingZip}),t&&a.ZP.createElement(en.Z,{label:P("PaymentCardSavePaymentInformation"),checked:e.saveCredentials,onChange:Z})))})),co=(0,a.X$)((0,s.c$)((e=>{const{step:t,shippingOptions:n,savedInfo:a,canSaveCredentials:s,invoice:r,invoiceContent:o,nativeProvider:l,nativeParams:i,passwordMissing:c,error:d}=e.payment,m=Boolean(r&&(!l||"stripe"!==l)),{needCardholderName:u,needCountry:h,needZip:Z}=i||{},{nameRequested:P,phoneRequested:g,emailRequested:v,shippingAddressRequested:p,flexible:E,phoneToProvider:C,emailToProvider:f,currency:b,prices:I}=r||{};return{step:t,shippingOptions:n,savedInfo:a,canSaveCredentials:s,nativeProvider:l,passwordMissing:c,nameRequested:P,shippingAddressRequested:p,phoneRequested:g,emailRequested:v,flexible:E,phoneToProvider:C,emailToProvider:f,currency:b,prices:I,isProviderError:m,invoiceContent:o,needCardholderName:u,needCountry:h,needZip:Z,error:d}}),((e,t)=>(0,h.ei)(t,["validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError"])))((({isOpen:e,onClose:t,step:n,shippingOptions:s,savedInfo:r,canSaveCredentials:l,nameRequested:i,shippingAddressRequested:c,phoneRequested:d,emailRequested:m,phoneToProvider:u,emailToProvider:h,currency:Z,passwordMissing:P,isProviderError:g,invoiceContent:v,nativeProvider:p,prices:E,needCardholderName:C,needCountry:f,needZip:b,error:I,validateRequestedInfo:y,sendPaymentForm:S,setPaymentStep:k,sendCredentialsInfo:w,clearPaymentError:N})=>{const[T,A]=(0,$t.Z)(jr,Vr),[B,$]=(0,a.eJ)(!1),D=(0,M.Z)();(0,a.d4)((()=>{(n||I)&&$(!1)}),[n,I]),(0,a.d4)((()=>{null!=I&&I.field&&A({type:"setFormErrors",payload:{[I.field]:I.message}})}),[I,A]),(0,a.d4)((()=>{if(r){const{name:e,phone:t,email:n,shippingAddress:a}=r;A({type:"updateUserInfo",payload:{fullName:e,phone:t&&"+"!==t.charAt(0)?`+${t}`:t,email:n,...a||{}}})}}),[r,A]);const U=(0,a.I4)((()=>{N()}),[N]),O=(0,a.Ye)((()=>n!==o.KB.Checkout?0:function(e=[],t,n){const a=t?uo(t,n):[];let s=0;return s=e.concat(a||[]).reduce(((e,t)=>e+t.amount),s),s}(E,s,T.shipping)),[n,T.shipping,E,s]),x=(0,a.Ye)((()=>{if(n===o.KB.Checkout)return function(e,t,n){const a=`${function(e){const t=Xr(e);return zr[t]||""}(e.cardNumber)} *${e.cardNumber.slice(-4)}`,s=e.streetLine1?`${e.streetLine1}, ${e.city}, ${e.countryIso2}`:void 0,{phone:r,fullName:o}=e,l=t?mo(t,e.shipping):void 0;return{paymentMethod:a,paymentProvider:n,shippingAddress:s,name:o,phone:r,shippingMethod:null==l?void 0:l.title}}(T,s,p||"")}),[n,T,s,p]),G=(0,a.I4)((()=>{const{saveInfo:e}=T,t=function(e){const{streetLine1:t,streetLine2:n,city:a,state:s,countryIso2:r,postCode:o,fullName:l,phone:i,email:c}=e;return{name:l,phone:i,email:c,shippingAddress:{streetLine1:t,streetLine2:n,city:a,state:s,countryIso2:r,postCode:o}}}(T);y({requestInfo:t,saveInfo:e})}),[y,T]),J=(0,a.I4)((()=>{const e=function(e){const{cardNumber:t,cardholder:n,expiry:a,cvv:s,billingCountry:r,billingZip:o}=e,[l,i]=a.split("/");return{data:{cardNumber:t,cardholder:n,expiryMonth:l,expiryYear:i,cvv:s,country:r,zip:o}}}(T);w({credentials:e})}),[w,T]),z=(0,a.I4)((()=>{S({shippingOptionId:T.shipping,saveCredentials:T.saveCredentials})}),[S,T]),X=(0,a.I4)((e=>{k({step:e})}),[k]),_=(0,a.I4)((()=>{switch($(!0),n){case o.KB.ShippingInfo:return G();case o.KB.Shipping:return X(o.KB.PaymentInfo);case o.KB.PaymentInfo:return J();case o.KB.Checkout:return z();default:return()=>{}}}),[n,G,X,J,z]),Y=(0,a.Ye)((()=>{switch(n){case o.KB.ShippingInfo:return D("PaymentShippingInfo");case o.KB.Shipping:return D("PaymentShippingMethod");case o.KB.PaymentInfo:return D("PaymentCardInfo");case o.KB.Checkout:return D("PaymentCheckout");default:return""}}),[n,D]),H=(0,a.Ye)((()=>{switch(n){case o.KB.Checkout:return D("Checkout.PayPrice",(0,Ur.x)(O,Z,D.code));default:return D("Next")}}),[n,D,Z,O]);return g?a.ZP.createElement(ge.Z,{className:"error",isOpen:e,onClose:t},a.ZP.createElement("p",null,"Sorry, Telegram WebZ doesn't support payments with this provider yet. ",a.ZP.createElement("br",null),"Please use one of our mobile apps to do this."),a.ZP.createElement(R.Z,{isText:!0,onClick:t},D("OK"))):a.ZP.createElement(ge.Z,{className:"PaymentModal",isOpen:e,onClose:t},a.ZP.createElement("div",{className:"header",dir:D.isRtl?"rtl":void 0},a.ZP.createElement(R.Z,{className:"close-button",color:"translucent",round:!0,size:"smaller",onClick:t,ariaLabel:"Close"},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement("h3",null,Y)),void 0!==n?a.ZP.createElement(L.Z,{name:"slide",activeKey:n},(()=>a.ZP.createElement("div",{className:"content custom-scroll"},function(e){switch(e){case o.KB.ShippingInfo:return a.ZP.createElement(Qr,{state:T,dispatch:A,needAddress:Boolean(c),needEmail:Boolean(m||h),needPhone:Boolean(d||u),needName:Boolean(i)});case o.KB.Shipping:return a.ZP.createElement(eo,{state:T,dispatch:A,shippingOptions:s||[],currency:Z});case o.KB.PaymentInfo:return a.ZP.createElement(io,{state:T,dispatch:A,canSaveCredentials:Boolean(!P&&l),needCardholderName:C,needCountry:f,needZip:b});case o.KB.Checkout:return a.ZP.createElement(ao,{prices:E,shippingPrices:T.shipping&&s?uo(s,T.shipping):void 0,totalPrice:O,invoiceContent:v,checkoutInfo:x,currency:Z});default:return}}(n)))):a.ZP.createElement("div",{className:"empty-content"},a.ZP.createElement(F.Z,{color:"gray"})),a.ZP.createElement("div",{className:"footer"},a.ZP.createElement(R.Z,{type:"submit",onClick:_,disabled:B,isLoading:B},H)),I&&!I.field&&function(){if(I)return a.ZP.createElement(ge.Z,{className:"error",isOpen:Boolean(I),onClose:U},a.ZP.createElement("h4",null,I.description||"Error"),a.ZP.createElement("p",null,I.description||"Error"),a.ZP.createElement(R.Z,{isText:!0,onClick:N},D("OK")))}())})));function mo(e,t){return e.find((({id:e})=>e===t))}function uo(e,t){const n=mo(e,t);return null==n?void 0:n.prices}const ho=(0,a.X$)((0,s.c$)((e=>{const{receipt:t}=e.payment,{currency:n,prices:a,info:s,totalAmount:r,credentialsTitle:o,shippingPrices:l,shippingMethod:i,photoUrl:c,text:d,title:m}=t||{};return{currency:n,prices:a,info:s,totalAmount:r,credentialsTitle:o,shippingPrices:l,shippingMethod:i,photoUrl:c,text:d,title:m}}))((({isOpen:e,onClose:t,prices:n,shippingPrices:s,totalAmount:r,currency:o,info:l,photoUrl:i,text:c,title:d,credentialsTitle:m,shippingMethod:u})=>{const h=(0,M.Z)(),Z=(0,a.Ye)((()=>function(e,t,n){if(!t)return{paymentMethod:e};const{shippingAddress:a}=t,s=null!=a&&a.streetLine1?`${a.streetLine1}, ${a.city}, ${a.countryIso2}`:void 0,{phone:r,name:o}=t;return{paymentMethod:e,paymentProvider:"Stripe",shippingAddress:s,name:o,phone:r,shippingMethod:n}}(m,l,u)),[l,u,m]);return a.ZP.createElement(ge.Z,{className:"PaymentModal PaymentModal-receipt",isOpen:e,onClose:t},a.ZP.createElement("div",null,a.ZP.createElement("div",{className:"header",dir:h.isRtl?"rtl":void 0},a.ZP.createElement(R.Z,{className:"close-button",color:"translucent",round:!0,size:"smaller",onClick:t,ariaLabel:"Close"},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement("h3",null," ",h("PaymentReceipt")," ")),a.ZP.createElement("div",{className:"receipt-content custom-scroll"},a.ZP.createElement(ao,{prices:n,shippingPrices:s,totalPrice:r,invoiceContent:{photoUrl:i,text:c,title:d},checkoutInfo:Z,currency:o}))))})))},9364:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(4050),s=n(3716),r=n(7361),o=n(6752),l=n(9107),i=n(231);const c=r.wB?550:400,d=(0,a.X$)((({isLoading:e=!1,isPasswordVisible:t,error:n,hint:d,placeholder:m="Password",submitLabel:u="Next",clearError:h,onChangePasswordVisibility:Z,onInputChange:P,onSubmit:g})=>{const v=(0,a.sO)(null),p=(0,l.Z)(),[E,C]=(0,a.eJ)(""),[f,b]=(0,a.eJ)(!1);return(0,a.d4)((()=>{r.$b||setTimeout((()=>{v.current.focus()}),c)}),[]),(0,a.d4)((()=>{n&&requestAnimationFrame((()=>{v.current.focus(),v.current.select()}))}),[n]),a.ZP.createElement("form",{action:"",onSubmit:function(t){t.preventDefault(),e||f&&g(E)},autoComplete:"off"},a.ZP.createElement("div",{className:(0,o.Z)("input-group password-input",E&&"touched",n&&"error"),dir:p.isRtl?"rtl":void 0},a.ZP.createElement("input",{ref:v,className:"form-control",type:t?"text":"password",id:"sign-in-password",value:E||"",autoComplete:"current-password",onChange:function(e){n&&h();const{target:t}=e;C(t.value),b(t.value.length>=s.lo),P&&P(t.value)},dir:"auto"}),a.ZP.createElement("label",null,n||d||m),a.ZP.createElement("div",{className:"toggle-password",onClick:function(){Z(!t)},role:"button",tabIndex:0,title:"Toggle password visibility"},a.ZP.createElement("i",{className:t?"icon-eye":"icon-eye-closed"}))),f&&a.ZP.createElement(i.Z,{type:"submit",ripple:!0,isLoading:e},u))}))},3490:(e,t,n)=>{n.d(t,{Z:()=>u});var a=n(4050),s=n(3716),r=n(7361),o=n(7324),l=n(7799);const i=[0,50],c=[0,20],d=[20,0],m=r.wB?s.qp:s.z7,u=(0,a.X$)((({isPasswordVisible:e,isBig:t})=>{const[n,r]=(0,a.eJ)(),[u,h]=(0,a.eJ)(),[Z,P]=(0,a.eJ)(!1),[g,v]=(0,a.eJ)(!1);(0,a.d4)((()=>{n?setTimeout((()=>v(!0)),2e3):(0,o.Z)("MonkeyClose").then(r)}),[n]),(0,a.d4)((()=>{u||(0,o.Z)("MonkeyPeek").then(h)}),[u]);const p=(0,a.I4)((()=>P(!0)),[]);return a.ZP.createElement("div",{id:"monkey",className:t?"big":""},!Z&&a.ZP.createElement("div",{className:"monkey-preview"}),n&&a.ZP.createElement(l.Z,{id:"closeMonkey",size:t?s.K2:m,className:g?"hidden":"shown",animationData:n,playSegment:i,noLoop:!0,onLoad:p}),u&&a.ZP.createElement(l.Z,{id:"peekMonkey",size:t?s.K2:m,className:g?"shown":"hidden",animationData:u,playSegment:e?c:d,noLoop:!0}))}))},7324:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(6137),s=n(647);const r={MonkeyIdle:n(1679),MonkeyTracking:n(4889),MonkeyClose:n(4185),MonkeyPeek:n(8431),FoldersAll:n(6041),FoldersNew:n(7196),DiscussionGroups:n(4349),CameraFlip:n(6280),HandFilled:n(9129),HandOutline:n(1039),Speaker:n(9261),VoiceAllowTalk:n(2873),VoiceMini:n(7242),VoiceMuted:n(1274),VoiceOutlined:n(973)};function o(e){const t=r[e].replace(window.location.origin,"");return s.he(`file${t}`,a.IU.Lottie)}},710:(e,t,n)=>{n.d(t,{Z:()=>g});var a=n(4050),s=n(6752),r=n(3716),o=n(1394),l=n(9107),i=n(231),c=n(3103),d=n(4288);const m={type:"blob",quality:1,format:"jpeg",circle:!1};let u,h,Z;const P=(0,a.X$)((({file:e,onChange:t,onClose:s})=>{const[P,g]=(0,a.eJ)(!1);(0,a.d4)((()=>{e&&(P?async function(e){try{const t=document.getElementById("avatar-crop");if(!t)return;const{offsetWidth:n,offsetHeight:a}=t;Z=new u(t,{enableZoom:!0,boundary:{width:n,height:a},viewport:{width:n-16,height:a-16,type:"circle"}});const s=await(0,o.YJ)(e);await Z.bind({url:s})}catch(e){r.eM&&console.error(e)}}(e):async function(){return h||(h=Promise.all([n.e(99),n.e(472)]).then(n.bind(n,3472)),u=(await h).default),h}().then((()=>g(!0))))}),[e,P]);const v=(0,l.Z)();return a.ZP.createElement(c.Z,{isOpen:Boolean(e),onClose:s,title:"Drag to reposition",className:"CropModal",hasCloseButton:!0},P?a.ZP.createElement("div",{id:"avatar-crop"}):a.ZP.createElement(d.Z,null),a.ZP.createElement(i.Z,{className:"confirm-button",round:!0,color:"primary",onClick:async function(){if(!Z)return;const e=await Z.result(m),n="string"==typeof e?e:(0,o.hl)(e,"avatar.jpg");t(n)},ariaLabel:v("CropImage")},a.ZP.createElement("i",{className:"icon-check"})))})),g=(0,a.X$)((({title:e="Change your profile picture",disabled:t,currentAvatarBlobUrl:n,onChange:r})=>{const[o,l]=(0,a.eJ)(),[i,c]=(0,a.eJ)(n);(0,a.d4)((()=>{c(n)}),[n]);const d=(0,s.Z)(i&&"filled",t&&"disabled");return a.ZP.createElement("div",{className:"AvatarEditable"},a.ZP.createElement("label",{className:d,role:"button",tabIndex:0,title:e},a.ZP.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"}),a.ZP.createElement("i",{className:"icon-camera-add"}),i&&a.ZP.createElement("img",{src:i,alt:"Avatar"})),a.ZP.createElement(P,{file:o,onClose:function(){l(void 0)},onChange:function(e){l(void 0),r(e),i&&URL.revokeObjectURL(i),c(URL.createObjectURL(e))}}))}))},4349:(e,t,n)=>{e.exports=n.p+"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a..tgs"},6041:(e,t,n)=>{e.exports=n.p+"FoldersAll.3f9f9e243d19f0fbf9aa..tgs"},7196:(e,t,n)=>{e.exports=n.p+"FoldersNew.9a40d71c0c8be70f5bd1..tgs"},4185:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3e..tgs"},1679:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab..tgs"},8431:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyPeek.1905436b042520363d7e..tgs"},4889:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12..tgs"},6280:(e,t,n)=>{e.exports=n.p+"CameraFlip.1a9fe44cf01fcb22347d..tgs"},9129:(e,t,n)=>{e.exports=n.p+"HandFilled.f87939d160f1dc288586..tgs"},1039:(e,t,n)=>{e.exports=n.p+"HandOutline.f9831751ba60df30c484..tgs"},9261:(e,t,n)=>{e.exports=n.p+"Speaker.04bb3743412b41ff83c5..tgs"},2873:(e,t,n)=>{e.exports=n.p+"VoiceAllowTalk.a9cc7c39ec438973ddc9..tgs"},7242:(e,t,n)=>{e.exports=n.p+"VoiceMini.bf00ffdf69625c579569..tgs"},1274:(e,t,n)=>{e.exports=n.p+"VoiceMuted.a4b4ec6bfd7c6c5fb275..tgs"},973:(e,t,n)=>{e.exports=n.p+"VoiceOutlined.91b394ab3562cdfad6bc..tgs"},6352:(e,t,n)=>{e.exports=n.p+"mastercard.4216118edafe23cc2dec..svg"},5753:(e,t,n)=>{e.exports=n.p+"visa.e5a7c336e1deb4b92a63..svg"}}]); -//# sourceMappingURL=701.f1f158c205e1345450d1.js.map \ No newline at end of file +"use strict";(self.webpackChunktelegram_t=self.webpackChunktelegram_t||[]).push([[701],{9701:(e,t,n)=>{n.r(t),n.d(t,{ArchivedChats:()=>Ua,AttachMenu:()=>Hs,AttachmentModal:()=>Es,BotCommandMenu:()=>Ks,BotCommandTooltip:()=>js,CalendarModal:()=>Ue,ChatFolderModal:()=>xa,ContactList:()=>Fa,ContextMenuContainer:()=>Qa,CustomSendMenu:()=>Ws,DeleteMessageModal:()=>xe,Dialogs:()=>ke,DropArea:()=>Qs.Z,EmojiTooltip:()=>nr,ForwardPicker:()=>Ie,GifSearch:()=>gr,HeaderMenuContainer:()=>ns,HistoryCalendar:()=>Oe,InlineBotTooltip:()=>cr,LeftSearch:()=>Bt,Management:()=>Dr,MediaViewer:()=>de,MentionTooltip:()=>vs,MessageSelectToolbar:()=>He,MobileSearch:()=>rs,NewChat:()=>$a,NewChatStep1:()=>La,NewChatStep2:()=>Ra,Notifications:()=>Ne,PaymentModal:()=>co,PinMessageModal:()=>Ge,PollModal:()=>fs,PollResults:()=>pr,ReceiptModal:()=>ho,RightSearch:()=>mr,SafeLinkModal:()=>Ae,Settings:()=>Ma,StickerSearch:()=>Pr,StickerSetModal:()=>es,StickerTooltip:()=>qs,SymbolMenu:()=>Ys,TextFormatter:()=>er.Z,UnpinAllMessagesModal:()=>Je});var a=n(4050),s=n(5116),r=n(6137),o=n(1713),l=n(3716),i=n(7361),c=n(3858),d=n(4399),m=n(1638),u=n(2858),h=n(782),Z=n(1174),P=n(3989),g=n(396),v=n(5326),p=n(6202),E=n(2566),C=n(2937),f=n(7204),b=n(8674),I=n(935);function y(e,t){const n=document.createElement("div");n.classList.add("ghost");const a=new Image;if("string"==typeof e?a.src=e:e instanceof HTMLVideoElement?a.src=e.poster:a.src=e.src,n.appendChild(a),t===o.bZ.ProfileAvatar||t===o.bZ.SettingsAvatar){n.classList.add("ProfileInfo"),t===o.bZ.SettingsAvatar&&n.classList.add("self");const e=document.querySelector(t===o.bZ.ProfileAvatar?"#RightColumn .ProfileInfo .info":"#Settings .ProfileInfo .info");e&&n.appendChild(e.cloneNode(!0))}return n}function S(e,t){const n=document.querySelector(".active > .MessageList");let a=e.offsetTop+t.closest(".content-inner, .WebPage").offsetTop;return e.id.includes("album-media-")&&(a+=e.parentElement.offsetTop+e.closest(".Message").offsetTop),a>n.scrollTop&&a+t.offsetHeight .MessageList #album-media-${t.id}`,a=".full-media";break;case o.bZ.SharedMedia:n=`#shared-media${t.id}`,a="img";break;case o.bZ.SearchResult:n=`#search-media${t.id}`,a="img";break;case o.bZ.MiddleHeaderAvatar:n=".MiddleHeader .ChatInfo .Avatar",a="img.avatar-media";break;case o.bZ.SettingsAvatar:n="#Settings .ProfileInfo .active .ProfilePhoto",a="img.avatar-media";break;case o.bZ.ProfileAvatar:n="#RightColumn .ProfileInfo .active .ProfilePhoto",a="img.avatar-media";break;case o.bZ.ScheduledInline:case o.bZ.Inline:default:n=`.active > .MessageList #message${t.id}`,a=".message-content .full-media, .message-content .thumbnail"}const s=document.querySelector(n),r=s&&s.querySelectorAll(a);return{container:s,mediaEl:null==r?void 0:r[r.length-1]}}function N(e,t){switch(t){case o.bZ.Album:case o.bZ.ScheduledAlbum:case o.bZ.Inline:case o.bZ.ScheduledInline:e.classList.add("rounded-corners");break;case o.bZ.SharedMedia:case o.bZ.SettingsAvatar:case o.bZ.ProfileAvatar:case o.bZ.SearchResult:e.firstChild.style.objectFit="cover";break;case o.bZ.MiddleHeaderAvatar:e.classList.add("circle")}}var M=n(9107),T=n(6590),F=n(9204),A=n(126),L=n(2255),R=n(231),B=n(790),$=n(2340),D=n(172);const U=(0,s.c$)(((e,{chatId:t,messageId:n,isAvatar:a})=>{if(a&&t)return{sender:(0,u.YC)(t)?(0,m.dy)(e,t):(0,m.Z1)(e,t)};if(!n||!t)return{};const s=(0,m.hj)(e,t,n);return{message:s,sender:s&&(0,m.Ur)(e,s)}}),((e,t)=>(0,h.ei)(t,["closeMediaViewer","focusMessage"])))((({chatId:e,messageId:t,sender:n,isAvatar:s,message:r,closeMediaViewer:o,focusMessage:l})=>{const i=(0,a.I4)((()=>{o(),l({chatId:e,messageId:t})}),[e,l,t,o]),c=(0,M.Z)();if(!n||!r&&!s)return;const d=(0,u.OU)(c,n);return a.ZP.createElement("div",{className:"SenderInfo",onClick:i},(0,u.YC)(n.id)?a.ZP.createElement(D.Z,{key:n.id,size:"medium",user:n}):a.ZP.createElement(D.Z,{key:n.id,size:"medium",chat:n}),a.ZP.createElement("div",{className:"meta"},a.ZP.createElement("div",{className:"title",dir:"auto"},d&&(0,$.Z)(d)),a.ZP.createElement("div",{className:"date",dir:"auto"},s?c("lng_mediaview_profile_photo"):(0,B.ZK)(c,1e3*r.date,!0))))}));var O=n(3106),x=n(8964),G=n(9196);const J=(0,a.X$)((0,s.c$)(((e,{message:t})=>({isDownloading:!!t&&(0,m.te)(e,t)})),((e,t)=>(0,h.ei)(t,["downloadMessageMedia","cancelMessageMediaDownload"])))((({mediaData:e,isVideo:t,isZoomed:n,message:s,fileName:r,isAvatar:o,isDownloading:l,onCloseMediaViewer:c,onForward:d,onZoomToggle:m,downloadMessageMedia:h,cancelMessageMediaDownload:Z})=>{const{loadProgress:P}=(0,E.Z)(s&&(0,u.Ti)(s,"download"),!l),g=(0,a.I4)((()=>{l?Z({message:s}):h({message:s})}),[Z,h,l,s]),v=(0,M.Z)(),p=(0,a.Ye)((()=>({onTrigger:e,isOpen:t})=>a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent",className:t?"active":void 0,onClick:e,ariaLabel:"More actions"},a.ZP.createElement("i",{className:"icon-more"}))),[]);return i.wB?a.ZP.createElement("div",{className:"MediaViewerActions-mobile"},a.ZP.createElement(O.Z,{trigger:p,positionX:"right"},!o&&a.ZP.createElement(x.Z,{icon:"forward",onClick:d},v("Forward")),t?a.ZP.createElement(x.Z,{icon:l?"close":"download",onClick:g},l?`${Math.round(100*P)}% Downloading...`:"Download"):a.ZP.createElement(x.Z,{icon:"download",href:e,download:r},v("AccActionDownload"))),l&&a.ZP.createElement(G.Z,{progress:P,size:"s",noCross:!0})):a.ZP.createElement("div",{className:"MediaViewerActions"},!o&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:v("Forward"),onClick:d},a.ZP.createElement("i",{className:"icon-forward"}))),t?a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:v("AccActionDownload"),onClick:g},l?a.ZP.createElement(G.Z,{progress:P,size:"s",onClick:g}):a.ZP.createElement("i",{className:"icon-download"})):a.ZP.createElement(R.Z,{href:e,download:r,round:!0,size:"smaller",color:"translucent-white",ariaLabel:v("AccActionDownload")},a.ZP.createElement("i",{className:"icon-download"})),a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:n?"Zoom Out":"Zoom In",onClick:m},a.ZP.createElement("i",{className:n?"icon-zoom-out":"icon-zoom-in"})),a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:v("Close"),onClick:c},a.ZP.createElement("i",{className:"icon-close"})))})));var z=n(9118),X=n(6752);const _=({text:e="",isHidden:t,isForVideo:n,onClick:s})=>{const[r,o]=(0,a.eJ)(!1);(0,a.d4)((()=>{const e=document.querySelector(".MediaViewerFooter .media-text"),t=()=>{const t=e?e.clientHeight:0;o(t>2*d.Gw)};t();const n=(0,z.P2)(t,500,!0);return window.addEventListener("resize",n,!1),()=>{window.removeEventListener("resize",n,!1)}}),[]);const l=(0,X.Z)("MediaViewerFooter",n&&"is-for-video",t&&"is-hidden");return a.ZP.createElement("div",{className:l,onClick:function(t){e&&t.stopPropagation()}},e&&a.ZP.createElement("div",{className:"media-viewer-footer-content",onClick:i.wB?void 0:s},a.ZP.createElement("p",{className:"media-text custom-scroll "+(r?"multiline":""),dir:"auto"},e)))};var Y=n(1212),H=n(2019);const V=void 0!==document.fullscreenElement?"fullscreenElement":void 0!==document.mozFullScreenElement?"mozFullScreenElement":void 0!==document.webkitFullscreenElement?"webkitFullscreenElement":"";var j=n(6898),K=n(4753);const q=["bytes","kB","MB","GB","TB","PB"],W=e=>{const t=0===e?0:Math.floor(Math.log(e)/Math.log(1024));return`${(e/1024**Math.floor(t)).toFixed(1)} ${q[t]}`},Q=e=>{e.stopPropagation()},ee=({bufferedProgress:e,currentTime:t,duration:n,fileSize:s,isForceVisible:r,isForceMobileVersion:o,isPlayed:l,isFullscreenSupported:c,isFullscreen:d,onChangeFullscreen:m,onPlayPause:u,onSeek:h})=>{const[P,g]=(0,a.eJ)(!0),v=(0,a.sO)(null),p=(0,a.sO)(!1);(0,a.d4)((()=>{r&&g(r)}),[r]),(0,a.d4)((()=>{let e;return r||(i.wB?g(!1):e=window.setTimeout((()=>{g(!1)}),800)),()=>{e&&window.clearTimeout(e)}}),[r]),(0,a.d4)((()=>((P||r)&&document.body.classList.add("video-controls-visible"),()=>{document.body.classList.remove("video-controls-visible")})),[r,P]);const E=(0,M.Z)(),C=(0,a.I4)((e=>{if(p.current&&v.current){const{width:t,left:a}=v.current.getBoundingClientRect(),s=e instanceof MouseEvent?e.clientX:e.targetTouches[0].clientX;h(Math.max(Math.min(n*((s-a)/t),n),0))}}),[n,h]),f=(0,a.I4)((e=>{p.current=!0,C(e)}),[C]),b=(0,a.I4)((()=>{p.current=!1}),[]);var I,y;if((0,a.d4)((()=>{if(v.current&&P)return(0,Z.s)(v.current,{onCapture:f,onRelease:b,onClick:b,onDrag:C})}),[P,f,C,b]),P||r)return a.ZP.createElement("div",{className:"VideoPlayerControls "+(o?"mobile":""),onClick:Q},function(e,t,n,s){const r=e/t*100,o=100*n;return a.ZP.createElement("div",{className:"player-seekline",ref:s},a.ZP.createElement("div",{className:"player-seekline-track"},a.ZP.createElement("div",{className:"player-seekline-buffered",style:`width: ${o||0}%`}),a.ZP.createElement("div",{className:"player-seekline-played",style:`width: ${r||0}%`})))}(t,n,e,v),a.ZP.createElement(R.Z,{ariaLabel:E("AccActionPlay"),size:"tiny",ripple:!i.wB,color:"translucent-white",className:"play",onClick:u},a.ZP.createElement("i",{className:l?"icon-pause":"icon-play"})),function(e,t){return a.ZP.createElement("div",{className:"player-time"},`${(0,B.k9)(e)} / ${(0,B.k9)(t)}`)}(t,n),e<1&&(I=e,y=s,a.ZP.createElement("div",{className:"player-file-size"},`${W(y*I)} / ${W(y)}`)),c&&a.ZP.createElement(R.Z,{ariaLabel:"Fullscreen",size:"tiny",color:"translucent-white",className:"fullscreen",onClick:m},a.ZP.createElement("i",{className:d?"icon-smallscreen":"icon-fullscreen"})))};function te(){return(te=Object.assign||function(e){for(var t=1;t{const m=(0,a.sO)(null),[u,h]=(0,a.eJ)(!i.$b||!i.cj),[Z,P]=(0,a.eJ)(0),[g,v]=(0,a.eJ)(!0),[p,E,C]=function(e,t){const[n,s]=(0,a.eJ)(Boolean(V&&document[V]));return(0,a.bt)((()=>{const n=()=>{s(Boolean(V&&document[V]))},a=()=>{s(!0)},r=()=>{s(!1),t(!1)},o=e.current;return document.addEventListener("fullscreenchange",n,!1),document.addEventListener("webkitfullscreenchange",n,!1),document.addEventListener("mozfullscreenchange",n,!1),o&&(o.addEventListener("webkitbeginfullscreen",a,!1),o.addEventListener("webkitendfullscreen",r,!1)),()=>{document.removeEventListener("fullscreenchange",n,!1),document.removeEventListener("webkitfullscreenchange",n,!1),document.removeEventListener("mozfullscreenchange",n,!1),o&&(o.removeEventListener("webkitbeginfullscreen",a,!1),o.removeEventListener("webkitendfullscreen",r,!1))}}),[]),V||"iOS"===i.Lt?[n,()=>{e.current&&(V||"iOS"===i.Lt)&&(e.current.requestFullscreen?e.current.requestFullscreen():e.current.webkitRequestFullscreen?e.current.webkitRequestFullscreen():e.current.webkitEnterFullscreen?e.current.webkitEnterFullscreen():e.current.mozRequestFullScreen&&e.current.mozRequestFullScreen(),s(!0))},()=>{e.current&&(document.exitFullscreen?document.exitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.webkitExitFullscreen&&document.webkitExitFullscreen(),s(!1))}]:[!1]}(m,h),{isBuffered:f,bufferedProgress:b,bufferingHandlers:I}=(0,H.Z)(),{shouldRender:y,transitionClassNames:S}=(0,Y.Z)(!f,void 0,void 0,"slow"),{shouldRender:k,transitionClassNames:w}=(0,Y.Z)(i.cj&&!u&&!y,void 0,void 0,"slow");(0,a.d4)((()=>{c||!l?m.current.pause():e&&!i.$b&&(0,K.Z)(m.current)}),[c,l,e]),(0,a.d4)((()=>{m.current.currentTime===m.current.duration?(P(0),h(!1)):P(m.current.currentTime)}),[Z]);const N=(0,a.I4)((e=>{e.stopPropagation(),u?(m.current.pause(),h(!1)):((0,K.Z)(m.current),h(!0),i.wB&&v(!1))}),[u]);(0,j.Z)(m,[]);const M=(0,a.I4)((()=>{v(!0)}),[]),T=(0,a.I4)((()=>{v(!1)}),[]),F=(0,a.I4)((e=>{P(e.currentTarget.currentTime)}),[]),A=(0,a.I4)((()=>{P(0),h(!1),v(!0)}),[]),L=(0,a.I4)((()=>{p&&C?C():!p&&E&&E()}),[C,p,E]),B=(0,a.I4)((e=>{m.current.currentTime=e}),[]),$=(0,a.I4)((e=>{e.stopPropagation(),v(!g),g||(m.current.pause(),h(!1))}),[g]);(0,a.d4)((()=>{const e=e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),N(e))};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}}),[N]);const D=s&&`width: ${s.width}px; height: ${s.height}px`,U=`background-image: url(${n})`;return a.ZP.createElement("div",{className:"VideoPlayer",onClick:!t&&i.wB?$:void 0,onMouseOver:t||i.$b?void 0:M,onMouseOut:t||i.$b?void 0:T},a.ZP.createElement("div",{style:D},a.ZP.createElement("video",te({ref:m,autoPlay:i.$b,playsInline:!0,loop:t,muted:t,id:"media-viewer-video",style:U,onPlay:i.cj?()=>h(!0):void 0,onEnded:A,onClick:i.wB?void 0:N,onDoubleClick:L},I,{onTimeUpdate:F}),e&&a.ZP.createElement("source",{src:e}))),k&&a.ZP.createElement(R.Z,{round:!0,className:`play-button ${w}`,onClick:N},a.ZP.createElement("i",{className:"icon-play"})),y&&a.ZP.createElement("div",{className:["spinner-container",S].join(" ")},!f&&a.ZP.createElement("div",{className:"buffering"},"Buffering..."),a.ZP.createElement(G.Z,{size:"xl",progress:f?1:r,square:!0,onClick:d})),!t&&!y&&a.ZP.createElement(ee,{isPlayed:u,bufferedProgress:b,currentTime:Z,isFullscreenSupported:Boolean(E),isFullscreen:p,fileSize:o,duration:m.current?m.current.duration:0,isForceVisible:g,isForceMobileVersion:s&&s.width<400,onSeek:B,onChangeFullscreen:L,onPlayPause:N}))})),ae=(0,a.X$)((({isShown:e,onChangeZoom:t})=>{const{transitionClassNames:n}=(0,Y.Z)(e),s=(0,f.Z)(e),r=(0,a.sO)(null),[o,l]=(0,a.eJ)(1),c=(0,a.sO)(!1);(0,a.d4)((()=>{e&&!s&&l(1.5)}),[e,s]);const d=(0,a.I4)((()=>{c.current=!0}),[]),m=(0,a.I4)((()=>{c.current=!1,1===o&&t(o,!c.current)}),[t,o]);(0,a.d4)((()=>{t(o,!c.current)}),[o,t]);const u=(0,M.Z)(),h=(0,X.Z)("ZoomControls",n);return a.ZP.createElement("div",{className:h},a.ZP.createElement(R.Z,{disabled:1===o,size:"tiny",color:"translucent-white",ariaLabel:u("ZoomOut"),className:"zoom-out",ripple:!i.wB,onClick:()=>{r.current&&l(Math.max(1,o-.5))}},a.ZP.createElement("i",{className:"icon-zoom-out"})),a.ZP.createElement(R.Z,{disabled:3===o,size:"tiny",color:"translucent-white",ariaLabel:"Zoom In",className:"zoom-in",ripple:!i.wB,onClick:()=>{r.current&&l(Math.min(3,o+.5))}},a.ZP.createElement("i",{className:"icon-zoom-in"})),a.ZP.createElement("div",{className:"seekline"},a.ZP.createElement("div",{className:"seekline-track"},a.ZP.createElement("div",{className:"seekline-played",style:`width: ${50*(o-1)}%`}),a.ZP.createElement("input",{ref:r,min:1,max:3,step:"0.5",value:o,type:"range",className:"seekline-input",onChange:e=>{l(Math.min(3,Math.max(Number(e.target.value),1)))},onMouseDown:d,onMouseUp:m}))))})),se=[1,0,0,1,0,0],re={1:1,1.5:1.5,2:2.2,2.5:3.3,3:5.5},oe=150,le=(0,a.X$)((({children:e,className:t,noWrap:n,canPan:s,zoomLevel:r,panDeltaX:o,panDeltaY:l,onPan:i})=>{const c=re[r]||r,[d,m]=(0,a.eJ)(!1),[u,Z]=(0,a.eJ)({dx:o,dy:l,x:0,y:0}),[P,g]=(0,a.eJ)(se),v=(0,a.sO)(null),p=(0,a.sO)(null);return(0,a.d4)((()=>{const e=c||P[0],t=o||P[4],n=l||P[5],a=[...P];P[0]!==e&&(a[0]=e||a[0],a[3]=e||a[3]),P[4]!==t&&(a[4]=t),P[5]!==n&&(a[5]=n),(0,h.et)(P,a)||g(function(e,t,n){const a=n&&n.querySelector(".active img");if(!n||!a)return t;const s=n.getBoundingClientRect(),r=a.getBoundingClientRect(),o=r.width/e*t[0],l=r.height/e*t[3],i=(s.width-o)/2+t[4],c=(s.height-l)/2+t[5];return s.width&&s.width-oe{s||g(se)}),[s]),(0,a.d4)((()=>{p.current&&(p.current.style.transform=`matrix(${P.toString()})`)}),[n,P]),n?e:a.ZP.createElement("div",{ref:v,className:`pan-wrapper ${t||""}`,onMouseDown:e=>{if(!s)return;e.stopPropagation(),e.preventDefault();const t={dx:P[4],dy:P[5],x:e.pageX,y:e.pageY};Z(t),m(!0),v.current&&v.current.classList.add("move")},onMouseUp:()=>{m(!1),v.current&&v.current.classList.remove("move"),i&&i(P[4],P[5])},onMouseMove:e=>{if(d){const t=function(e,t){const n=[...P],a=u.x-e,s=u.y-t;return n[4]=u.dx-a,n[5]=u.dy-s,n}(e.pageX,e.pageY);g(t),p.current&&(p.current.style.transform=`matrix(${P.toString()})`)}}},a.ZP.createElement("div",{ref:p,className:"pan-container"},e))})),ie=350;function ce(e,t,n){return e?a.ZP.createElement("img",{src:e,alt:"",style:t?`width: ${t.width}px`:"",draggable:Boolean(n)}):a.ZP.createElement("div",{className:"spinner-wrapper",style:t?`width: ${t.width}px`:""},a.ZP.createElement(F.Z,{color:"white"}))}const de=(0,a.X$)((0,s.c$)((e=>{const{chatId:t,threadId:n,messageId:a,avatarOwnerId:s,profilePhotoIndex:r,origin:l}=e.mediaViewer,{animationLevel:i}=e.settings.byKey;if(l===o.bZ.SearchResult){if(!t||!a)return{animationLevel:i};const n=(0,m.hj)(e,t,a);return n?{chatId:t,messageId:a,senderId:n.senderId,origin:l,message:n,animationLevel:i}:{animationLevel:i}}if(s)return{messageId:-1,senderId:s,avatarOwner:(0,m.dy)(e,s)||(0,m.Z1)(e,s),profilePhotoIndex:r||0,animationLevel:i,origin:l};if(!(t&&n&&a))return{animationLevel:i};let c,d,u;if(c=l&&[o.bZ.ScheduledAlbum,o.bZ.ScheduledInline].includes(l)?(0,m.Tm)(e,t,a):(0,m.hj)(e,t,a),!c)return{animationLevel:i};if(d=l&&[o.bZ.ScheduledAlbum,o.bZ.ScheduledInline].includes(l)?(0,m.Fn)(e,t):(0,m.Zw)(e,t),l===o.bZ.Inline||l===o.bZ.Album)u=(0,m.qC)(e,t,n)||(0,m.gb)(e,t,n);else if(l===o.bZ.SharedMedia){const t=(0,m.we)(e),{foundIds:n}=t&&t.resultsByType&&t.resultsByType.media||{};u=n}return{chatId:t,threadId:n,messageId:a,senderId:c.senderId,origin:l,message:c,chatMessages:d,collectionIds:u,animationLevel:i}}),((e,t)=>(0,h.ei)(t,["openMediaViewer","closeMediaViewer","openForwardMenu","focusMessage"])))((({chatId:e,threadId:t,messageId:n,senderId:s,origin:m,avatarOwner:h,profilePhotoIndex:F,message:B,chatMessages:$,collectionIds:D,openMediaViewer:O,closeMediaViewer:x,openForwardMenu:G,focusMessage:z,animationLevel:X})=>{const Y=Boolean(h||n),H=m===o.bZ.SharedMedia,V=m===o.bZ.SearchResult,j=B?(0,u.O$)(B):void 0,K=B?(0,u.b7)(B):void 0,q=B?(0,u.F$)(B):void 0,W=B?(0,u.Cg)(B):void 0,Q=!!B&&(0,u.rl)(B),ee=!!B&&(0,u.hC)(B),te=Boolean(K||W||ee),se=Boolean(!te&&(j||q||Q)),{isGif:re}=K||W||{},oe=Boolean(h),de=Boolean(q||W),me=(0,a.Ye)((()=>de&&n?[n]:(0,u.N0)($||{},D||[],H)),[de,n,$,D,H]),ue=n?me.indexOf(n):-1,he=0===ue||-1===ue,Ze=ue===me.length-1||-1===ue,Pe=(0,a.sO)(),ge=(0,f.Z)(s);!Y||ge&&ge===s&&Pe.current||(Pe.current=ue);const ve=X>=1?"mv-slide":"none",pe=2===X?"slide-fade":"none",Ee=2===X,[Ce,fe]=(0,a.eJ)(!1),[be,Ie]=(0,a.eJ)(!1),[ye,Se]=(0,a.eJ)(!1),[ke,we]=(0,a.eJ)(1),[Ne,Me]=(0,a.eJ)({x:0,y:0});function Te(e){if(oe&&void 0!==F){const{photos:t}=h;return t&&t[F]?`photo${t[F].id}?size=c`:(0,u.RT)(h,e?"big":"normal")}return B&&(0,u.Ti)(B,e?"viewerFull":"viewerPreview")}const Fe=(0,p.Z)(B&&(H||V)&&(0,u.Ti)(B,"pictogram"),void 0,r.IU.BlobUrl,void 0,Ee&&ie),Ae=Te(),Le=(0,p.Z)(Ae,void 0,r.IU.BlobUrl,void 0,Ee&&ie),{mediaData:Re,loadProgress:Be}=(0,E.Z)(Te(!0),void 0,B&&(0,u.kG)(B,"viewerFull"),void 0,Ee&&ie),$e=j||K?(j||K).blobUrl:void 0;let De=!te&&($e||Re)||Le||Fe;const Ue=(0,C.Z)(!De&&B&&(0,u.DH)(B));De||m===o.bZ.SearchResult||(De=Ue);const Oe=B?(0,u.c0)(B):void 0,xe=B?(0,u.ep)(B):oe?`avatar${h.id}-${F}.jpg`:void 0;let Ge;B?Q||ee?Ge=(0,u.aE)(B).mediaSize:j||q?Ge=(0,u.bV)(j||q):(K||W)&&(Ge=(0,u.jC)(K||W)):Ge=d.vY,(0,a.d4)((()=>{i.wB&&document.body.classList.toggle("is-media-viewer-open",Y)}),[Y]);const Je=(0,v.Z)();(0,a.d4)((()=>{const e=window.matchMedia(d.L6);return"function"==typeof e.addEventListener?e.addEventListener("change",Je):"function"==typeof e.addListener&&e.addListener(Je),()=>{"function"==typeof e.removeEventListener?e.removeEventListener("change",Je):"function"==typeof e.removeListener&&e.removeListener(Je)}}),[Je]);const ze=(0,f.Z)(B),Xe=(0,f.Z)(m),_e=(0,f.Z)(h),Ye=(0,f.Z)(De);(0,a.d4)((()=>{if(Ee&&Y&&!ze&&!_e){(0,b.YW)(ie+l.fK);const e=B?(0,I.X)(B):void 0;!function(e,t,n,a,s,r){const{mediaEl:i}=w(t,r);if(!i)return;const{width:m}=c.Z.get(),{width:u,height:h}=(0,d.fM)(e,s),{width:Z,height:P}=(0,d.jg)(u,h,a.width,a.height),g=(m-Z)/2,v=function(e){const t=window.matchMedia(d.L6);let n=4.125;return e&&(n+=t.matches?.875:3.375),n*d.Gw}(e)+(h-P)/2;let{top:p,left:E,width:C,height:f}=i.getBoundingClientRect();if([o.bZ.SharedMedia,o.bZ.Album,o.bZ.ScheduledAlbum,o.bZ.SearchResult].includes(t)){const e=function(e,t,n,a,s,r){if(e===t){const o=Math.max(s,r)*(e/t);a-=(o-s)/2,n-=(o-r)/2,s=o,r=o}else if(e>t){const n=s;a-=((s=r*(e/t))-n)/2}else if(t>e){const a=r;n-=((r=s*(t/e))-a)/2}return{top:n,left:a,width:s,height:r}}(Z,P,p,E,C,f);p=e.top,E=e.left,C=e.width,f=e.height}const b=E+C/2-(g+Z/2),I=p+f/2-(v+P/2),S=C/Z,M=f/P,T=y(n||i);k(T,{top:`${v}px`,left:`${g}px`,width:`${Z}px`,height:`${P}px`,transform:`translate3d(${b}px, ${I}px, 0) scale(${S}, ${M})`}),N(T,t),document.body.classList.add("ghost-animating"),requestAnimationFrame((()=>{document.body.appendChild(T),requestAnimationFrame((()=>{T.style.transform="",function(e){e.firstChild.style.objectFit="default",e.classList.remove("rounded-corners","circle")}(T),setTimeout((()=>{requestAnimationFrame((()=>{document.body.contains(T)&&document.body.removeChild(T),document.body.classList.remove("ghost-animating")}))}),200+l.fK)}))}))}(Boolean(e),m,De,Ge,te,B)}Ee&&!Y&&(ze||_e)&&((0,b.YW)(ie+l.fK),function(e,t,n){const{container:a,mediaEl:s}=w(e,n);if(!s)return;const r=document.getElementById("MediaViewer").querySelector(".active .media-viewer-content img, .active .media-viewer-content video");if(!r||!s)return;const{top:i,left:d,width:m,height:u}=r.getBoundingClientRect(),{top:h,left:Z,width:P,height:g}=s.getBoundingClientRect();let v=h;if(!function(e){if("none"===e.style.display)return!1;const t=e.getBoundingClientRect(),{height:n}=c.Z.get();return t.top<=n&&t.top+t.height>=0}(a)){const{height:e}=c.Z.get();v=hf?C=f:f>C&&(f=C));const I=document.getElementsByClassName("ghost")[0],M=I||y(t||s,e);I||k(M,{top:`${v}px`,left:`${Z}px`,width:`${P}px`,height:`${g}px`,transform:`translate3d(${p}px, ${E}px, 0) scale(${C}, ${f})`}),requestAnimationFrame((()=>{if(I){const{top:e,left:t,width:n,height:a}=I.getBoundingClientRect();k(M,{transition:"none",top:`${v}px`,left:`${Z}px`,transformOrigin:"top left",transform:`translate3d(${t-Z}px, ${e-v}px, 0) scale(${n/P}, ${a/g})`,width:`${P}px`,height:`${g}px`})}document.body.classList.add("ghost-animating"),I||document.body.appendChild(M),requestAnimationFrame((()=>{I&&(I.style.transition=""),M.style.transform="",b&&(M.style.opacity="0"),N(M,e),setTimeout((()=>{requestAnimationFrame((()=>{document.body.contains(M)&&document.body.removeChild(M),document.body.classList.remove("ghost-animating")}))}),200+l.fK)}))}))}(Xe,Ye,ze||void 0))}),[Ee,Y,m,Xe,B,ze,_e,De,Ye,Ge,te]),(0,a.d4)((()=>{let e;return ye?Ie(!0):e=window.setTimeout((()=>{Ie(!1)}),ie),()=>{e&&window.clearTimeout(e)}}),[ye]);const He=()=>{Se(!1),we(1),Me({x:0,y:0})},Ve=(0,a.I4)((()=>{Se(!ye),we(ye?1:1.5),ye&&Me({x:0,y:0})}),[ye]),je=(0,a.I4)(((e,t=!1)=>{we(e),1===e&&t&&He()}),[]),Ke=(0,a.I4)((()=>{x(),He()}),[x]),qe=(0,a.I4)((()=>{Ke(),z({chatId:e,threadId:t,messageId:n})}),[Ke,e,t,z,n]),We=(0,a.I4)((()=>{G({fromChatId:e,messageIds:[n]}),He()}),[G,e,n]);(0,a.d4)((()=>Y?(0,P.Z)((()=>{ye?He():Ke()})):void 0),[Ke,Y,ye]),(0,a.d4)((()=>{te&&!re&&(0,g.Es)()}),[re,te]),(0,a.d4)((()=>{if(Y)return c.Z.disableRefresh(),()=>{c.Z.enableRefresh()}}),[Y]);const Qe=(0,a.I4)(((e,t)=>{let n=me.indexOf(e);return(-1===t&&n>0||1===t&&n{he||O({chatId:e,threadId:t,messageId:n?Qe(n,-1):void 0,origin:m})}),[e,t,Qe,he,n,O,m]),tt=(0,a.I4)((()=>{Ze||O({chatId:e,threadId:t,messageId:n?Qe(n,1):void 0,origin:m})}),[e,t,Qe,Ze,n,O,m]);(0,a.d4)((()=>{const e=e=>{switch(e.key){case"Left":case"ArrowLeft":et();break;case"Right":case"ArrowRight":tt()}};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}})),(0,a.d4)((()=>{const e=document.querySelector(".slide-container > .active, .slide-container > .to");if(!e)return;const t=re&&!i.cj;return(0,Z.s)(e,{excludedClosestSelector:".backdrop, .navigation, .media-viewer-head, .media-viewer-footer"+(t?"":", .VideoPlayer"),onClick:()=>{ye||i.$b||Ke()},onSwipe:i.$b?(e,t)=>(t===Z.e.Right?et():t===Z.e.Left?tt():e.target&&e.target.closest(".MediaViewerFooter")||Ke(),!0):void 0})}),[Ke,Ce,re,se,ye,tt,et]);const nt=(0,a.I4)(((e,t)=>{Me({x:e,y:t})}),[]),at=(0,a.I4)((()=>{i.$b&&(se||re)&&fe(!Ce)}),[Ce,re,se]),st=(0,M.Z)();function rt(t){if(oe)return a.ZP.createElement("div",{key:e,className:"media-viewer-content"},ce(Re||Le,(0,d.PA)(d.vY,!1),!i.wB&&!ye));if(B){const e=(0,I.X)(B),s=Boolean(e);return a.ZP.createElement("div",{key:n,className:"media-viewer-content "+(s?"has-footer":""),onClick:at},se&&ce($e||Re||Le||Fe,B&&(0,d.PA)(Ge,s),!i.wB&&!ye),te&&a.ZP.createElement(ne,{key:n,url:$e||Re,isGif:re,posterData:De,posterSize:B&&(0,d.PA)(Ge,s,!0),loadProgress:Be,fileSize:Oe,isMediaViewerOpen:Y,noPlay:!t,onClose:Ke}),e&&a.ZP.createElement(_,{text:e,onClick:qe,isHidden:Ce&&(!te||re),isForVideo:te&&!re}))}}function ot(){return oe?a.ZP.createElement(U,{key:h.id,chatId:h.id,isAvatar:!0}):a.ZP.createElement(U,{key:n,chatId:e,messageId:n})}return(0,T.ZP)(Y,x,O,{chatId:e,threadId:t,messageId:n,origin:m,avatarOwnerId:h&&h.id}),a.ZP.createElement(A.Z,{id:"MediaViewer",className:ye?"zoomed":"",isOpen:Y},(()=>a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("div",{className:"media-viewer-head",dir:st.isRtl?"rtl":void 0},i.wB&&a.ZP.createElement(R.Z,{className:"media-viewer-close",round:!0,size:"smaller",color:"translucent-white",ariaLabel:st("Close"),onClick:Ke},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement(L.Z,{activeKey:Pe.current,name:pe},ot),a.ZP.createElement(J,{mediaData:Re||Le,isVideo:te,isZoomed:ye,message:B,fileName:xe,onCloseMediaViewer:Ke,onForward:We,onZoomToggle:Ve,isAvatar:oe})),a.ZP.createElement(le,{noWrap:!be,canPan:ye,panDeltaX:Ne.x,panDeltaY:Ne.y,zoomLevel:ke,onPan:nt},a.ZP.createElement(L.Z,{className:"slide-container",activeKey:ue,name:ve},rt)),!he&&a.ZP.createElement("button",{type:"button",className:`navigation prev ${te&&!re&&"inline"}`,"aria-label":st("AccDescrPrevious"),dir:st.isRtl?"rtl":void 0,onClick:et}),!Ze&&a.ZP.createElement("button",{type:"button",className:`navigation next ${te&&!re&&"inline"}`,"aria-label":st("Next"),dir:st.isRtl?"rtl":void 0,onClick:tt}),a.ZP.createElement(ae,{isShown:ye,onChangeZoom:je}))))})));var me=n(5765),ue=n(7407),he=n(2313),Ze=n(2515),Pe=n(4288),ge=n(3103),ve=n(7687),pe=n(1273),Ee=n(1876),Ce=n(8799),fe=n(6058);const be=(0,a.X$)((({isOpen:e,currentUserId:t,chatOrUserIds:n,filterRef:s,filter:r,filterPlaceholder:o,onFilterChange:l,onClose:i,loadMore:c,onSelectChatOrUser:d})=>{const m=(0,M.Z)(),[h,Z]=(0,ue.Z)(c,n,Boolean(r));(0,Ze.Z)(s,e,(()=>{l("")}));const P=(0,a.sO)(null),g=(0,a.I4)((e=>{l(e.currentTarget.value)}),[l]),v=(0,he.Z)(P,e,(e=>{h&&h.length>0&&d(h[-1===e?0:e])}),".ListItem-button",!0),p=a.ZP.createElement("div",{className:"modal-header",dir:m.isRtl?"rtl":void 0},a.ZP.createElement(R.Z,{round:!0,color:"translucent",size:"smaller",ariaLabel:m("Close"),onClick:i},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement(ve.Z,{ref:s,value:r,onChange:g,onKeyDown:v,placeholder:o}));return a.ZP.createElement(ge.Z,{isOpen:e,onClose:i,className:"ChatOrUserPicker",header:p},null!=h&&h.length?a.ZP.createElement(pe.Z,{className:"picker-list custom-scroll",items:h,onLoadMore:Z,noScrollRestore:Boolean(r),ref:P,onKeyDown:v},h.map((e=>a.ZP.createElement(Ee.Z,{key:e,className:"chat-item-clickable force-rounded-corners",onClick:()=>d(e)},(0,u.YC)(e)?a.ZP.createElement(fe.Z,{status:e===t?m("SavedMessagesInfo"):void 0,userId:e}):a.ZP.createElement(Ce.Z,{chatId:e}))))):h&&!h.length?a.ZP.createElement("p",{className:"no-results"},m("lng_blocked_list_not_found")):a.ZP.createElement(Pe.Z,null))})),Ie=(0,a.X$)((0,s.c$)((e=>{const{chats:{byId:t,listIds:n,orderedPinnedIds:a},currentUserId:s}=e;return{chatsById:t,pinnedIds:a.active,activeListIds:n.active,archivedListIds:n.archived,currentUserId:s}}),((e,t)=>(0,h.ei)(t,["setForwardChatId","exitForwardMode","loadMoreChats"])))((({chatsById:e,pinnedIds:t,activeListIds:n,archivedListIds:s,currentUserId:o,isOpen:l,setForwardChatId:i,exitForwardMode:c,loadMoreChats:d})=>{const m=(0,M.Z)(),[Z,P]=(0,a.eJ)(""),g=(0,a.sO)(null),v=(0,a.Ye)((()=>{const a=[...n||[],...s||[]];let l=t||[];return o&&(l=(0,h.Tw)([o,...l])),(0,u.ih)([...a.filter((t=>{const n=e[t];return!n||!!(0,u.Qm)(n,r._f)&&(!Z||(0,me.Z)((0,u.U)(m,e[t],void 0,t===o),Z))}))],e,void 0,l)}),[n,s,e,o,Z,m,t]),p=(0,a.I4)((e=>{i({id:e})}),[i]);return a.ZP.createElement(be,{currentUserId:o,isOpen:l,chatOrUserIds:v,filterRef:g,filterPlaceholder:m("ForwardTo"),filter:Z,onFilterChange:P,loadMore:d,onSelectChatOrUser:p,onClose:c})})));var ye=n(1947);function Se(e){return e.isSlowMode?"Slowmode enabled":e.hasErrorKey?"Something went wrong":"Telegram"}const ke=(0,a.X$)((0,s.c$)((e=>(0,h.ei)(e,["dialogs"])),((e,t)=>(0,h.ei)(t,["dismissDialog","acceptInviteConfirmation"])))((({dialogs:e,dismissDialog:t,acceptInviteConfirmation:n})=>{const s=(0,M.Z)();if(e.length)return a.ZP.createElement("div",{id:"Dialogs"},e.map((e=>{return"hash"in e?(e=>{const{hash:r,title:o,participantsCount:l,isChannel:i}=e,c=s(i?"Subscribers":"Members",l,"i"),d=s(i?"ChannelJoin":"JoinGroup");return a.ZP.createElement(ge.Z,{isOpen:!0,onClose:t,className:"error",title:o},void 0!==l&&a.ZP.createElement("p",null,c),a.ZP.createElement(R.Z,{isText:!0,className:"confirm-dialog-button",onClick:()=>{n({hash:r}),t()}},d),a.ZP.createElement(R.Z,{isText:!0,className:"confirm-dialog-button",onClick:t},s("Cancel")))})(e):(r=e,a.ZP.createElement(ge.Z,{isOpen:!0,onClose:t,className:"error",title:Se(r)},r.hasErrorKey?(0,ye.ZP)(r):(0,$.Z)(r.message,["emoji","br"]),a.ZP.createElement("div",null,a.ZP.createElement(R.Z,{isText:!0,onClick:t},s("OK")))));var r})))})));var we=n(6937);const Ne=(0,a.X$)((0,s.c$)((e=>(0,h.ei)(e,["notifications"])),((e,t)=>(0,h.ei)(t,["dismissNotification"])))((({notifications:e,dismissNotification:t})=>{if(e.length)return a.ZP.createElement("div",{id:"Notifications"},e.map((({message:e,localId:n})=>a.ZP.createElement(we.Z,{message:(0,$.Z)(e,["emoji","br","links","simple_markdown"]),onDismiss:()=>t({localId:n})}))))})));var Me=n(1396),Te=n(8360),Fe=n(7551);const Ae=(0,a.X$)((0,s.c$)(void 0,((e,t)=>(0,h.ei)(t,["toggleSafeLinkModal"])))((({url:e,toggleSafeLinkModal:t})=>{const n=(0,M.Z)(),s=(0,a.I4)((()=>{window.open((0,Me.X)(e)),t({url:void 0})}),[t,e]),r=(0,a.I4)((()=>{t({url:void 0})}),[t]),o=(0,Te.Z)(e);return a.ZP.createElement(Fe.Z,{isOpen:Boolean(e),onClose:r,title:n("OpenUrlTitle"),textParts:(0,$.Z)(n("OpenUrlAlert2",o),["links"]),confirmLabel:n("OpenUrlTitle"),confirmHandler:s})})));var Le=n(706);const Re=["lng_weekday1","lng_weekday2","lng_weekday3","lng_weekday4","lng_weekday5","lng_weekday6","lng_weekday7"];function Be(e,t,n,a,s){const r=new Date(e,t,n,0,0,0,0),o=a&&new Date(a.getFullYear(),a.getMonth(),a.getDate(),0,0,0,0),l=s&&new Date(s.getFullYear(),s.getMonth(),s.getDate(),0,0,0,0);return!!(l&&r>l)||!!(o&&r{const u=(0,M.Z)(),h=new Date,Z=(0,a.Ye)((()=>e?new Date(e):new Date),[e]),P=t?new Date(t):void 0,g=(0,f.Z)(r),[v,p,E]=(0,Le.Z)(!1),[C,b]=(0,a.eJ)(Z),[I,y]=(0,a.eJ)(new Date(C.getFullYear(),C.getMonth(),1)),[S,k]=(0,a.eJ)($e(Z.getHours())),[w,N]=(0,a.eJ)($e(Z.getMinutes())),T=De(C.getFullYear(),C.getMonth(),C.getDate()),F=I.getFullYear(),A=I.getMonth();(0,a.d4)((()=>{!g&&r&&(b(Z),y(new Date(Z.getFullYear(),Z.getMonth(),1)))}),[Z,r,g]),(0,a.d4)((()=>{n&&!v&&C.getTime()=h.getFullYear()&&A>=h.getMonth()||P&&F>=P.getFullYear()&&A>=P.getMonth(),$=n&&F<=h.getFullYear()&&A<=h.getMonth(),{prevMonthGrid:D,currentMonthGrid:U,nextMonthGrid:O}=(0,a.Ye)((()=>function(e,t){const n=[],a=[],s=[],r=new Date;r.setDate(1),r.setMonth(t),r.setFullYear(e);const o=r.getDay(),l=new Date(e,t,0).getDate();for(let e=1;e0)for(let e=1;e<=7-i;e++)s.push(e);return{prevMonthGrid:n,currentMonthGrid:a,nextMonthGrid:s}}(F,A)),[A,F]),x=(0,a.I4)((e=>{const t=e.target.value.replace(/[^\d]+/g,"");if(!t.length)return k(""),void(e.target.value="");const n=Math.max(0,Math.min(Number(t),23)),a=new Date(C.getTime());a.setHours(n),b(a);const s=$e(n);k(s),e.target.value=s}),[C]),G=(0,a.I4)((e=>{const t=e.target.value.replace(/[^\d]+/g,"");if(!t.length)return N(""),void(e.target.value="");const n=Math.max(0,Math.min(Number(t),59)),a=new Date(C.getTime());a.setMinutes(n),b(a);const s=$e(n);N(s),e.target.value=s}),[C]);return a.ZP.createElement(ge.Z,{isOpen:r,onClose:c,className:"CalendarModal"},a.ZP.createElement("div",{className:"container"},a.ZP.createElement("div",{className:"month-selector"},a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent",onClick:c},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement("h4",null,u(`lng_month${A+1}`)," ",F),a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent",disabled:$,onClick:$?void 0:function(){y((e=>{const t=new Date(e);return t.setMonth(t.getMonth()-1),t}))}},a.ZP.createElement("i",{className:"icon-previous"})),a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent",disabled:L,onClick:L?void 0:function(){y((e=>{const t=new Date(e);return t.setMonth(t.getMonth()+1),t}))}},a.ZP.createElement("i",{className:"icon-next"})))),a.ZP.createElement("div",{className:"calendar-wrapper"},a.ZP.createElement("div",{className:"calendar-grid"},Re.map((e=>a.ZP.createElement("div",{className:"day-button faded weekday"},a.ZP.createElement("span",null,u(e))))),D.map((e=>a.ZP.createElement("div",{className:"day-button disabled"},a.ZP.createElement("span",null,e)))),U.map((e=>a.ZP.createElement("div",{role:"button",tabIndex:0,onClick:()=>{return t=e,void b((e=>{const n=new Date(e);return n.setDate(t),n.setMonth(A),n.setFullYear(F),n}));var t},className:(0,X.Z)("day-button",Be(F,A,e,n?h:void 0,s?h:P)?"disabled":e?"clickable":"",T===De(F,A,e)&&"selected")},!!e&&a.ZP.createElement("span",null,e)))),O.map((e=>a.ZP.createElement("div",{className:"day-button disabled"},a.ZP.createElement("span",null,e)))))),o&&a.ZP.createElement("div",{className:"timepicker"},a.ZP.createElement("input",{type:"text",className:"form-control",inputMode:"decimal",value:S,onChange:x,onFocus:p,onBlur:E}),":",a.ZP.createElement("input",{type:"text",className:"form-control",inputMode:"decimal",value:w,onChange:G,onFocus:p,onBlur:E})),a.ZP.createElement("div",{className:"footer"},a.ZP.createElement(R.Z,{onClick:function(){d(C)}},o?function(e,t){const n=(0,B.xH)(t,e.code);return n===(0,B.xH)(new Date,e.code)?e("Conversation.ScheduleMessage.SendToday",(0,B.mr)(t,e)):e("Conversation.ScheduleMessage.SendOn",[n,(0,B.mr)(t,e)])}(u,C):l),i&&a.ZP.createElement(R.Z,{onClick:m,isText:!0},i)))})),Oe=(0,a.X$)((0,s.c$)((e=>({selectedAt:e.historyCalendarSelectedAt})),((e,t)=>(0,h.ei)(t,["searchMessagesByDate","closeHistoryCalendar"])))((({isOpen:e,selectedAt:t,searchMessagesByDate:n,closeHistoryCalendar:s})=>{const r=(0,a.I4)((e=>{n({timestamp:e.valueOf()/1e3}),s()}),[s,n]),o=(0,M.Z)();return a.ZP.createElement(Ue,{isOpen:e,selectedAt:t,isPastMode:!0,submitButtonLabel:o("JumpToDate"),onClose:s,onSubmit:r})}))),xe=(0,a.X$)((0,s.c$)(((e,{message:t,isSchedule:n})=>{const{threadId:a}=(0,m.Bt)(e)||{},{canDeleteForAll:s}=a&&(0,m._k)(e,t,a)||{},r=(0,m.Z1)(e,t.chatId);return{canDeleteForAll:!n&&s,contactName:r&&(0,u.YC)(r.id)?(0,u.Vl)((0,m.dy)(e,(0,u.zX)(r))):void 0,willDeleteForCurrentUserOnly:r&&(0,u.G9)(r)&&!s,willDeleteForAll:r&&(0,u.ZV)(r)}}),((e,t)=>(0,h.ei)(t,["deleteMessages","deleteScheduledMessages"])))((({isOpen:e,isSchedule:t,message:n,album:s,canDeleteForAll:r,contactName:o,willDeleteForCurrentUserOnly:l,willDeleteForAll:i,onClose:c,deleteMessages:d,deleteScheduledMessages:m})=>{const u=(0,a.I4)((()=>{const e=null!=s&&s.messages?s.messages.map((({id:e})=>e)):[n.id];d({messageIds:e,shouldDeleteForAll:!0}),c()}),[d,n.id,c,s]),h=(0,a.I4)((()=>{const e=null!=s&&s.messages?s.messages.map((({id:e})=>e)):[n.id];t?m({messageIds:e}):d({messageIds:e,shouldDeleteForAll:!1}),c()}),[s,n.id,t,c,m,d]),Z=(0,M.Z)();return a.ZP.createElement(ge.Z,{isOpen:e,onClose:c,onEnter:e&&!r?h:void 0,className:"delete",title:Z("DeleteSingleMessagesTitle")},a.ZP.createElement("p",null,Z("AreYouSureDeleteSingleMessage")),l&&a.ZP.createElement("p",null,Z("lng_delete_for_me_chat_hint",1,"i")),i&&a.ZP.createElement("p",null,Z("lng_delete_for_everyone_hint",1,"i")),r&&a.ZP.createElement(R.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:u},o&&(0,$.Z)(Z("Conversation.DeleteMessagesFor",o)),!o&&Z("Conversation.DeleteMessagesForEveryone")),a.ZP.createElement(R.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:h},Z(r?"ChatList.DeleteForCurrentUser":"Delete")),a.ZP.createElement(R.Z,{className:"confirm-dialog-button",isText:!0,onClick:c},Z("Cancel")))}))),Ge=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,u.YC)(t),a=(0,m.FM)(e,t),s=(0,m.Z1)(e,t),r=!!s&&(0,u.eA)(s),o=!!s&&(0,u.G9)(s),l=!!s&&(0,u.ZV)(s);return{isPrivateChat:n,isChatWithSelf:a,isChannel:r,isGroup:o,isSuperGroup:l,canPinForAll:n&&!a||l||o,contactName:s&&(0,u.YC)(s.id)?(0,u.Vl)((0,m.dy)(e,(0,u.zX)(s))):void 0}}),((e,t)=>(0,h.ei)(t,["pinMessage"])))((({isOpen:e,messageId:t,chatId:n,isChannel:s,isGroup:r,isSuperGroup:o,canPinForAll:l,contactName:i,onClose:c,pinMessage:d})=>{const m=(0,a.I4)((()=>{d({chatId:n,messageId:t,isUnpin:!1}),c()}),[d,n,t,c]),u=(0,a.I4)((()=>{d({chatId:n,messageId:t,isUnpin:!1,isOneSide:!0,isSilent:!0}),c()}),[n,t,c,d]),h=(0,M.Z)();return a.ZP.createElement(ge.Z,{isOpen:e,onClose:c,className:"pin",title:h("PinMessageAlertTitle")},a.ZP.createElement("p",null,h(s?"PinMessageAlertChannel":r||o?"PinMessageAlert":"PinMessageAlertChat")),a.ZP.createElement(R.Z,{className:"confirm-dialog-button",isText:!0,onClick:u},h("DialogPin")),l&&a.ZP.createElement(R.Z,{className:"confirm-dialog-button",isText:!0,onClick:m},i?(0,$.Z)(h("Conversation.PinMessagesFor",i)):h("Conversation.PinMessageAlert.PinAndNotifyMembers")),a.ZP.createElement(R.Z,{className:"confirm-dialog-button",isText:!0,onClick:c},h("Cancel")))}))),Je=(0,a.X$)((({isOpen:e,pinnedMessagesCount:t=0,onClose:n,onUnpin:s})=>{const r=(0,M.Z)();return a.ZP.createElement(ge.Z,{isOpen:e,onClose:n,className:"unpin-all",title:r("Chat.PanelUnpinAllMessages")},a.ZP.createElement("p",null,r("Chat.UnpinAllMessagesConfirmation",t,"i")),a.ZP.createElement(R.Z,{className:"confirm-dialog-button",isText:!0,onClick:s},r("DialogUnpin")),a.ZP.createElement(R.Z,{className:"confirm-dialog-button",isText:!0,onClick:n},r("Cancel")))}));var ze=n(517);const Xe=(0,a.X$)((0,s.c$)(((e,{isSchedule:t})=>{const{messageIds:n}=e.selectedMessages||{},{canDeleteForAll:a}=(0,m.xl)(e),s=(0,m.jr)(e);return{selectedMessageIds:n,canDeleteForAll:!t&&a,contactName:s&&(0,u.YC)(s.id)?(0,u.Vl)((0,m.dy)(e,(0,u.zX)(s))):void 0,willDeleteForCurrentUserOnly:s&&(0,u.G9)(s)&&!a,willDeleteForAll:s&&(0,u.ZV)(s)}}),((e,t)=>(0,h.ei)(t,["deleteMessages","deleteScheduledMessages","exitMessageSelectMode"])))((({isOpen:e,isSchedule:t,selectedMessageIds:n,canDeleteForAll:s,contactName:r,willDeleteForCurrentUserOnly:o,willDeleteForAll:l,onClose:i,deleteMessages:c,deleteScheduledMessages:d,exitMessageSelectMode:m})=>{const u=(0,f.Z)(e),h=(0,a.I4)((()=>{i(),c({messageIds:n,shouldDeleteForAll:!0})}),[c,n,i]),Z=(0,a.I4)((()=>{t?d({messageIds:n}):c({messageIds:n,shouldDeleteForAll:!1}),i()}),[t,i,d,n,c]),P=(0,M.Z)();if((0,a.d4)((()=>{!e&&u&&m()}),[m,e,u]),n)return a.ZP.createElement(ge.Z,{isOpen:e,onClose:i,onEnter:s?void 0:Z,className:"delete",title:P("Conversation.DeleteManyMessages")},a.ZP.createElement("p",null,P("AreYouSureDeleteFewMessages")),o&&a.ZP.createElement("p",null,"This will delete them just for you, not for other participants in the chat."),l&&a.ZP.createElement("p",null,"This will delete them for everyone in this chat."),s&&a.ZP.createElement(R.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:h},r?(0,$.Z)(P("ChatList.DeleteForEveryone",r)):P("Conversation.DeleteMessagesForEveryone")),a.ZP.createElement(R.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:Z},P(s?"ChatList.DeleteForCurrentUser":"Delete")),a.ZP.createElement(R.Z,{className:"confirm-dialog-button",isText:!0,onClick:i},P("Cancel")))})));var _e=n(4434);const Ye=(0,a.X$)((0,s.c$)(void 0,((e,t)=>(0,h.ei)(t,["reportMessages","exitMessageSelectMode"])))((({isOpen:e,messageIds:t,reportMessages:n,exitMessageSelectMode:s,onClose:r})=>{const[o,l]=(0,a.eJ)("spam"),[i,c]=(0,a.eJ)(""),d=()=>{n({messageIds:t,reason:o,description:i}),s(),r()},m=(0,a.I4)((e=>{l(e)}),[]),u=(0,a.I4)((e=>{c(e.target.value)}),[]),h=(0,M.Z)(),Z=[{value:"spam",label:h("lng_report_reason_spam")},{value:"violence",label:h("lng_report_reason_violence")},{value:"pornography",label:h("lng_report_reason_pornography")},{value:"childAbuse",label:h("lng_report_reason_child_abuse")},{value:"copyright",label:h("ReportPeer.ReasonCopyright")},{value:"other",label:h("lng_report_reason_other")}];if(t)return a.ZP.createElement(ge.Z,{isOpen:e,onClose:r,onEnter:e?d:void 0,className:"report",title:h("lng_report_message_title")},a.ZP.createElement(_e.Z,{name:"report-message",options:Z,onChange:m,selected:o}),a.ZP.createElement(ve.Z,{label:h("lng_report_reason_description"),value:i,onChange:u}),a.ZP.createElement(R.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:d},h("lng_report_button")),a.ZP.createElement(R.Z,{className:"confirm-dialog-button",isText:!0,onClick:r},h("Cancel")))}))),He=(0,a.X$)((0,s.c$)((e=>{const{type:t}=(0,m.Bt)(e)||{},{canDelete:n}=(0,m.xl)(e),a=(0,m.nB)(e),s=(0,m.Nu)(e),{messageIds:r}=e.selectedMessages||{};return{isSchedule:"scheduled"===t,selectedMessagesCount:(0,m.D7)(e),canDeleteMessages:n,canReportMessages:a,canDownloadMessages:s,selectedMessageIds:r}}),((e,t)=>(0,h.ei)(t,["exitMessageSelectMode","openForwardMenuForSelectedMessages","downloadSelectedMessages"])))((({canPost:e,isActive:t,messageListType:n,isSchedule:s,selectedMessagesCount:r,canDeleteMessages:o,canReportMessages:l,canDownloadMessages:i,selectedMessageIds:c,exitMessageSelectMode:d,openForwardMenuForSelectedMessages:m,downloadSelectedMessages:u})=>{const[h,Z,P]=(0,Le.Z)(),[g,v,p]=(0,Le.Z)();(0,a.d4)((()=>!t||h||g?void 0:(0,ze.Z)({onBackspace:Z,onDelete:Z,onEsc:d})),[t,h,g,Z,d]);const E=(0,a.I4)((()=>{u(),d()}),[u,d]),C=(0,f.Z)(r||void 0,!0),b=t?r:C,I=(0,M.Z)(),y=I("VoiceOver.Chat.MessagesSelected",b,"i"),S=(0,X.Z)("MessageSelectToolbar",e&&"with-composer",t&&"shown"),k=(e,t,n,s,r)=>a.ZP.createElement("div",{role:"button",tabIndex:0,className:(0,X.Z)("item",s&&"disabled",r&&"destructive"),onClick:s?void 0:n,title:t},a.ZP.createElement("i",{className:`icon-${e}`}));return a.ZP.createElement("div",{className:S},a.ZP.createElement("div",{className:"MessageSelectToolbar-inner"},a.ZP.createElement(R.Z,{color:"translucent",round:!0,onClick:d,ariaLabel:"Exit select mode"},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement("span",{className:"MessageSelectToolbar-count",title:y},y),!!r&&a.ZP.createElement("div",{className:"MessageSelectToolbar-actions"},"scheduled"!==n&&k("forward",I("Chat.ForwardActionHeader"),m),l&&k("flag",I("Conversation.ReportMessages"),v),i&&k("download",I("lng_media_download"),E),k("delete",I("EditAdminGroupDeleteMessages"),Z,!o,!0))),a.ZP.createElement(Xe,{isOpen:h,isSchedule:s,onClose:P}),a.ZP.createElement(Ye,{isOpen:g,onClose:p,messageIds:c}))})));var Ve=n(3133),je=n(735),Ke=n(1470);const qe=e=>{const t=(0,a.sO)(null),n=(0,a.I4)((n=>{"Enter"===n.key&&t.current===document.activeElement&&e()}),[e]);return(0,a.d4)((()=>(window.addEventListener("keydown",n,!1),()=>window.removeEventListener("keydown",n))),[n]),t};var We=n(329),Qe=n(742);const et=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,m.Z1)(e,t),a=n&&(0,u.zX)(n);return{chat:n,privateChatUser:a?(0,m.dy)(e,a):void 0,isPinned:(0,m.ep)(e,t),isMuted:n?(0,u.i4)(n,(0,m.dZ)(e),(0,m.NJ)(e)):void 0}}))((({chatId:e,chat:t,privateChatUser:n,isPinned:s,isMuted:r,withUsername:o,onClick:l})=>{const[i,c,d]=(0,Le.Z)(),[m,h,Z]=(0,Le.Z)(),P=(0,Ke.Z)({chat:t,privateChatUser:n,isPinned:s,isMuted:r,handleDelete:c,handleChatFolderChange:h},!0),g=()=>{l(e)},v=qe(g);if(t)return a.ZP.createElement(Ee.Z,{className:"chat-item-clickable search-result",onClick:g,contextActions:P,buttonRef:v},(0,u.YC)(e)?a.ZP.createElement(fe.Z,{userId:e,withUsername:o,avatarSize:"large"}):a.ZP.createElement(Ce.Z,{chatId:e,withUsername:o,avatarSize:"large"}),a.ZP.createElement(We.Z,{isOpen:i,onClose:d,chat:t}),a.ZP.createElement(Qe.Z,{isOpen:m,onClose:Z,chatId:e}))})));var tt=n(8781);const nt=(0,z.P2)((e=>e()),6e4,!0),at=(0,a.X$)((0,s.c$)((e=>{const{userIds:t}=e.topPeers,n=e.users.byId,{recentlyFoundChatIds:a}=e.globalSearch;return{topUserIds:t,usersById:n,recentlyFoundChatIds:a}}),((e,t)=>(0,h.ei)(t,["loadTopUsers","loadContactList","openChat","addRecentlyFoundChatId","clearRecentlyFoundChats"])))((({topUserIds:e,usersById:t,recentlyFoundChatIds:n,onReset:s,loadTopUsers:r,loadContactList:o,openChat:l,addRecentlyFoundChatId:i,clearRecentlyFoundChats:c})=>{const d=(0,a.sO)(null);(0,a.d4)((()=>{nt((()=>{r(),o()}))}),[r,o]),(0,tt.Z)(d.current,!e);const m=(0,a.I4)((e=>{l({id:e,shouldReplaceHistory:!0}),s(),setTimeout((()=>{i({id:e})}),250)}),[l,i,s]),h=(0,M.Z)();return a.ZP.createElement("div",{className:"RecentContacts custom-scroll"},e&&a.ZP.createElement("div",{className:"top-peers-section",dir:h.isRtl?"rtl":void 0},a.ZP.createElement("div",{ref:d,className:"top-peers no-selection"},e.map((e=>a.ZP.createElement("div",{className:"top-peer-item",onClick:()=>m(e),dir:h.isRtl?"rtl":void 0},a.ZP.createElement(D.Z,{user:t[e]}),a.ZP.createElement("div",{className:"top-peer-name"},(0,$.Z)((0,u.Vl)(t[e])||" "))))))),n&&a.ZP.createElement("div",{className:"search-section pt-1"},a.ZP.createElement("h3",{className:"section-heading mt-0 recent-chats-header",dir:h.isRtl?"rtl":void 0},h("Recent"),a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent",ariaLabel:"Clear recent chats",onClick:c,isRtl:h.isRtl},a.ZP.createElement("i",{className:"icon-close"}))),n.map((e=>a.ZP.createElement(et,{chatId:e,onClick:m})))))})));var st=n(9411),rt=n(8033);const ot=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,m.Z1)(e,t);if(!n)return{};const a=(0,u.zX)(n);return{chat:n,lastSyncTime:e.lastSyncTime,...a&&{privateChatUser:(0,m.dy)(e,a)}}}),((e,t)=>(0,h.ei)(t,["focusMessage"])))((({message:e,searchQuery:t,chatId:n,chat:s,privateChatUser:r,focusMessage:o,lastSyncTime:l})=>{const c=(0,u.DH)(e),d=(0,p.Z)((0,u.Ti)(e,"micro")),m=Boolean((0,u.Y5)(e)),h=(0,a.I4)((()=>{o({chatId:n,messageId:e.id})}),[n,o,e.id]),Z=(0,M.Z)(),P=qe(h);if(s)return a.ZP.createElement(Ee.Z,{className:"ChatMessage chat-item-clickable",ripple:!i.wB,onClick:h,buttonRef:P},a.ZP.createElement(D.Z,{chat:s,user:r,withOnlineStatus:!0,isSavedMessages:null==r?void 0:r.isSelf,lastSyncTime:l}),a.ZP.createElement("div",{className:"info"},a.ZP.createElement("div",{className:"info-row"},a.ZP.createElement("div",{className:"title"},a.ZP.createElement("h3",{dir:"auto"},(0,$.Z)((0,u.U)(Z,s,r))),s.isVerified&&a.ZP.createElement(st.Z,null)),a.ZP.createElement("div",{className:"message-date"},a.ZP.createElement(rt.Z,{className:"date"},(0,B.VX)(Z,1e3*e.date)))),a.ZP.createElement("div",{className:"subtitle"},a.ZP.createElement("div",{className:"message",dir:"auto"},function(e,t,n,s,r){return n?a.ZP.createElement("span",{className:"media-preview"},a.ZP.createElement("img",{src:n,alt:"",className:r?"round":void 0}),(0,u.b7)(t)&&a.ZP.createElement("i",{className:"icon-play"}),(0,$.Z)((0,u.MK)(e,t,!0),["emoji","highlight"],{highlight:s})):(0,$.Z)((0,u.MK)(e,t))}(Z,e,d||c,t,m)))))}))),lt=(0,a.X$)((({searchDate:e,onSelect:t})=>{const n=(0,a.Ye)((()=>function(e){if(e.match(/^\d{2,4}-\d{2}-\d{2}$/g)){const t=new Date(e);return[{date:t,text:(0,B.xH)(t)}]}const t=[],n=new Date,a=n.getFullYear(),s=n.getTime()>new Date(`${a}-${e}`).getTime()?a:a-1;for(let n=0;n<8;n++){const a=new Date(`${s-n}-${e}`);t.push({date:a,text:(0,B.xH)(a)})}return t}(e)),[e]);return a.ZP.createElement("section",{className:"DateSuggest custom-scroll custom-scroll-x"},n.map((({date:e,text:n})=>a.ZP.createElement("div",{onClick:()=>t(e),className:"date-item",key:n},a.ZP.createElement("i",{className:"icon-calendar"}),a.ZP.createElement("span",null,n)))))}));var it=n(7262),ct=n(9187);const dt=(0,z.P2)((e=>e()),500,!0),mt=(0,a.X$)((0,s.c$)((e=>{var t;const{byId:n}=e.chats,{byId:a}=e.users,{userIds:s}=e.contactList||{};if(!s)return{chatsById:n,usersById:a};const{currentUserId:r,messages:o,lastSyncTime:l}=e,{fetchingStatus:i,globalResults:c,localResults:d,resultsByType:m}=e.globalSearch,{chatIds:u,userIds:h}=c||{},{chatIds:Z,userIds:P}=d||{},{byChatId:g}=o;return{currentUserId:r,localContactIds:s,localChatIds:Z,localUserIds:P,globalChatIds:u,globalUserIds:h,foundIds:null==m||null===(t=m.text)||void 0===t?void 0:t.foundIds,globalMessagesByChatId:g,chatsById:n,usersById:a,fetchingStatus:i,lastSyncTime:l}}),((e,t)=>(0,h.ei)(t,["openChat","addRecentlyFoundChatId","searchMessagesGlobal","setGlobalSearchChatId"])))((({searchQuery:e,searchDate:t,dateSearchQuery:n,currentUserId:s,localContactIds:r,localChatIds:l,localUserIds:c,globalChatIds:d,globalUserIds:m,foundIds:Z,globalMessagesByChatId:P,chatsById:g,usersById:v,fetchingStatus:p,lastSyncTime:E,onReset:C,onSearchDateSelect:f,openChat:b,addRecentlyFoundChatId:I,searchMessagesGlobal:y,setGlobalSearchChatId:S})=>{const k=(0,M.Z)(),[w,N]=(0,a.eJ)(!1),[T,F]=(0,a.eJ)(!1),A=(0,a.I4)((({direction:t})=>{E&&t===o.Uq.Backwards&&dt((()=>{y({type:"text",query:e})}))}),[E,y,e]),L=(0,a.I4)((e=>{b({id:e,shouldReplaceHistory:!0}),e!==s&&I({id:e}),i.wB||C()}),[s,b,I,C]),R=(0,a.I4)((e=>{S({id:e})}),[S]),B=(0,a.Ye)((()=>{if(!e||e.startsWith("@")&&e.length<2)return je.D;const t=r?r.filter((t=>{const n=v[t];if(!n)return!1;const a=(0,u.Js)(n);return a&&(0,me.Z)(a,e)||(0,me.Z)(n.username,e)})):[];return[...s&&(0,me.Z)(k("SavedMessages"),e)?[s]:[],...(0,u.ih)((0,h.Tw)([...t,...l||[],...c||[]]),g)]}),[e,r,s,k,l,c,g,v]),$=(0,a.Ye)((()=>!e||e.length<4||!d||!m?je.D:(0,u.ih)((0,h.Tw)([...d,...m]),g,!0)),[g,d,m,e]),D=(0,a.Ye)((()=>(e||t)&&Z&&0!==Z.length?Z.map((e=>{var t;const[n,a]=e.split("_");return null==P||null===(t=P[n])||void 0===t?void 0:t.byId[Number(a)]})).filter(Boolean).sort(((e,t)=>t.date-e.date)):je.D),[Z,P,e,t]),U=(0,a.I4)((()=>{N(!w)}),[w]),O=(0,a.I4)((()=>{F(!T)}),[T]),x=p&&!p.chats&&!p.messages&&!B.length&&!$.length&&!D.length;return e||t?a.ZP.createElement(pe.Z,{className:"LeftSearch custom-scroll",items:D,onLoadMore:A,noScrollRestoreOnTop:!0,noFastList:!0},n&&a.ZP.createElement("div",{className:"chat-selection no-selection no-scrollbar"},a.ZP.createElement(lt,{searchDate:n,onSelect:f})),x&&a.ZP.createElement(it.Z,{text:k("ChatList.Search.NoResults"),description:k("ChatList.Search.NoResultsDescription")}),!!B.length&&a.ZP.createElement("div",{className:"chat-selection no-selection no-scrollbar",dir:k.isRtl?"rtl":void 0},B.map((e=>a.ZP.createElement(ct.Z,{chatOrUserId:e,onClick:R,clickArg:e})))),!!B.length&&a.ZP.createElement("div",{className:"search-section"},a.ZP.createElement("h3",{className:"section-heading",dir:k.isRtl?"auto":void 0},B.length>3&&a.ZP.createElement(rt.Z,{onClick:U},k(w?"ChatList.Search.ShowLess":"ChatList.Search.ShowMore")),k("DialogList.SearchSectionDialogs")),B.map(((e,t)=>{if(w||!(t>=3))return a.ZP.createElement(et,{chatId:e,onClick:L})}))),!!$.length&&a.ZP.createElement("div",{className:"search-section"},a.ZP.createElement("h3",{className:"section-heading",dir:k.isRtl?"auto":void 0},$.length>3&&a.ZP.createElement(rt.Z,{onClick:O},k(T?"ChatList.Search.ShowLess":"ChatList.Search.ShowMore")),k("DialogList.SearchSectionGlobal")),$.map(((e,t)=>{if(T||!(t>=3))return a.ZP.createElement(et,{chatId:e,withUsername:!0,onClick:L})}))),!!D.length&&a.ZP.createElement("div",{className:"search-section"},a.ZP.createElement("h3",{className:"section-heading",dir:k.isRtl?"auto":void 0},k("SearchMessages")),D.map((function(t){const n=(0,u.MK)(k,t),s=g[t.chatId];if(n&&s)return a.ZP.createElement(ot,{chatId:t.chatId,message:t,searchQuery:e})})))):a.ZP.createElement(at,{onReset:C})}))),ut=(0,z.P2)((e=>e()),500,!0),ht=(0,a.X$)((0,s.c$)((e=>{const{byId:t}=e.chats,{currentUserId:n,messages:{byChatId:a},lastSyncTime:s}=e,{fetchingStatus:r,resultsByType:o}=e.globalSearch,{foundIds:l}=(null==o?void 0:o.text)||{};return{currentUserId:n,foundIds:l,globalMessagesByChatId:a,chatsById:t,fetchingStatus:r,lastSyncTime:s}}),((e,t)=>(0,h.ei)(t,["searchMessagesGlobal"])))((({searchQuery:e,currentUserId:t,dateSearchQuery:n,foundIds:s,globalMessagesByChatId:r,chatsById:l,fetchingStatus:i,lastSyncTime:c,searchMessagesGlobal:d,onSearchDateSelect:m})=>{const h=(0,M.Z)(),Z=(0,a.I4)((({direction:n})=>{c&&n===o.Uq.Backwards&&ut((()=>{d({type:"text",query:e,chatId:t})}))}),[t,c,d,e]),P=(0,a.Ye)((()=>s&&0!==s.length?s.map((e=>{var t;const[n,a]=e.split("_");return null==r||null===(t=r[n])||void 0===t?void 0:t.byId[Number(a)]})).filter(Boolean).sort(((e,t)=>t.date-e.date)):je.D),[s,r]),g=i&&!i.chats&&!i.messages&&!P.length;return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(pe.Z,{className:"search-content custom-scroll chat-list",items:P,onLoadMore:Z,noFastList:!0},n&&a.ZP.createElement("div",{className:"chat-selection no-selection no-scrollbar"},a.ZP.createElement(lt,{searchDate:n,onSelect:m})),g&&a.ZP.createElement(it.Z,{text:h("ChatList.Search.NoResults"),description:h("ChatList.Search.NoResultsDescription")}),!!P.length&&P.map((function(t){const n=(0,u.MK)(h,t),s=l[t.chatId];if(n&&s)return a.ZP.createElement(ot,{chatId:t.chatId,message:t,searchQuery:e})}))))})));function Zt(e){return(t,n)=>{var a;const{byId:s}=t.chats,{byId:r}=t.users,{fetchingStatus:o,resultsByType:l,chatId:i}=t.globalSearch,c="audio"!==e?e:null!=n&&n.isVoice?"voice":"audio",{byChatId:d}=t.messages,u=null==l||null===(a=l[c])||void 0===a?void 0:a.foundIds,h=t.activeDownloads.byChatId;return{theme:(0,m.Pu)(t),isLoading:void 0===u||!!o&&Boolean(o.chats||o.messages),chatsById:s,usersById:r,globalMessagesByChatId:d,foundIds:u,searchChatId:i,activeDownloads:h,lastSyncTime:t.lastSyncTime}}}var Pt=n(7891),gt=n(3709);const vt="media",pt=(0,z.P2)((e=>e()),500,!0),Et=(0,a.X$)((0,s.c$)(Zt(vt),((e,t)=>(0,h.ei)(t,["searchMessagesGlobal","openMediaViewer"])))((({searchQuery:e,searchChatId:t,isLoading:n,globalMessagesByChatId:s,foundIds:r,lastSyncTime:i,searchMessagesGlobal:c,openMediaViewer:d})=>{const m=(0,M.Z)(),u=(0,a.I4)((({direction:n})=>{i&&n===o.Uq.Backwards&&pt((()=>{c({type:vt,query:e,chatId:t})}))}),[i,c,e,t]),h=(0,a.Ye)((()=>r&&s?r.map((e=>{var t;const[n,a]=e.split("_");return null===(t=s[n])||void 0===t?void 0:t.byId[Number(a)]})).filter(Boolean):je.D),[s,r]),Z=(0,a.I4)(((e,t)=>{d({chatId:t,messageId:e,origin:o.bZ.SearchResult})}),[d]),P=(0,Pt.Z)([e],l.Y)&&!n,g=P&&r&&r.length>0&&!e,v=P&&r&&r.length>0&&e,p=(0,X.Z)("search-content custom-scroll",v&&"chat-list");return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(pe.Z,{className:p,items:h,itemSelector:e?".ListItem":".Media",onLoadMore:u,noFastList:!0},!P&&a.ZP.createElement(Pe.Z,null),P&&(!r||0===r.length)&&a.ZP.createElement(it.Z,{text:m("ChatList.Search.NoResults"),description:m("ChatList.Search.NoResultsDescription")}),g&&a.ZP.createElement("div",{className:"media-list",dir:m.isRtl?"rtl":void 0},h.map((e=>a.ZP.createElement(gt.Z,{key:e.id,idPrefix:"search-media",message:e,onClick:Z})))),v&&h.map((e=>a.ZP.createElement(ot,{key:e.id,chatId:e.chatId,message:e})))))})));var Ct=n(91),ft=n(5418);const bt="links",It=(0,z.P2)((e=>e()),500,!0),yt=(0,a.X$)((0,s.c$)(Zt(bt),((e,t)=>(0,h.ei)(t,["searchMessagesGlobal","focusMessage"])))((({searchQuery:e,searchChatId:t,isLoading:n,chatsById:s,usersById:r,globalMessagesByChatId:i,foundIds:c,lastSyncTime:d,searchMessagesGlobal:m,focusMessage:u})=>{const h=(0,M.Z)(),Z=(0,a.I4)((({direction:n})=>{d&&n===o.Uq.Backwards&&It((()=>{m({type:bt,query:e,chatId:t})}))}),[d,m,e,t]),P=(0,a.Ye)((()=>c&&i?c.map((e=>{var t;const[n,a]=e.split("_");return null===(t=i[n])||void 0===t?void 0:t.byId[Number(a)]})).filter(Boolean):je.D),[i,c]),g=(0,a.I4)(((e,t)=>{u({chatId:t,messageId:e})}),[u]),v=(0,Pt.Z)([e],l.Y)&&!n;return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(pe.Z,{className:"search-content documents-list custom-scroll",items:P,onLoadMore:Z,noFastList:!0},!v&&a.ZP.createElement(Pe.Z,null),v&&(!c||0===c.length)&&a.ZP.createElement(it.Z,{text:h("ChatList.Search.NoResults"),description:h("ChatList.Search.NoResultsDescription")}),v&&c&&c.length>0&&P.map(((e,t)=>{const n=0===t||(0,B.kj)(e.date)!==(0,B.kj)(P[t-1].date);return a.ZP.createElement("div",{className:"ListItem small-icon",dir:h.isRtl?"rtl":void 0,key:e.id},n&&a.ZP.createElement("p",{className:"section-heading",dir:h.isRtl?"rtl":void 0},(0,B.np)(h,new Date(1e3*e.date))),a.ZP.createElement(ft.Z,{key:e.id,message:e,senderTitle:(0,Ct.F)(h,e,s,r),onMessageClick:g}))}))))})));var St=n(2535);const kt="documents",wt=(0,z.P2)((e=>e()),500,!0),Nt=(0,a.X$)((0,s.c$)(Zt(kt),((e,t)=>(0,h.ei)(t,["searchMessagesGlobal","focusMessage"])))((({searchQuery:e,searchChatId:t,isLoading:n,chatsById:s,usersById:r,globalMessagesByChatId:i,foundIds:c,activeDownloads:d,lastSyncTime:m,searchMessagesGlobal:h,focusMessage:Z})=>{const P=(0,M.Z)(),g=(0,a.I4)((({direction:n})=>{m&&n===o.Uq.Backwards&&wt((()=>{h({type:kt,query:e,chatId:t})}))}),[m,h,e,t]),v=(0,a.Ye)((()=>c&&i?c.map((e=>{var t;const[n,a]=e.split("_"),s=null===(t=i[n])||void 0===t?void 0:t.byId[Number(a)];return s&&(0,u.aE)(s)?s:void 0})).filter(Boolean):je.D),[i,c]),p=(0,a.I4)(((e,t)=>{Z({chatId:t,messageId:e})}),[Z]),E=(0,Pt.Z)([e],l.Y)&&!n;return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(pe.Z,{className:"search-content documents-list custom-scroll",items:v,onLoadMore:g,noFastList:!0},!E&&a.ZP.createElement(Pe.Z,null),E&&(!c||0===c.length)&&a.ZP.createElement(it.Z,{text:P("ChatList.Search.NoResults"),description:P("ChatList.Search.NoResultsDescription")}),E&&c&&c.length>0&&v.map(((e,t)=>{var n;const o=0===t||(0,B.kj)(e.date)!==(0,B.kj)(v[t-1].date);return a.ZP.createElement("div",{className:"ListItem small-icon",key:e.id},o&&a.ZP.createElement("p",{className:"section-heading"},(0,B.np)(P,new Date(1e3*e.date))),a.ZP.createElement(St.Z,{message:e,withDate:!0,datetime:e.date,smaller:!0,sender:(0,Ct.F)(P,e,s,r),className:"scroll-item",onDateClick:p,isDownloading:null===(n=d[e.chatId])||void 0===n?void 0:n.includes(e.id)}))}))))})));var Mt=n(4752);const Tt=(0,z.P2)((e=>e()),500,!0),Ft=(0,a.X$)((0,s.c$)(Zt("audio"),((e,t)=>(0,h.ei)(t,["searchMessagesGlobal","focusMessage","openAudioPlayer"])))((({theme:e,isVoice:t,searchQuery:n,searchChatId:s,isLoading:r,chatsById:i,usersById:c,globalMessagesByChatId:d,foundIds:m,lastSyncTime:u,activeDownloads:h,searchMessagesGlobal:Z,focusMessage:P,openAudioPlayer:g})=>{const v=(0,M.Z)(),p=t?"voice":"audio",E=(0,a.I4)((({direction:e})=>{u&&e===o.Uq.Backwards&&Tt((()=>{Z({type:p,query:n,chatId:s})}))}),[p,u,Z,n,s]),C=(0,a.Ye)((()=>m&&d?m.map((e=>{var t;const[n,a]=e.split("_");return null===(t=d[n])||void 0===t?void 0:t.byId[Number(a)]})).filter(Boolean):je.D),[d,m]),f=(0,a.I4)(((e,t)=>{P({chatId:t,messageId:e})}),[P]),b=(0,a.I4)(((e,t)=>{g({chatId:t,messageId:e})}),[g]),I=(0,Pt.Z)([n],l.Y)&&!r;return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(pe.Z,{className:"search-content documents-list custom-scroll",items:C,onLoadMore:E,noFastList:!0},!I&&a.ZP.createElement(Pe.Z,null),I&&(!m||0===m.length)&&a.ZP.createElement(it.Z,{text:v("ChatList.Search.NoResults"),description:v("ChatList.Search.NoResultsDescription")}),I&&m&&m.length>0&&C.map(((t,n)=>{var s;const r=0===n||(0,B.kj)(t.date)!==(0,B.kj)(C[n-1].date);return a.ZP.createElement("div",{className:"ListItem small-icon",key:t.id},r&&a.ZP.createElement("p",{className:"section-heading",dir:v.isRtl?"rtl":void 0},(0,B.np)(v,new Date(1e3*t.date))),a.ZP.createElement(Mt.Z,{key:t.id,theme:e,message:t,origin:o.Cr.Search,senderTitle:(0,Ct.F)(v,t,i,c),date:t.date,lastSyncTime:u,className:"scroll-item",onPlay:b,onDateClick:f,isDownloading:null===(s=h[t.chatId])||void 0===s?void 0:s.includes(t.id)}))}))))}))),At=[{type:o.nJ.ChatList,title:"SearchAllChatsShort"},{type:o.nJ.Media,title:"SharedMediaTab2"},{type:o.nJ.Links,title:"SharedLinksTab2"},{type:o.nJ.Files,title:"SharedFilesTab2"},{type:o.nJ.Music,title:"SharedMusicTab2"},{type:o.nJ.Voice,title:"SharedVoiceTab2"}],Lt=[{type:o.nJ.ChatList,title:"All Messages"},...At.slice(1)],Rt=Object.keys(o.nJ).length/2,Bt=(0,a.X$)((0,s.c$)((e=>{const{currentContent:t,chatId:n}=e.globalSearch;return{currentContent:t,chatId:n}}),((e,t)=>(0,h.ei)(t,["setGlobalSearchContent","setGlobalSearchDate"])))((({searchQuery:e,searchDate:t,isActive:n,currentContent:s=o.nJ.ChatList,chatId:r,setGlobalSearchContent:l,setGlobalSearchDate:i,onReset:c})=>{const d=(0,M.Z)(),[m,u]=(0,a.eJ)(s),h=(0,a.Ye)((()=>(0,B.xk)(e)),[e]),Z=(0,a.I4)((e=>{const t=At[e];l({content:t.type}),u(e)}),[l]),P=(0,a.I4)((e=>{i({date:e.getTime()/1e3})}),[i]);(0,T.ZP)(n,c,void 0,void 0,!0);const g=(0,a.sO)(null),v=(0,he.Z)(g,n,void 0,".ListItem-button",!0);return a.ZP.createElement("div",{className:"LeftSearch",ref:g,onKeyDown:v},a.ZP.createElement(Ve.Z,{activeTab:m,tabs:r?Lt:At,onSwitchTab:Z}),a.ZP.createElement(L.Z,{name:d.isRtl?"slide-reversed":"slide",renderCount:Rt,activeKey:s},(()=>{switch(s){case o.nJ.ChatList:return r?a.ZP.createElement(ht,{searchQuery:e,dateSearchQuery:h,onReset:c,onSearchDateSelect:P}):a.ZP.createElement(mt,{searchQuery:e,searchDate:t,dateSearchQuery:h,onReset:c,onSearchDateSelect:P});case o.nJ.Media:return a.ZP.createElement(Et,{searchQuery:e});case o.nJ.Links:return a.ZP.createElement(yt,{searchQuery:e});case o.nJ.Files:return a.ZP.createElement(Nt,{searchQuery:e});case o.nJ.Music:return a.ZP.createElement(Ft,{key:"audio",searchQuery:e});case o.nJ.Voice:return a.ZP.createElement(Ft,{key:"voice",isVoice:!0,searchQuery:e});default:return}})))})));var $t=n(1090);const Dt={currentPassword:"",password:"",hint:"",email:""},Ut=(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 Dt;default:return e}},Ot=(0,a.X$)((0,s.c$)(void 0,((e,t)=>(0,h.ei)(t,["signOut","deleteChatFolder"])))((({currentScreen:e,editedFolderId:t,onReset:n,onSaveFilter:s,signOut:r,deleteChatFolder:l,onScreenSelect:c})=>{const[d,m]=(0,a.eJ)(!1),[u,h]=(0,a.eJ)(!1),Z=(0,a.I4)((()=>{m(!0)}),[]),P=(0,a.I4)((()=>{m(!1)}),[]),g=(0,a.I4)((()=>{h(!0)}),[]),v=(0,a.I4)((()=>{h(!1)}),[]),p=(0,a.I4)((()=>{P(),r()}),[P,r]),E=(0,a.I4)((()=>{v(),l({id:t}),n()}),[t,v,l,n]),C=(0,a.Ye)((()=>({onTrigger:e,isOpen:t})=>a.ZP.createElement(R.Z,{round:!0,ripple:!i.wB,size:"smaller",color:"translucent",className:t?"active":"",onClick:e,ariaLabel:"More actions"},a.ZP.createElement("i",{className:"icon-more"}))),[]),f=(0,M.Z)();return a.ZP.createElement("div",{className:"left-header"},a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent",onClick:n,ariaLabel:f("AccDescrGoBack")},a.ZP.createElement("i",{className:"icon-arrow-left"})),function(){switch(e){case o.MT.EditProfile:return a.ZP.createElement("h3",null,f("lng_settings_information"));case o.MT.General:return a.ZP.createElement("h3",null,f("General"));case o.MT.Notifications:return a.ZP.createElement("h3",null,f("Notifications"));case o.MT.DataStorage:return a.ZP.createElement("h3",null,f("DataSettings"));case o.MT.Privacy:return a.ZP.createElement("h3",null,f("PrivacySettings"));case o.MT.Language:return a.ZP.createElement("h3",null,f("Language"));case o.MT.GeneralChatBackground:return a.ZP.createElement("h3",null,f("ChatBackground"));case o.MT.GeneralChatBackgroundColor:return a.ZP.createElement("h3",null,f("SetColor"));case o.MT.PrivacyPhoneNumber:return a.ZP.createElement("h3",null,f("PrivacyPhone"));case o.MT.PrivacyLastSeen:return a.ZP.createElement("h3",null,f("PrivacyLastSeen"));case o.MT.PrivacyProfilePhoto:return a.ZP.createElement("h3",null,f("Privacy.ProfilePhoto"));case o.MT.PrivacyForwarding:return a.ZP.createElement("h3",null,f("PrivacyForwards"));case o.MT.PrivacyGroupChats:return a.ZP.createElement("h3",null,f("AutodownloadGroupChats"));case o.MT.PrivacyPhoneNumberAllowedContacts:case o.MT.PrivacyLastSeenAllowedContacts:case o.MT.PrivacyProfilePhotoAllowedContacts:case o.MT.PrivacyForwardingAllowedContacts:case o.MT.PrivacyGroupChatsAllowedContacts:return a.ZP.createElement("h3",null,f("AlwaysShareWith"));case o.MT.PrivacyPhoneNumberDeniedContacts:case o.MT.PrivacyLastSeenDeniedContacts:case o.MT.PrivacyProfilePhotoDeniedContacts:case o.MT.PrivacyForwardingDeniedContacts:case o.MT.PrivacyGroupChatsDeniedContacts:return a.ZP.createElement("h3",null,f("NeverShareWith"));case o.MT.PrivacyActiveSessions:return a.ZP.createElement("h3",null,f("SessionsTitle"));case o.MT.PrivacyBlockedUsers:return a.ZP.createElement("h3",null,f("BlockedUsers"));case o.MT.TwoFaDisabled:case o.MT.TwoFaEnabled:return a.ZP.createElement("h3",null,f("TwoStepVerification"));case o.MT.TwoFaNewPassword:case o.MT.TwoFaChangePasswordNew:case o.MT.TwoFaChangePasswordConfirm:return a.ZP.createElement("h3",null,f("PleaseEnterCurrentPassword"));case o.MT.TwoFaNewPasswordConfirm:return a.ZP.createElement("h3",null,f("PleaseReEnterPassword"));case o.MT.TwoFaNewPasswordHint:case o.MT.TwoFaChangePasswordHint:return a.ZP.createElement("h3",null,f("PasswordHint"));case o.MT.TwoFaNewPasswordEmail:case o.MT.TwoFaRecoveryEmail:return a.ZP.createElement("h3",null,f("RecoveryEmailTitle"));case o.MT.TwoFaNewPasswordEmailCode:case o.MT.TwoFaRecoveryEmailCode:return a.ZP.createElement("h3",null,"Recovery Email Code");case o.MT.TwoFaCongratulations:return a.ZP.createElement("h3",null,f("TwoStepVerificationPasswordSet"));case o.MT.TwoFaChangePasswordCurrent:case o.MT.TwoFaTurnOff:case o.MT.TwoFaRecoveryEmailCurrentPassword:return a.ZP.createElement("h3",null,f("PleaseEnterCurrentPassword"));case o.MT.Folders:return a.ZP.createElement("h3",null,f("Filters"));case o.MT.FoldersCreateFolder:return a.ZP.createElement("h3",null,f("FilterNew"));case o.MT.FoldersEditFolder:case o.MT.FoldersEditFolderFromChatList:return a.ZP.createElement("div",{className:"settings-main-header"},a.ZP.createElement("h3",null,f("FilterEdit")),t&&a.ZP.createElement(O.Z,{className:"settings-more-menu",trigger:C,positionX:"right"},a.ZP.createElement(x.Z,{icon:"delete",destructive:!0,onClick:g},f("Delete"))));case o.MT.FoldersIncludedChats:case o.MT.FoldersIncludedChatsFromChatList:case o.MT.FoldersExcludedChats:case o.MT.FoldersExcludedChatsFromChatList:return a.ZP.createElement("div",{className:"settings-main-header"},e===o.MT.FoldersIncludedChats||e===o.MT.FoldersIncludedChatsFromChatList?a.ZP.createElement("h3",null,f("FilterInclude")):a.ZP.createElement("h3",null,f("FilterExclude")),a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent",className:"color-primary",onClick:s,ariaLabel:f("AutoDeleteConfirm")},a.ZP.createElement("i",{className:"icon-check"})));default:return a.ZP.createElement("div",{className:"settings-main-header"},a.ZP.createElement("h3",null,f("SETTINGS")),a.ZP.createElement(R.Z,{round:!0,ripple:!i.wB,size:"smaller",color:"translucent",onClick:()=>c(o.MT.EditProfile),ariaLabel:f("lng_settings_information")},a.ZP.createElement("i",{className:"icon-edit"})),a.ZP.createElement(O.Z,{className:"settings-more-menu",trigger:C,positionX:"right"},a.ZP.createElement(x.Z,{icon:"logout",onClick:Z},f("LogOutTitle"))))}}(),a.ZP.createElement(Fe.Z,{isOpen:d,onClose:P,text:f("lng_sure_logout"),confirmLabel:f("AccountSettings.Logout"),confirmHandler:p,confirmIsDestructive:!0}),a.ZP.createElement(Fe.Z,{isOpen:u,onClose:v,text:f("FilterDeleteAlert"),confirmLabel:f("Delete"),confirmHandler:E,confirmIsDestructive:!0}))})));var xt=n(787),Gt=n(180);const Jt=(0,a.X$)((0,s.c$)((e=>{const{currentUserId:t,lastSyncTime:n}=e;return{currentUser:t?(0,m.dy)(e,t):void 0,lastSyncTime:n}}),((e,t)=>(0,h.ei)(t,["loadProfilePhotos"])))((({isActive:e,onScreenSelect:t,onReset:n,loadProfilePhotos:s,currentUser:r,lastSyncTime:l})=>{const i=(0,M.Z)(),c=null==r?void 0:r.id;return(0,a.d4)((()=>{c&&l&&s({profileId:c})}),[l,c,s]),(0,T.ZP)(e,n,t,o.MT.Main),a.ZP.createElement("div",{className:"settings-content custom-scroll"},a.ZP.createElement("div",{className:"settings-main-menu"},r&&a.ZP.createElement(xt.Z,{userId:r.id,forceShowSelf:!0}),r&&a.ZP.createElement(Gt.Z,{chatOrUserId:r.id,forceShowSelf:!0}),a.ZP.createElement(Ee.Z,{icon:"settings",onClick:()=>t(o.MT.General)},i("Telegram.GeneralSettingsViewController")),a.ZP.createElement(Ee.Z,{icon:"unmute",onClick:()=>t(o.MT.Notifications)},i("Notifications")),a.ZP.createElement(Ee.Z,{icon:"lock",onClick:()=>t(o.MT.Privacy)},i("PrivacySettings")),a.ZP.createElement(Ee.Z,{icon:"data",onClick:()=>t(o.MT.DataStorage)},i("DataSettings")),a.ZP.createElement(Ee.Z,{icon:"folder",onClick:()=>t(o.MT.Folders)},i("Filters")),a.ZP.createElement(Ee.Z,{icon:"language",onClick:()=>t(o.MT.Language)},i("Language"))))})));var zt=n(710),Xt=n(1151);const _t="https://t.me/",Yt=/https:\/\/t\.me\/?/i,Ht=/^([a-zA-Z0-9_]+)$/,Vt=(0,z.Ds)((e=>e()),250,!1),jt=(0,a.X$)((({currentUsername:e,asLink:t,isLoading:n,isUsernameAvailable:s,checkUsername:r,onChange:o})=>{const[l,i]=(0,a.eJ)(e||""),c=(0,M.Z)(),d=t?"SetUrl":"Username",m=c(t?"SetUrlPlaceholder":"Username"),[u,h]=(0,a.Ye)((()=>l.length?l.length<5?[void 0,`${m} is too short`]:l.length>32?[void 0,`${m} is too long`]:Ht.test(l)?void 0===s?[]:[s?c(`${d}Available`,"Username"):void 0,!1===s?c(`${d}InUse`):void 0]:[void 0,`${m} contains invalid characters`]:[]),[l,s,c,d,m]);(0,a.d4)((()=>{i(e||"")}),[t,e]);const Z=(0,a.I4)((e=>{const n=e.target.value.trim().replace(Yt,"");i(n),e.target.value=`${t?_t:""}${n}`;const a=function(e){return e.length>=5&&e.length<=32&&Ht.test(e)}(n);a&&Vt((()=>{r({username:n})})),o&&o(!!a&&n)}),[t,r,o]);return a.ZP.createElement(ve.Z,{value:`${t?_t:""}${l}`,onChange:Z,label:m,error:h,success:u,readOnly:n})})),Kt=(0,z.P2)((e=>e()),6e4,!0),qt="Please provide your first name",Wt="Bio can' be longer than 70 characters",Qt=(0,a.X$)((0,s.c$)((e=>{const{currentUserId:t}=e,{progress:n,isUsernameAvailable:a}=e.profileEdit||{},s=t?(0,m.dy)(e,t):void 0;if(!s)return{progress:n,isUsernameAvailable:a};const{firstName:r,lastName:o,username:l,fullInfo:i}=s,{bio:c}=i||{};return{currentAvatarHash:(0,u.RT)(s),currentFirstName:r,currentLastName:o,currentBio:c,currentUsername:l,progress:n,isUsernameAvailable:a}}),((e,t)=>(0,h.ei)(t,["loadCurrentUser","updateProfile","checkUsername"])))((({isActive:e,onScreenSelect:t,onReset:n,currentAvatarHash:s,currentFirstName:l,currentLastName:i,currentBio:c,currentUsername:d,progress:m,isUsernameAvailable:u,loadCurrentUser:h,updateProfile:Z,checkUsername:P})=>{const g=(0,M.Z)(),[v,E]=(0,a.eJ)(!1),[C,f]=(0,a.eJ)(!1),[b,I]=(0,a.eJ)(),[y,S]=(0,a.eJ)(),[k,w]=(0,a.eJ)(l||""),[N,A]=(0,a.eJ)(i||""),[L,R]=(0,a.eJ)(c||""),[B,D]=(0,a.eJ)(d||""),U=(0,p.Z)(s,!1,r.IU.BlobUrl),O=m===o.rN.InProgress,x=!1===B,G=(0,a.Ye)((()=>!x&&(Boolean(y)||C||!0===u)),[y,C,x,u]);(0,T.ZP)(e,n,t,o.MT.EditProfile),(0,a.d4)((()=>{Kt((()=>{h()}))}),[h]),(0,a.d4)((()=>{S(void 0)}),[U]),(0,a.d4)((()=>{w(l||""),A(i||""),R(c||"")}),[l,i,c]),(0,a.d4)((()=>{D(d||"")}),[d]),(0,a.d4)((()=>{m===o.rN.Complete&&(f(!1),E(!1),I(void 0))}),[m]);const J=(0,a.I4)((e=>{S(e)}),[]),z=(0,a.I4)((e=>{w(e.target.value),f(!0)}),[]),X=(0,a.I4)((e=>{A(e.target.value),f(!0)}),[]),_=(0,a.I4)((e=>{R(e.target.value),f(!0)}),[]),Y=(0,a.I4)((e=>{D(e),E(!0)}),[]),H=(0,a.I4)((()=>{const e=k.trim(),t=N.trim(),n=L.trim();e.length?n.length>70?I(Wt):Z({photo:y,...C&&{firstName:e,lastName:t,bio:n},...v&&{username:B}}):I(qt)}),[y,k,N,L,C,B,v,Z]);return a.ZP.createElement("div",{className:"settings-fab-wrapper"},a.ZP.createElement("div",{className:"settings-content custom-scroll"},a.ZP.createElement("div",{className:"settings-edit-profile"},a.ZP.createElement(zt.Z,{currentAvatarBlobUrl:U,onChange:J,title:"Edit your profile photo",disabled:O}),a.ZP.createElement(ve.Z,{value:k,onChange:z,label:g("FirstName"),disabled:O,error:b===qt?b:void 0}),a.ZP.createElement(ve.Z,{value:N,onChange:X,label:g("LastName"),disabled:O}),a.ZP.createElement(ve.Z,{value:L,onChange:_,label:g("UserBio"),disabled:O,error:b===Wt?b:void 0}),a.ZP.createElement("p",{className:"settings-item-description",dir:g.isRtl?"rtl":void 0},(0,$.Z)(g("lng_settings_about_bio"),["br","simple_markdown"]))),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:g.isRtl?"rtl":void 0},g("Username")),a.ZP.createElement(jt,{currentUsername:B||"",isLoading:O,isUsernameAvailable:u,checkUsername:P,onChange:Y}),a.ZP.createElement("p",{className:"settings-item-description",dir:g.isRtl?"rtl":void 0},(0,$.Z)(g("UsernameHelp"),["br","simple_markdown"])),B&&a.ZP.createElement("p",{className:"settings-item-description",dir:g.isRtl?"rtl":void 0},g("lng_username_link"),a.ZP.createElement("br",null),a.ZP.createElement("span",{className:"username-link"},"https://t.me/",B)))),a.ZP.createElement(Xt.Z,{isShown:G,onClick:H,disabled:O,ariaLabel:"Save changes"},O?a.ZP.createElement(F.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})))})));var en=n(4605),tn=n(8051);const nn=(0,a.X$)((0,s.c$)((e=>(0,h.ei)(e.settings.byKey,["canAutoLoadPhotoFromContacts","canAutoLoadPhotoInPrivateChats","canAutoLoadPhotoInGroups","canAutoLoadPhotoInChannels","canAutoLoadVideoFromContacts","canAutoLoadVideoInPrivateChats","canAutoLoadVideoInGroups","canAutoLoadVideoInChannels","canAutoLoadFileFromContacts","canAutoLoadFileInPrivateChats","canAutoLoadFileInGroups","canAutoLoadFileInChannels","canAutoPlayGifs","canAutoPlayVideos","autoLoadFileMaxSizeMb"])),((e,t)=>(0,h.ei)(t,["setSettingOption"])))((({isActive:e,onScreenSelect:t,onReset:n,canAutoLoadPhotoFromContacts:s,canAutoLoadPhotoInPrivateChats:r,canAutoLoadPhotoInGroups:i,canAutoLoadPhotoInChannels:c,canAutoLoadVideoFromContacts:d,canAutoLoadVideoInPrivateChats:m,canAutoLoadVideoInGroups:u,canAutoLoadVideoInChannels:h,canAutoLoadFileFromContacts:Z,canAutoLoadFileInPrivateChats:P,canAutoLoadFileInGroups:g,canAutoLoadFileInChannels:v,canAutoPlayGifs:p,canAutoPlayVideos:E,autoLoadFileMaxSizeMb:C,setSettingOption:f})=>{const b=(0,M.Z)();(0,T.ZP)(e,n,t,o.MT.General);const I=(0,a.I4)((e=>b("AutodownloadSizeLimitUpTo",b("FileSize.MB",String(l.by[e]),"i"))),[b]),y=(0,a.I4)((e=>{f({autoLoadFileMaxSizeMb:l.by[e]})}),[f]);function S(e,t,n,s,r,o){return a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:b.isRtl?"rtl":void 0},e),a.ZP.createElement(en.Z,{label:b("AutoDownloadSettings.Contacts"),checked:n,onCheck:e=>f({[`canAutoLoad${t}FromContacts`]:e})}),a.ZP.createElement(en.Z,{label:b("AutoDownloadSettings.PrivateChats"),checked:s,onCheck:e=>f({[`canAutoLoad${t}InPrivateChats`]:e})}),a.ZP.createElement(en.Z,{label:b("AutoDownloadSettings.GroupChats"),checked:r,onCheck:e=>f({[`canAutoLoad${t}InGroups`]:e})}),a.ZP.createElement(en.Z,{label:b("AutoDownloadSettings.Channels"),checked:o,onCheck:e=>f({[`canAutoLoad${t}InChannels`]:e})}),"File"===t&&function(){const e=l.by.indexOf(C);return a.ZP.createElement("div",{className:"pt-5"},a.ZP.createElement(tn.Z,{label:b("AutoDownloadMaxFileSize"),min:0,max:5,value:-1!==e?e:2,renderValue:I,onChange:y}))}())}return a.ZP.createElement("div",{className:"settings-content custom-scroll"},S(b("AutoDownloadPhotosTitle"),"Photo",s,r,i,c),S(b("AutoDownloadVideosTitle"),"Video",d,m,u,h),S("Auto-download files","File",Z,P,g,v),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:b.isRtl?"rtl":void 0},b("AutoplayMedia")),a.ZP.createElement(en.Z,{label:b("GifsTab2"),checked:p,onCheck:e=>f({canAutoPlayGifs:e})}),a.ZP.createElement(en.Z,{label:b("DataAndStorage.Autoplay.Videos"),checked:E,onCheck:e=>f({canAutoPlayVideos:e})})))})));var an=n(7324),sn=n(7799);const rn=(0,z.P2)((e=>e()),6e4,!0),on=(0,a.X$)((0,s.c$)((e=>{const{chats:{byId:t},users:{byId:n}}=e,{orderedIds:a,byId:s,recommended:r}=e.chatFolders;return{chatsById:t,usersById:n,orderedFolderIds:a,foldersById:s,recommendedChatFolders:r,notifySettings:(0,m.dZ)(e),notifyExceptions:(0,m.NJ)(e)}}),((e,t)=>(0,h.ei)(t,["loadRecommendedChatFolders","addChatFolder","showDialog"])))((({onCreateFolder:e,onEditFolder:t,isActive:n,onScreenSelect:s,onReset:r,chatsById:i,usersById:c,orderedFolderIds:d,foldersById:m,recommendedChatFolders:h,notifySettings:Z,notifyExceptions:P,loadRecommendedChatFolders:g,addChatFolder:v,showDialog:p})=>{const[E,C]=(0,a.eJ)(),[f,b]=(0,a.eJ)(!1),I=(0,a.I4)((()=>b(!0)),[]);(0,a.d4)((()=>{E||(0,an.Z)("FoldersAll").then(C)}),[E]),(0,a.d4)((()=>{rn((()=>{g()}))}),[g]);const y=(0,a.I4)((()=>{Object.keys(m).length>=10?p({data:{message:"DIALOG_FILTERS_TOO_MUCH",hasErrorKey:!0}}):e()}),[m,p,e]),S=(0,M.Z)();(0,T.ZP)(n,r,s,o.MT.Folders);const k=(0,a.Ye)((()=>{if(!d)return;const e=Object.keys(i);return d.map((t=>{const n=m[t];return{id:n.id,title:n.title,subtitle:(0,u.SB)(S,i,c,n,e,Z,P)}}))}),[d,i,m,c,Z,P,S]),w=(0,a.I4)((e=>{Object.keys(m).length>=10?p({data:{message:"DIALOG_FILTERS_TOO_MUCH",hasErrorKey:!0}}):v({folder:e})}),[m,v,p]);return a.ZP.createElement("div",{className:"settings-content custom-scroll"},a.ZP.createElement("div",{className:"settings-content-header"},a.ZP.createElement("div",{className:"settings-content-icon"},E&&a.ZP.createElement(sn.Z,{id:"settingsFoldersMain",size:l.ku,animationData:E,play:f,noLoop:!0,onLoad:I})),a.ZP.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},S("CreateNewFilterInfo")),a.ZP.createElement(R.Z,{className:"with-icon mb-2",color:"primary",size:"smaller",pill:!0,fluid:!0,onClick:y,isRtl:S.isRtl},a.ZP.createElement("i",{className:"icon-add"}),S("CreateNewFilter"))),a.ZP.createElement("div",{className:"settings-item pt-3"},a.ZP.createElement("h4",{className:"settings-item-header mb-3",dir:S.isRtl?"rtl":void 0},S("Filters")),null!=k&&k.length?k.map((e=>a.ZP.createElement(Ee.Z,{className:"mb-2 no-icon",narrow:!0,multiline:!0,onClick:()=>t(m[e.id])},a.ZP.createElement("span",{className:"title"},e.title),a.ZP.createElement("span",{className:"subtitle"},e.subtitle)))):k&&!k.length?a.ZP.createElement("p",{className:"settings-item-description my-4",dir:"auto"},"You have no folders yet."):a.ZP.createElement(Pe.Z,null)),h&&!!h.length&&a.ZP.createElement("div",{className:"settings-item pt-3"},a.ZP.createElement("h4",{className:"settings-item-header mb-3",dir:S.isRtl?"rtl":void 0},S("FilterRecommended")),h.map((e=>a.ZP.createElement(Ee.Z,{className:"mb-2",narrow:!0,onClick:()=>w(e)},a.ZP.createElement("div",{className:"settings-folders-recommended-item"},a.ZP.createElement("div",{className:"multiline-item"},a.ZP.createElement("span",{className:"title"},e.title),a.ZP.createElement("span",{className:"subtitle"},e.description)),a.ZP.createElement(R.Z,{className:"px-3",color:"primary",size:"tiny",pill:!0,fluid:!0,isRtl:S.isRtl},S("Add"))))))))})));var ln=n(3455);const cn=({count:e,itemName:t,itemPluralName:n,isLoading:s,onClick:r})=>{const o=(0,M.Z)();return a.ZP.createElement(R.Z,{className:"ShowMoreButton",color:"translucent",size:"smaller",isText:!0,isLoading:s,isRtl:o.isRtl,onClick:r},a.ZP.createElement("i",{className:"icon-down"}),"Show ",e," more ",e>1?n||`${t}s`:t)},dn="Please provide a title for this folder.",mn="ChatList.Filter.Error.Empty",un=(0,a.X$)((0,s.c$)((e=>{const{listIds:t}=e.chats;return{loadedActiveChatIds:t.active,loadedArchivedChatIds:t.archived}}),((e,t)=>(0,h.ei)(t,["editChatFolder","addChatFolder","loadMoreChats"])))((({state:e,dispatch:t,onAddIncludedChats:n,onAddExcludedChats:s,isActive:r,onScreenSelect:i,onReset:c,onBack:d,loadedActiveChatIds:m,loadedArchivedChatIds:Z,editChatFolder:P,addChatFolder:g,loadMoreChats:v})=>{const[p,E]=(0,a.eJ)(),[C,f]=(0,a.eJ)(!1),b=(0,a.I4)((()=>f(!0)),[]),[I,y]=(0,a.eJ)(!1),[S,k]=(0,a.eJ)(!1),{selectedChatIds:w,selectedChatTypes:N}=(0,ln.vb)(e,"included"),{selectedChatIds:A,selectedChatTypes:L}=(0,ln.vb)(e,"excluded");(0,a.d4)((()=>{p||(0,an.Z)("FoldersNew").then(E)}),[p]),(0,a.d4)((()=>{y(!1),k(!1)}),[e.folderId]);const[R,B]=(0,a.Ye)((()=>{const e=new Set([...m||[],...Z||[]]),t=(0,h.eL)(w,e),n=(0,h.eL)(A,e);return[I?t:t.slice(0,5-N.length),S?n:n.slice(0,5-L.length)]}),[A,w,N,L,S,I,m,Z]);(0,a.d4)((()=>{(R.lengthy(!0):()=>k(!0);return a.ZP.createElement(a.ZP.Fragment,null,t.map((t=>function(e,t){const n="included"===t?ln.fi.find((({key:t})=>t===e)):ln.Yy.find((({key:t})=>t===e));if(n)return a.ZP.createElement(Ee.Z,{key:n.key,className:"settings-folders-list-item mb-1",icon:n.icon,narrow:!0,inactive:!0},$(n.title))}(t,e))),n.map((e=>a.ZP.createElement(Ee.Z,{className:"settings-folders-list-item mb-1",narrow:!0,inactive:!0},(0,u.YC)(e)?a.ZP.createElement(fe.Z,{avatarSize:"small",userId:e}):a.ZP.createElement(Ce.Z,{avatarSize:"small",chatId:e})))),!s&&r>0&&a.ZP.createElement(cn,{count:r,itemName:"chat",onClick:o}))}return(0,T.ZP)(r,d,i,"edit"===e.mode?o.MT.FoldersEditFolder:o.MT.FoldersCreateFolder),a.ZP.createElement("div",{className:"settings-fab-wrapper"},a.ZP.createElement("div",{className:"settings-content custom-scroll"},a.ZP.createElement("div",{className:"settings-content-header"},a.ZP.createElement("div",{className:"settings-content-icon"},p&&a.ZP.createElement(sn.Z,{id:"settingsFoldersEdit",size:l.ku,animationData:p,play:C&&String(e.folderId),noLoop:!0,onLoad:b})),"create"===e.mode&&a.ZP.createElement("p",{className:"settings-item-description mb-3",dir:$.isRtl?"rtl":void 0},$("FilterIncludeInfo")),a.ZP.createElement(ve.Z,{className:"mb-0",label:$("FilterNameHint"),value:e.folder.title,onChange:function(e){const{currentTarget:n}=e;t({type:"setTitle",payload:n.value.trim()})},error:e.error&&e.error===dn?dn:void 0})),a.ZP.createElement("div",{className:"settings-item no-border pt-3"},e.error&&e.error===mn&&a.ZP.createElement("p",{className:"settings-item-description color-danger mb-2",dir:$.isRtl?"rtl":void 0},$(e.error)),a.ZP.createElement("h4",{className:"settings-item-header mb-3",dir:$.isRtl?"rtl":void 0},$("FilterInclude")),a.ZP.createElement(Ee.Z,{className:"settings-folders-list-item color-primary mb-0",icon:"add",onClick:n},$("FilterAddChats")),D("included")),a.ZP.createElement("div",{className:"settings-item no-border pt-3"},a.ZP.createElement("h4",{className:"settings-item-header mb-3",dir:$.isRtl?"rtl":void 0},$("FilterExclude")),a.ZP.createElement(Ee.Z,{className:"settings-folders-list-item color-primary mb-0",icon:"add",onClick:s},$("FilterAddChats")),D("excluded"))),a.ZP.createElement(Xt.Z,{isShown:!!e.isTouched,disabled:e.isLoading,onClick:function(){const{title:n}=e.folder;n?w.length||Object.keys(N).length?(t({type:"setIsLoading",payload:!0}),"edit"===e.mode?P({id:e.folderId,folderUpdate:e.folder}):g({folder:e.folder}),setTimeout((()=>{c()}),500)):t({type:"setError",payload:mn}):t({type:"setError",payload:dn})},ariaLabel:"edit"===e.mode?"Save changes":"Create folder"},e.isLoading?a.ZP.createElement(F.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})))}))),hn=(0,a.X$)((({mode:e,chatIds:t,selectedIds:n,selectedChatTypes:s,filterValue:r,onSelectedIdsChange:o,onSelectedChatTypesChange:l,onFilterChange:i,onLoadMore:c})=>{const d=(0,a.sO)(null),m="included"===e?ln.fi:ln.Yy,h=n.length+s.length>10,Z=n.length>=100;(0,a.d4)((()=>{setTimeout((()=>{requestAnimationFrame((()=>{d.current.focus()}))}),500)}),[]);const P=(0,a.I4)((e=>{const t=[...n];t.includes(e)?t.splice(t.indexOf(e),1):t.push(e),o(t)}),[n,o]),g=(0,a.I4)((e=>{const t=[...s];t.includes(e)?t.splice(t.indexOf(e),1):t.push(e),l(t)}),[s,l]),v=(0,a.I4)((e=>{const{value:t}=e.currentTarget;i(t)}),[i]),p=(0,M.Z)(),[E,C]=(0,ue.Z)(c,t,Boolean(r));return a.ZP.createElement("div",{className:"Picker SettingsFoldersChatsPicker"},a.ZP.createElement("div",{className:"picker-header custom-scroll"},s.map((function(e){const t=m.find((({key:t})=>e===t));if(t)return a.ZP.createElement(ct.Z,{icon:t.icon,title:p(t.title),isMinimized:h,canClose:!0,onClick:g,clickArg:t.key})})),n.map(((e,t)=>a.ZP.createElement(ct.Z,{chatOrUserId:e,isMinimized:h&&tg(e.key),ripple:!0},a.ZP.createElement("i",{className:`icon-${e.icon}`}),a.ZP.createElement("h3",{className:"chat-type",dir:"auto"},p(e.title)),a.ZP.createElement(en.Z,{label:"",checked:s.includes(e.key),round:!0}))})),a.ZP.createElement("div",{key:"divider",className:"picker-list-divider"}),a.ZP.createElement("h4",{key:"header2",className:"settings-item-header",dir:p.isRtl?"rtl":void 0},p("FilterChats"))),null!=E&&E.length?E.map((function(e){const t=n.includes(e);return a.ZP.createElement(Ee.Z,{key:e,className:"chat-item-clickable picker-list-item chat-item",onClick:()=>P(e),ripple:!0,disabled:!t&&Z},(0,u.YC)(e)?a.ZP.createElement(fe.Z,{userId:e}):a.ZP.createElement(Ce.Z,{chatId:e,withChatType:!0}),a.ZP.createElement(en.Z,{label:"",checked:t,round:!0}))})):E&&!E.length?a.ZP.createElement("p",{className:"no-results",key:"no-results"},"Sorry, nothing found."):a.ZP.createElement(Pe.Z,{key:"loading"})))})),Zn=(0,a.X$)((0,s.c$)((e=>{const{chats:{byId:t,listIds:n,orderedPinnedIds:a}}=e;return{chatsById:t,listIds:n.active,orderedPinnedIds:a.active,archivedPinnedIds:a.archived,archivedListIds:n.archived}}),((e,t)=>(0,h.ei)(t,["loadMoreChats"])))((({isActive:e,onScreenSelect:t,onReset:n,mode:s,state:r,dispatch:l,chatsById:i,listIds:c,orderedPinnedIds:d,archivedListIds:m,archivedPinnedIds:h,loadMoreChats:Z})=>{const{chatFilter:P}=r,{selectedChatIds:g,selectedChatTypes:v}=(0,ln.vb)(r,s,!0),p=(0,M.Z)(),E=(0,a.Ye)((()=>{const e=c?(0,u.O)(i,c,d,"all"):void 0,t=m?(0,u.O)(i,m,h,"archived"):void 0;if(e||t)return[...e?[...e.pinnedChats,...e.otherChats]:[],...t?t.otherChats:[]]}),[i,c,d,m,h]),C=(0,a.Ye)((()=>{if(E)return E.filter((e=>!P||(0,me.Z)((0,u.U)(p,e),P)||g.includes(e.id))).map((({id:e})=>e))}),[E,P,p,g]),f=(0,a.I4)((e=>{l({type:"setChatFilter",payload:e})}),[l]),b=(0,a.I4)((e=>{l("included"===s?{type:"setIncludeFilters",payload:{...r.includeFilters,includedChatIds:e}}:{type:"setExcludeFilters",payload:{...r.excludeFilters,excludedChatIds:e}})}),[s,r,l]),I=(0,a.I4)((e=>{const t={};e.forEach((e=>{t[e]=!0})),l("included"===s?{type:"setIncludeFilters",payload:{includedChatIds:g,...t}}:{type:"setExcludeFilters",payload:{excludedChatIds:g,...t}})}),[s,g,l]);return(0,T.ZP)(e,n,t,"included"===s?o.MT.FoldersIncludedChats:o.MT.FoldersExcludedChats),C?a.ZP.createElement(hn,{mode:s,chatIds:C,selectedIds:g,selectedChatTypes:v,filterValue:P,onSelectedIdsChange:b,onSelectedChatTypesChange:I,onFilterChange:f,onLoadMore:Z}):a.ZP.createElement(Pe.Z,null)}))),Pn=(0,a.X$)((({currentScreen:e,shownScreen:t,state:n,dispatch:s,isActive:r,onScreenSelect:l,onReset:i})=>{const c=(0,a.I4)((()=>{e!==o.MT.FoldersCreateFolder&&e!==o.MT.FoldersEditFolder&&e!==o.MT.FoldersEditFolderFromChatList||setTimeout((()=>{s({type:"reset"})}),200),e!==o.MT.FoldersIncludedChats&&e!==o.MT.FoldersExcludedChats?i():"create"===n.mode?l(o.MT.FoldersCreateFolder):l(o.MT.FoldersEditFolder)}),[n.mode,s,e,i,l]),d=(0,a.I4)((()=>{s({type:"reset"}),l(o.MT.FoldersCreateFolder)}),[l,s]),m=(0,a.I4)((e=>{s({type:"editFolder",payload:e}),l(o.MT.FoldersEditFolder)}),[s,l]),u=(0,a.I4)((()=>{s({type:"editIncludeFilters"}),l(e===o.MT.FoldersEditFolderFromChatList?o.MT.FoldersIncludedChatsFromChatList:o.MT.FoldersIncludedChats)}),[e,s,l]),h=(0,a.I4)((()=>{s({type:"editExcludeFilters"}),l(e===o.MT.FoldersEditFolderFromChatList?o.MT.FoldersExcludedChatsFromChatList:o.MT.FoldersExcludedChats)}),[e,s,l]);switch(e){case o.MT.Folders:return a.ZP.createElement(on,{onCreateFolder:d,onEditFolder:m,onScreenSelect:l,isActive:r||[o.MT.FoldersCreateFolder,o.MT.FoldersEditFolder,o.MT.FoldersIncludedChats,o.MT.FoldersExcludedChats].includes(t),onReset:i});case o.MT.FoldersCreateFolder:case o.MT.FoldersEditFolder:case o.MT.FoldersEditFolderFromChatList:return a.ZP.createElement(un,{state:n,dispatch:s,onAddIncludedChats:u,onAddExcludedChats:h,onReset:c,onScreenSelect:l,isActive:r||[o.MT.FoldersIncludedChats,o.MT.FoldersExcludedChats].includes(t),onBack:i});case o.MT.FoldersIncludedChats:case o.MT.FoldersIncludedChatsFromChatList:return a.ZP.createElement(Zn,{mode:"included",state:n,dispatch:s,onReset:c,onScreenSelect:l,isActive:r});case o.MT.FoldersExcludedChats:case o.MT.FoldersExcludedChatsFromChatList:return a.ZP.createElement(Zn,{mode:"excluded",state:n,dispatch:s,onReset:c,onScreenSelect:l,isActive:r});default:return}}));var gn=n(663),vn=n(3657),pn=n(692),En=n(2155);const Cn=(0,a.X$)((({size:e=l.DC,stickerSet:t,observeIntersection:n})=>{const s=(0,a.sO)(null),o=(0,vn.Op)(s,n),i=`stickerSet${t.id}`,c=(0,p.Z)(i,!o,r.IU.Lottie),d=(0,pn.Z)(c),m=(0,a.Ye)((()=>{if(!c)return(0,En.Xv)(t.title,2)}),[c,t.title]);return a.ZP.createElement("div",{ref:s,className:"sticker-set-cover"},m,c&&a.ZP.createElement(sn.Z,{id:i,size:e,animationData:c,className:d}))})),fn=(0,a.X$)((({stickerSet:e,observeIntersection:t})=>{const n=(0,a.sO)(null),s=(0,vn.Op)(n,t),r=(0,p.Z)(e.hasThumbnail&&`stickerSet${e.id}`,!s),o=(0,pn.Z)(r),l=(0,a.Ye)((()=>{if(!r)return(0,En.Xv)(e.title,2)}),[r,e.title]);return a.ZP.createElement("div",{ref:n,className:"sticker-set-cover"},l,a.ZP.createElement("img",{src:r,className:o,alt:""}))}));var bn=n(3547);const In=(0,a.X$)((({stickerSet:e,observeIntersection:t,onClick:n})=>{var s;const r=(0,M.Z)();if(!e||!e.stickers)return;const o=null===(s=e.stickers)||void 0===s?void 0:s[0];return e.hasThumbnail||!o?a.ZP.createElement(Ee.Z,{narrow:!0,className:"SettingsStickerSet",inactive:!o,onClick:()=>o&&n(o)},a.ZP.createElement(R.Z,{ariaLabel:e.title,color:"translucent",isRtl:r.isRtl},e.isAnimated?a.ZP.createElement(Cn,{size:l.Mw,stickerSet:e,observeIntersection:t}):a.ZP.createElement(fn,{stickerSet:e,observeIntersection:t})),a.ZP.createElement("div",{className:"multiline-menu-item"},a.ZP.createElement("div",{className:"title"},e.title),a.ZP.createElement("div",{className:"subtitle"},r("StickerPack.StickerCount",e.count,"i")))):a.ZP.createElement(Ee.Z,{narrow:!0,className:"SettingsStickerSet",onClick:()=>n(o)},a.ZP.createElement(bn.Z,{sticker:o,size:l.Mw,title:e.title,observeIntersection:t}),a.ZP.createElement("div",{className:"multiline-menu-item"},a.ZP.createElement("div",{className:"title"},e.title),a.ZP.createElement("div",{className:"subtitle"},r("StickerPack.StickerCount",e.count,"i"))))}));var yn=n(4851);const Sn=["Solid and Steady","Nice and Fast","Lots of Stuff"],kn=[{label:"12-hour",value:"12h"},{label:"24-hour",value:"24h"}],wn=(0,a.X$)((0,s.c$)((e=>({...(0,h.ei)(e.settings.byKey,["messageTextSize","animationLevel","messageSendKeyCombo","shouldSuggestStickers","shouldLoopStickers","isSensitiveEnabled","canChangeSensitive","timeFormat"]),stickerSetIds:e.stickers.added.setIds,stickerSetsById:e.stickers.setsById})),((e,t)=>(0,h.ei)(t,["setSettingOption","loadStickerSets","loadAddedStickers"])))((({isActive:e,onScreenSelect:t,onReset:n,stickerSetIds:s,stickerSetsById:r,messageTextSize:l,animationLevel:c,messageSendKeyCombo:d,shouldSuggestStickers:m,shouldLoopStickers:u,timeFormat:h,setSettingOption:Z,loadStickerSets:P,loadAddedStickers:g})=>{const v=(0,a.sO)(null),{observe:p}=(0,vn.S1)({rootRef:v}),[E,C,f]=(0,Le.Z)(),[b,I]=(0,a.eJ)(),y=(0,M.Z)(),S=i.$b?void 0:[{value:"enter",label:y("lng_settings_send_enter"),subLabel:"New line by Shift + Enter"},{value:"ctrl-enter",label:y(i.jm?"lng_settings_send_cmdenter":"lng_settings_send_ctrlenter"),subLabel:"New line by Enter"}];(0,a.d4)((()=>{P()}),[P]),(0,a.d4)((()=>{null!=s&&s.length&&g()}),[s,g]);const k=(0,a.I4)((e=>{Sn.forEach(((t,n)=>{document.body.classList.toggle(`animation-level-${n}`,e===n)})),Z({animationLevel:e})}),[Z]),w=(0,a.I4)((e=>{document.documentElement.style.setProperty("--composer-text-size",`${Math.max(e,i.cj?16:15)}px`),document.documentElement.style.setProperty("--message-meta-height",`${Math.floor(1.3125*e)}px`),document.documentElement.style.setProperty("--message-text-size",`${e}px`),document.documentElement.setAttribute("data-message-text-size",e.toString()),Z({messageTextSize:e})}),[Z]),N=(0,a.I4)((e=>{Z({timeFormat:e}),Z({wasTimeFormatSetManually:!0}),(0,gn.qf)(e)}),[Z]),F=(0,a.I4)((e=>{I(e),C()}),[C]),A=s&&s.map((e=>{var t;return!(null==r||null===(t=r[e])||void 0===t||!t.installedDate)&&r[e]})).filter(Boolean);return(0,T.ZP)(e,n,t,o.MT.General),a.ZP.createElement("div",{className:"settings-content custom-scroll"},a.ZP.createElement("div",{className:"settings-item pt-3"},a.ZP.createElement("h4",{className:"settings-item-header",dir:y.isRtl?"rtl":void 0},y("SETTINGS")),a.ZP.createElement(tn.Z,{label:y("TextSize"),min:12,max:20,value:l,onChange:w}),a.ZP.createElement(Ee.Z,{icon:"photo",onClick:()=>t(o.MT.GeneralChatBackground)},y("ChatBackground"))),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:y.isRtl?"rtl":void 0},"Time Format"),a.ZP.createElement(_e.Z,{name:"timeformat",options:kn,selected:h,onChange:N})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:y.isRtl?"rtl":void 0},"Animation Level"),a.ZP.createElement("p",{className:"settings-item-description",dir:y.isRtl?"rtl":void 0},"Choose the desired animations amount."),a.ZP.createElement(tn.Z,{options:Sn,value:c,onChange:k})),S&&a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:y.isRtl?"rtl":void 0},y("VoiceOver.Keyboard")),a.ZP.createElement(_e.Z,{name:"keyboard-send-settings",options:S,onChange:e=>Z({messageSendKeyCombo:e}),selected:d})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:y.isRtl?"rtl":void 0},y("AccDescrStickers")),a.ZP.createElement(en.Z,{label:y("SuggestStickers"),checked:m,onCheck:e=>Z({shouldSuggestStickers:e})}),a.ZP.createElement(en.Z,{label:y("LoopAnimatedStickers"),checked:u,onCheck:e=>Z({shouldLoopStickers:e})}),a.ZP.createElement("div",{className:"mt-4",ref:v},A&&A.map((e=>a.ZP.createElement(In,{key:e.id,stickerSet:e,observeIntersection:p,onClick:F})))),b&&a.ZP.createElement(yn.Z,{isOpen:E,fromSticker:b,onClose:f})))})));let Nn;function Mn(e="*",t,n=!1){Nn||(Nn=document.createElement("input"),Nn.setAttribute("type","file")),Nn.setAttribute("accept",e),n?Nn.removeAttribute("multiple"):Nn.setAttribute("multiple","multiple"),Nn.onchange=null,Nn.value="",Nn.onchange=t,Nn.click()}var Tn=n(1394);function Fn(e){return[parseInt(e.substring(0,2),16),parseInt(e.substring(2,4),16),parseInt(e.substring(4,6),16)]}function An(e){const t=e[0].toString(16),n=e[1].toString(16),a=e[2].toString(16);return(1==t.length?"0"+t:t)+(1==n.length?"0"+n:n)+(1==a.length?"0"+a:a)}function Ln([e,t,n]){e/=255,t/=255,n/=255;let a,s,r=Math.max(e,t,n),o=Math.min(e,t,n),l=r,i=r-o;if(s=0==r?0:i/r,r==o)a=0;else{switch(r){case e:a=(t-n)/i+(t.5?Math.max(0,.65*a):Math.max(0,Math.min(1,1-.65*a)),`hsla(${360*t}, ${100*n}%, ${100*a}%, .4)`}var $n=n(9524),Dn=n(5866);const Un=(0,a.X$)((({wallpaper:e,theme:t,isSelected:n,onClick:s})=>{var r;const{slug:i,document:c}=e,d=`wallpaper${c.id}`,m=c.previewBlobUrl,u=(0,p.Z)(`${d}?size=m`),h=(0,Dn.Z)(null===(r=c.thumbnail)||void 0===r?void 0:r.dataUri,Boolean(u),!0),{transitionClassNames:Z}=(0,Y.Z)(Boolean(u||m),void 0,void 0,"slow"),[P,g]=(0,a.eJ)(!1),{mediaData:v,loadProgress:C}=(0,E.Z)(d,!P),b=!1===(0,f.Z)(P),{shouldRender:I,transitionClassNames:y}=(0,Y.Z)(P&&!v||i===o.mp,void 0,b,"slow"),S=(0,a.sO)();S.current=t;const k=(0,a.I4)((()=>{(async()=>{const e=await(0,Tn.gm)(v);await $n.save(l.fo,S.current,e),s(i)})()}),[v,s,i]);(0,a.d4)((()=>{v&&k()}),[v,k]);const w=(0,a.I4)((()=>{v?k():g((e=>!e))}),[v,k]),N=(0,X.Z)("WallpaperTile",n&&"selected");return a.ZP.createElement("div",{className:N,onClick:w},a.ZP.createElement("div",{className:"media-inner"},a.ZP.createElement("canvas",{ref:h,className:"thumbnail"}),a.ZP.createElement("img",{src:u||m,className:(0,X.Z)("full-media",Z),alt:""}),I&&a.ZP.createElement("div",{className:(0,X.Z)("spinner-container",y)},a.ZP.createElement(G.Z,{progress:C,onClick:w}))))})),On=(0,z.P2)((e=>e()),6e4,!0),xn=(0,a.X$)((0,s.c$)((e=>{const t=(0,m.Pu)(e),{background:n,isBlurred:a}=e.settings.themes[t]||{},{loadedWallpapers:s}=e.settings;return{background:n,isBlurred:a,loadedWallpapers:s,theme:t}}),((e,t)=>(0,h.ei)(t,["loadWallpapers","uploadWallpaper","setThemeSettings"])))((({isActive:e,onScreenSelect:t,onReset:n,background:s,isBlurred:r,loadedWallpapers:i,theme:c,loadWallpapers:d,uploadWallpaper:m,setThemeSettings:u})=>{const h=(0,a.sO)();h.current=c,(0,a.d4)((()=>{On((()=>{d()}))}),[d]);const Z=(0,a.I4)((e=>{const{files:t}=e.target;t&&t.length>0&&m(t[0])}),[m]),P=(0,a.I4)((()=>{Mn("image/jpeg",Z,!0)}),[Z]),g=(0,a.I4)((()=>{t(o.MT.GeneralChatBackgroundColor)}),[t]),v=(0,a.I4)((()=>{u({theme:c,background:void 0,backgroundColor:void 0,isBlurred:!0,patternColor:"dark"===c?l.Vv:l.g})}),[u,c]),p=(0,a.I4)((e=>{u({theme:h.current,background:e});const t=i&&i.find((t=>t.slug===e));null!=t&&t.document.thumbnail&&async function(e){const t=[0,0,0];let n,a,s,r,o=-4,l=[0,0,0],i=0;const c=document.createElement("canvas"),d=c.getContext&&c.getContext("2d");if(!d)return t;const m=await(0,Tn.pt)(e);s=m.naturalHeight||m.offsetHeight||m.height,a=m.naturalWidth||m.offsetWidth||m.width,c.height=s,c.width=a,d.drawImage(m,0,0);try{n=d.getImageData(0,0,a,s)}catch(e){return t}for(r=n.data.length;(o+=20){const t=Bn(e),n=`#${An(e)}`;u({theme:h.current,backgroundColor:n,patternColor:t})}))}),[i,u]),E=(0,a.I4)((e=>{u({theme:h.current,isBlurred:e.target.checked})}),[u]),C=(0,M.Z)();(0,T.ZP)(e,n,t,o.MT.GeneralChatBackground);const f=(null==i?void 0:i[0])&&i[0].slug===o.mp;return a.ZP.createElement("div",{className:"SettingsGeneralBackground settings-content custom-scroll"},a.ZP.createElement("div",{className:"settings-item pt-3"},a.ZP.createElement(Ee.Z,{icon:"camera-add",className:"mb-0",disabled:f,onClick:P},C("UploadImage")),a.ZP.createElement(Ee.Z,{icon:"colorize",className:"mb-0",onClick:g},C("SetColor")),a.ZP.createElement(Ee.Z,{icon:"favorite",onClick:v},C("ThemeResetToDefaults")),a.ZP.createElement(en.Z,{label:C("BackgroundBlurred"),checked:Boolean(r),onChange:E})),i?a.ZP.createElement("div",{className:"settings-wallpapers"},i.map((e=>a.ZP.createElement(Un,{wallpaper:e,theme:c,isSelected:s===e.slug,onClick:p})))):a.ZP.createElement(Pe.Z,null))}))),Gn=Ln(Fn("e6ebee")),Jn=["#e6ebee","#b2cee1","#008dd0","#c6e7cb","#c4e1a6","#60b16e","#ccd0af","#a6a997","#7a7072","#fdd7af","#fdb76e","#dd8851"];function zn(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 Xn({colorPosition:e,huePosition:t},n){return[t/(n.hueRect.width-1),e[0]/(n.colorRect.width-1),1-e[1]/(n.colorRect.height-1)]}const _n=(0,a.X$)((0,s.c$)((e=>{const t=(0,m.Pu)(e),{backgroundColor:n}=e.settings.themes[t]||{};return{backgroundColor:n,theme:t}}),((e,t)=>(0,h.ei)(t,["setThemeSettings"])))((({isActive:e,onScreenSelect:t,onReset:n,theme:s,backgroundColor:r,setThemeSettings:l})=>{const i=(0,a.sO)();i.current=s;const c=(0,a.sO)(null),d=(0,a.sO)(null),m=(0,a.sO)(null),u=(0,a.sO)(!0),[P,g]=(0,a.eJ)(function(e){return e&&e.startsWith("#")?Ln(Fn(e.replace("#",""))):Gn}(r)),v=(0,a.sO)(P);(0,a.d4)((()=>{v.current=P}),[P]);const[p,E,C]=(0,Le.Z)(),[f,b]=(0,a.eJ)(""),[I,y]=(0,a.eJ)(""),S=(0,a.sO)(),k=(0,a.sO)();(0,a.d4)((()=>{const e={offsetLeft:d.current.offsetLeft,...(0,h.ei)(d.current.getBoundingClientRect(),["top","width","height"])},t={offsetLeft:m.current.offsetLeft,...(0,h.ei)(m.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+c.current.scrollTop),e.height-1)],{huePosition:a}=zn(v.current,S.current);return g(Xn({colorPosition:n,huePosition:a},S.current)),E(),!0}function a(e){const{colorPosition:n}=zn(v.current,S.current),a=Math.min(Math.max(0,e.pageX-t.offsetLeft),t.width-1);return g(Xn({colorPosition:n,huePosition:a},S.current)),E(),!0}S.current={colorRect:e,hueRect:t},(0,Z.s)(d.current,{onCapture:n,onDrag:n,onRelease:C,onClick:C,selectorToPreventScroll:".SettingsGeneralBackgroundColor",withCursor:!0}),(0,Z.s)(m.current,{onCapture:a,onDrag:a,onRelease:C,onClick:C,selectorToPreventScroll:".SettingsGeneralBackgroundColor",withCursor:!0})}),[E,C]);const{colorPosition:w=[0,0],huePosition:N=0}=S.current?zn(P,S.current):{},M=An(Rn(P)),F=P[0],A=An(Rn([F,1,1]));(0,a.d4)((()=>{const e=Rn(P),t=`#${An(e)}`;if(b(e.join(", ")),y(t),!u.current){const n=Bn(e);l({theme:i.current,background:void 0,backgroundColor:t,patternColor:n})}u.current=!1}),[P,l]),(0,a.d4)((()=>{!function(e,t,n,a){let s,r,o;n.current&&a.current?(s=a.current.colorRect.width,r=a.current.colorRect.height,o=n.current):(s=e.offsetWidth,r=e.offsetHeight,o=e.getContext("2d"),e.width=s,e.height=r,n.current=o);const l=o.createImageData(s,r),i=l.data,c=Rn([t,1,1]);let d=0;for(let e=0;e{!function(e){const t=e.offsetWidth;e.width=t,e.height=1;const n=e.getContext("2d"),a=n.createImageData(t,1),s=a.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())));g(Ln(e))}e.currentTarget.value=t}),[]),R=(0,a.I4)((e=>{const t=e.currentTarget.value.replace(/[^0-9a-fA-F]/g,"").slice(0,6);t.match(/^#?[0-9a-fA-F]{6}$/)&&g(Ln(Fn(t.replace("#","")))),e.currentTarget.value=t}),[]),B=(0,a.I4)((e=>{g(Ln(Fn(e.currentTarget.dataset.color.replace("#",""))))}),[]),$=(0,X.Z)("SettingsGeneralBackgroundColor settings-content custom-scroll",p&&"is-dragging");return(0,T.ZP)(e,n,t,o.MT.GeneralChatBackgroundColor),a.ZP.createElement("div",{ref:c,className:$},a.ZP.createElement("div",{className:"settings-item pt-3"},a.ZP.createElement("div",{ref:d,className:"color-picker"},a.ZP.createElement("canvas",null),a.ZP.createElement("div",{className:"handle",style:`transform: translate(${w[0]}px, ${w[1]}px); background-color: #${M};`})),a.ZP.createElement("div",{ref:m,className:"hue-picker"},a.ZP.createElement("canvas",null),a.ZP.createElement("div",{className:"handle",style:`transform: translateX(${N}px); background-color: #${A};`})),a.ZP.createElement("div",{className:"tools"},a.ZP.createElement(ve.Z,{value:I,label:"HEX",onChange:R}),a.ZP.createElement(ve.Z,{value:f,label:"RGB",onChange:L}))),a.ZP.createElement("div",{className:"predefined-colors"},Jn.map((e=>a.ZP.createElement("div",{className:e===`#${M}`?"active":void 0,"data-color":e,style:`background-color: ${e};`,onClick:B})))))})));var Yn=n(2202),Hn=n(8406);const Vn=(0,a.X$)((0,s.c$)((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),hasWebNotifications:e.settings.byKey.hasWebNotifications,hasPushNotifications:e.settings.byKey.hasPushNotifications,notificationSoundVolume:e.settings.byKey.notificationSoundVolume})),((e,t)=>(0,h.ei)(t,["loadNotificationSettings","updateContactSignUpNotification","updateNotificationSettings","updateWebNotificationSettings"])))((({isActive:e,onScreenSelect:t,onReset:n,hasPrivateChatsNotifications:s,hasPrivateChatsMessagePreview:r,hasGroupNotifications:l,hasGroupMessagePreview:i,hasBroadcastNotifications:c,hasBroadcastMessagePreview:d,hasContactJoinedNotifications:m,hasPushNotifications:u,hasWebNotifications:h,notificationSoundVolume:Z,loadNotificationSettings:P,updateContactSignUpNotification:g,updateNotificationSettings:v,updateWebNotificationSettings:p})=>{(0,a.d4)((()=>{P()}),[P]);const E=(0,Yn.Z)(500,!1,!0),C=(0,a.I4)(((e,t,n)=>{const a="contact"===t?!s:!("group"===t?l:c),o="contact"===t?r:"group"===t?i:d;v({peerType:t,..."silent"===n&&{isSilent:!e.target.checked,shouldShowPreviews:o},..."showPreviews"===n&&{shouldShowPreviews:e.target.checked,isSilent:a}})}),[d,c,i,l,r,s,v]),f=(0,a.I4)((e=>{g({isSilent:!e.target.checked})}),[g]),b=(0,M.Z)();return(0,T.ZP)(e,n,t,o.MT.Notifications),a.ZP.createElement("div",{className:"settings-content custom-scroll"},a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:b.isRtl?"rtl":void 0},"Web notifications"),a.ZP.createElement(en.Z,{label:"Web notifications",subLabel:b(h?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:h,onChange:e=>{p({hasWebNotifications:e.target.checked})}}),a.ZP.createElement(en.Z,{label:"Offline notifications",disabled:!h,subLabel:b(u?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:u,onChange:e=>{p({hasPushNotifications:e.target.checked})}}),a.ZP.createElement("div",{className:"settings-item-slider"},a.ZP.createElement(tn.Z,{label:"Sound",min:0,max:10,value:Z,onChange:e=>{p({notificationSoundVolume:e}),E((()=>(0,Hn.q3)(void 0,e)))}}))),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:b.isRtl?"rtl":void 0},b("AutodownloadPrivateChats")),a.ZP.createElement(en.Z,{label:b("NotificationsForPrivateChats"),subLabel:b(s?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:s,onChange:e=>{C(e,"contact","silent")}}),a.ZP.createElement(en.Z,{label:b("MessagePreview"),disabled:!s,subLabel:b(r?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:r,onChange:e=>{C(e,"contact","showPreviews")}})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:b.isRtl?"rtl":void 0},b("FilterGroups")),a.ZP.createElement(en.Z,{label:b("NotificationsForGroups"),subLabel:b(l?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:l,onChange:e=>{C(e,"group","silent")}}),a.ZP.createElement(en.Z,{label:b("MessagePreview"),disabled:!l,subLabel:b(i?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:i,onChange:e=>{C(e,"group","showPreviews")}})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:b.isRtl?"rtl":void 0},b("FilterChannels")),a.ZP.createElement(en.Z,{label:b("NotificationsForChannels"),subLabel:b(c?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:c,onChange:e=>{C(e,"broadcast","silent")}}),a.ZP.createElement(en.Z,{label:b("MessagePreview"),disabled:!c,subLabel:b(d?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:d,onChange:e=>{C(e,"broadcast","showPreviews")}})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:b.isRtl?"rtl":void 0},b("PhoneOther")),a.ZP.createElement(en.Z,{label:b("ContactJoined"),checked:m,onChange:f})))}))),jn=(0,a.X$)((0,s.c$)((e=>{var t,n,a,s,r;const{settings:{byKey:{hasPassword:o,isSensitiveEnabled:l,canChangeSensitive:i},privacy:c},blocked:d,activeSessions:m}=e;return{hasPassword:o,blockedCount:d.totalCount,sessionsCount:m.length,isSensitiveEnabled:l,canChangeSensitive:i,visibilityPrivacyPhoneNumber:null===(t=c.phoneNumber)||void 0===t?void 0:t.visibility,visibilityPrivacyLastSeen:null===(n=c.lastSeen)||void 0===n?void 0:n.visibility,visibilityPrivacyProfilePhoto:null===(a=c.profilePhoto)||void 0===a?void 0:a.visibility,visibilityPrivacyForwarding:null===(s=c.forwards)||void 0===s?void 0:s.visibility,visibilityPrivacyGroupChats:null===(r=c.chatInvite)||void 0===r?void 0:r.visibility}}),((e,t)=>(0,h.ei)(t,["loadBlockedContacts","loadAuthorizations","loadPrivacySettings","loadContentSettings","updateContentSettings"])))((({isActive:e,onScreenSelect:t,onReset:n,hasPassword:s,blockedCount:r,sessionsCount:l,isSensitiveEnabled:i,canChangeSensitive:c,visibilityPrivacyPhoneNumber:d,visibilityPrivacyLastSeen:m,visibilityPrivacyProfilePhoto:u,visibilityPrivacyForwarding:h,visibilityPrivacyGroupChats:Z,loadPrivacySettings:P,loadBlockedContacts:g,loadAuthorizations:v,loadContentSettings:p,updateContentSettings:E})=>{(0,a.d4)((()=>{g(),v(),P(),p()}),[g,v,P,p]);const C=(0,M.Z)();function f(e){switch(e){case"everybody":return C("P2PEverybody");case"contacts":return C("P2PContacts");case"nobody":return C("P2PNobody")}}return(0,T.ZP)(e,n,t,o.MT.Privacy),a.ZP.createElement("div",{className:"settings-content custom-scroll"},a.ZP.createElement("div",{className:"settings-item pt-3"},a.ZP.createElement(Ee.Z,{icon:"delete-user",narrow:!0,onClick:()=>t(o.MT.PrivacyBlockedUsers)},a.ZP.createElement("div",{className:"multiline-menu-item"},a.ZP.createElement("span",{className:"title"},C("BlockedUsers")),r>0&&a.ZP.createElement("span",{className:"subtitle",dir:"auto"},C("Users",r)))),a.ZP.createElement(Ee.Z,{icon:"lock",narrow:!0,onClick:()=>t(s?o.MT.TwoFaEnabled:o.MT.TwoFaDisabled)},a.ZP.createElement("div",{className:"multiline-menu-item"},a.ZP.createElement("span",{className:"title"},C("TwoStepVerification")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},C(s?"PasswordOn":"PasswordOff")))),a.ZP.createElement(Ee.Z,{icon:"active-sessions",narrow:!0,onClick:()=>t(o.MT.PrivacyActiveSessions)},a.ZP.createElement("div",{className:"multiline-menu-item"},a.ZP.createElement("span",{className:"title"},C("SessionsTitle")),l>0&&a.ZP.createElement("span",{className:"subtitle",dir:"auto"},1===l?"1 session":`${l} sessions`)))),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header mb-4",dir:C.isRtl?"rtl":void 0},C("PrivacyTitle")),a.ZP.createElement(Ee.Z,{narrow:!0,className:"no-icon",onClick:()=>t(o.MT.PrivacyPhoneNumber)},a.ZP.createElement("div",{className:"multiline-menu-item"},a.ZP.createElement("span",{className:"title"},C("PrivacyPhoneTitle")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},f(d)))),a.ZP.createElement(Ee.Z,{narrow:!0,className:"no-icon",onClick:()=>t(o.MT.PrivacyLastSeen)},a.ZP.createElement("div",{className:"multiline-menu-item"},a.ZP.createElement("span",{className:"title"},C("LastSeenTitle")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},f(m)))),a.ZP.createElement(Ee.Z,{narrow:!0,className:"no-icon",onClick:()=>t(o.MT.PrivacyProfilePhoto)},a.ZP.createElement("div",{className:"multiline-menu-item"},a.ZP.createElement("span",{className:"title"},C("PrivacyProfilePhotoTitle")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},f(u)))),a.ZP.createElement(Ee.Z,{narrow:!0,className:"no-icon",onClick:()=>t(o.MT.PrivacyForwarding)},a.ZP.createElement("div",{className:"multiline-menu-item"},a.ZP.createElement("span",{className:"title"},C("PrivacyForwardsTitle")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},f(h)))),a.ZP.createElement(Ee.Z,{narrow:!0,className:"no-icon",onClick:()=>t(o.MT.PrivacyGroupChats)},a.ZP.createElement("div",{className:"multiline-menu-item"},a.ZP.createElement("span",{className:"title"},C("WhoCanAddMe")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},f(Z))))),c&&a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:C.isRtl?"rtl":void 0},C("lng_settings_sensitive_title")),a.ZP.createElement(en.Z,{label:C("lng_settings_sensitive_disable_filtering"),subLabel:C("lng_settings_sensitive_about"),checked:Boolean(i),disabled:!c,onCheck:E})))}))),Kn=(0,a.X$)((0,s.c$)((e=>({languages:e.settings.byKey.languages,language:e.settings.byKey.language})),((e,t)=>(0,h.ei)(t,["loadLanguages","setSettingOption"])))((({isActive:e,onScreenSelect:t,onReset:n,languages:s,language:r,loadLanguages:l,setSettingOption:i})=>{const[c,d]=(0,a.eJ)(r),[m,u,h]=(0,Le.Z)();(0,a.d4)((()=>{l()}),[l]);const Z=(0,a.I4)((e=>{d(e),u(),(0,gn.m0)(e,(()=>{h(),i({language:e})}))}),[u,h,i]),P=(0,a.Ye)((()=>s?function(e){const t=(window.navigator.language||"en").toLowerCase(),n=t.substr(0,2);return e.map((({langCode:e,nativeName:t,name:n})=>({value:e,label:t,subLabel:n}))).sort((e=>!t||e.value!==t&&e.value!==n?0:-1))}(s):void 0),[s]);return(0,T.ZP)(e,n,t,o.MT.Language),a.ZP.createElement("div",{className:"settings-content settings-item settings-language custom-scroll"},P?a.ZP.createElement(_e.Z,{name:"keyboard-send-settings",options:P,selected:c,loadingOption:m?c:void 0,onChange:Z}):a.ZP.createElement(Pe.Z,null))})));function qn(e){switch(e){case o.MT.PrivacyPhoneNumber:case o.MT.PrivacyPhoneNumberAllowedContacts:case o.MT.PrivacyPhoneNumberDeniedContacts:return"phoneNumber";case o.MT.PrivacyLastSeen:case o.MT.PrivacyLastSeenAllowedContacts:case o.MT.PrivacyLastSeenDeniedContacts:return"lastSeen";case o.MT.PrivacyProfilePhoto:case o.MT.PrivacyProfilePhotoAllowedContacts:case o.MT.PrivacyProfilePhotoDeniedContacts:return"profilePhoto";case o.MT.PrivacyForwarding:case o.MT.PrivacyForwardingAllowedContacts:case o.MT.PrivacyForwardingDeniedContacts:return"forwards";case o.MT.PrivacyGroupChats:case o.MT.PrivacyGroupChatsAllowedContacts:case o.MT.PrivacyGroupChatsDeniedContacts:return"chatInvite"}}const Wn=(0,a.X$)((0,s.c$)(((e,{screen:t})=>{let n;const{chats:{byId:a},settings:{privacy:s}}=e;switch(t){case o.MT.PrivacyPhoneNumber:n=s.phoneNumber;break;case o.MT.PrivacyLastSeen:n=s.lastSeen;break;case o.MT.PrivacyProfilePhoto:n=s.profilePhoto;break;case o.MT.PrivacyForwarding:n=s.forwards;break;case o.MT.PrivacyGroupChats:n=s.chatInvite}return n?{...n,chatsById:a}:{}}),((e,t)=>(0,h.ei)(t,["setPrivacyVisibility"])))((({screen:e,isActive:t,onScreenSelect:n,onReset:s,visibility:r,allowUserIds:l,allowChatIds:i,blockUserIds:c,blockChatIds:d,chatsById:m,setPrivacyVisibility:u})=>{const h=(0,M.Z)(),Z=(0,a.Ye)((()=>{switch(e){case o.MT.PrivacyProfilePhoto:case o.MT.PrivacyGroupChats:return[{value:"everybody",label:h("P2PEverybody")},{value:"contacts",label:h("P2PContacts")}];default:return[{value:"everybody",label:h("P2PEverybody")},{value:"contacts",label:h("P2PContacts")},{value:"nobody",label:h("P2PNobody")}]}}),[h,e]),P={shouldShowDenied:"nobody"!==r,shouldShowAllowed:"everybody"!==r},g=qn(e),v=(0,a.Ye)((()=>{switch(e){case o.MT.PrivacyPhoneNumber:return h("PrivacyPhoneTitle");case o.MT.PrivacyLastSeen:return h("LastSeenTitle");case o.MT.PrivacyProfilePhoto:return h("PrivacyProfilePhotoTitle");case o.MT.PrivacyForwarding:return h("PrivacyForwardsTitle");case o.MT.PrivacyGroupChats:return h("WhoCanAddMe");default:return}}),[h,e]);(0,T.ZP)(t,s,n,e);const p=(0,a.Ye)((()=>{switch(e){case o.MT.PrivacyLastSeen:return h("CustomHelp");default:return}}),[h,e]),E=(()=>{switch(e){case o.MT.PrivacyPhoneNumber:return o.MT.PrivacyPhoneNumberAllowedContacts;case o.MT.PrivacyLastSeen:return o.MT.PrivacyLastSeenAllowedContacts;case o.MT.PrivacyProfilePhoto:return o.MT.PrivacyProfilePhotoAllowedContacts;case o.MT.PrivacyForwarding:return o.MT.PrivacyForwardingAllowedContacts;default:return o.MT.PrivacyGroupChatsAllowedContacts}})(),C=(()=>{switch(e){case o.MT.PrivacyPhoneNumber:return o.MT.PrivacyPhoneNumberDeniedContacts;case o.MT.PrivacyLastSeen:return o.MT.PrivacyLastSeenDeniedContacts;case o.MT.PrivacyProfilePhoto:return o.MT.PrivacyProfilePhotoDeniedContacts;case o.MT.PrivacyForwarding:return o.MT.PrivacyForwardingDeniedContacts;default:return o.MT.PrivacyGroupChatsDeniedContacts}})(),f=(0,a.Ye)((()=>l&&i&&m?i.reduce(((e,t)=>e+(m[t]?m[t].membersCount:0)),l.length):0),[i,l,m]),b=(0,a.Ye)((()=>c&&d&&m?d.reduce(((e,t)=>e+(m[t]?m[t].membersCount:0)),c.length):0),[d,c,m]),I=(0,a.I4)((e=>{u({privacyKey:g,visibility:e})}),[g,u]);return a.ZP.createElement("div",{className:"settings-content custom-scroll"},a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:h.isRtl?"rtl":void 0},v),a.ZP.createElement(_e.Z,{name:`visibility-${g}`,options:Z,onChange:I,selected:r}),p&&a.ZP.createElement("p",{className:"settings-item-description-larger",dir:h.isRtl?"rtl":void 0},p)),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header mb-4",dir:h.isRtl?"rtl":void 0},h("PrivacyExceptions")),P.shouldShowAllowed&&a.ZP.createElement(Ee.Z,{narrow:!0,icon:"add-user",onClick:()=>{n(E)}},a.ZP.createElement("div",{className:"multiline-menu-item full-size"},f>0&&a.ZP.createElement("span",{className:"date",dir:"auto"},"+",f),a.ZP.createElement("span",{className:"title"},h("AlwaysShareWith")),a.ZP.createElement("span",{className:"subtitle"},h("EditAdminAddUsers")))),P.shouldShowDenied&&a.ZP.createElement(Ee.Z,{narrow:!0,icon:"delete-user",onClick:()=>{n(C)}},a.ZP.createElement("div",{className:"multiline-menu-item full-size"},b>0&&a.ZP.createElement("span",{className:"date",dir:"auto"},"−",b),a.ZP.createElement("span",{className:"title"},h("NeverShareWith")),a.ZP.createElement("span",{className:"subtitle"},h("EditAdminAddUsers"))))))})));function Qn(e){return[e.region,e.country].filter(Boolean).join(", ")}function ea(e){return`${e.deviceModel}${e.deviceModel?", ":""} ${e.platform} ${e.systemVersion}`}const ta=(0,a.X$)((0,s.c$)((e=>({activeSessions:e.activeSessions})),((e,t)=>(0,h.ei)(t,["loadAuthorizations","terminateAuthorization","terminateAllAuthorizations"])))((({isActive:e,onScreenSelect:t,onReset:n,activeSessions:s,loadAuthorizations:r,terminateAuthorization:l,terminateAllAuthorizations:i})=>{const[c,d,m]=(0,Le.Z)();(0,a.d4)((()=>{r()}),[r]);const u=(0,a.I4)((e=>{l({hash:e})}),[l]),h=(0,a.I4)((()=>{m(),i()}),[m,i]),Z=(0,a.Ye)((()=>s.find((e=>e.isCurrent))),[s]),P=(0,a.Ye)((()=>s.filter((e=>!e.isCurrent))),[s]),g=(0,M.Z)();return(0,T.ZP)(e,n,t,o.MT.PrivacyActiveSessions),a.ZP.createElement("div",{className:"settings-content custom-scroll"},Z&&(p=Z,a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header mb-4",dir:g.isRtl?"rtl":void 0},g("AuthSessions.CurrentSession")),a.ZP.createElement(Ee.Z,{narrow:!0,inactive:!0,className:"no-icon"},a.ZP.createElement("div",{className:"multiline-menu-item",dir:"auto"},a.ZP.createElement("span",{className:"title",dir:"auto"},p.appName),a.ZP.createElement("span",{className:"subtitle black tight"},ea(p)),a.ZP.createElement("span",{className:"subtitle"},p.ip," - ",Qn(p)))),a.ZP.createElement(Ee.Z,{className:"destructive mb-0 no-icon",icon:"stop",ripple:!0,narrow:!0,onClick:d},g("TerminateAllSessions")))),P&&(v=P,a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header mb-4",dir:g.isRtl?"rtl":void 0},g("OtherSessions")),v.map((function(e){return a.ZP.createElement(Ee.Z,{key:e.hash,ripple:!0,narrow:!0,contextActions:[{title:"Terminate",icon:"stop",handler:()=>{u(e.hash)}}],className:"no-icon"},a.ZP.createElement("div",{className:"multiline-menu-item full-size",dir:"auto"},a.ZP.createElement("span",{className:"date"},(0,B.VX)(g,1e3*e.dateActive)),a.ZP.createElement("span",{className:"title"},e.appName),a.ZP.createElement("span",{className:"subtitle black tight"},ea(e)),a.ZP.createElement("span",{className:"subtitle"},e.ip," - ",Qn(e))))})))),P&&a.ZP.createElement(Fe.Z,{isOpen:c,onClose:m,text:"Are you sure you want to terminate all other sessions?",confirmLabel:"Terminate All Other Sessions",confirmHandler:h,confirmIsDestructive:!0}));var v,p})));var na=n(6272);const aa=(0,a.X$)((0,s.c$)((e=>{const{users:{byId:t},blocked:{ids:n},contactList:a,currentUserId:s}=e;return{usersById:t,blockedIds:n,contactIds:null==a?void 0:a.userIds,localContactIds:e.userSearch.localUserIds,currentUserId:s}}),((e,t)=>(0,h.ei)(t,["loadContactList","setUserSearchQuery","blockContact"])))((({usersById:e,blockedIds:t,contactIds:n,localContactIds:s,currentUserId:r,isOpen:o,onClose:l,loadContactList:i,setUserSearchQuery:c,blockContact:d})=>{const m=(0,M.Z)(),[Z,P]=(0,a.eJ)(""),g=(0,a.sO)(null);(0,a.d4)((()=>{c({query:Z})}),[Z,c]);const v=(0,a.Ye)((()=>{const a=(n||[]).concat(s||[]).filter((e=>!t.includes(e)&&e!==r));return(0,h.Tw)(a).reduce(((t,n)=>{var a;return(!Z||!e[n]||(0,me.Z)((0,u.Js)(e[n])||"",Z)||null!==(a=e[n])&&void 0!==a&&a.username.toLowerCase().includes(Z))&&t.push(n),t}),[]).sort(((t,n)=>{const a=(0,u.Js)(e[t])||"",s=(0,u.Js)(e[n])||"";return a.localeCompare(s)}))}),[t,n,r,Z,s,e]),p=(0,a.I4)((t=>{const{id:n,accessHash:a}=e[t]||{};n&&a&&(d({contactId:n,accessHash:a}),l())}),[d,l,e]);return a.ZP.createElement(be,{isOpen:o,chatOrUserIds:v,filterRef:g,filterPlaceholder:m("BlockedUsers.BlockUser"),filter:Z,onFilterChange:P,loadMore:i,onSelectChatOrUser:p,onClose:l})}))),sa=(0,a.X$)((0,s.c$)((e=>{const{chats:{byId:t},users:{byId:n},blocked:{ids:a},countryList:{phoneCodes:s}}=e;return{chatsByIds:t,usersByIds:n,blockedIds:a,phoneCodeList:s}}),((e,t)=>(0,h.ei)(t,["unblockContact"])))((({isActive:e,onScreenSelect:t,onReset:n,chatsByIds:s,usersByIds:r,blockedIds:i,phoneCodeList:c,unblockContact:d})=>{const m=(0,M.Z)(),[h,Z,P]=(0,Le.Z)(),g=(0,a.I4)((e=>{d({contactId:e})}),[d]);return(0,T.ZP)(e,n,t,o.MT.PrivacyBlockedUsers),a.ZP.createElement("div",{className:"settings-fab-wrapper"},a.ZP.createElement("div",{className:"settings-content infinite-scroll"},a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("p",{className:"settings-item-description-larger mt-0 mb-2",dir:m.isRtl?"rtl":void 0},m("BlockedUsersInfo"))),a.ZP.createElement("div",{className:"chat-list custom-scroll"},null!=i&&i.length?a.ZP.createElement("div",{className:"scroll-container"},i.map(((e,t)=>function(e,t,n){const o=(0,u.YC)(e),i=o?r[e]:void 0,d=o?void 0:s[e],h=(0,X.Z)("Chat chat-item-clickable blocked-list-item small-icon",o?"private":"group");return a.ZP.createElement(Ee.Z,{key:e,className:h,ripple:!0,narrow:!0,contextActions:[{title:"Unblock",icon:"unlock",handler:()=>{g(e)}}],style:`top: ${(0+t)*l.rS}px;`},a.ZP.createElement(D.Z,{size:"medium",user:i,chat:d}),a.ZP.createElement("div",{className:"contact-info",dir:"auto"},a.ZP.createElement("h3",{dir:"auto"},(0,$.Z)((o?(0,u.Js)(i):(0,u.U)(m,d))||"")),(null==i?void 0:i.phoneNumber)&&a.ZP.createElement("div",{className:"contact-phone",dir:"auto"},(0,na.WZ)(c,i.phoneNumber)),i&&!i.phoneNumber&&i.username&&a.ZP.createElement("div",{className:"contact-username",dir:"auto"},"@",i.username)))}(e,t)))):i&&!i.length?a.ZP.createElement("div",{className:"no-results",dir:"auto"},m("NoBlocked")):a.ZP.createElement(Pe.Z,{key:"loading"}))),a.ZP.createElement(Xt.Z,{isShown:!0,onClick:Z,ariaLabel:m("BlockContact")},a.ZP.createElement("i",{className:"icon-add"})),a.ZP.createElement(aa,{isOpen:h,onClose:P}))})));var ra=n(7854);const oa=(0,a.X$)((0,s.c$)((e=>({animatedEmoji:(0,m.zB)(e,"🔐")})))((({isActive:e,onReset:t,animatedEmoji:n,onScreenSelect:s})=>{const r=(0,M.Z)();return(0,T.ZP)(e,t,s,o.MT.TwoFaEnabled),a.ZP.createElement("div",{className:"settings-content two-fa custom-scroll"},a.ZP.createElement("div",{className:"settings-content-header"},a.ZP.createElement(ra.Z,{sticker:n,size:"large"}),a.ZP.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},(0,$.Z)(r("EnabledPasswordText"),["br"]))),a.ZP.createElement("div",{className:"settings-item pt-0 no-border"},a.ZP.createElement(Ee.Z,{icon:"edit",onClick:()=>s(o.MT.TwoFaChangePasswordCurrent)},r("ChangePassword")),a.ZP.createElement(Ee.Z,{icon:"password-off",onClick:()=>s(o.MT.TwoFaTurnOff)},r("TurnPasswordOff")),a.ZP.createElement(Ee.Z,{icon:"email",onClick:()=>s(o.MT.TwoFaRecoveryEmailCurrentPassword)},r("SetRecoveryEmail"))))})));var la=n(3490),ia=n(9364);const ca=(0,a.X$)((({screen:e,isActive:t,onScreenSelect:n,onReset:s,error:r,isLoading:o,expectedPassword:l,placeholder:i="Current Password",hint:c,submitLabel:d,clearError:m,onSubmit:u})=>{const[h,Z]=(0,a.eJ)(""),[P,g]=(0,a.eJ)(!1),v=(0,a.I4)((e=>{l&&e!==l?Z("Passwords Should Be Equal"):u(e)}),[u,l]),p=(0,a.I4)((()=>{m&&m(),Z("")}),[m]),E=(0,M.Z)();return(0,T.ZP)(t,s,n,e),a.ZP.createElement("div",{className:"settings-content two-fa custom-scroll"},a.ZP.createElement("div",{className:"settings-content-header"},a.ZP.createElement(la.Z,{isBig:!0,isPasswordVisible:P})),a.ZP.createElement("div",{className:"settings-item pt-0 no-border"},a.ZP.createElement(ia.Z,{error:h||r,hint:c,placeholder:i,submitLabel:d||E("Next"),clearError:p,isLoading:o,isPasswordVisible:P,onChangePasswordVisibility:g,onSubmit:v})))})),da=(0,a.X$)((0,s.c$)((e=>({animatedEmoji:(0,m.zB)(e,"🔐")})))((({isActive:e,onScreenSelect:t,onReset:n,animatedEmoji:s,onStart:r})=>{const l=(0,M.Z)();return(0,T.ZP)(e,n,t,o.MT.TwoFaDisabled),a.ZP.createElement("div",{className:"settings-content two-fa custom-scroll"},a.ZP.createElement("div",{className:"settings-content-header"},a.ZP.createElement(ra.Z,{sticker:s,size:"large"}),a.ZP.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},l("SetAdditionalPasswordInfo"))),a.ZP.createElement("div",{className:"settings-item pt-0 no-border"},a.ZP.createElement(R.Z,{onClick:r},l("EditAdminTransferSetPassword"))))}))),ma=i.wB?550:400,ua=(0,a.X$)((0,s.c$)(((e,{icon:t})=>({animatedEmoji:(0,m.zB)(e,"email"===t?"💌":"💡")})))((({animatedEmoji:e,type:t="text",isLoading:n,error:s,placeholder:r,shouldConfirm:o,clearError:l,onSubmit:c,isActive:d,onScreenSelect:m,onReset:u,screen:h})=>{const Z=(0,a.sO)(null),[P,g]=(0,a.eJ)(""),[v,p,E]=(0,Le.Z)(!1);(0,a.d4)((()=>{i.$b||setTimeout((()=>{Z.current.focus()}),ma)}),[]);const C=(0,M.Z)();return(0,T.ZP)(d,u,m,h),a.ZP.createElement("div",{className:"settings-content two-fa custom-scroll"},a.ZP.createElement("div",{className:"settings-content-header"},a.ZP.createElement(ra.Z,{sticker:e,size:"large"})),a.ZP.createElement("div",{className:"settings-item pt-0 no-border"},a.ZP.createElement("form",{action:"",onSubmit:e=>{e.preventDefault(),Z.current&&c(P)}},a.ZP.createElement(ve.Z,{ref:Z,value:P,inputMode:t,label:r,error:s,onChange:e=>{s&&l&&l(),g(e.target.value)}}),P?a.ZP.createElement(R.Z,{type:"submit",isLoading:n,ripple:!0},C("Continue")):a.ZP.createElement(R.Z,{isText:!0,isLoading:n,ripple:!0,onClick:o?p:()=>{c()}},C("YourEmailSkip"))),o&&a.ZP.createElement(ge.Z,{className:"narrow",isOpen:v,title:C("YourEmailSkipWarning"),onClose:E},(0,$.Z)(C("YourEmailSkipWarningText"),["br","simple_markdown"]),a.ZP.createElement("div",{className:"dialog-buttons"},a.ZP.createElement(R.Z,{color:"danger",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:()=>{E(),c()}},C("YourEmailSkip")),a.ZP.createElement(R.Z,{color:"primary",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:E},C("Cancel"))))))}))),ha=(0,a.X$)((0,s.c$)((e=>({animatedEmoji:(0,m.zB)(e,"🥳")})))((({isActive:e,onReset:t,animatedEmoji:n,onScreenSelect:s})=>{const r=(0,M.Z)();return(0,T.ZP)(e,t,s,o.MT.TwoFaCongratulations),a.ZP.createElement("div",{className:"settings-content two-fa custom-scroll"},a.ZP.createElement("div",{className:"settings-content-header"},a.ZP.createElement(ra.Z,{sticker:n,size:"large"}),a.ZP.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},r("TwoStepVerificationPasswordSetInfo"))),a.ZP.createElement("div",{className:"settings-item pt-0 no-border"},a.ZP.createElement(R.Z,{onClick:()=>{s(o.MT.Privacy)}},r("TwoStepVerificationPasswordReturnSettings"))))}))),Za=i.wB?550:400,Pa=(0,a.X$)((0,s.c$)((e=>({animatedEmoji:(0,m.zB)(e,"💌"),codeLength:e.twoFaSettings.waitingEmailCodeLength})))((({animatedEmoji:e,codeLength:t,isLoading:n,error:s,clearError:r,onSubmit:o,isActive:l,onScreenSelect:c,onReset:d,screen:m})=>{const u=(0,a.sO)(null),[h,Z]=(0,a.eJ)("");(0,a.d4)((()=>{i.$b||setTimeout((()=>{u.current.focus()}),Za)}),[]);const P=(0,M.Z)();return(0,T.ZP)(l,d,c,m),a.ZP.createElement("div",{className:"settings-content two-fa custom-scroll"},a.ZP.createElement("div",{className:"settings-content-header"},a.ZP.createElement(ra.Z,{sticker:e,size:"large"})),a.ZP.createElement("div",{className:"settings-item pt-0 no-border"},a.ZP.createElement(ve.Z,{value:h,ref:u,inputMode:"decimal",label:P("YourEmailCode"),error:s,onChange:e=>{s&&r&&r();const n=e.target.value.slice(0,t);n.length===t&&o(n),Z(n),e.target.value=n}}),n&&a.ZP.createElement(Pe.Z,null)))}))),ga=(0,a.X$)((0,s.c$)((e=>({...e.twoFaSettings})),((e,t)=>(0,h.ei)(t,["updatePassword","updateRecoveryEmail","clearPassword","provideTwoFaEmailCode","checkPassword","clearTwoFaError"])))((({currentScreen:e,shownScreen:t,state:n,hint:s,isLoading:r,error:l,waitingEmailCodeLength:i,dispatch:c,isActive:d,onScreenSelect:m,onReset:u,updatePassword:h,checkPassword:Z,clearTwoFaError:P,updateRecoveryEmail:g,provideTwoFaEmailCode:v,clearPassword:p})=>{(0,a.d4)((()=>{i&&(e===o.MT.TwoFaNewPasswordEmail?m(o.MT.TwoFaNewPasswordEmailCode):e===o.MT.TwoFaRecoveryEmail&&m(o.MT.TwoFaRecoveryEmailCode))}),[e,m,i]);const E=(0,a.I4)((()=>{c({type:"reset"}),m(o.MT.TwoFaNewPassword)}),[c,m]),C=(0,a.I4)((e=>{c({type:"setPassword",payload:e}),m(o.MT.TwoFaNewPasswordConfirm)}),[c,m]),f=(0,a.I4)((()=>{m(o.MT.TwoFaNewPasswordHint)}),[m]),b=(0,a.I4)((e=>{c({type:"setHint",payload:e}),m(o.MT.TwoFaNewPasswordEmail)}),[c,m]),I=(0,a.I4)((e=>{c({type:"setEmail",payload:e}),h({...n,email:e,onSuccess:()=>{m(o.MT.TwoFaCongratulations)}})}),[c,m,n,h]),y=(0,a.I4)((e=>{c({type:"setCurrentPassword",payload:e}),Z({currentPassword:e,onSuccess:()=>{m(o.MT.TwoFaChangePasswordNew)}})}),[Z,c,m]),S=(0,a.I4)((e=>{c({type:"setPassword",payload:e}),m(o.MT.TwoFaChangePasswordConfirm)}),[c,m]),k=(0,a.I4)((()=>{m(o.MT.TwoFaChangePasswordHint)}),[m]),w=(0,a.I4)((e=>{c({type:"setHint",payload:e}),h({...n,hint:e,onSuccess:()=>{m(o.MT.TwoFaCongratulations)}})}),[c,m,n,h]),N=(0,a.I4)((e=>{p({currentPassword:e,onSuccess:()=>{m(o.MT.Privacy)}})}),[p,m]),T=(0,a.I4)((e=>{c({type:"setCurrentPassword",payload:e}),Z({currentPassword:e,onSuccess:()=>{m(o.MT.TwoFaRecoveryEmail)}})}),[Z,c,m]),F=(0,a.I4)((e=>{c({type:"setEmail",payload:e}),g({...n,email:e,onSuccess:()=>{m(o.MT.TwoFaCongratulations)}})}),[c,m,n,g]),A=(0,a.I4)((e=>{v({code:e})}),[v]),L=(0,M.Z)();switch(e){case o.MT.TwoFaDisabled:return a.ZP.createElement(da,{onStart:E,onScreenSelect:m,isActive:d||[o.MT.TwoFaNewPassword,o.MT.TwoFaNewPasswordConfirm,o.MT.TwoFaNewPasswordHint,o.MT.TwoFaNewPasswordEmail,o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:u});case o.MT.TwoFaNewPassword:return a.ZP.createElement(ca,{screen:e,placeholder:L("PleaseEnterPassword"),submitLabel:L("Continue"),onSubmit:C,onScreenSelect:m,isActive:d||[o.MT.TwoFaNewPasswordConfirm,o.MT.TwoFaNewPasswordHint,o.MT.TwoFaNewPasswordEmail,o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:u});case o.MT.TwoFaNewPasswordConfirm:return a.ZP.createElement(ca,{screen:e,expectedPassword:n.password,placeholder:L("PleaseReEnterPassword"),submitLabel:L("Continue"),onSubmit:f,onScreenSelect:m,isActive:d||[o.MT.TwoFaNewPasswordHint,o.MT.TwoFaNewPasswordEmail,o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:u});case o.MT.TwoFaNewPasswordHint:return a.ZP.createElement(ua,{icon:"hint",placeholder:L("PasswordHintPlaceholder"),onSubmit:b,screen:e,onScreenSelect:m,isActive:d||[o.MT.TwoFaNewPasswordEmail,o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:u});case o.MT.TwoFaNewPasswordEmail:return a.ZP.createElement(ua,{icon:"email",type:"email",isLoading:r,error:l,clearError:P,placeholder:L("RecoveryEmailTitle"),shouldConfirm:!0,onSubmit:I,screen:e,onScreenSelect:m,isActive:d||[o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:u});case o.MT.TwoFaNewPasswordEmailCode:return a.ZP.createElement(Pa,{isLoading:r,error:l,clearError:P,onSubmit:A,screen:e,onScreenSelect:m,isActive:d||t===o.MT.TwoFaCongratulations,onReset:u});case o.MT.TwoFaCongratulations:return a.ZP.createElement(ha,{onScreenSelect:m,isActive:d,onReset:u});case o.MT.TwoFaEnabled:return a.ZP.createElement(oa,{onScreenSelect:m,isActive:d||[o.MT.TwoFaChangePasswordCurrent,o.MT.TwoFaChangePasswordNew,o.MT.TwoFaChangePasswordConfirm,o.MT.TwoFaChangePasswordHint,o.MT.TwoFaTurnOff,o.MT.TwoFaRecoveryEmailCurrentPassword,o.MT.TwoFaRecoveryEmail,o.MT.TwoFaRecoveryEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:u});case o.MT.TwoFaChangePasswordCurrent:return a.ZP.createElement(ca,{screen:e,isLoading:r,error:l,clearError:P,hint:s,onSubmit:y,onScreenSelect:m,isActive:d||[o.MT.TwoFaChangePasswordNew,o.MT.TwoFaChangePasswordConfirm,o.MT.TwoFaChangePasswordHint,o.MT.TwoFaCongratulations].includes(t),onReset:u});case o.MT.TwoFaChangePasswordNew:return a.ZP.createElement(ca,{screen:e,placeholder:L("PleaseEnterNewFirstPassword"),onSubmit:S,onScreenSelect:m,isActive:d||[o.MT.TwoFaChangePasswordConfirm,o.MT.TwoFaChangePasswordHint,o.MT.TwoFaCongratulations].includes(t),onReset:u});case o.MT.TwoFaChangePasswordConfirm:return a.ZP.createElement(ca,{screen:e,expectedPassword:n.password,placeholder:L("PleaseReEnterPassword"),onSubmit:k,onScreenSelect:m,isActive:d||[o.MT.TwoFaChangePasswordHint,o.MT.TwoFaCongratulations].includes(t),onReset:u});case o.MT.TwoFaChangePasswordHint:return a.ZP.createElement(ua,{isLoading:r,error:l,clearError:P,icon:"hint",placeholder:L("PasswordHintPlaceholder"),onSubmit:w,onScreenSelect:m,isActive:d||t===o.MT.TwoFaCongratulations,onReset:u,screen:e});case o.MT.TwoFaTurnOff:return a.ZP.createElement(ca,{isLoading:r,error:l,clearError:P,hint:s,onSubmit:N,onScreenSelect:m,isActive:d,onReset:u,screen:e});case o.MT.TwoFaRecoveryEmailCurrentPassword:return a.ZP.createElement(ca,{screen:e,isLoading:r,error:l,clearError:P,hint:s,onSubmit:T,onScreenSelect:m,isActive:d||[o.MT.TwoFaRecoveryEmail,o.MT.TwoFaRecoveryEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:u});case o.MT.TwoFaRecoveryEmail:return a.ZP.createElement(ua,{screen:e,icon:"email",type:"email",placeholder:L("RecoveryEmailTitle"),onSubmit:F,onScreenSelect:m,isActive:d||[o.MT.TwoFaRecoveryEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:u});case o.MT.TwoFaRecoveryEmailCode:return a.ZP.createElement(Pa,{screen:e,isLoading:r,error:l,clearError:P,onSubmit:A,onScreenSelect:m,isActive:d||t===o.MT.TwoFaCongratulations,onReset:u});default:return}})));var va=n(1820);function pa(e,t){const{privacy:n}=e.settings;switch(t){case o.MT.PrivacyPhoneNumberAllowedContacts:case o.MT.PrivacyPhoneNumberDeniedContacts:return n.phoneNumber;case o.MT.PrivacyLastSeenAllowedContacts:case o.MT.PrivacyLastSeenDeniedContacts:return n.lastSeen;case o.MT.PrivacyProfilePhotoAllowedContacts:case o.MT.PrivacyProfilePhotoDeniedContacts:return n.profilePhoto;case o.MT.PrivacyForwardingAllowedContacts:case o.MT.PrivacyForwardingDeniedContacts:return n.forwards;case o.MT.PrivacyGroupChatsDeniedContacts:case o.MT.PrivacyGroupChatsAllowedContacts:return n.chatInvite}}const Ea=(0,a.X$)((0,s.c$)(((e,{screen:t})=>{const{chats:{byId:n,listIds:a,orderedPinnedIds:s},currentUserId:r}=e;return{currentUserId:r,chatsById:n,listIds:a.active,orderedPinnedIds:s.active,archivedPinnedIds:s.archived,archivedListIds:a.archived,settings:pa(e,t)}}),((e,t)=>(0,h.ei)(t,["setPrivacySettings"])))((({currentUserId:e,isAllowList:t,screen:n,settings:s,chatsById:r,listIds:l,orderedPinnedIds:i,archivedListIds:c,archivedPinnedIds:d,setPrivacySettings:m,isActive:h,onScreenSelect:Z,onReset:P})=>{const g=(0,M.Z)(),v=(0,a.Ye)((()=>s?t?[...s.allowUserIds,...s.allowChatIds]:[...s.blockUserIds,...s.blockChatIds]:[]),[t,s]),[p,E]=(0,a.eJ)(""),[C,f]=(0,a.eJ)(!1),[b,I]=(0,a.eJ)(v),y=(0,a.Ye)((()=>{const e=l?(0,u.O)(r,l,i,"all"):void 0,t=c?(0,u.O)(r,c,d,"archived"):void 0;if(e||t)return[...e?[...e.pinnedChats,...e.otherChats]:[],...t?t.otherChats:[]]}),[r,l,i,c,d]),S=(0,a.Ye)((()=>{if(y)return y.filter((t=>((0,u.YC)(t.id)&&t.id!==e||(0,u.Bf)(t))&&(!p||(0,me.Z)((0,u.U)(g,t),p)||v.includes(t.id)))).map((({id:e})=>e))}),[y,e,g,p,v]),k=(0,a.I4)((e=>{I(e),f(!0)}),[]),w=(0,a.I4)((()=>{m({privacyKey:qn(n),isAllowList:Boolean(t),contactsIds:b}),Z(o.MT.Privacy)}),[t,b,Z,n,m]);return(0,T.ZP)(h,P,Z,n),a.ZP.createElement("div",{className:"NewChat-inner step-1"},a.ZP.createElement(va.Z,{itemIds:S||[],selectedIds:b,filterValue:p,filterPlaceholder:g(t?"AlwaysShareWithPlaceholder":"NeverShareWithPlaceholder"),searchInputId:"new-group-picker-search",onSelectedIdsChange:k,onFilterChange:E}),a.ZP.createElement(Xt.Z,{isShown:C,onClick:w,ariaLabel:g(t?"AlwaysShareWithTitle":"NeverShareWithTitle")},a.ZP.createElement("i",{className:"icon-arrow-right"})))}))),Ca=Object.keys(o.MT).length/2,fa=[o.MT.TwoFaDisabled,o.MT.TwoFaNewPassword,o.MT.TwoFaNewPasswordConfirm,o.MT.TwoFaNewPasswordHint,o.MT.TwoFaNewPasswordEmail,o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations,o.MT.TwoFaEnabled,o.MT.TwoFaChangePasswordCurrent,o.MT.TwoFaChangePasswordNew,o.MT.TwoFaChangePasswordConfirm,o.MT.TwoFaChangePasswordHint,o.MT.TwoFaTurnOff,o.MT.TwoFaRecoveryEmailCurrentPassword,o.MT.TwoFaRecoveryEmail,o.MT.TwoFaRecoveryEmailCode],ba=[o.MT.Folders,o.MT.FoldersCreateFolder,o.MT.FoldersEditFolder,o.MT.FoldersEditFolderFromChatList,o.MT.FoldersIncludedChats,o.MT.FoldersIncludedChatsFromChatList,o.MT.FoldersExcludedChats,o.MT.FoldersExcludedChatsFromChatList],Ia=[o.MT.PrivacyBlockedUsers,o.MT.PrivacyActiveSessions],ya=[o.MT.PrivacyPhoneNumberAllowedContacts,o.MT.PrivacyPhoneNumberDeniedContacts],Sa=[o.MT.PrivacyLastSeenAllowedContacts,o.MT.PrivacyLastSeenDeniedContacts],ka=[o.MT.PrivacyProfilePhotoAllowedContacts,o.MT.PrivacyProfilePhotoDeniedContacts],wa=[o.MT.PrivacyForwardingAllowedContacts,o.MT.PrivacyForwardingDeniedContacts],Na=[o.MT.PrivacyGroupChatsAllowedContacts,o.MT.PrivacyGroupChatsDeniedContacts],Ma=(0,a.X$)((({isActive:e,currentScreen:t,foldersState:n,foldersDispatch:s,onScreenSelect:r,onReset:l,shouldSkipTransition:c})=>{const[d,m]=(0,$t.Z)(Ut,Dt),u=(0,a.I4)((()=>{t!==o.MT.FoldersCreateFolder&&t!==o.MT.FoldersEditFolder&&t!==o.MT.FoldersEditFolderFromChatList||setTimeout((()=>{s({type:"reset"})}),200),t!==o.MT.FoldersIncludedChats&&t!==o.MT.FoldersExcludedChats?l():"create"===n.mode?r(o.MT.FoldersCreateFolder):r(o.MT.FoldersEditFolder)}),[n.mode,s,t,l,r]),h=(0,a.I4)((()=>{s({type:"saveFilters"}),u()}),[s,u]);function Z(l,i,c){return a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(Ot,{currentScreen:t,onReset:u,onSaveFilter:h,onScreenSelect:r,editedFolderId:n.folderId}),function(l,i){const c={[o.MT.PrivacyPhoneNumber]:ya.includes(i),[o.MT.PrivacyLastSeen]:Sa.includes(i),[o.MT.PrivacyProfilePhoto]:ka.includes(i),[o.MT.PrivacyForwarding]:wa.includes(i),[o.MT.PrivacyGroupChats]:Na.includes(i)},h=fa.includes(i),Z=ba.includes(i),P=Ia.includes(i)||h||Object.keys(c).includes(i.toString())||Object.values(c).find((e=>!0===e));switch(t){case o.MT.Main:return a.ZP.createElement(Jt,{onScreenSelect:r,isActive:e,onReset:u});case o.MT.EditProfile:return a.ZP.createElement(Qt,{onScreenSelect:r,isActive:e&&l,onReset:u});case o.MT.General:return a.ZP.createElement(wn,{onScreenSelect:r,isActive:l||i===o.MT.GeneralChatBackgroundColor||i===o.MT.GeneralChatBackground||P||Z,onReset:u});case o.MT.Notifications:return a.ZP.createElement(Vn,{onScreenSelect:r,isActive:l,onReset:u});case o.MT.DataStorage:return a.ZP.createElement(nn,{onScreenSelect:r,isActive:l,onReset:u});case o.MT.Privacy:return a.ZP.createElement(jn,{onScreenSelect:r,isActive:l||P||h,onReset:u});case o.MT.Language:return a.ZP.createElement(Kn,{onScreenSelect:r,isActive:l,onReset:u});case o.MT.GeneralChatBackground:return a.ZP.createElement(xn,{onScreenSelect:r,isActive:l||i===o.MT.GeneralChatBackgroundColor,onReset:u});case o.MT.GeneralChatBackgroundColor:return a.ZP.createElement(_n,{onScreenSelect:r,isActive:l,onReset:u});case o.MT.PrivacyActiveSessions:return a.ZP.createElement(ta,{onScreenSelect:r,isActive:l,onReset:u});case o.MT.PrivacyBlockedUsers:return a.ZP.createElement(sa,{onScreenSelect:r,isActive:l,onReset:u});case o.MT.PrivacyPhoneNumber:case o.MT.PrivacyLastSeen:case o.MT.PrivacyProfilePhoto:case o.MT.PrivacyForwarding:case o.MT.PrivacyGroupChats:return a.ZP.createElement(Wn,{screen:t,onScreenSelect:r,isActive:l||c[t],onReset:u});case o.MT.PrivacyPhoneNumberAllowedContacts:case o.MT.PrivacyLastSeenAllowedContacts:case o.MT.PrivacyProfilePhotoAllowedContacts:case o.MT.PrivacyForwardingAllowedContacts:case o.MT.PrivacyGroupChatsAllowedContacts:return a.ZP.createElement(Ea,{isAllowList:!0,screen:t,onScreenSelect:r,isActive:l||c[t],onReset:u});case o.MT.PrivacyPhoneNumberDeniedContacts:case o.MT.PrivacyLastSeenDeniedContacts:case o.MT.PrivacyProfilePhotoDeniedContacts:case o.MT.PrivacyForwardingDeniedContacts:case o.MT.PrivacyGroupChatsDeniedContacts:return a.ZP.createElement(Ea,{screen:t,onScreenSelect:r,isActive:l,onReset:u});case o.MT.Folders:case o.MT.FoldersCreateFolder:case o.MT.FoldersEditFolder:case o.MT.FoldersEditFolderFromChatList:case o.MT.FoldersIncludedChats:case o.MT.FoldersIncludedChatsFromChatList:case o.MT.FoldersExcludedChats:case o.MT.FoldersExcludedChatsFromChatList:return a.ZP.createElement(Pn,{currentScreen:t,shownScreen:i,state:n,dispatch:s,isActive:l,onScreenSelect:r,onReset:u});case o.MT.TwoFaDisabled:case o.MT.TwoFaNewPassword:case o.MT.TwoFaNewPasswordConfirm:case o.MT.TwoFaNewPasswordHint:case o.MT.TwoFaNewPasswordEmail:case o.MT.TwoFaNewPasswordEmailCode:case o.MT.TwoFaCongratulations:case o.MT.TwoFaEnabled:case o.MT.TwoFaChangePasswordCurrent:case o.MT.TwoFaChangePasswordNew:case o.MT.TwoFaChangePasswordConfirm:case o.MT.TwoFaChangePasswordHint:case o.MT.TwoFaTurnOff:case o.MT.TwoFaRecoveryEmailCurrentPassword:case o.MT.TwoFaRecoveryEmail:case o.MT.TwoFaRecoveryEmailCode:return a.ZP.createElement(ga,{currentScreen:t,state:d,dispatch:m,shownScreen:i,isActive:l,onScreenSelect:r,onReset:u});default:return}}(l,c))}return a.ZP.createElement(L.Z,{id:"Settings",name:c?"none":i.s0,activeKey:t,renderCount:Ca},Z)})),Ta=(0,z.P2)((e=>e()),6e4,!0),Fa=(0,a.X$)((0,s.c$)((e=>{const{userIds:t}=e.contactList||{},{byId:n}=e.users;return{usersById:n,contactIds:t,serverTimeOffset:e.serverTimeOffset}}),((e,t)=>(0,h.ei)(t,["loadContactList","openChat"])))((({isActive:e,onReset:t,filter:n,usersById:s,contactIds:r,loadContactList:o,openChat:l,serverTimeOffset:c})=>{(0,a.d4)((()=>{Ta((()=>{o()}))})),(0,T.ZP)(e,t);const d=(0,a.I4)((e=>{l({id:e,shouldReplaceHistory:!0})}),[l]),m=(0,a.Ye)((()=>{if(!r)return;const e=n?r.filter((e=>{const t=s[e];if(!t)return!1;const a=(0,u.Js)(t);return a&&(0,me.Z)(a,n)})):r;return(0,u.Z0)(e,s,void 0,c)}),[r,n,s,c]),[h,Z]=(0,ue.Z)(void 0,m,Boolean(n));return a.ZP.createElement(pe.Z,{items:h,onLoadMore:Z,className:"chat-list custom-scroll"},null!=h&&h.length?h.map((e=>a.ZP.createElement(Ee.Z,{key:e,className:"chat-item-clickable",onClick:()=>d(e),ripple:!i.wB},a.ZP.createElement(fe.Z,{userId:e,forceShowSelf:!0,avatarSize:"large"})))):h&&!h.length?a.ZP.createElement("p",{className:"no-results",key:"no-results",dir:"auto"},n.length?"No contacts matched your search.":"Contact list is empty."):a.ZP.createElement(Pe.Z,{key:"loading"}))}))),Aa=(0,z.P2)((e=>e()),6e4,!0),La=(0,a.X$)((0,s.c$)((e=>{const{userIds:t}=e.contactList||{},{byId:n}=e.users,{byId:a}=e.chats,{currentUserId:s}=e,{query:r,fetchingStatus:o,globalResults:l,localResults:i}=e.globalSearch,{userIds:c}=l||{},{userIds:d}=i||{};return{currentUserId:s,usersById:n,chatsById:a,localContactIds:t,searchQuery:r,isSearching:null==o?void 0:o.chats,globalUserIds:c,localUserIds:d}}),((e,t)=>(0,h.ei)(t,["loadContactList","setGlobalSearchQuery"])))((({isChannel:e,isActive:t,selectedMemberIds:n,onSelectedMemberIdsChange:s,onNextStep:r,onReset:o,currentUserId:l,usersById:i,chatsById:c,localContactIds:d,searchQuery:m,isSearching:Z,localUserIds:P,globalUserIds:g,loadContactList:v,setGlobalSearchQuery:p})=>{(0,a.d4)((()=>{Aa((()=>{v()}))}));const E=(0,M.Z)();(0,T.ZP)(t,o);const C=(0,a.I4)((e=>{p({query:e})}),[p]),f=(0,a.Ye)((()=>{const e=d?(0,u.ih)(d.filter((e=>e!==l)),c):[];if(!m)return e;const t=e.filter((e=>{const t=i[e];if(!t)return!1;const n=(0,u.Js)(t);return n&&(0,me.Z)(n,m)}));return(0,u.ih)((0,h.Tw)([...t,...P||[],...g||[]]).filter((e=>{const t=i[e];return!t||!(0,u.cS)(t)||t.canBeInvitedToGroup})),c,!1,n)}),[d,c,m,P,g,n,l,i]),b=(0,a.I4)((()=>{(n.length||e)&&(p({query:""}),r())}),[n.length,e,p,r]);return a.ZP.createElement("div",{className:"NewChat step-1"},a.ZP.createElement("div",{className:"left-header"},a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent",onClick:o,ariaLabel:"Return to Chat List"},a.ZP.createElement("i",{className:"icon-arrow-left"})),a.ZP.createElement("h3",null,E("GroupAddMembers"))),a.ZP.createElement("div",{className:"NewChat-inner step-1"},a.ZP.createElement(va.Z,{itemIds:f,selectedIds:n,filterValue:m,filterPlaceholder:E("SendMessageTo"),searchInputId:"new-group-picker-search",isLoading:Z,onSelectedIdsChange:s,onFilterChange:C}),a.ZP.createElement(Xt.Z,{isShown:Boolean(n.length||e),onClick:b,ariaLabel:e?"Continue To Channel Info":"Continue To Group Info"},a.ZP.createElement("i",{className:"icon-arrow-right"}))))}))),Ra=(0,a.X$)((0,s.c$)((e=>{const{progress:t,error:n}=e.chatCreation||{};return{creationProgress:t,creationError:n}}),((e,t)=>(0,h.ei)(t,["createGroupChat","createChannel"])))((({isChannel:e,isActive:t,memberIds:n,onReset:s,creationProgress:r,creationError:l,createGroupChat:i,createChannel:c})=>{const d=(0,M.Z)();(0,T.ZP)(t,s);const[m,u]=(0,a.eJ)(""),[h,Z]=(0,a.eJ)(""),[P,g]=(0,a.eJ)(),[v,p]=(0,a.eJ)(),E="Chat title can't be empty",C="Channel title can't be empty",f="Sorry, creating supergroups is not yet supported",b=r===o.Nh.InProgress,I=(0,a.I4)((e=>{const{value:t}=e.currentTarget,n=t.replace(/^\s+/,"");u(n),n!==t&&(e.currentTarget.value=n)}),[]),y=(0,a.I4)((e=>{Z(e.currentTarget.value)}),[]),S=(0,a.I4)((()=>{m.length?n.length>199?p(f):i({title:m,photo:P,memberIds:n}):p(E)}),[m,n,i,P,E,f]),k=(0,a.I4)((()=>{m.length?c({title:m,about:h,photo:P,memberIds:n}):p(C)}),[m,c,h,P,n,C]);(0,a.d4)((()=>{r===o.Nh.Complete&&s(!0)}),[r,s]);const w=l&&d(l)||(v!==E&&v!==C?v:void 0);return a.ZP.createElement("div",{className:"NewChat"},a.ZP.createElement("div",{className:"left-header"},a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent",onClick:()=>s(),ariaLabel:"Return to member selection"},a.ZP.createElement("i",{className:"icon-arrow-left"})),a.ZP.createElement("h3",null,d(e?"NewChannel":"NewGroup"))),a.ZP.createElement("div",{className:"NewChat-inner step-2"},a.ZP.createElement(zt.Z,{onChange:g,title:d("AddPhoto")}),a.ZP.createElement(ve.Z,{value:m,onChange:I,label:d(e?"EnterChannelName":"GroupName"),error:v===E||v===C?v:void 0}),e&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(ve.Z,{value:h,onChange:y,label:d("DescriptionOptionalPlaceholder")}),a.ZP.createElement("p",{className:"note"},d("DescriptionInfo"))),w&&a.ZP.createElement("p",{className:"error"},w),n.length>0&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("h3",{className:"chat-members-heading"},d("GroupInfo.ParticipantCount",n.length,"i")),a.ZP.createElement("div",{className:"chat-members-list custom-scroll"},n.map((e=>a.ZP.createElement(Ee.Z,{inactive:!0,className:"chat-item-clickable"},a.ZP.createElement(fe.Z,{userId:e}))))))),a.ZP.createElement(Xt.Z,{isShown:0!==m.length,onClick:e?k:S,disabled:b,ariaLabel:e?d("ChannelIntro.CreateChannel"):"Create Group"},b?a.ZP.createElement(F.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-arrow-right"})))}))),Ba=Object.keys(o.du).length/2,$a=(0,a.X$)((({isActive:e,isChannel:t=!1,content:n,onContentChange:s,onReset:r})=>{const[l,c]=(0,a.eJ)([]),d=(0,a.I4)((()=>{s(t?o.du.NewChannelStep2:o.du.NewGroupStep2)}),[t,s]);return a.ZP.createElement(L.Z,{id:"NewChat",name:i.s0,renderCount:Ba,activeKey:n},(s=>{switch(n){case o.du.NewChannelStep1:case o.du.NewGroupStep1:return a.ZP.createElement(La,{isChannel:t,isActive:e,selectedMemberIds:l,onSelectedMemberIdsChange:c,onNextStep:d,onReset:r});case o.du.NewChannelStep2:case o.du.NewGroupStep2:return a.ZP.createElement(Ra,{isChannel:t,isActive:s&&e,memberIds:l,onReset:r});default:return}}))}));var Da=n(1080);const Ua=(0,a.X$)((({isActive:e,onReset:t,onContentChange:n})=>{const s=(0,M.Z)();return(0,T.ZP)(e,t,n,o.du.Archived),a.ZP.createElement("div",{className:"ArchivedChats"},a.ZP.createElement("div",{className:"left-header"},a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent",onClick:t,ariaLabel:"Return to chat list"},a.ZP.createElement("i",{className:"icon-arrow-left"})),a.ZP.createElement("h3",null,s("ArchivedChats"))),a.ZP.createElement(Da.Z,{folderType:"archived",isActive:e}))}));var Oa=n(1218);const xa=(0,a.X$)((0,s.c$)((e=>{const{byId:t,orderedIds:n}=e.chatFolders;return{foldersById:t,folderOrderedIds:n}}),((e,t)=>(0,h.ei)(t,["editChatFolders"])))((({isOpen:e,chatId:t,foldersById:n,folderOrderedIds:s,onClose:r,onCloseAnimationEnd:o,editChatFolders:l})=>{const i=(0,M.Z)(),c=(0,a.Ye)((()=>n?Object.keys(n).reduce(((e,a)=>{const{includedChatIds:s,pinnedChatIds:r}=n[Number(a)];return(s.includes(t)||null!=r&&r.includes(t))&&e.push(a),e}),[]):[]),[t,n]),[d,m]=(0,a.eJ)(c),u=(0,a.Ye)((()=>(null==s?void 0:s.map((e=>({label:n?n[e].title:"",value:String(e)}))))||[]),[s,n]),h=(0,a.I4)((()=>{const e=c.filter((e=>!d.includes(e))),n=d.filter((e=>!c.includes(e)));l({chatId:t,idsToRemove:e,idsToAdd:n}),r()}),[t,l,c,r,d]);if(n&&s)return a.ZP.createElement(ge.Z,{isOpen:e,onClose:r,onCloseAnimationEnd:o,onEnter:h,className:"delete",title:i("FilterAddTo")},a.ZP.createElement(Oa.Z,{options:u,selected:d,onChange:m,round:!0}),a.ZP.createElement(R.Z,{color:"primary",className:"confirm-dialog-button",isText:!0,onClick:h},i("FilterAddTo")),a.ZP.createElement(R.Z,{className:"confirm-dialog-button",isText:!0,onClick:r},i("Cancel")))})));var Ga=n(647),Ja=n(4319);function za(e){return e?"lng_context_copy_selected":"lng_context_copy_text"}let Xa;const _a={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},Ya=e=>{const t="deltaY"in e?e.deltaY:(e=>"changedTouches"in e?e.changedTouches[0].clientY:0)(e);(!Xa||!Xa.contains(e.target)||Xa.scrollTop<=0&&t<=0||Xa.scrollTop>=Xa.scrollHeight-Xa.offsetHeight&&t>=0)&&e.preventDefault()};function Ha(e){_a[e.key]&&!function(e){if(!(e&&e instanceof HTMLElement))return!1;const t=e,n=t.tagName.toLowerCase();if("textarea"===n)return!0;if("input"!==n)return!1;const a=t.getAttribute("type");return!!a&&["text","password","number","email","tel","url","search","date","datetime","datetime-local","time","month","week"].indexOf(a.toLowerCase())>-1}(e.target)&&e.preventDefault()}function Va(e){Xa=e,document.addEventListener("wheel",Ya,{passive:!1}),document.addEventListener("touchmove",Ya,{passive:!1}),document.onkeydown=Ha}function ja(){Xa=void 0,document.removeEventListener("wheel",Ya),document.removeEventListener("touchmove",Ya),document.onkeydown=null}var Ka=n(3394),qa=n(2328);const Wa=({isOpen:e,message:t,anchor:n,canSendNow:s,canReschedule:o,canReply:l,canEdit:i,canPin:c,canUnpin:d,canDelete:m,canReport:h,canForward:Z,canFaveSticker:P,canUnfaveSticker:g,canCopy:v,canCopyLink:p,canSelect:E,canDownload:C,isDownloading:f,onReply:b,onEdit:I,onPin:y,onUnpin:S,onForward:k,onDelete:w,onReport:N,onFaveSticker:T,onUnfaveSticker:F,onSelect:A,onSend:L,onReschedule:R,onClose:B,onCloseAnimationEnd:$,onCopyLink:D,onDownload:U})=>{const O=(0,a.sO)(null),G=function(e,t,n){const a=[],s=(0,u.UD)(e),o=(0,u.O$)(e)||((0,u.Cg)(e)?void 0:(0,u.F$)(e)),l=(0,u.Ti)(e,"inline"),i=o&&(l||(0,u.BM)(e))&&Ja.yl,c=window.getSelection();if(i&&a.push({label:"lng_context_copy_image",handler:()=>{Promise.resolve(l?Ga.he(l,r.IU.BlobUrl):o.blobUrl).then(Ja.VP),t&&t()}}),s){var d;const e=Boolean((null==c||null===(d=c.anchorNode)||void 0===d?void 0:d.parentNode)&&c.anchorNode.parentNode.closest(".Message .content-inner")&&""!==c.toString().replace(/(?:\r\n|\r|\n)/g,""));a.push({label:za(e),handler:()=>{const n=e&&c?c.toString():s;(0,Ja.TE)(n),t&&t()}})}return n&&a.push({label:"lng_context_copy_message_link",handler:()=>{n(),t&&t()}}),a}(t,B,p?D:void 0),J=(0,a.I4)((()=>document.querySelector(`.active > .MessageList div[data-message-id="${t.id}"]`)),[t.id]),z=(0,a.I4)((()=>document.querySelector(".active > .MessageList")),[]),X=(0,a.I4)((()=>document.querySelector(".MessageContextMenu .bubble")),[]),{positionX:_,positionY:Y,style:H,menuStyle:V,withScroll:j}=(0,Ka.Z)(n,J,z,X,10,document.querySelector(".MiddleHeader").offsetHeight);(0,a.d4)((()=>(Va(j?O.current:void 0),ja)),[j]);const K=(0,M.Z)();return a.ZP.createElement(qa.Z,{ref:O,isOpen:e,positionX:_,positionY:Y,style:H,menuStyle:V,className:"MessageContextMenu fluid",onClose:B,onCloseAnimationEnd:$},s&&a.ZP.createElement(x.Z,{icon:"send-outline",onClick:L},K("MessageScheduleSend")),o&&a.ZP.createElement(x.Z,{icon:"schedule",onClick:R},K("MessageScheduleEditTime")),l&&a.ZP.createElement(x.Z,{icon:"reply",onClick:b},K("Reply")),i&&a.ZP.createElement(x.Z,{icon:"edit",onClick:I},K("Edit")),P&&a.ZP.createElement(x.Z,{icon:"favorite",onClick:T},K("AddToFavorites")),g&&a.ZP.createElement(x.Z,{icon:"favorite",onClick:F},K("Stickers.RemoveFromFavorites")),v&&G.map((e=>a.ZP.createElement(x.Z,{key:e.label,icon:"copy",onClick:e.handler},K(e.label)))),c&&a.ZP.createElement(x.Z,{icon:"pin",onClick:y},K("DialogPin")),d&&a.ZP.createElement(x.Z,{icon:"unpin",onClick:S},K("DialogUnpin")),C&&a.ZP.createElement(x.Z,{icon:"download",onClick:U},K(f?"lng_context_cancel_download":"lng_media_download")),Z&&a.ZP.createElement(x.Z,{icon:"forward",onClick:k},K("Forward")),E&&a.ZP.createElement(x.Z,{icon:"select",onClick:A},K("Common.Select")),h&&a.ZP.createElement(x.Z,{icon:"flag",onClick:N},K("lng_context_report_msg")),m&&a.ZP.createElement(x.Z,{destructive:!0,icon:"delete",onClick:w},K("Delete")))},Qa=(0,a.X$)((0,s.c$)(((e,{message:t,messageListType:n})=>{const{threadId:a}=(0,m.Bt)(e)||{},s=(0,m.xs)(e,t.chatId),{noOptions:r,canReply:o,canPin:l,canUnpin:i,canDelete:c,canReport:d,canEdit:u,canForward:h,canFaveSticker:Z,canUnfaveSticker:P,canCopy:g,canCopyLink:v,canSelect:p,canDownload:E}=a&&(0,m._k)(e,t,a)||{},C="pinned"===n,f="scheduled"===n;return{noOptions:r,canSendNow:f,canReschedule:f,canReply:!C&&!f&&o,canPin:!f&&l,canUnpin:!f&&i,canDelete:c,canReport:d,canEdit:!C&&u,canForward:!f&&h,canFaveSticker:!f&&Z,canUnfaveSticker:!f&&P,canCopy:g,canCopyLink:!f&&v,canSelect:p,canDownload:E,activeDownloads:s}}),((e,t)=>(0,h.ei)(t,["setReplyingToId","setEditingId","pinMessage","openForwardMenu","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","downloadMessageMedia","cancelMessageMediaDownload"])))((({isOpen:e,messageListType:t,chatUsername:n,message:s,album:r,anchor:o,onClose:l,onCloseAnimationEnd:i,noOptions:c,canSendNow:d,canReschedule:m,canReply:u,canPin:h,canUnpin:Z,canDelete:P,canReport:g,canEdit:v,canForward:p,canFaveSticker:E,canUnfaveSticker:C,canCopy:f,canCopyLink:b,canSelect:I,canDownload:y,activeDownloads:S,setReplyingToId:k,setEditingId:w,pinMessage:N,openForwardMenu:M,faveSticker:T,unfaveSticker:F,toggleMessageSelection:A,sendScheduledMessages:L,rescheduleMessage:R,downloadMessageMedia:$,cancelMessageMediaDownload:D})=>{const{transitionClassNames:U}=(0,Y.Z)(e,i,void 0,!1),[O,x]=(0,a.eJ)(!0),[G,J]=(0,a.eJ)(!1),[z,X]=(0,a.eJ)(!1),[_,H]=(0,a.eJ)(!1),[V,j,K]=(0,Le.Z)(),q=r?r.messages.some((e=>S.includes(e.id))):S.includes(s.id),W=(0,a.I4)((()=>{x(!1),J(!0)}),[]),Q=(0,a.I4)((()=>{x(!1),X(!0)}),[]),ee=(0,a.I4)((()=>{x(!1),l()}),[l]),te=(0,a.I4)((()=>{J(!1),l()}),[l]),ne=(0,a.I4)((()=>{X(!1),l()}),[l]),ae=(0,a.I4)((()=>{H(!1),l()}),[l]),se=(0,a.I4)((()=>{K(),l()}),[K,l]),re=(0,a.I4)((()=>{k({messageId:s.id}),ee()}),[k,s.id,ee]),oe=(0,a.I4)((()=>{w({messageId:s.id}),ee()}),[w,s.id,ee]),le=(0,a.I4)((()=>{x(!1),H(!0)}),[]),ie=(0,a.I4)((()=>{N({messageId:s.id,isUnpin:!0}),ee()}),[N,s.id,ee]),ce=(0,a.I4)((()=>{if(ee(),null!=r&&r.messages){const e=r.messages.map((({id:e})=>e));M({fromChatId:s.chatId,messageIds:e})}else M({fromChatId:s.chatId,messageIds:[s.id]})}),[M,s,ee,r]),de=(0,a.I4)((()=>{ee(),T({sticker:s.content.sticker})}),[ee,s.content.sticker,T]),me=(0,a.I4)((()=>{ee(),F({sticker:s.content.sticker})}),[ee,s.content.sticker,F]),ue=(0,a.I4)((()=>{const e=null!=r&&r.messages?{messageId:s.id,childMessageIds:r.messages.map((({id:e})=>e)),withShift:!1}:{messageId:s.id,withShift:!1};A(e),ee()}),[ee,s.id,A,r]),he=(0,a.I4)((()=>{L({chatId:s.chatId,id:s.id}),ee()}),[ee,s.chatId,s.id,L]),Ze=(0,a.I4)((()=>{x(!1),j()}),[j]),Pe=(0,a.I4)((e=>{R({chatId:s.chatId,messageId:s.id,scheduledAt:Math.round(e.getTime()/1e3)})}),[s.chatId,s.id,R]),ge=(0,a.I4)((()=>{(0,Ja.TE)(`https://t.me/${n||`c/${s.chatId.replace("-","")}`}/${s.id}`),ee()}),[n,ee,s.chatId,s.id]),ve=(0,a.I4)((()=>{((null==r?void 0:r.messages)||[s]).forEach((e=>{q?D({message:e}):$({message:e})})),ee()}),[r,s,ee,q,D,$]),pe=(0,a.Ye)((()=>(r?r.messages:[s]).map((({id:e})=>e))),[r,s]);if(c)return void ee();const Ee=new Date;return Ee.setFullYear(Ee.getFullYear()+1),a.ZP.createElement("div",{className:["ContextMenuContainer",U].join(" ")},a.ZP.createElement(Wa,{message:s,isOpen:O,anchor:o,canSendNow:d,canReschedule:m,canReply:u,canDelete:P,canReport:g,canPin:h,canUnpin:Z,canEdit:v,canForward:p,canFaveSticker:E,canUnfaveSticker:C,canCopy:f,canCopyLink:b,canSelect:I,canDownload:y,isDownloading:q,onReply:re,onEdit:oe,onPin:le,onUnpin:ie,onForward:ce,onDelete:W,onReport:Q,onFaveSticker:de,onUnfaveSticker:me,onSelect:ue,onSend:he,onReschedule:Ze,onClose:ee,onCopyLink:ge,onDownload:ve}),a.ZP.createElement(xe,{isOpen:G,isSchedule:"scheduled"===t,onClose:te,album:r,message:s}),a.ZP.createElement(Ye,{isOpen:z,onClose:ne,messageIds:pe}),a.ZP.createElement(Ge,{isOpen:_,messageId:s.id,chatId:s.chatId,onClose:ae}),a.ZP.createElement(Ue,{isOpen:V,withTimePicker:!0,selectedAt:1e3*s.date,maxAt:(0,B._F)(Ee),isFutureMode:!0,onClose:se,onSubmit:Pe}))}))),es=(0,a.X$)((0,s.c$)(((e,{fromSticker:t,stickerSetShortName:n})=>{const a=(0,m.Bt)(e),{chatId:s,threadId:r}=a||{},o=s&&(0,m.Z1)(e,s),l=o?(0,u.H5)(o):void 0;return{canSendStickers:Boolean(o&&r&&(0,u.Qm)(o,r)&&(null==l?void 0:l.canSendStickers)),stickerSet:t?(0,m.Ny)(e,t.stickerSetId):n?(0,m.E_)(e,n):void 0}}),((e,t)=>(0,h.ei)(t,["loadStickers","toggleStickerSet","sendMessage"])))((({isOpen:e,fromSticker:t,stickerSetShortName:n,stickerSet:s,canSendStickers:r,onClose:o,loadStickers:i,toggleStickerSet:c,sendMessage:d})=>{const m=(0,a.sO)(null),u=(0,M.Z)(),{observe:h}=(0,vn.S1)({rootRef:m,throttleMs:200,isDisabled:!e});(0,a.d4)((()=>{if(e)if(t){const{stickerSetId:e,stickerSetAccessHash:n}=t;i({stickerSetId:e,stickerSetAccessHash:n})}else n&&i({stickerSetShortName:n})}),[e,t,i,n]);const Z=(0,a.I4)((e=>{e={...e,isPreloadedGlobally:!0},d({sticker:e}),o()}),[o,d]),P=(0,a.I4)((()=>{s&&(c({stickerSetId:s.id}),o())}),[o,s,c]);return a.ZP.createElement(ge.Z,{className:"StickerSetModal",isOpen:e,onClose:o,hasCloseButton:!0,title:s?(0,$.Z)(s.title,["emoji","links"]):u("AccDescrStickerSet")},null!=s&&s.stickers?a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("div",{ref:m,className:"stickers custom-scroll"},s.stickers.map((e=>a.ZP.createElement(bn.Z,{sticker:e,size:l.yK,observeIntersection:h,onClick:r?Z:void 0,clickArg:e})))),a.ZP.createElement("div",{className:"button-wrapper"},a.ZP.createElement(R.Z,{size:"smaller",fluid:!0,color:s.installedDate?"danger":"primary",onClick:P},u(s.installedDate?"StickerPack.RemoveStickerCount":"StickerPack.AddStickerCount",s.count,"i")))):a.ZP.createElement(Pe.Z,null))})));var ts=n(2898);const ns=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,m.Z1)(e,t);if(!a||a.isRestricted)return{};const s=(0,u.YC)(a.id),r=s?(0,m.dy)(e,t):void 0,o=r&&(0,u.kw)(r);return{chat:a,isMuted:(0,u.i4)(a,(0,m.dZ)(e),(0,m.NJ)(e)),isPrivate:s,canAddContact:o,canDeleteChat:(0,u.cc)(a),hasLinkedChat:Boolean(null==a||null===(n=a.fullInfo)||void 0===n?void 0:n.linkedChatId)}}),((e,t)=>(0,h.ei)(t,["updateChatMutedState","enterMessageSelectMode","sendBotCommand","restartBot","joinGroupCall","createGroupCall","openLinkedChat","addContact","openCallFallbackConfirm"])))((({chatId:e,isOpen:t,withExtraActions:n,anchor:s,isChannel:r,canStartBot:o,canRestartBot:l,canSubscribe:c,canSearch:d,canCall:m,canMute:u,canLeave:h,canEnterVoiceChat:Z,canCreateVoiceChat:P,chat:g,isPrivate:v,isMuted:p,canDeleteChat:E,hasLinkedChat:C,canAddContact:f,onSubscribeChannel:b,onSearchClick:I,onClose:y,onCloseAnimationEnd:S,updateChatMutedState:k,enterMessageSelectMode:w,sendBotCommand:N,restartBot:T,joinGroupCall:F,createGroupCall:A,openLinkedChat:L,addContact:R,openCallFallbackConfirm:B})=>{const[$,D]=(0,a.eJ)(!0),[U,O]=(0,a.eJ)(!1),{x:G,y:J}=s;(0,Y.Z)(t,S,void 0,!1);const z=(0,a.I4)((()=>{D(!1),O(!0)}),[]),X=(0,a.I4)((()=>{D(!1),y()}),[y]),_=(0,a.I4)((()=>{O(!1),y()}),[y]),H=(0,a.I4)((()=>{N({command:"/start"})}),[N]),V=(0,a.I4)((()=>{T({chatId:e})}),[e,T]),j=(0,a.I4)((()=>{k({chatId:e,isMuted:!p}),X()}),[e,X,p,k]),K=(0,a.I4)((()=>{P?A({chatId:e}):F({chatId:e}),X()}),[X,P,e,F,A]),q=(0,a.I4)((()=>{L({id:e}),X()}),[e,X,L]),W=(0,a.I4)((()=>{R({userId:e}),X()}),[R,e,X]),Q=(0,a.I4)((()=>{b(),X()}),[X,b]),ee=(0,a.I4)((()=>{B(),X()}),[X,B]),te=(0,a.I4)((()=>{I(),X()}),[X,I]),ne=(0,a.I4)((()=>{w(),X()}),[X,w]);(0,a.d4)((()=>(Va(),ja)),[]);const ae=(0,M.Z)();return a.ZP.createElement(ts.Z,null,a.ZP.createElement("div",{className:"HeaderMenuContainer"},a.ZP.createElement(qa.Z,{isOpen:$,positionX:"right",style:`left: ${G}px;top: ${J}px;`,onClose:X},n&&o&&a.ZP.createElement(x.Z,{icon:"bots",onClick:H},ae("BotStart")),n&&l&&a.ZP.createElement(x.Z,{icon:"bots",onClick:V},ae("BotRestart")),n&&c&&a.ZP.createElement(x.Z,{icon:r?"channel":"group",onClick:Q},ae(r?"ProfileJoinChannel":"ProfileJoinGroup")),f&&a.ZP.createElement(x.Z,{icon:"add-user",onClick:W},ae("AddContact")),i.wB&&m&&a.ZP.createElement(x.Z,{icon:"phone",onClick:ee},ae("Call")),i.wB&&d&&a.ZP.createElement(x.Z,{icon:"search",onClick:te},ae("Search")),u&&a.ZP.createElement(x.Z,{icon:p?"unmute":"mute",onClick:j},ae(p?"ChatsUnmute":"ChatsMute")),(Z||P)&&a.ZP.createElement(x.Z,{icon:"voice-chat",onClick:K},ae(P?"StartVoipChat":"VoipGroupJoinCall")),C&&a.ZP.createElement(x.Z,{icon:r?"comments":"channel",onClick:q},ae(r?"ViewDiscussion":"lng_profile_view_channel")),a.ZP.createElement(x.Z,{icon:"select",onClick:ne},ae("ReportSelectMessages")),h&&a.ZP.createElement(x.Z,{destructive:!0,icon:"delete",onClick:z},ae(v?"DeleteChatUser":E?"GroupInfo.DeleteAndExit":r?"LeaveChannel":"Group.LeaveGroup"))),g&&a.ZP.createElement(We.Z,{isOpen:U,onClose:_,chat:g})))})));var as=n(9589);const ss=(0,z.Ds)((e=>e()),200,!1),rs=(0,a.X$)((0,s.c$)((e=>{const t=(0,m.jr)(e);if(!t)return{};const{query:n,results:a}=(0,m.n5)(e)||{},{totalCount:s,foundIds:r}=a||{};return{chat:t,query:n,totalCount:s,foundIds:r,isHistoryCalendarOpen:Boolean(e.historyCalendarSelectedAt)}}),((e,t)=>(0,h.ei)(t,["setLocalTextSearchQuery","searchTextMessagesLocal","focusMessage","closeLocalTextSearch","openHistoryCalendar"])))((({isActive:e,chat:t,query:n,totalCount:s,foundIds:r,isHistoryCalendarOpen:o,setLocalTextSearchQuery:l,searchTextMessagesLocal:i,focusMessage:c,closeLocalTextSearch:d,openHistoryCalendar:m})=>{const u=(0,a.sO)(null),[h,Z]=(0,a.eJ)(0);(0,a.d4)((()=>{const{visualViewport:e}=window;if(!e)return;const t=document.getElementById("Main"),n=()=>{const{activeElement:n}=document;if(n&&n===u.current){const{pageTop:n,height:a}=e;t.style.transform=`translateY(${n}px)`,t.style.height=`${a}px`,document.documentElement.scrollTop=n}else t.style.transform="",t.style.height=""};return e.addEventListener("resize",n),()=>{e.removeEventListener("resize",n)}}),[]),(0,a.d4)((()=>{t&&r&&r.length?(c({chatId:t.id,messageId:r[r.length-1]}),Z(0)):Z(-1)}),[t,c,r]),(0,a.d4)((()=>{Array.from(document.querySelectorAll("input")).forEach((t=>{t.disabled=Boolean(e&&t!==u.current)})),Array.from(document.querySelectorAll("div[contenteditable]")).forEach((t=>{t.contentEditable=e?"false":"true"}))}),[e]),(0,a.d4)((()=>{e||u.current.blur()}),[e]),(0,a.bt)((()=>{document.querySelector("#MobileSearch input").blur()}),[o]);const P=(0,a.I4)((e=>{l({query:e}),e.length&&ss(i)}),[i,l]),g=(0,a.I4)((()=>{if(t&&r){const e=h+1;c({chatId:t.id,messageId:r[r.length-1-e]}),Z(e)}}),[t,h,c,r]),v=(0,a.I4)((()=>{if(t&&r){const e=h-1;c({chatId:t.id,messageId:r[r.length-1-e]}),Z(e)}}),[t,h,c,r]);return a.ZP.createElement("div",{id:"MobileSearch",className:e?"active":""},a.ZP.createElement("div",{className:"header"},a.ZP.createElement(R.Z,{size:"smaller",round:!0,color:"translucent",onClick:d},a.ZP.createElement("i",{className:"icon-arrow-left"})),a.ZP.createElement(as.Z,{ref:u,value:n,onChange:P})),a.ZP.createElement("div",{className:"footer"},a.ZP.createElement("div",{className:"counter"},n?null!=r&&r.length?`${h+1} of ${s}`:r&&!r.length?"No results":"":a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent",onClick:()=>m({selectedAt:(0,B._F)(Date.now())}),ariaLabel:"Search messages by date"},a.ZP.createElement("i",{className:"icon-calendar"}))),a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent",onClick:g,disabled:!r||!r.length||h===r.length-1},a.ZP.createElement("i",{className:"icon-up"})),a.ZP.createElement(R.Z,{round:!0,size:"smaller",color:"translucent",onClick:v,disabled:!r||!r.length||0===h},a.ZP.createElement("i",{className:"icon-down"}))))})));var os=n(5376),ls=n(2365),is=n(8353),cs=n(7002),ds=n(3616);function ms(e,t,n=0,a=!1,s=!1,r=!1){const o=e[r?"scrollLeft":"scrollTop"],l=o+e[r?"offsetWidth":"offsetHeight"],i="string"==typeof t?e.querySelectorAll(t):t,{length:c}=i,d=[];let m=!1;for(let e=0;e=o-n&&u<=l+n:c<=l+n&&u>=o-n)d.push(e),m=!0;else if(m&&!a)break}return{allElements:i,visibleIndexes:d}}const us=function(e,t,n=!1){const a=e[n?"scrollLeft":"scrollTop"],s=a+e[n?"offsetWidth":"offsetHeight"],r=t[n?"offsetLeft":"offsetTop"],o=r+t[n?"offsetWidth":"offsetHeight"];return r>a&&os[s.length-1]?"start":"end";(0,hs.Z)(a,r[t],e,10)}}var Ps=n(3570);function gs({isActive:e,isHorizontal:t,shouldSaveSelectionOnUpdateItems:n,shouldRemoveSelectionOnReset:s,noArrowNavigation:r,items:o,shouldSelectOnTab:l,onSelect:i,onClose:c}){const[d,m]=(0,a.eJ)(-1),u=(0,a.I4)((e=>o?(0,Ps.Z)(o.length,e):-1),[o]),h=(0,a.I4)(((e,t)=>{t.preventDefault(),m((t=>u(t+e)))}),[m,u]),Z=(0,a.I4)((e=>{if(o&&o.length&&d>-1){const t=o[d];t&&(e.preventDefault(),i(t))}}),[o,i,d]),P=!o||d>o.length-1;return(0,a.d4)((()=>{n&&!P||m(s?-1:0)}),[P,s,n]),(0,a.d4)((()=>e?(0,ze.Z)({onEsc:c,onUp:r||t?void 0:e=>h(-1,e),onDown:r||t?void 0:e=>h(1,e),onLeft:r||!t?void 0:e=>h(-1,e),onRight:r||!t?void 0:e=>h(1,e),onTab:l?Z:void 0,onEnter:Z}):void 0),[r,h,Z,e,t,c,l]),d}const vs=(0,a.X$)((({isOpen:e,onClose:t,onInsertUserName:n,usersById:s,filteredUsers:r})=>{const o=(0,a.sO)(null),{shouldRender:l,transitionClassNames:i}=(0,Y.Z)(e,void 0,void 0,!1),c=(0,a.I4)(((e,t=!1)=>{const a=null==s?void 0:s[e];a&&n(a,t)}),[s,n]),d=(0,a.I4)((e=>{c(e.id,!0)}),[c]),m=gs({isActive:e,items:r,onSelect:d,shouldSelectOnTab:!0,shouldSaveSelectionOnUpdateItems:!0,onClose:t});(0,a.d4)((()=>{Zs(".chat-item-clickable",m,o)}),[m]),(0,a.d4)((()=>{r&&!r.length&&t()}),[r,t]);const u=(0,f.Z)(null!=r&&r.length?r:void 0,l),h=r&&!r.length?u:r;if(!l||h&&!h.length)return;const Z=(0,X.Z)("MentionTooltip composer-tooltip custom-scroll",i);return a.ZP.createElement("div",{className:Z,ref:o},null==h?void 0:h.map((({id:e},t)=>a.ZP.createElement(Ee.Z,{key:e,className:"chat-item-clickable scroll-item",onClick:()=>c(e),focus:m===t},a.ZP.createElement(fe.Z,{userId:e,avatarSize:"small",withUsername:!0})))))}));var ps=n(9830);const Es=(0,a.X$)((({attachments:e,caption:t,isReady:n,currentUserId:s,groupChatMembers:r,usersById:o,recentEmojis:i,baseEmojiKeywords:c,emojiKeywords:d,addRecentEmoji:m,onCaptionUpdate:u,onSend:h,onFileAppend:Z,onClear:g})=>{const v=(0,a.sO)(null),p=(0,f.Z)(e),E=e.length?e:p,C=Boolean(e.length),[b,I,y]=(0,Le.Z)(),S=Boolean(E&&E.every((e=>e.quick))),k=(0,M.Z)(),{isMentionTooltipOpen:w,closeMentionTooltip:N,insertMention:T,mentionFilteredUsers:F}=(0,ls.Z)(C,t,u,l.nY,r,void 0,s,o),{isEmojiTooltipOpen:A,closeEmojiTooltip:L,filteredEmojis:B,insertEmoji:$}=(0,is.Z)(C,t,i,l.nY,u,c,d,!n);(0,a.d4)((()=>C?(0,P.Z)(g):void 0),[C,g]);const D=(0,a.I4)((()=>{C&&h()}),[C,h]),U=(0,a.I4)((e=>{e.preventDefault(),y();const{dataTransfer:{files:t}}=e;if(null!=t&&t.length){const e=S?Array.from(t).filter((e=>e.type&&l.dI.has(e.type))):Array.from(t);Z(e,S)}}),[S,Z,y]);if(!E)return;const O=E.every((e=>l.oG.has(e.mimeType))),x=E.every((e=>l.wG.has(e.mimeType))),G=E.every((e=>e.mimeType.startsWith("audio/")));let J="";return J=k(O?"PreviewSender.SendPhoto":x?"PreviewSender.SendVideo":G?"PreviewSender.SendAudio":"PreviewSender.SendFile",E.length,"i"),a.ZP.createElement(ge.Z,{isOpen:C,onClose:g,header:function(){if(E)return a.ZP.createElement("div",{className:"modal-header-condensed",dir:k.isRtl?"rtl":void 0},a.ZP.createElement(R.Z,{round:!0,color:"translucent",size:"smaller",ariaLabel:"Cancel attachments",onClick:g},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement("div",{className:"modal-title"},J),a.ZP.createElement(R.Z,{color:"primary",size:"smaller",className:"modal-action-button",onClick:D},k("Send")))}(),className:"AttachmentModal "+(b?"hovered":"")},a.ZP.createElement("div",{className:"drop-target",onDragEnter:I,onDrop:U,onDragOver:function(e){e.preventDefault(),e.stopPropagation(),v.current&&window.clearTimeout(v.current)},onDragLeave:e=>{const{relatedTarget:t,target:n}=e;n.matches(".drop-target")&&!t&&(v.current=window.setTimeout(y,150)),n&&n.closest(".AttachmentModal.hovered")||(t&&e.stopPropagation(),y())},"data-attach-description":k("Preview.Dragging.AddItems",10)},S?a.ZP.createElement("div",{className:"media-wrapper custom-scroll"},E.map((e=>e.mimeType.startsWith("image/")?a.ZP.createElement("img",{src:e.blobUrl,alt:""}):a.ZP.createElement("video",{src:e.blobUrl,autoPlay:!0,muted:!0,loop:!0})))):a.ZP.createElement("div",{className:"document-wrapper custom-scroll"},E.map((e=>a.ZP.createElement(cs.Z,{name:e.filename,extension:(0,os.mD)(e.filename,e.mimeType),previewData:e.previewBlobUrl,size:e.size,smaller:!0})))),a.ZP.createElement("div",{className:"attachment-caption-wrapper"},a.ZP.createElement(vs,{isOpen:w,onClose:N,onInsertUserName:T,filteredUsers:F,usersById:o}),a.ZP.createElement(ps.Z,{isOpen:A,emojis:B,onClose:L,onEmojiSelect:$,addRecentEmoji:m}),a.ZP.createElement(ds.Z,{id:"caption-input-text",isAttachmentModalInput:!0,html:t,editableInputId:l.nY,placeholder:k("Caption"),onUpdate:u,onSend:h,shouldSetFocus:Boolean(e.length)}))))}));var Cs=n(3099);const fs=(0,a.X$)((({isOpen:e,onSend:t,onClear:n})=>{const s=(0,a.sO)(null),r=(0,a.sO)(null),o=(0,a.sO)(null),[l,i]=(0,a.eJ)(""),[c,d]=(0,a.eJ)([""]),[m,u]=(0,a.eJ)(!0),[h,Z]=(0,a.eJ)(!1),[g,v]=(0,a.eJ)(!1),[p,E]=(0,a.eJ)(),[C,f]=(0,a.eJ)(),[b,I]=(0,a.eJ)(!1),y=(0,M.Z)(),S=(0,a.I4)((t=>{e&&t.current&&t.current.focus()}),[e]);(0,a.d4)((()=>e?(0,P.Z)(n):void 0),[e,n]),(0,a.d4)((()=>{e||(i(""),d([""]),u(!0),Z(!1),v(!1),E(""),f(""),I(!1))}),[e]),(0,a.d4)((()=>S(s)),[S,e]),(0,a.bt)((()=>{const e=o.current;e&&p!==e.innerHTML&&(e.innerHTML=p)}),[p]);const k=(0,a.I4)(((e=[])=>{d([...e,""]),requestAnimationFrame((()=>{const e=r.current;e&&(e.classList.toggle("overflown",e.scrollHeight>320),e.scrollTo({top:e.scrollHeight,behavior:"smooth"}))}))}),[]),w=(0,a.I4)((()=>{if(I(!1),!e)return;const n=l.trim().substring(0,255),a=c.map((e=>e.trim().substring(0,100))).filter((e=>e.length));if(!n||a.length<2)return i(n),a.length?a.length<2?k(a):d(a):k(),void I(!0);if(g&&(!C||!a[Number(C)]))return void I(!0);const s={summary:{question:n,answers:a.map(((e,t)=>({text:e.trim(),option:String(t),...String(t)===C&&{correct:!0}}))),...!m&&{isPublic:!0},...h&&{multipleChoice:!0},...g&&{quiz:!0}}};if(g){const{text:e,entities:t}=p&&(0,Cs.Z)(p.substring(0,200))||{};s.quiz={correctAnswers:[C],...e&&{solution:e},...t&&{solutionEntities:t}}}t(s)}),[e,l,c,g,C,m,h,t,k,p]),N=(0,a.I4)(((e,t)=>{const n=[...c];n[e]=t,n[n.length-1].trim().length&&n.length<10?k(n):d(n)}),[c,k]),T=(0,a.I4)((e=>{const t=[...c];t.splice(e,1),d(t),requestAnimationFrame((()=>{r.current&&r.current.classList.toggle("overflown",r.current.scrollHeight>320)}))}),[c]),F=(0,a.I4)((e=>{f(e)}),[f]),A=(0,a.I4)((e=>{u(e.target.checked)}),[]),L=(0,a.I4)((e=>{Z(e.target.checked)}),[]),B=(0,a.I4)((e=>{v(e.target.checked)}),[]),$=(0,a.I4)((e=>{13===e.keyCode&&w()}),[w]),D=(0,a.I4)((()=>{if(b&&!l.trim().length)return y("lng_polls_choose_question")}),[b,y,l]),U=(0,a.I4)((e=>{const t=c.map((e=>e.trim())).filter((e=>e.length));if(b&&t.length<2&&!c[e].trim().length)return y("lng_polls_choose_answers")}),[b,y,c]);function O(){return c.map(((e,t)=>a.ZP.createElement("div",{className:"option-wrapper"},a.ZP.createElement(ve.Z,{label:t!==c.length-1||10===c.length?y("OptionHint"):y("CreatePoll.AddOption"),error:U(t),value:e,onChange:e=>N(t,e.currentTarget.value),onKeyPress:$}),t!==c.length-1&&a.ZP.createElement(R.Z,{className:"option-remove-button",round:!0,color:"translucent",size:"smaller",ariaLabel:y("Delete"),onClick:()=>T(t)},a.ZP.createElement("i",{className:"icon-close"})))))}return a.ZP.createElement(ge.Z,{isOpen:e,onClose:n,header:a.ZP.createElement("div",{className:"modal-header-condensed"},a.ZP.createElement(R.Z,{round:!0,color:"translucent",size:"smaller",ariaLabel:"Cancel poll creation",onClick:n},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement("div",{className:"modal-title"},y("NewPoll")),a.ZP.createElement(R.Z,{color:"primary",size:"smaller",className:"modal-action-button",onClick:w},y("Create"))),className:"PollModal"},a.ZP.createElement(ve.Z,{ref:s,label:y("AskAQuestion"),value:l,error:D(),onChange:e=>i(e.currentTarget.value),onKeyPress:$}),a.ZP.createElement("div",{className:"options-divider"}),a.ZP.createElement("div",{className:"options-list custom-scroll",ref:r},a.ZP.createElement("h3",{className:"options-header"},y("PollOptions")),b&&function(){const e=c.map((e=>e.trim())).filter((e=>e.length));return g&&(!C||!e[Number(C)])&&a.ZP.createElement("p",{className:"error"},y("lng_polls_choose_correct"))}(),g?a.ZP.createElement(_e.Z,{name:"correctOption",options:O().map(((e,t)=>({value:String(t),label:e,hidden:t===c.length-1}))),onChange:F}):O()),a.ZP.createElement("div",{className:"options-divider"}),a.ZP.createElement("div",{className:"quiz-mode"},a.ZP.createElement(en.Z,{label:y("PollAnonymous"),checked:m,onChange:A}),a.ZP.createElement(en.Z,{label:y("PollMultiple"),checked:h,disabled:g,onChange:L}),a.ZP.createElement(en.Z,{label:y("PollQuiz"),checked:g,disabled:h,onChange:B}),g&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("h3",{className:"options-header"},y("lng_polls_solution_title")),a.ZP.createElement("div",{ref:o,className:"form-control",contentEditable:!0,dir:"auto",onChange:e=>E(e.currentTarget.innerHTML)}),a.ZP.createElement("div",{className:"note"},y("CreatePoll.ExplanationInfo")))))}));var bs=n(6503),Is=n(4284),ys=n(1367);const Ss=(0,a.X$)((({emoji:e,focus:t,onClick:n})=>{const s=(0,a.I4)((t=>{t.preventDefault(),n(e.native,e.id)}),[e,n]);return a.ZP.createElement("div",{className:"EmojiButton "+(t?"focus":""),onMouseDown:s,title:`:${e.names[0]}:`},i.op?e.native:a.ZP.createElement("img",{src:`./img-apple-64/${e.image}.png`,alt:"",loading:"lazy"}))})),ks=(0,a.X$)((({category:e,index:t,allEmojis:n,observeIntersection:s,shouldRender:r,onEmojiSelect:o})=>{const l=(0,a.sO)(null);(0,vn._N)(l,s);const d=(0,pn.Z)(r),m=(0,M.Z)(),u=i.wB?Math.floor((c.Z.get().width-8)/44):9,h=44*Math.ceil(e.emojis.length/u);return a.ZP.createElement("div",{ref:l,key:e.id,id:`emoji-category-${t}`,className:"symbol-set"},a.ZP.createElement("p",{className:"symbol-set-name",dir:"auto"},m("recent"===e.id?"RecentStickers":`Emoji${t}`)),a.ZP.createElement("div",{className:(0,X.Z)("symbol-set-container",d),style:`height: ${h}px;`,dir:m.isRtl?"rtl":void 0},r&&e.emojis.map((e=>{const t=n[e];if(!t)return;const s="id"in t?t:t[1];return a.ZP.createElement(Ss,{key:s.id,emoji:s,onClick:o})}))))})),ws={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"},Ns=[];let Ms,Ts,Fs;const As=(0,a.X$)((0,s.c$)((e=>(0,h.ei)(e,["recentEmojis"])))((({className:e,onEmojiSelect:t,recentEmojis:s})=>{const r=(0,a.sO)(null),o=(0,a.sO)(null),[c,d]=(0,a.eJ)(),[m,u]=(0,a.eJ)(),[h,Z]=(0,a.eJ)(0),{observe:P}=(0,vn.S1)({rootRef:r,throttleMs:200},(e=>{e.forEach((e=>{const{id:t}=e.target;if(!t||!t.startsWith("emoji-category-"))return;const n=Number(t.replace("emoji-category-",""));Ns[n]=e.isIntersecting}));const t=Ns.map(((e,t)=>({index:t,isIntersecting:e}))).filter((({isIntersecting:e})=>e));t.length&&Z(t[Math.floor(t.length/2)].index)}));(0,tt.Z)(o.current,!i.wB),(0,a.d4)((()=>{if(!c)return;const e=o.current;if(!e)return;const t=42*h-e.offsetWidth/2+21;(0,ys.Z)(e,t)}),[c,h]);const g=(0,M.Z)(),v=(0,a.Ye)((()=>{if(!c)return je.D;const e=[...c];return null!=s&&s.length&&e.unshift({id:"recent",name:g("RecentStickers"),emojis:s}),e}),[c,g,s]);(0,a.d4)((()=>{setTimeout((()=>{const e=()=>{d(Fs.categories),u(Fs.emojis)};Fs?e():async function(){return Ms||(Ms=n.e(501).then(n.t.bind(n,7501,19)),Ts=(await Ms).default,Fs=(0,Is.NM)(Ts)),Ms}().then(e)}),200)}),[]);const p=(0,a.I4)((e=>{Z(e);const t=document.getElementById(`emoji-category-${e}`);(0,hs.Z)(r.current,t,"start",50,800)}),[]),E=(0,a.I4)(((e,n)=>{t(e,n)}),[t]),C=(0,Pt.Z)([],l.kU),f=(0,X.Z)("EmojiPicker",e);return m&&C?a.ZP.createElement("div",{className:f},a.ZP.createElement("div",{ref:o,className:"EmojiPicker-header",dir:g.isRtl?"rtl":""},v.map((function(e,t){const n=ws[e.id];return n&&a.ZP.createElement(R.Z,{className:"symbol-set-button "+(t===h?"activated":""),round:!0,faded:!0,color:"translucent",onClick:()=>p(t),ariaLabel:e.name},a.ZP.createElement("i",{className:n}))}))),a.ZP.createElement("div",{ref:r,className:(0,X.Z)("EmojiPicker-main no-selection",i.$b?"no-scrollbar":"custom-scroll")},v.map(((e,t)=>a.ZP.createElement(ks,{category:e,index:t,allEmojis:m,observeIntersection:P,shouldRender:h>=t-1&&h<=t+1,onEmojiSelect:E}))))):a.ZP.createElement("div",{className:f},a.ZP.createElement(Pe.Z,null))}))),Ls=i.wB?8:16,Rs=(0,a.X$)((({stickerSet:e,loadAndPlay:t,index:n,observeIntersection:s,shouldRender:r,onStickerSelect:o,onStickerUnfave:d})=>{const m=(0,a.sO)(null);(0,vn._N)(m,s);const u=(0,pn.Z)(r),h=i.wB?Math.floor((c.Z.get().width-8)/(l.Q+Ls)):5,Z=Math.ceil(e.count/h)*(l.Q+Ls);return a.ZP.createElement("div",{ref:m,key:e.id,id:`sticker-set-${n}`,className:"symbol-set"},a.ZP.createElement("p",{className:"symbol-set-name"},e.title),a.ZP.createElement("div",{className:(0,X.Z)("symbol-set-container",u),style:`height: ${Z}px;`},r&&e.stickers&&e.stickers.map((n=>a.ZP.createElement(bn.Z,{key:n.id,sticker:n,size:l.Q,observeIntersection:s,noAnimate:!t,onClick:o,clickArg:n,onUnfaveClick:"favorite"===e.id?d:void 0})))))})),Bs=[],$s=(0,a.X$)((0,s.c$)((e=>{const{setsById:t,added:n,recent:a,favorite:s}=e.stickers;return{recentStickers:a.stickers,favoriteStickers:s.stickers,stickerSetsById:t,addedSetIds:n.setIds,shouldPlay:e.settings.byKey.shouldLoopStickers}}),((e,t)=>(0,h.ei)(t,["loadStickerSets","loadRecentStickers","loadFavoriteStickers","loadAddedStickers","addRecentSticker","unfaveSticker"])))((({className:e,loadAndPlay:t,canSendStickers:n,recentStickers:s,favoriteStickers:r,addedSetIds:o,stickerSetsById:c,shouldPlay:d,onStickerSelect:m,loadStickerSets:u,loadRecentStickers:h,loadFavoriteStickers:Z,loadAddedStickers:P,addRecentSticker:g,unfaveSticker:v})=>{const p=(0,a.sO)(null),E=(0,a.sO)(null),[C,f]=(0,a.eJ)(0),{observe:b}=(0,vn.S1)({rootRef:p,throttleMs:200},(e=>{e.forEach((e=>{const{id:t}=e.target;if(!t||!t.startsWith("sticker-set-"))return;const n=Number(t.replace("sticker-set-",""));Bs[n]=e.isIntersecting}));const t=Bs.map(((e,t)=>({index:t,isIntersecting:e}))).filter((({isIntersecting:e})=>e));t.length&&f(t[Math.floor(t.length/2)].index)})),{observe:I}=(0,vn.S1)({rootRef:E}),y=(0,M.Z)(),S=Boolean(o),k=(0,a.Ye)((()=>o?[{id:"recent",title:y("RecentStickers"),stickers:s,count:s.length},{id:"favorite",title:y("FavoriteStickers"),stickers:r,count:r.length},...o.map((e=>c[e])).filter(Boolean)]:je.D),[o,y,s,r,c]),w=(0,a.Ye)((()=>S&&0===k.filter((e=>{var t;return null===(t=e.stickers)||void 0===t?void 0:t.length})).length),[k,S]);(0,a.d4)((()=>{t&&(u(),h(),Z())}),[t,Z,h,u]),(0,a.d4)((()=>{null!=o&&o.length&&P()}),[o,P]),(0,tt.Z)(E.current),(0,a.d4)((()=>{if(!S)return;const e=E.current;if(!e)return;const t=52*C-(e.offsetWidth/2-26);(0,ys.Z)(e,t)}),[S,C]);const N=(0,a.I4)((e=>{f(e);const t=document.getElementById(`sticker-set-${e}`);(0,hs.Z)(p.current,t,"start",void 0,500)}),[]),T=(0,a.I4)((e=>{m(e),g({sticker:e})}),[g,m]),F=(0,a.I4)((e=>{v({sticker:e})}),[v]),A=(0,Pt.Z)([],l.Y),L=(0,X.Z)("StickerPicker",e);return S&&A&&!w&&n?a.ZP.createElement("div",{className:L},a.ZP.createElement("div",{ref:E,className:"StickerPicker-header no-selection no-scrollbar"},k.map((function(e,t){var n;const s=null===(n=e.stickers)||void 0===n?void 0:n[0],r=(0,X.Z)("symbol-set-button sticker-set-button",t===C&&"activated");return"recent"===e.id||"favorite"===e.id||e.hasThumbnail||!s?a.ZP.createElement(R.Z,{key:e.id,className:r,ariaLabel:e.title,round:!0,faded:"recent"===e.id||"favorite"===e.id,color:"translucent",onClick:()=>N(t)},"recent"===e.id?a.ZP.createElement("i",{className:"icon-recent"}):"favorite"===e.id?a.ZP.createElement("i",{className:"icon-favorite"}):e.isAnimated?a.ZP.createElement(Cn,{stickerSet:e,observeIntersection:I}):a.ZP.createElement(fn,{stickerSet:e,observeIntersection:I})):a.ZP.createElement(bn.Z,{key:e.id,sticker:s,size:l.DC,title:e.title,className:r,observeIntersection:I,onClick:N,clickArg:t})}))),a.ZP.createElement("div",{ref:p,className:(0,X.Z)("StickerPicker-main no-selection",i.$b?"no-scrollbar":"custom-scroll")},k.map(((e,n)=>a.ZP.createElement(Rs,{key:e.id,stickerSet:e,loadAndPlay:Boolean(d&&t),index:n,observeIntersection:b,shouldRender:C>=n-1&&C<=n+1,onStickerSelect:T,onStickerUnfave:F}))))):a.ZP.createElement("div",{className:L},n?w?a.ZP.createElement("div",{className:"picker-disabled"},y("NoStickers")):a.ZP.createElement(Pe.Z,null):a.ZP.createElement("div",{className:"picker-disabled"},y("ErrorSendRestrictedStickersAll")))})));var Ds=n(386);function Us(){return(Us=Object.assign||function(e){for(var t=1;t{var l,i;const c=(0,a.sO)(null),d=(0,a.sO)(null),m=Boolean(null===(l=e.thumbnail)||void 0===l?void 0:l.dataUri),u=`gif${e.id}`,h=(0,vn.Op)(c,t)&&!n,Z=(0,p.Z)(`${u}?size=m`,!h,r.IU.BlobUrl),P=(0,Dn.Z)(null===(i=e.thumbnail)||void 0===i?void 0:i.dataUri,Boolean(Z)),g=(0,p.Z)(u,!h,r.IU.BlobUrl),v=Boolean(h&&g),{isBuffered:E,bufferingHandlers:C}=(0,H.Z)(!0),f=h&&!E,b=h&&E;(0,j.Z)(d,[v]);const I=(0,a.I4)((()=>o({...e,blobUrl:g})),[o,e,g]),y=(0,X.Z)("GifButton",e.width&&e.height&&e.width({savedGifs:e.gifs.saved.gifs})),((e,t)=>(0,h.ei)(t,["loadSavedGifs"])))((({className:e,loadAndPlay:t,canSendGifs:n,savedGifs:s,onGifSelect:r,loadSavedGifs:o})=>{const c=(0,a.sO)(null),{observe:d}=(0,vn.S1)({rootRef:c,debounceMs:300});(0,a.d4)((()=>{t&&o()}),[t,o]);const m=(0,Pt.Z)([],l.Y);return a.ZP.createElement("div",{ref:c,className:(0,X.Z)("GifPicker",e,i.$b?"no-scrollbar":"custom-scroll")},n?m&&s&&s.length?s.map((e=>a.ZP.createElement(Os,{key:e.id,gif:e,observeIntersection:d,isDisabled:!t,onClick:r}))):m&&s?a.ZP.createElement("div",{className:"picker-disabled"},"No saved GIFs."):a.ZP.createElement(Pe.Z,null):a.ZP.createElement("div",{className:"picker-disabled"},"Sending GIFs is not allowed in this chat."))})));let Gs;!function(e){e[e.Emoji=0]="Emoji",e[e.Stickers=1]="Stickers",e[e.GIFs=2]="GIFs"}(Gs||(Gs={}));const Js=Object.values(Gs).filter((e=>"string"==typeof e)),zs={[Gs.Emoji]:"icon-smile",[Gs.Stickers]:"icon-stickers",[Gs.GIFs]:"icon-gifs"},Xs=(0,a.X$)((({activeTab:e,onSwitchTab:t,onRemoveSymbol:n,onSearchOpen:s})=>{const r=(0,M.Z)();function o(n){return a.ZP.createElement(R.Z,{className:"symbol-tab-button "+(e===n?"activated":""),onClick:()=>t(n),ariaLabel:Js[n],round:!0,faded:!0,color:"translucent"},a.ZP.createElement("i",{className:zs[n]}))}const l=(0,a.I4)((()=>{s(e===Gs.Stickers?"stickers":"gifs")}),[e,s]);return a.ZP.createElement("div",{className:"SymbolMenu-footer",onClick:function(e){e.stopPropagation()},dir:r.isRtl?"rtl":void 0},e!==Gs.Emoji&&a.ZP.createElement(R.Z,{className:"symbol-search-button",ariaLabel:e===Gs.Stickers?"Search Stickers":"Search GIFs",round:!0,faded:!0,color:"translucent",onClick:l},a.ZP.createElement("i",{className:"icon-search"})),o(Gs.Emoji),o(Gs.Stickers),o(Gs.GIFs),e===Gs.Emoji&&a.ZP.createElement(R.Z,{className:"symbol-delete-button",onClick:n,ariaLabel:"Remove Symbol",round:!0,faded:!0,color:"translucent"},a.ZP.createElement("i",{className:"icon-delete-left"})))}));let _s=!1;const Ys=(0,a.X$)((0,s.c$)((e=>({isLeftColumnShown:e.isLeftColumnShown})))((({isOpen:e,allowedAttachmentOptions:t,isLeftColumnShown:n,onLoad:s,onClose:r,onEmojiSelect:o,onStickerSelect:l,onGifSelect:c,onRemoveSymbol:d,onSearchOpen:m,addRecentEmoji:u})=>{const[h,Z]=(0,a.eJ)(0),[P,g]=(0,a.eJ)([]),[v,p]=(0,bs.Z)(e,r,void 0,i.wB),{shouldRender:E,transitionClassNames:C}=(0,Y.Z)(e,r,!1,!1);!_s&&e&&(_s=!0),(0,a.d4)((()=>{s()}),[s]),(0,a.bt)((()=>{if(i.wB)return e&&(document.body.classList.add("enable-symbol-menu-transforms"),document.body.classList.add("is-symbol-menu-open")),()=>{e&&(0,z.T2)((()=>{document.body.classList.remove("is-symbol-menu-open"),setTimeout((()=>{document.body.classList.remove("enable-symbol-menu-transforms")}),350)}))}}),[e]);const f=(0,a.sO)(P);f.current=P,(0,a.d4)((()=>{f.current.length&&(f.current.forEach((e=>{u({emoji:e})})),g([]))}),[e,h,u]);const b=(0,a.I4)(((e,t)=>{g((e=>[...e,t])),o(e)}),[o]),I=(0,a.I4)((e=>{r(),m(e)}),[r,m]),y=(0,a.I4)((e=>{l(e,!0)}),[l]),S=(0,M.Z)(),{canSendStickers:k,canSendGifs:w}=t;function N(t,n){switch(h){case Gs.Emoji:return a.ZP.createElement(As,{className:"picker-tab",onEmojiSelect:b});case Gs.Stickers:return a.ZP.createElement($s,{className:"picker-tab",loadAndPlay:!!k&&e&&(t||n),canSendStickers:k,onStickerSelect:y});case Gs.GIFs:return a.ZP.createElement(xs,{className:"picker-tab",loadAndPlay:!!w&&e&&(t||n),canSendGifs:w,onGifSelect:c})}}const T=a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("div",{className:"SymbolMenu-main",onClick:function(e){e.stopPropagation()}},_s&&a.ZP.createElement(L.Z,{name:"slide",activeKey:h,renderCount:Js.length},N)),i.wB&&a.ZP.createElement(R.Z,{round:!0,faded:!0,color:"translucent",ariaLabel:S("Close"),className:"symbol-close-button",size:"tiny",onClick:r},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement(Xs,{activeTab:h,onSwitchTab:Z,onRemoveSymbol:d,onSearchOpen:I}));if(i.wB){if(!E)return;const e=(0,X.Z)("SymbolMenu mobile-menu",C,!n&&"middle-column-open");return a.ZP.createElement(ts.Z,null,a.ZP.createElement("div",{className:e},T))}return a.ZP.createElement(qa.Z,{isOpen:e,positionX:"left",positionY:"bottom",onClose:r,className:"SymbolMenu",onCloseAnimationEnd:r,onMouseEnter:i.$b?void 0:v,onMouseLeave:i.$b?void 0:p,noCloseOnBackdrop:!i.$b},T)}))),Hs=(0,a.X$)((({isOpen:e,allowedAttachmentOptions:t,onFileSelect:n,onPollCreate:s,onClose:r})=>{const[o,c]=(0,bs.Z)(e,r),d=(0,a.I4)(((e,t)=>{const{files:a}=e.target;a&&a.length>0&&n(Array.from(a),t)}),[n]),m=(0,a.I4)((()=>{Mn(Array.from(l.dI).join(","),(e=>d(e,!0)))}),[d]),u=(0,a.I4)((()=>{Mn("*",(e=>d(e,!1)))}),[d]),h=(0,M.Z)(),{canAttachMedia:Z,canAttachPolls:P}=t;return a.ZP.createElement(qa.Z,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",onClose:r,className:"AttachMenu fluid",onCloseAnimationEnd:r,onMouseEnter:i.$b?void 0:o,onMouseLeave:i.$b?void 0:c,noCloseOnBackdrop:!i.$b},!Z&&a.ZP.createElement(x.Z,{className:"media-disabled",disabled:!0},"Posting media content is not allowed in this group."),Z&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(x.Z,{icon:"photo",onClick:m},h("AttachmentMenu.PhotoOrVideo")),a.ZP.createElement(x.Z,{icon:"document",onClick:u},h("AttachDocument"))),P&&a.ZP.createElement(x.Z,{icon:"poll",onClick:s},h("Poll")))})),Vs=(0,a.X$)((({withAvatar:e,focus:t,botCommand:n,bot:s,onClick:r})=>a.ZP.createElement(Ee.Z,{key:n.command,className:(0,X.Z)("BotCommand chat-item-clickable scroll-item",e&&"with-avatar"),multiline:!0,onClick:()=>r(n),focus:t},e&&a.ZP.createElement(D.Z,{size:"small",user:s}),a.ZP.createElement("div",{className:"content-inner"},a.ZP.createElement("span",{className:"title"},"/",n.command),a.ZP.createElement("span",{className:"subtitle"},(0,$.Z)(n.description)))))),js=(0,a.X$)((0,s.c$)((e=>({usersById:e.users.byId})),((e,t)=>(0,h.ei)(t,["sendBotCommand"])))((({usersById:e,isOpen:t,withUsername:n,botCommands:s,onClick:r,onClose:o,sendBotCommand:l})=>{const i=(0,a.sO)(null),{shouldRender:c,transitionClassNames:d}=(0,Y.Z)(t,void 0,void 0,!1),m=(0,a.I4)((({botId:t,command:a})=>{const s=e[t];l({command:`/${a}${n&&s?`@${s.username}`:""}`,botId:t}),r()}),[r,l,e,n]),u=gs({isActive:t,items:s,onSelect:m,onClose:o});(0,a.d4)((()=>{s&&!s.length&&o()}),[s,o]),(0,a.d4)((()=>{Zs(".chat-item-clickable",u,i)}),[u]);const h=(0,f.Z)(s&&s.length?s:void 0,c),Z=s&&!s.length?h:s;if(!c||Z&&!Z.length)return;const P=(0,X.Z)("BotCommandTooltip composer-tooltip custom-scroll",d);return a.ZP.createElement("div",{className:P,ref:i},Z&&Z.map(((t,n)=>a.ZP.createElement(Vs,{key:`${t.botId}_${t.command}`,botCommand:t,bot:e[t.botId],withAvatar:!0,onClick:m,focus:u===n}))))}))),Ks=(0,a.X$)((0,s.c$)(void 0,((e,t)=>(0,h.ei)(t,["sendBotCommand"])))((({isOpen:e,botCommands:t,onClose:n,sendBotCommand:s})=>{const[r,o]=(0,bs.Z)(e,n,void 0,i.wB),l=(0,a.I4)((e=>{s({command:`/${e.command}`,botId:e.botId}),n()}),[n,s]);return a.ZP.createElement(qa.Z,{isOpen:e,positionX:"left",positionY:"bottom",onClose:n,className:"BotCommandMenu",onCloseAnimationEnd:n,onMouseEnter:i.$b?void 0:r,onMouseLeave:i.$b?void 0:o,noCloseOnBackdrop:!i.$b},t.map((e=>a.ZP.createElement(Vs,{key:e.command,botCommand:e,onClick:l}))))}))),qs=(0,a.X$)((0,s.c$)((e=>{const{stickers:t}=e.stickers.forEmoji;return{stickers:t}}),((e,t)=>(0,h.ei)(t,["clearStickersForEmoji"])))((({isOpen:e,onStickerSelect:t,stickers:n,clearStickersForEmoji:s})=>{const r=(0,a.sO)(null),{shouldRender:o,transitionClassNames:c}=(0,Y.Z)(e,void 0,void 0,!1),d=(0,f.Z)(n,!0),m=n||d,{observe:u}=(0,vn.S1)({rootRef:r,throttleMs:200});(0,a.d4)((()=>e?(0,P.Z)(s):void 0),[e,s]);const h=(0,X.Z)("StickerTooltip composer-tooltip custom-scroll",c,!(null!=m&&m.length)&&"hidden");return a.ZP.createElement("div",{ref:r,className:h,onMouseEnter:i.$b?void 0:()=>{document.body.classList.add("no-select")},onMouseLeave:i.$b?void 0:()=>{document.body.classList.remove("no-select")}},o&&m?m.map((e=>a.ZP.createElement(bn.Z,{key:e.id,sticker:e,size:l.Q,observeIntersection:u,onClick:t,clickArg:e}))):o?a.ZP.createElement(Pe.Z,null):void 0)}))),Ws=(0,a.X$)((({isOpen:e,onSilentSend:t,onScheduleSend:n,onClose:s,onCloseAnimationEnd:r})=>{const[o,l]=(0,bs.Z)(e,s),c=(0,M.Z)();return a.ZP.createElement(qa.Z,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",className:"CustomSendMenu",onClose:s,onCloseAnimationEnd:r,onMouseEnter:i.$b?void 0:o,onMouseLeave:i.$b?void 0:l,noCloseOnBackdrop:!i.$b},t&&a.ZP.createElement(x.Z,{icon:"mute",onClick:t},c("SendWithoutSound")),n&&a.ZP.createElement(x.Z,{icon:"schedule",onClick:n},c("ScheduleMessage")))}));var Qs=n(2420),er=n(3283),tr=n(2678);const nr=(0,a.X$)((({isOpen:e,emojis:t,onClose:n,onEmojiSelect:s,addRecentEmoji:r})=>{const o=(0,a.sO)(null),{shouldRender:l,transitionClassNames:c}=(0,Y.Z)(e,void 0,void 0,!1),d=(0,tr.Z)(t.length?t:void 0,350)||[],m=(0,a.I4)((e=>{s(e.native),r({emoji:e.id})}),[r,s]),u=(0,a.I4)(((e,t)=>{s(e),r({emoji:t})}),[r,s]),h=gs({isActive:e,isHorizontal:!0,items:t,onSelect:m,onClose:n});(0,a.d4)((()=>{!function(e,t){const n=t.current;if(!n)return;const{visibleIndexes:a,allElements:s}=ms(n,".EmojiButton",8,!0,!0,!0);if(!s.length||!s[e])return;const r=a[0];if(!a.includes(e)||e===r&&!us(n,s[r],!0)){const t="start"==(e>a[a.length-1]?"start":"end")?44*e:0;(0,ys.Z)(n,t)}}(h,o)}),[h]);const Z=(0,X.Z)("EmojiTooltip composer-tooltip custom-scroll-x",c);return a.ZP.createElement("div",{ref:o,className:Z,onMouseEnter:i.$b?void 0:()=>{document.body.classList.add("no-select")},onMouseLeave:i.$b?void 0:()=>{document.body.classList.remove("no-select")}},l&&d?d.map(((e,t)=>a.ZP.createElement(Ss,{key:e.id,emoji:e,focus:h===t,onClick:u}))):l?a.ZP.createElement(Pe.Z,null):void 0)})),ar=(0,a.X$)((({title:e,description:t,thumbnail:n,thumbUrl:s,focus:r,transitionClassNames:o="",onClick:l})=>{let i="";const c=(0,p.Z)(n?`webDocument:${n.url}`:void 0);return(s=s||c)?i=a.ZP.createElement("img",{src:s,className:o,alt:"",decoding:"async",draggable:"false"}):e&&(i=(0,En.Xv)(e,1)),a.ZP.createElement(Ee.Z,{focus:r,className:"BaseResult chat-item-clickable",onMouseDown:Ds.b,onClick:l},a.ZP.createElement("span",{className:"thumb"},"string"==typeof i?(0,$.Z)(i):i),a.ZP.createElement("div",{className:"content-inner"},e&&a.ZP.createElement("div",{className:"title"},e),t&&a.ZP.createElement("div",{className:"description"},t)))})),sr=(0,a.X$)((({focus:e,isForGallery:t,inlineResult:n,onClick:s})=>{var r;let o,l,i;"photo"in n&&(o=n.photo),"thumbnail"in n&&(l=n.thumbnail),"webThumbnail"in n&&t&&(i=n.webThumbnail);const c=(0,p.Z)(i?`webDocument:${i.url}`:void 0),d=(0,p.Z)(o&&`photo${o.id}?size=m`),m=(0,pn.Z)(d),u=(0,a.I4)((()=>{s(n)}),[n,s]);var h,Z;if(t)return a.ZP.createElement("div",{className:"MediaResult chat-item-clickable",onClick:u},a.ZP.createElement("img",{src:(null===(h=o)||void 0===h||null===(Z=h.thumbnail)||void 0===Z?void 0:Z.dataUri)||c,alt:""}),a.ZP.createElement("img",{src:d,className:(0,X.Z)("full-media",m),alt:""}));const{title:P,description:g}=n;return a.ZP.createElement(ar,{focus:e,thumbUrl:d||(null===(r=l)||void 0===r?void 0:r.dataUri)||c,transitionClassNames:m,title:P,description:g,onClick:u})})),rr=(0,a.X$)((({focus:e,inlineResult:t,onClick:n})=>{const{title:s,url:r,description:o,webThumbnail:l}=t,i=(0,a.I4)((()=>{n(t)}),[t,n]);return a.ZP.createElement(ar,{focus:e,thumbnail:l,title:s||r,description:o,onClick:i})})),or=(0,a.X$)((({inlineResult:e,observeIntersection:t,onClick:n})=>{const{gif:s}=e,r=(0,a.I4)((()=>{n(e)}),[e,n]);if(s)return a.ZP.createElement(Os,{gif:s,observeIntersection:t,className:"chat-item-clickable",onClick:r})})),lr=(0,a.X$)((({inlineResult:e,observeIntersection:t,onClick:n})=>{const{sticker:s}=e;if(s)return a.ZP.createElement(bn.Z,{sticker:s,size:l.zq,observeIntersection:t,title:s.emoji,className:"chat-item-clickable",onClick:n,clickArg:e})})),ir=(0,z.P2)((e=>e()),500,!0),cr=(0,a.X$)((0,s.c$)(void 0,((e,t)=>(0,h.ei)(t,["startBot","openChat","sendInlineBotResult"])))((({isOpen:e,botId:t,isGallery:n,inlineBotResults:s,switchPm:r,loadMore:l,onClose:c,openChat:d,startBot:m,onSelectResult:u})=>{const h=(0,a.sO)(null),{shouldRender:Z,transitionClassNames:P}=(0,Y.Z)(e,void 0,void 0,!1),{observe:g}=(0,vn.S1)({rootRef:h,debounceMs:200,isDisabled:!e}),v=(0,a.I4)((({direction:e})=>{e===o.Uq.Backwards&&ir(l)}),[l]),p=gs({isActive:e,shouldRemoveSelectionOnReset:n,noArrowNavigation:n,items:s,onSelect:u,onClose:c});(0,a.d4)((()=>{Zs(".chat-item-clickable",p,h)}),[p]);const E=(0,a.I4)((()=>{d({id:t}),m({botId:t,param:r.startParam})}),[t,d,m,r]),C=(0,f.Z)(null!=s&&s.length?s:void 0,Z),b=s&&!s.length?C:s;if(!Z||!b||!b.length&&!r)return;const I=(0,X.Z)("InlineBotTooltip composer-tooltip",i.$b?"no-scrollbar":"custom-scroll",n&&"gallery",P);return a.ZP.createElement(pe.Z,{ref:h,className:I,items:b,itemSelector:".chat-item-clickable",noFastList:!0,onLoadMore:v,sensitiveArea:160},r&&a.ZP.createElement(Ee.Z,{ripple:!0,className:"switch-pm scroll-item",onClick:E},a.ZP.createElement("span",{className:"title"},r.text)),b.map(((e,t)=>{switch(e.type){case"gif":return a.ZP.createElement(or,{key:e.id,inlineResult:e,observeIntersection:g,onClick:u});case"photo":return a.ZP.createElement(sr,{key:e.id,isForGallery:n,inlineResult:e,onClick:u});case"sticker":return a.ZP.createElement(lr,{key:e.id,inlineResult:e,observeIntersection:g,onClick:u});case"video":case"game":return a.ZP.createElement(sr,{key:e.id,focus:p===t,inlineResult:e,onClick:u});case"article":case"audio":return a.ZP.createElement(rr,{key:e.id,focus:p===t,inlineResult:e,onClick:u});default:return}})))})));var dr=n(6844);const mr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,m.Z1)(e,t),a=n&&(0,m.Zw)(e,n.id);if(!n||!a)return{};const{query:s,results:r}=(0,m.n5)(e)||{},{totalCount:o,foundIds:l}=r||{};return{chat:n,messagesById:a,query:s,totalCount:o,foundIds:l}}),((e,t)=>(0,h.ei)(t,["searchTextMessagesLocal","focusMessage"])))((({chatId:e,threadId:t,onClose:n,isActive:r,chat:o,messagesById:l,query:i,totalCount:c,foundIds:d,searchTextMessagesLocal:Z,focusMessage:P})=>{const g=(0,M.Z)(),v=(0,a.Ye)((()=>{if(!(i&&d&&d.length&&l))return je.D;const n=d.map((n=>{const a=l[n];if(!a)return;const r=a.senderId?(0,m.dy)((0,s.Rd)(),a.senderId):void 0;let i;if(o&&(0,u.eA)(o))i=o;else if(a.forwardInfo){const{isChannelPost:e,fromChatId:t}=a.forwardInfo;i=e&&t?(0,m.Z1)((0,s.Rd)(),t):void 0}else i=a.senderId?(0,m.Z1)((0,s.Rd)(),a.senderId):void 0;return{message:a,senderUser:r,senderChat:i,onClick:()=>P({chatId:e,threadId:t,messageId:n})}})).filter(Boolean);return(0,h.Xo)(n,(({message:e})=>e.date),"desc")}),[e,t,P,d,o,l,i]);(0,T.ZP)(r,n);const p=(0,a.sO)(null),E=(0,he.Z)(p,!0,(e=>{const t=null==v?void 0:v[-1===e?0:e];t&&t.onClick()}),".ListItem-button",!0);return a.ZP.createElement(pe.Z,{className:"RightSearch custom-scroll",items:v,preloadBackwards:0,onLoadMore:Z,noFastList:!0,onKeyDown:E,ref:p},a.ZP.createElement("p",{className:"helper-text",dir:"auto"},i?0!==c&&v.length?1===c?"1 message found":`${v.length&&(c||v.length)} messages found`:g("lng_search_no_results"):g("lng_dlg_search_for_messages")),v.map((({message:e,senderUser:t,senderChat:n,onClick:s})=>{const r=n?(0,u.U)(g,n):(0,u.Js)(t),o=(0,u.MK)(g,e);return a.ZP.createElement(Ee.Z,{className:"chat-item-clickable search-result-message m-0",onClick:s},a.ZP.createElement(D.Z,{chat:n,user:t}),a.ZP.createElement("div",{className:"info"},a.ZP.createElement("div",{className:"title"},a.ZP.createElement("h3",{dir:"auto"},r&&(0,$.Z)(r)),a.ZP.createElement(dr.Z,{message:e})),a.ZP.createElement("div",{className:"subtitle",dir:"auto"},(0,$.Z)(o,["emoji","highlight"],{highlight:i}))))})))})));var ur=n(9290);const hr=(0,a.X$)((0,s.c$)(((e,{stickerSetId:t})=>({set:(0,m.Ny)(e,t),shouldPlay:(0,m.yB)(e)})),((e,t)=>(0,h.ei)(t,["loadStickers","toggleStickerSet"])))((({stickerSetId:e,observeIntersection:t,set:n,shouldPlay:s,loadStickers:r,toggleStickerSet:o,isSomeModalOpen:i,onModalToggle:c})=>{const d=(0,M.Z)(),m=n&&Boolean(n.installedDate),u=Boolean(null==n?void 0:n.stickers),[h,Z,P]=(0,Le.Z)();(0,ur.Z)((()=>{c(h)}),[h,c]);const g=(0,a.Ye)((()=>{if(!n)return[];const e=(n.covers||[]).map((({id:e})=>e)),t=n.stickers?n.stickers.filter((({id:t})=>!e.includes(t))):[];return[...n.covers||[],...t].slice(0,5)}),[n]);(0,a.d4)((()=>{!u&&g.length<5&&r({stickerSetId:e})}),[u,g.length,r,e]);const v=(0,a.I4)((()=>{o({stickerSetId:e})}),[o,e]);if(!n)return;const p=g.length>0;return a.ZP.createElement("div",{key:n.id,className:"sticker-set",dir:d.isRtl?"rtl":void 0},a.ZP.createElement("div",{className:"sticker-set-header"},a.ZP.createElement("div",{className:"title-wrapper"},a.ZP.createElement("h3",{className:"title",dir:"auto"},n.title),a.ZP.createElement("p",{className:"count",dir:"auto"},d("Stickers",n.count,"i"))),a.ZP.createElement(R.Z,{className:m?"is-added":void 0,color:"primary",size:"tiny",pill:!0,fluid:!0,onClick:v},d(m?"Stickers.Installed":"Stickers.Install"))),a.ZP.createElement("div",{className:"sticker-set-main"},!p&&a.ZP.createElement(F.Z,null),p&&g.map((e=>a.ZP.createElement(bn.Z,{sticker:e,size:l.Y7,observeIntersection:t,noAnimate:!s||h||i,onClick:Z})))),p&&a.ZP.createElement(yn.Z,{isOpen:h,fromSticker:g[0],onClose:P}))}))),Zr=(0,z.P2)((e=>e()),6e4,!0),Pr=(0,a.X$)((0,s.c$)((e=>{const t=(0,m.y5)(e),{query:n,resultIds:a}=t||{},{featured:s}=e.stickers;return{query:n,featuredIds:s.setIds,resultIds:a}}),((e,t)=>(0,h.ei)(t,["loadFeaturedStickers"])))((({onClose:e,isActive:t,query:n,featuredIds:s,resultIds:r,loadFeaturedStickers:o})=>{const l=(0,a.sO)(null),i=(0,M.Z)(),[c,d]=(0,a.eJ)(!1),{observe:m}=(0,vn.S1)({rootRef:l,throttleMs:200});return(0,a.d4)((()=>{Zr((()=>{o()}))})),(0,T.ZP)(t,e),a.ZP.createElement("div",{ref:l,className:"StickerSearch custom-scroll",dir:i.isRtl?"rtl":void 0},function(){if(void 0!==n)return!n&&s?s.map((e=>a.ZP.createElement(hr,{key:e,stickerSetId:e,observeIntersection:m,isSomeModalOpen:c,onModalToggle:d}))):r?r.length?r.map((e=>a.ZP.createElement(hr,{key:e,stickerSetId:e,observeIntersection:m,isSomeModalOpen:c,onModalToggle:d}))):a.ZP.createElement("p",{className:"helper-text",dir:"auto"},"Nothing found."):a.ZP.createElement(Pe.Z,null)}())}))),gr=(0,a.X$)((0,s.c$)((e=>{const t=(0,m.yN)(e),{query:n,results:a}=t||{},{chatId:s}=(0,m.Bt)(e)||{},r=s?(0,m.Z1)(e,s):void 0;return{query:n,results:a,chat:r,isChatWithBot:r?(0,m.xo)(e,r):void 0}}),((e,t)=>(0,h.ei)(t,["searchMoreGifs","sendMessage","setGifSearchQuery"])))((({onClose:e,isActive:t,query:n,results:s,chat:r,isChatWithBot:o,searchMoreGifs:l,sendMessage:c,setGifSearchQuery:d})=>{const m=(0,a.sO)(null),{observe:h}=(0,vn.S1)({rootRef:m,debounceMs:300}),{canSendGifs:Z}=(0,u.H5)(r,o),P=(0,a.I4)((e=>{Z&&c({gif:e}),i.$b&&d({query:void 0})}),[Z,c,d]),g=(0,M.Z)();(0,T.ZP)(t,e);const v=Boolean(void 0!==n&&s&&s.length);return a.ZP.createElement("div",{className:"GifSearch",dir:g.isRtl?"rtl":void 0},a.ZP.createElement(pe.Z,{ref:m,className:(0,X.Z)("gif-container custom-scroll",v&&"grid"),items:s,itemSelector:".GifButton",preloadBackwards:96,noFastList:!0,onLoadMore:l},function(){if(void 0!==n)return s?s.length?s.map((e=>a.ZP.createElement(Os,{key:e.id,gif:e,observeIntersection:h,onClick:P}))):a.ZP.createElement("p",{className:"helper-text",dir:"auto"},g("NoGIFsFound")):a.ZP.createElement(Pe.Z,null)}()))}))),vr=(0,a.X$)((0,s.c$)(((e,{answer:t})=>{const{voters:n,offsets:a}=e.pollResults;return{voters:null==n?void 0:n[t.option],offset:(null==a?void 0:a[t.option])||""}}),((e,t)=>(0,h.ei)(t,["loadPollOptionResults","openChat","closePollResults"])))((({chat:e,message:t,answer:n,answerVote:s,totalVoters:r,voters:o,offset:l,loadPollOptionResults:i,openChat:c,closePollResults:d})=>{const m=(0,f.Z)(s.votersCount),[u,h]=(0,a.eJ)(!0),Z=Boolean(o),{option:P,text:g}=n,v=(0,M.Z)();(0,a.d4)((()=>{Z&&m===s.votersCount||i({chat:e,messageId:t.id,option:P,offset:l,limit:4,shouldResetVoters:!0})}),[s.votersCount,Z]);const p=(0,a.I4)((()=>{h(!0),i({chat:e,messageId:t.id,option:P,offset:l,limit:50})}),[e,i,t.id,l,P]);(0,a.d4)((()=>{h(!1)}),[o]);const E=(0,a.I4)((e=>{c({id:e}),d()}),[d,c]);return a.ZP.createElement("div",{className:"PollAnswerResults"},a.ZP.createElement("div",{className:"poll-voters"},o?o.map((e=>a.ZP.createElement(Ee.Z,{key:e,className:"chat-item-clickable",onClick:()=>E(e)},a.ZP.createElement(fe.Z,{avatarSize:"tiny",userId:e,forceShowSelf:!0,noStatusOrTyping:!0})))):a.ZP.createElement(Pe.Z,null),o&&function(){const e=s.votersCount-o.length;return s.votersCount>4&&e>0&&a.ZP.createElement(cn,{count:e,itemName:"voter",isLoading:u,onClick:p})}()),a.ZP.createElement("div",{className:"answer-head",dir:v.isRtl?"rtl":void 0},a.ZP.createElement("span",{className:"answer-title",dir:"auto"},g),a.ZP.createElement("span",{className:"answer-percent",dir:v.isRtl?"auto":void 0},(C=s.votersCount,(b=r)>0?(C/b*100).toFixed():0),"%")));var C,b}))),pr=(0,a.X$)((0,s.c$)((e=>{const{pollResults:{chatId:t,messageId:n},lastSyncTime:a}=e;return t&&n?{chat:(0,m.Z1)(e,t),message:(0,m.hj)(e,t,n),lastSyncTime:a}:{}}))((({onClose:e,isActive:t,chat:n,message:s,lastSyncTime:r})=>{const o=(0,M.Z)();if((0,T.ZP)(t,e),!s||!n)return a.ZP.createElement(Pe.Z,null);const{summary:l,results:i}=(0,u.t9)(s);if(!i.results)return;const c=(0,h.ee)(i.results,"option");return a.ZP.createElement("div",{className:"PollResults",dir:o.isRtl?"rtl":void 0},a.ZP.createElement("h3",{className:"poll-question",dir:"auto"},(0,$.Z)(l.question,["emoji","br"])),a.ZP.createElement("div",{className:"poll-results-list custom-scroll"},r&&l.answers.map((e=>a.ZP.createElement(vr,{key:`${s.id}-${e.option}`,chat:n,message:s,answer:e,answerVote:c[e.option],totalVoters:i.totalVoters}))),!r&&a.ZP.createElement(Pe.Z,null)))}))),Er="Please provide first name",Cr=(0,a.X$)((0,s.c$)(((e,{userId:t})=>{const n=(0,m.dy)(e,t),a=(0,m.Z1)(e,t),{progress:s}=e.management;return{user:n,chat:a,progress:s,isMuted:(0,u.i4)(a,(0,m.dZ)(e),(0,m.NJ)(e))}}),((e,t)=>(0,h.ei)(t,["updateContact","deleteUser","closeManagement","openChat","deleteHistory"])))((({userId:e,user:t,chat:n,progress:s,isMuted:r,updateContact:l,deleteUser:i,deleteHistory:c,closeManagement:d,openChat:m,onClose:u,isActive:h})=>{const[Z,P,g]=(0,Le.Z)(),[v,p]=(0,a.eJ)(!1),[E,C]=(0,a.eJ)(),f=(0,M.Z)();(0,T.ZP)(h,u);const b=t&&t.firstName||"",I=t&&t.lastName||"",[y,S]=(0,a.eJ)(b),[k,w]=(0,a.eJ)(I),[N,A]=(0,a.eJ)(!r);(0,a.d4)((()=>{A(!r)}),[r]),(0,a.d4)((()=>{p(!1),g()}),[g,e]),(0,a.d4)((()=>{S(b),w(I)}),[b,I,t]),(0,a.d4)((()=>{s===o.wv.Complete&&(p(!1),C(void 0),g())}),[g,s]);const L=(0,a.I4)((e=>{S(e.target.value),p(!0)}),[]),R=(0,a.I4)((e=>{w(e.target.value),p(!0)}),[]),B=(0,a.I4)((e=>{A(e.target.checked),p(!0)}),[]),$=(0,a.I4)((()=>{const t=y.trim(),n=k.trim();t.length||C(Er),l({userId:e,isMuted:!N,firstName:t,lastName:n})}),[y,k,l,e,N]),D=(0,a.I4)((()=>{c({chatId:n.id,shouldDeleteForAll:!1}),i({userId:e}),g(),d(),m({id:void 0})}),[n.id,g,d,c,i,m,e]);if(!t)return;const U=s===o.wv.InProgress;return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement(fe.Z,{userId:t.id,avatarSize:"jumbo",status:"original name",withFullInfo:!0}),a.ZP.createElement(ve.Z,{id:"user-first-name",label:f("UserInfo.FirstNamePlaceholder"),onChange:L,value:y,error:E===Er?E:void 0}),a.ZP.createElement(ve.Z,{id:"user-last-name",label:f("UserInfo.LastNamePlaceholder"),onChange:R,value:k}),a.ZP.createElement("div",{className:"ListItem no-selection narrow"},a.ZP.createElement(en.Z,{checked:N,label:f("Notifications"),subLabel:f(N?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),onChange:B}))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Ee.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:P},f("DeleteContact")))),a.ZP.createElement(Xt.Z,{isShown:v,onClick:$,disabled:U,ariaLabel:f("Save")},U?a.ZP.createElement(F.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Fe.Z,{isOpen:Z,onClose:g,text:f("AreYouSureDeleteContact"),confirmLabel:f("DeleteContact"),confirmHandler:D,confirmIsDestructive:!0}))}))),fr="Group title can't be empty",br=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,m.Z1)(e,t),{progress:s}=e.management,r=Boolean(null===(n=a.fullInfo)||void 0===n?void 0:n.linkedChatId),o=(0,u.G9)(a);return{chat:a,progress:s,isBasicGroup:o,hasLinkedChannel:r,canChangeInfo:o?a.isCreator:(0,u.VE)(a,"changeInfo"),canBanUsers:o?a.isCreator:(0,u.VE)(a,"banUsers")}}),((e,t)=>(0,h.ei)(t,["togglePreHistoryHidden","updateChat","closeManagement","leaveChannel","deleteChannel","deleteChat","openChat"])))((({chatId:e,chat:t,progress:n,isBasicGroup:s,hasLinkedChannel:l,canChangeInfo:i,canBanUsers:c,onScreenSelect:d,togglePreHistoryHidden:m,updateChat:h,deleteChat:Z,leaveChannel:P,deleteChannel:g,closeManagement:v,openChat:E,onClose:C,isActive:f})=>{var b,I,y;const[S,k,w]=(0,Le.Z)(),N=t.title,A=t.fullInfo&&t.fullInfo.about||"",[L,R]=(0,a.eJ)(!1),[B,D]=(0,a.eJ)(N),[U,O]=(0,a.eJ)(A),[x,G]=(0,a.eJ)(),[J,z]=(0,a.eJ)(),X=(0,u.RT)(t),_=(0,p.Z)(X,!1,r.IU.BlobUrl),Y=(0,M.Z)();(0,T.ZP)(f,C),(0,a.d4)((()=>{n===o.wv.Complete&&(R(!1),z(void 0))}),[n]);const H=(0,a.I4)((()=>{d(o.u1.ChatPrivacyType)}),[d]),V=(0,a.I4)((()=>{d(o.u1.Discussion)}),[d]),j=(0,a.I4)((()=>{d(o.u1.GroupPermissions)}),[d]),K=(0,a.I4)((()=>{d(o.u1.ChatAdministrators)}),[d]),q=(0,a.I4)((e=>{G(e),R(!0)}),[]),W=(0,a.I4)((e=>{D(e.target.value),R(!0)}),[]),Q=(0,a.I4)((e=>{O(e.target.value),R(!0)}),[]),ee=(0,a.I4)((()=>{const t=B.trim(),n=U.trim();t.length?h({chatId:e,title:t,about:n,photo:x}):z(fr)}),[U,e,x,B,h]),te=(0,a.I4)((()=>{d(o.u1.GroupMembers)}),[d]),ne=(0,a.I4)((()=>{if(!t.fullInfo)return;const{isPreHistoryHidden:e}=t.fullInfo;m({chatId:t.id,isEnabled:!e})}),[t,m]),ae=(0,a.Ye)((()=>{if(!t.defaultBannedRights)return 0;let e=["sendMessages","sendMedia","embedLinks","sendPolls","changeInfo","inviteUsers","pinMessages"].filter((e=>!t.defaultBannedRights[e])).length;const{sendStickers:n,sendGifs:a}=t.defaultBannedRights;return n||a||(e+=1),e}),[t]),se=(null===(b=t.fullInfo)||void 0===b||null===(I=b.adminMembers)||void 0===I?void 0:I.length)||0,re=(0,a.I4)((()=>{s?Z({chatId:t.id}):t.isCreator?g({chatId:t.id}):P({chatId:t.id}),w(),v(),E({id:void 0})}),[s,t.isCreator,t.id,w,v,P,g,Z,E]);if(t.isRestricted)return;const oe=n===o.wv.InProgress;return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement(zt.Z,{currentAvatarBlobUrl:_,onChange:q,disabled:!i}),a.ZP.createElement(ve.Z,{id:"group-title",label:Y("GroupName"),onChange:W,value:B,error:J===fr?J:void 0,disabled:!i}),a.ZP.createElement(ve.Z,{id:"group-about",className:"mb-2",label:Y("DescriptionPlaceholder"),onChange:Q,value:U,disabled:!i}),t.isCreator&&a.ZP.createElement(Ee.Z,{icon:"lock",multiline:!0,onClick:H},a.ZP.createElement("span",{className:"title"},Y("GroupType")),a.ZP.createElement("span",{className:"subtitle"},t.username?Y("TypePublic"):Y("TypePrivate"))),l&&a.ZP.createElement(Ee.Z,{icon:"message",multiline:!0,onClick:V},a.ZP.createElement("span",{className:"title"},Y("LinkedChannel")),a.ZP.createElement("span",{className:"subtitle"},Y("DiscussionUnlink"))),a.ZP.createElement(Ee.Z,{icon:"permissions",multiline:!0,onClick:j,disabled:!c},a.ZP.createElement("span",{className:"title"},Y("ChannelPermissions")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},ae,"/",8)),a.ZP.createElement(Ee.Z,{icon:"admin",multiline:!0,onClick:K},a.ZP.createElement("span",{className:"title"},Y("ChannelAdministrators")),a.ZP.createElement("span",{className:"subtitle"},(0,En.kh)(se)))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Ee.Z,{icon:"group",multiline:!0,onClick:te},a.ZP.createElement("span",{className:"title"},Y("GroupMembers")),a.ZP.createElement("span",{className:"subtitle"},(0,En.kh)(null!==(y=t.membersCount)&&void 0!==y?y:0))),t.fullInfo&&a.ZP.createElement("div",{className:"ListItem narrow no-selection"},a.ZP.createElement(en.Z,{checked:!t.fullInfo.isPreHistoryHidden,label:Y("ChatHistory"),onChange:ne,disabled:!c}))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Ee.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:k},Y("DeleteMega")))),a.ZP.createElement(Xt.Z,{isShown:L,onClick:ee,disabled:oe,ariaLabel:Y("Save")},oe?a.ZP.createElement(F.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Fe.Z,{isOpen:S,onClose:w,textParts:(0,$.Z)(s||!t.isCreator?Y("AreYouSureDeleteAndExit"):Y("AreYouSureDeleteThisChatWithGroup",t.title),["br","simple_markdown"]),confirmLabel:s||!t.isCreator?Y("DeleteMega"):Y("DeleteGroupForAll"),confirmHandler:re,confirmIsDestructive:!0}))}))),Ir=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>({chat:(0,m.Z1)(e,t),currentUserId:e.currentUserId})),((e,t)=>(0,h.ei)(t,["updateChatDefaultBannedRights"])))((({onScreenSelect:e,onChatMemberSelect:t,chat:n,currentUserId:s,updateChatDefaultBannedRights:r,onClose:l,isActive:i})=>{const[c,d]=(0,a.eJ)({}),[m,u]=(0,a.eJ)(!1),[h,Z]=(0,a.eJ)(!1),P=(0,M.Z)();(0,T.ZP)(i,l);const g=(0,a.I4)((()=>{e(o.u1.GroupRemovedUsers)}),[e]),v=(0,a.I4)((()=>{e(o.u1.GroupUserPermissionsCreate)}),[e]),p=(0,a.I4)((n=>{t(n.userId,n.promotedByUserId===s),e(o.u1.GroupUserPermissions)}),[s,t,e]);(0,a.d4)((()=>{d((null==n?void 0:n.defaultBannedRights)||{}),u(!1),setTimeout((()=>{Z(!1)}),250)}),[n]);const E=(0,a.I4)((e=>{const{name:t}=e.target;function n(e){return!e||void 0}d((e=>({...e,[t]:n(e[t]),..."sendStickers"===t&&{sendGifs:n(e[t])}}))),u(!0)}),[]),C=(0,a.I4)((()=>{n&&(Z(!0),r({chatId:n.id,bannedRights:c}))}),[n,c,r]),f=(0,a.Ye)((()=>n&&n.fullInfo&&n.fullInfo.kickedMembers?n.fullInfo.kickedMembers.length:0),[n]),b=(0,a.Ye)((()=>n&&n.fullInfo&&n.fullInfo.members?n.fullInfo.members.filter((({bannedRights:e})=>!!e)):[]),[n]),I=(0,a.I4)((e=>{const{bannedRights:t}=e;if(!t||!n)return;const{defaultBannedRights:a}=n;return Object.keys(t).reduce(((e,n)=>{if(!t[n]||null!=a&&a[n]||"sendInline"===n||"viewMessages"===n||"sendGames"===n)return e;const s=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}}(n);if(!s)return e;const r=P(s);return`${e}${e.length?`, ${r}`:r}`}),"")}),[n,P]);return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement("h3",{className:"section-heading",dir:"auto"},P("ChannelPermissionsHeader")),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"sendMessages",checked:!c.sendMessages,label:P("UserRestrictionsSend"),blocking:!0,onChange:E})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"sendMedia",checked:!c.sendMedia,label:P("UserRestrictionsSendMedia"),blocking:!0,onChange:E})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"sendStickers",checked:!c.sendStickers&&!c.sendGifs,label:P("UserRestrictionsSendStickers"),blocking:!0,onChange:E})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"sendPolls",checked:!c.sendPolls,label:P("UserRestrictionsSendPolls"),blocking:!0,onChange:E})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"embedLinks",checked:!c.embedLinks,label:P("UserRestrictionsEmbedLinks"),blocking:!0,onChange:E})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"inviteUsers",checked:!c.inviteUsers,label:P("UserRestrictionsInviteUsers"),blocking:!0,onChange:E})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"pinMessages",checked:!c.pinMessages,label:P("UserRestrictionsPinMessages"),blocking:!0,onChange:E})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"changeInfo",checked:!c.changeInfo,label:P("UserRestrictionsChangeInfo"),blocking:!0,onChange:E}))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Ee.Z,{icon:"delete-user",multiline:!0,narrow:!0,onClick:g},a.ZP.createElement("span",{className:"title"},P("ChannelBlockedUsers")),a.ZP.createElement("span",{className:"subtitle"},f))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement("h3",{className:"section-heading",dir:"auto"},P("PrivacyExceptions")),a.ZP.createElement(Ee.Z,{icon:"add-user",onClick:v},P("ChannelAddException")),b.map((e=>a.ZP.createElement(Ee.Z,{key:e.userId,className:"chat-item-clickable exceptions-member",onClick:()=>p(e)},a.ZP.createElement(fe.Z,{userId:e.userId,status:I(e)})))))),a.ZP.createElement(Xt.Z,{isShown:m,onClick:C,ariaLabel:P("Save"),disabled:h},h?a.ZP.createElement(F.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})))}))),yr=(0,a.X$)((0,s.c$)((e=>{const{users:{byId:t},currentUserId:n}=e;return{usersById:t,currentUserId:n}}),((e,t)=>(0,h.ei)(t,["loadMoreMembers","deleteChatMember"])))((({chat:e,usersById:t,currentUserId:n,isOpen:s,onClose:r,loadMoreMembers:o,deleteChatMember:l})=>{var i;const c=(0,M.Z)(),[d,m]=(0,a.eJ)(""),h=(0,a.sO)(null),Z=(0,a.Ye)((()=>{var a;return((null===(a=e.fullInfo)||void 0===a?void 0:a.members)||[]).filter((e=>!e.isAdmin&&!e.isOwner&&e.userId!==n)).reduce(((e,n)=>(d&&t[n.userId]&&!(0,me.Z)((0,u.Js)(t[n.userId])||"",d)||e.push(n.userId),e)),[])}),[null===(i=e.fullInfo)||void 0===i?void 0:i.members,n,d,t]),P=(0,a.I4)((t=>{l({chatId:e.id,userId:t}),r()}),[e.id,l,r]);return a.ZP.createElement(be,{isOpen:s,chatOrUserIds:Z,filterRef:h,filterPlaceholder:c("ChannelBlockUser"),filter:d,onFilterChange:m,loadMore:o,onSelectChatOrUser:P,onClose:r})}))),Sr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,m.Z1)(e,t),{byId:a}=e.users;return{chat:n,usersById:a,canDeleteMembers:n&&((0,u.VE)(n,"banUsers")||n.isCreator)}}),((e,t)=>(0,h.ei)(t,["updateChatMemberBannedRights"])))((({chat:e,usersById:t,canDeleteMembers:n,updateChatMemberBannedRights:s,onClose:r,isActive:o})=>{const l=(0,M.Z)(),[i,c,d]=(0,Le.Z)();(0,T.ZP)(o,r);const m=(0,a.Ye)((()=>e&&e.fullInfo&&e.fullInfo.kickedMembers?e.fullInfo.kickedMembers:[]),[e]),h=(0,a.I4)((e=>{if(!e.kickedByUserId)return;const n=t[e.kickedByUserId];return n?l("UserRemovedBy",(0,u.Js)(n)):void 0}),[l,t]),Z=(0,a.I4)((t=>{if(e)return[{title:l("Unblock"),icon:"delete",destructive:!0,handler:()=>s({chatId:e.id,userId:t.userId,bannedRights:{}})}]}),[l,e,s]);return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section",dir:l.isRtl?"rtl":void 0},a.ZP.createElement("p",{className:"text-muted"},l("NoBlockedGroup2")),m.map((e=>a.ZP.createElement(Ee.Z,{key:e.userId,className:"chat-item-clickable",ripple:!0,contextActions:Z(e)},a.ZP.createElement(fe.Z,{userId:e.userId,status:h(e)})))),n&&a.ZP.createElement(Xt.Z,{isShown:!0,onClick:c,ariaLabel:l("Channel.EditAdmin.Permission.BanUsers")},a.ZP.createElement("i",{className:"icon-add-user-filled"})),e&&n&&a.ZP.createElement(yr,{chat:e,isOpen:i,onClose:d}))))}))),kr="Channel title can't be empty",wr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,m.Z1)(e,t),{progress:a}=e.management;return{chat:n,progress:a,isSignaturesShown:Boolean(null==n?void 0:n.isSignaturesShown),canChangeInfo:(0,u.VE)(n,"changeInfo")}}),((e,t)=>(0,h.ei)(t,["toggleSignatures","updateChat","closeManagement","leaveChannel","deleteChannel","openChat"])))((({chatId:e,chat:t,progress:n,isSignaturesShown:s,canChangeInfo:l,onScreenSelect:i,updateChat:c,toggleSignatures:d,closeManagement:m,leaveChannel:h,deleteChannel:Z,openChat:P,onClose:g,isActive:v})=>{var E,C,f,b;const I=t&&t.title||"",y=null!=t&&t.fullInfo&&t.fullInfo.about||"",S=null==t||null===(E=t.fullInfo)||void 0===E?void 0:E.linkedChatId,[k,w,N]=(0,Le.Z)(),[A,L]=(0,a.eJ)(!1),[R,B]=(0,a.eJ)(I),[$,D]=(0,a.eJ)(y),[U,O]=(0,a.eJ)(),[x,G]=(0,a.eJ)(),J=t&&(0,u.RT)(t),z=(0,p.Z)(J,!1,r.IU.BlobUrl),X=(0,M.Z)();(0,T.ZP)(v,g),(0,a.d4)((()=>{n===o.wv.Complete&&(L(!1),G(void 0))}),[n]);const _=(null==t||null===(C=t.fullInfo)||void 0===C||null===(f=C.adminMembers)||void 0===f?void 0:f.length)||0,Y=(0,a.I4)((()=>{i(o.u1.ChatPrivacyType)}),[i]),H=(0,a.I4)((()=>{i(o.u1.Discussion)}),[i]),V=(0,a.I4)((()=>{i(o.u1.ChatAdministrators)}),[i]),j=(0,a.I4)((e=>{O(e),L(!0)}),[]),K=(0,a.I4)((e=>{B(e.target.value),L(!0)}),[]),q=(0,a.I4)((e=>{D(e.target.value),L(!0)}),[]),W=(0,a.I4)((()=>{const t=R.trim(),n=$.trim();t.length?c({chatId:e,title:t,about:n,photo:U}):G(kr)}),[$,e,U,R,c]),Q=(0,a.I4)((()=>{d({chatId:e,isEnabled:!s})}),[e,s,d]),ee=(0,a.I4)((()=>{i(o.u1.ChannelSubscribers)}),[i]),te=(0,a.I4)((()=>{t.isCreator?Z({chatId:t.id}):h({chatId:t.id}),N(),m(),P({id:void 0})}),[t.isCreator,t.id,N,m,h,Z,P]);if(t.isRestricted)return;const ne=n===o.wv.InProgress;return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement(zt.Z,{currentAvatarBlobUrl:z,onChange:j,disabled:!l}),a.ZP.createElement(ve.Z,{id:"channel-title",label:X("EnterChannelName"),onChange:K,value:R,error:x===kr?x:void 0,disabled:!l}),a.ZP.createElement(ve.Z,{id:"channel-about",className:"mb-2",label:X("DescriptionPlaceholder"),onChange:q,value:$,disabled:!l}),t.isCreator&&a.ZP.createElement(Ee.Z,{icon:"lock",multiline:!0,onClick:Y},a.ZP.createElement("span",{className:"title"},X("ChannelType")),a.ZP.createElement("span",{className:"subtitle"},t.username?X("TypePublic"):X("TypePrivate"))),a.ZP.createElement(Ee.Z,{icon:"message",multiline:!0,onClick:H,disabled:!l},a.ZP.createElement("span",{className:"title"},X("Discussion")),a.ZP.createElement("span",{className:"subtitle"},X(S?"DiscussionUnlink":"Add"))),a.ZP.createElement(Ee.Z,{icon:"admin",multiline:!0,onClick:V},a.ZP.createElement("span",{className:"title"},X("ChannelAdministrators")),a.ZP.createElement("span",{className:"subtitle"},_)),a.ZP.createElement("div",{className:"ListItem no-selection narrow"},a.ZP.createElement(en.Z,{checked:s,label:X("ChannelSignMessages"),onChange:Q}))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Ee.Z,{icon:"group",multiline:!0,onClick:ee},a.ZP.createElement("span",{className:"title",dir:"auto"},X("ChannelSubscribers")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},X("Subscribers",null!==(b=t.membersCount)&&void 0!==b?b:0,"i")))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Ee.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:w},t.isCreator?X("ChannelDelete"):X("LeaveChannel")))),a.ZP.createElement(Xt.Z,{isShown:A,onClick:W,disabled:ne,ariaLabel:X("Save")},ne?a.ZP.createElement(F.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Fe.Z,{isOpen:k,onClose:N,text:t.isCreator?X("ChannelDeleteAlert"):X("ChannelLeaveAlert"),confirmLabel:t.isCreator?X("ChannelDelete"):X("LeaveChannel"),confirmHandler:te,confirmIsDestructive:!0}))})));var Nr=n(88);const Mr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,m.Z1)(e,t),{isUsernameAvailable:a}=(0,m.aW)(e,t);return{chat:n,isChannel:(0,u.eA)(n),progress:e.management.progress,isUsernameAvailable:a}}),((e,t)=>(0,h.ei)(t,["checkPublicLink","updatePublicLink","updatePrivateLink"])))((({chat:e,onClose:t,isActive:n,isChannel:s,progress:r,isUsernameAvailable:l,checkPublicLink:i,updatePublicLink:c,updatePrivateLink:d})=>{var m;const u=Boolean(e.username),h=null===(m=e.fullInfo)||void 0===m?void 0:m.inviteLink,[Z,P]=(0,a.eJ)(u?"public":"private"),[g,v]=(0,a.eJ)(),[p,E,C]=(0,Le.Z)(),f=Boolean("public"===Z&&g&&l||"private"===Z&&u);(0,T.ZP)(n,t),(0,a.d4)((()=>{Z&&!h&&d()}),[Z,h,d]);const b=(0,a.I4)((e=>{P(e)}),[]),I=(0,a.I4)((()=>{c({username:"public"===Z?g:""})}),[Z,c,g]),y=(0,a.I4)((()=>{C(),d()}),[C,d]),S=(0,M.Z)(),k=s?"Channel":"Mega",w=s?"Channel":"Group",N=[{value:"private",label:S(`${k}Private`),subLabel:S(`${k}PrivateInfo`)},{value:"public",label:S(`${k}Public`),subLabel:S(`${k}PublicInfo`)}],A=r===o.wv.InProgress;return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section",dir:S.isRtl?"rtl":void 0},a.ZP.createElement("h3",{className:"section-heading"},S(`${w}Type`)),a.ZP.createElement(_e.Z,{selected:Z,name:"channel-type",options:N,onChange:b})),"private"===Z?a.ZP.createElement("div",{className:"section",dir:S.isRtl?"rtl":void 0},h?a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(Nr.Z,{url:h,className:"group-link",text:h}),a.ZP.createElement("p",{className:"section-info",dir:S.isRtl?"rtl":void 0},S(`${k}PrivateLinkHelp`)),a.ZP.createElement(Ee.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:E},S("RevokeLink")),a.ZP.createElement(Fe.Z,{isOpen:p,onClose:C,text:S("RevokeAlert"),confirmLabel:S("RevokeButton"),confirmHandler:y,confirmIsDestructive:!0})):a.ZP.createElement(Pe.Z,null)):a.ZP.createElement("div",{className:"section no-border"},a.ZP.createElement(jt,{asLink:!0,currentUsername:e.username,isLoading:A,isUsernameAvailable:l,checkUsername:i,onChange:v}),a.ZP.createElement("p",{className:"section-info",dir:"auto"},S(`${w}.Username.CreatePublicLinkHelp`)))),a.ZP.createElement(Xt.Z,{isShown:f,disabled:A,ariaLabel:S("Save"),onClick:I},A?a.ZP.createElement(F.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})))}))),Tr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,m.Z1)(e,t),{forDiscussionIds:s,byId:r}=e.chats;return{chat:a,chatsByIds:r,forDiscussionIds:s,linkedChat:null!=a&&null!==(n=a.fullInfo)&&void 0!==n&&n.linkedChatId?(0,m.Z1)(e,a.fullInfo.linkedChatId):void 0,isChannel:a&&(0,u.eA)(a)}}),((e,t)=>(0,h.ei)(t,["loadGroupsForDiscussion","linkDiscussionGroup","unlinkDiscussionGroup"])))((({chat:e,onClose:t,isActive:n,chatId:s,chatsByIds:r,linkedChat:i,forDiscussionIds:c,isChannel:d,onScreenSelect:m,loadGroupsForDiscussion:u,linkDiscussionGroup:h,unlinkDiscussionGroup:Z})=>{const[P,g]=(0,a.eJ)(),[v,p]=(0,a.eJ)(),[E,C]=(0,a.eJ)(!1),f=(0,a.I4)((()=>C(!0)),[]),[b,I,y]=(0,Le.Z)(),[S,k,w]=(0,Le.Z)(),N=(0,M.Z)(),F=null==i?void 0:i.id;(0,T.ZP)(n,t),(0,a.d4)((()=>{u()}),[u]),(0,a.d4)((()=>{v||(0,an.Z)("DiscussionGroups").then(p)}),[v]);const A=(0,a.I4)((()=>{y(),Z({channelId:d?s:F}),d||m(o.u1.Initial)}),[y,Z,d,s,F,m]),L=(0,a.I4)((()=>{w(),h({channelId:s,chatId:P})}),[w,h,s,P]);return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement("div",{className:"section-icon"},v&&a.ZP.createElement(sn.Z,{id:"discussionGroupsDucks",size:l.bM,animationData:v,play:E,noLoop:!0,onLoad:f})),i&&a.ZP.createElement("div",null,a.ZP.createElement(Ee.Z,{className:"chat-item-clickable",inactive:!0},a.ZP.createElement(Ce.Z,{chatId:i.id})),a.ZP.createElement(Ee.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:I},N(d?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel")),a.ZP.createElement(Fe.Z,{isOpen:b,onClose:y,header:a.ZP.createElement("div",{className:"modal-header"},a.ZP.createElement(D.Z,{size:"tiny",chat:i}),a.ZP.createElement("div",{className:"modal-title"},N(d?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"))),textParts:(0,$.Z)(N(d?"DiscussionUnlinkChannelAlert":"DiscussionUnlinkGroupAlert",i.title),["br","simple_markdown"]),confirmLabel:N(d?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"),confirmHandler:A,confirmIsDestructive:!0})),!i&&a.ZP.createElement("div",null,a.ZP.createElement("p",{className:"section-help",dir:"auto"},N("DiscussionChannelHelp")),a.ZP.createElement("div",{teactFastList:!0},a.ZP.createElement(Ee.Z,{key:"create-group",icon:"group",ripple:!0,teactOrderKey:0,className:"not-implemented"},N("DiscussionCreateGroup")),c?c.map(((e,t)=>a.ZP.createElement(Ee.Z,{key:e,teactOrderKey:t+1,className:"chat-item-clickable scroll-item",onClick:()=>{g(e),k()}},a.ZP.createElement(Ce.Z,{chatId:e})))):a.ZP.createElement(it.Z,{key:"nothing-found",teactOrderKey:0,text:"No discussion groups found"})),a.ZP.createElement("p",{className:"mt-4 mb-0 section-help",dir:"auto"},N("DiscussionChannelHelp2")),a.ZP.createElement(Fe.Z,{isOpen:S,onClose:w,header:function(){const e=r[P];if(e)return a.ZP.createElement("div",{className:"modal-header"},a.ZP.createElement(D.Z,{size:"tiny",chat:e}),a.ZP.createElement("div",{className:"modal-title"},N("Channel.DiscussionGroup.LinkGroup")))}(),textParts:function(){const t=r[P];if(t)return t.hasPrivateLink?(0,$.Z)(`Do you want to make **${t.title}** the discussion board for **${e.title}**?`,["br","simple_markdown"]):(0,$.Z)(`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"])}(),confirmLabel:N("DiscussionLinkGroup"),confirmHandler:L,isButtonsInOneRow:!0})))))}))),Fr=(0,a.X$)((0,s.c$)(((e,{chatId:t,isPromotedByCurrentUser:n})=>{const a=(0,m.Z1)(e,t);return{chat:a,isFormFullyDisabled:!(a.isCreator||n)}}),((e,t)=>(0,h.ei)(t,["updateChatMemberBannedRights"])))((({chat:e,selectedChatMemberId:t,onScreenSelect:n,updateChatMemberBannedRights:s,isFormFullyDisabled:r,onClose:l,isActive:i})=>{const[c,d]=(0,a.eJ)({}),[m,u]=(0,a.eJ)(!1),[h,Z]=(0,a.eJ)(!1),[P,g,v]=(0,Le.Z)(),p=(0,M.Z)();(0,T.ZP)(i,l);const E=(0,a.Ye)((()=>{if(e&&e.fullInfo&&e.fullInfo.members)return e.fullInfo.members.find((({userId:e})=>e===t))}),[e,t]);(0,a.d4)((()=>{null!=e&&e.fullInfo&&t&&!E&&n(o.u1.GroupPermissions)}),[e,n,E,t]),(0,a.d4)((()=>{d((null==E?void 0:E.bannedRights)||(null==e?void 0:e.defaultBannedRights)||{}),u(!1),Z(!1)}),[e,E]);const C=(0,a.I4)((e=>{const{name:t}=e.target;function n(e){return!e||void 0}d((e=>({...e,[t]:n(e[t]),..."sendStickers"===t&&{sendGifs:n(e[t])}}))),u(!0)}),[]),f=(0,a.I4)((()=>{e&&t&&(Z(!0),s({chatId:e.id,userId:t,bannedRights:c}))}),[e,t,c,s]),b=(0,a.I4)((()=>{e&&t&&s({chatId:e.id,userId:t,bannedRights:{viewMessages:!0}})}),[e,t,s]),I=(0,a.I4)((t=>!!r||!(!e||!e.defaultBannedRights)&&e.defaultBannedRights[t]),[e,r]);if(E)return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Ee.Z,{inactive:!0,className:"chat-item-clickable"},a.ZP.createElement(fe.Z,{userId:E.userId})),a.ZP.createElement("h3",{className:"section-heading mt-4",dir:"auto"},p("UserRestrictionsCanDo")),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"sendMessages",checked:!c.sendMessages,label:p("UserRestrictionsSend"),blocking:!0,disabled:I("sendMessages"),onChange:C})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"sendMedia",checked:!c.sendMedia,label:p("UserRestrictionsSendMedia"),blocking:!0,disabled:I("sendMedia"),onChange:C})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"sendStickers",checked:!c.sendStickers&&!c.sendGifs,label:p("UserRestrictionsSendStickers"),blocking:!0,disabled:I("sendStickers"),onChange:C})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"sendPolls",checked:!c.sendPolls,label:p("UserRestrictionsSendPolls"),blocking:!0,disabled:I("sendPolls"),onChange:C})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"embedLinks",checked:!c.embedLinks,label:p("UserRestrictionsEmbedLinks"),blocking:!0,disabled:I("embedLinks"),onChange:C})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"inviteUsers",checked:!c.inviteUsers,label:p("UserRestrictionsInviteUsers"),blocking:!0,disabled:I("inviteUsers"),onChange:C})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"pinMessages",checked:!c.pinMessages,label:p("UserRestrictionsPinMessages"),blocking:!0,disabled:I("pinMessages"),onChange:C})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"changeInfo",checked:!c.changeInfo,label:p("UserRestrictionsChangeInfo"),blocking:!0,disabled:I("changeInfo"),onChange:C}))),!r&&a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Ee.Z,{icon:"delete-user",ripple:!0,destructive:!0,onClick:g},p("UserRestrictionsBlock")))),a.ZP.createElement(Xt.Z,{isShown:m,onClick:f,ariaLabel:p("Save"),disabled:h},h?a.ZP.createElement(F.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Fe.Z,{isOpen:P,onClose:v,text:"Are you sure you want to ban and remove this user from the group?",confirmLabel:"Remove",confirmHandler:b,confirmIsDestructive:!0}))}))),Ar=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,m.Z1)(e,t),{byId:a}=e.users;return{chat:n,currentUserId:e.currentUserId,isChannel:(0,u.eA)(n),usersById:a}}))((({chat:e,isChannel:t,currentUserId:n,usersById:s,onScreenSelect:r,onChatMemberSelect:l,onClose:i,isActive:c})=>{const d=(0,M.Z)();(0,T.ZP)(c,i);const m=(0,a.Ye)((()=>e.fullInfo&&e.fullInfo.adminMembers?e.fullInfo.adminMembers.sort(((e,t)=>e.isOwner?-1:t.isOwner?1:0)):[]),[e]),h=(0,a.I4)((e=>{l(e.userId,e.promotedByUserId===n),r(o.u1.ChatAdminRights)}),[n,l,r]),Z=(0,a.I4)((e=>{if(e.isOwner)return d("ChannelCreator");const t=e.promotedByUserId?s[e.promotedByUserId]:void 0;return t?d("EditAdminPromotedBy",(0,u.Js)(t)):d("ChannelAdmin")}),[d,s]);return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Ee.Z,{icon:"recent",multiline:!0,onClick:function(){r(o.u1.GroupRecentActions)}},a.ZP.createElement("span",{className:"title"},d("EventLog")),a.ZP.createElement("span",{className:"subtitle"},d(t?"EventLogInfoDetailChannel":"EventLogInfoDetail")))),a.ZP.createElement("div",{className:"section",dir:d.isRtl?"rtl":void 0},a.ZP.createElement("p",{className:"text-muted",dir:"auto"},t?"You can add administrators to help you manage your channel.":"You can add administrators to help you manage your group."),m.map((e=>a.ZP.createElement(Ee.Z,{key:e.userId,className:"chat-item-clickable",onClick:()=>h(e)},a.ZP.createElement(fe.Z,{userId:e.userId,status:Z(e),forceShowSelf:!0})))))))}))),Lr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>({chat:(0,m.Z1)(e,t)})))((({chat:e,onClose:t,isActive:n})=>{const s=(0,M.Z)();(0,T.ZP)(n,t);const r=(0,a.Ye)((()=>e&&e.fullInfo&&e.fullInfo.adminMembers?e.fullInfo.adminMembers.sort(((e,t)=>e.isOwner?-1:t.isOwner?1:0)):[]),[e]),o=(0,a.I4)((e=>e.isOwner?s("ChannelCreator"):s("ChannelAdmin")),[s]);return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section not-implemented",dir:s.isRtl?"rtl":void 0},a.ZP.createElement("h3",{className:"section-heading",dir:"auto"},"Actions"),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"changeInfo",checked:!0,label:s("EventLogAllEvents"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterNewAdmins"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterNewMembers"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterChannelInfo"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterDeletedMessages"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterEditedMessages"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterLeavingMembers"),onChange:void 0}))),a.ZP.createElement("div",{className:"section not-implemented",dir:s.isRtl?"rtl":void 0},a.ZP.createElement("h3",{className:"section-heading",dir:"auto"},s("Channel.Management.Title")),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"changeInfo",checked:!0,label:s("EventLogAllAdmins"),onChange:void 0})),r.map((e=>a.ZP.createElement(Ee.Z,{key:e.userId,className:"chat-item-clickable picker-list-item",onClick:void 0,ripple:!0},a.ZP.createElement(en.Z,{label:"",checked:!0}),a.ZP.createElement(fe.Z,{userId:e.userId,status:o(e),forceShowSelf:!0})))))))}))),Rr=(0,a.X$)((0,s.c$)(((e,{chatId:t,isPromotedByCurrentUser:n})=>{const a=(0,m.Z1)(e,t),{byId:s}=e.users,{currentUserId:r}=e;return{chat:a,usersById:s,currentUserId:r,isChannel:(0,u.eA)(a),isFormFullyDisabled:!(a.isCreator||n)}}),((e,t)=>(0,h.ei)(t,["updateChatAdmin"])))((({selectedChatMemberId:e,onScreenSelect:t,chat:n,usersById:s,currentUserId:r,isChannel:l,isFormFullyDisabled:i,updateChatAdmin:c,onClose:d,isActive:m})=>{const[h,Z]=(0,a.eJ)({}),[P,g]=(0,a.eJ)(!1),[v,p]=(0,a.eJ)(!1),[E,C,f]=(0,Le.Z)(),[b,I]=(0,a.eJ)(""),y=(0,M.Z)();(0,T.ZP)(m,d);const S=(0,a.Ye)((()=>{if(n.fullInfo&&n.fullInfo.adminMembers)return n.fullInfo.adminMembers.find((({userId:t})=>t===e))}),[n,e]);(0,a.d4)((()=>{null!=n&&n.fullInfo&&e&&!S&&t(o.u1.ChatAdministrators)}),[n,t,S,e]),(0,a.d4)((()=>{Z((null==S?void 0:S.adminRights)||{}),I(((null==S?void 0:S.customTitle)||"").substr(0,16)),g(!1),p(!1)}),[S]);const k=(0,a.I4)((e=>{const{name:t}=e.target;Z((e=>{return{...e,[t]:(n=e[t],!n||void 0)};var n})),g(!0)}),[]),w=(0,a.I4)((()=>{e&&(p(!0),c({chatId:n.id,userId:e,adminRights:h,customTitle:b}))}),[n,e,h,b,c]),N=(0,a.I4)((()=>{e&&(c({chatId:n.id,userId:e,adminRights:{}}),f())}),[n.id,f,e,c]),A=(0,a.I4)((e=>!((0,u.G9)(n)||!i&&n.adminRights&&n.adminRights[e])),[n,i]),L=(0,a.Ye)((()=>{if(!S)return;if(S.isOwner)return y("ChannelCreator");const e=S.promotedByUserId?s[S.promotedByUserId]:void 0;return e?y("EditAdminPromotedBy",(0,u.Js)(e)):y("ChannelAdmin")}),[S,s,y]),R=(0,a.I4)((e=>{const{value:t}=e.target;I(t),g(!0)}),[]);if(S)return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Ee.Z,{inactive:!0,className:"chat-item-clickable"},a.ZP.createElement(fe.Z,{userId:S.userId,status:L,forceShowSelf:!0})),a.ZP.createElement("h3",{className:"section-heading mt-4",dir:"auto"},y("EditAdminWhatCanDo")),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"changeInfo",checked:!!h.changeInfo,label:y(l?"EditAdminChangeChannelInfo":"EditAdminChangeGroupInfo"),blocking:!0,disabled:A("changeInfo"),onChange:k})),l&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"postMessages",checked:!!h.postMessages,label:y("EditAdminPostMessages"),blocking:!0,disabled:A("postMessages"),onChange:k})),l&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"editMessages",checked:!!h.editMessages,label:y("EditAdminEditMessages"),blocking:!0,disabled:A("editMessages"),onChange:k})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"deleteMessages",checked:!!h.deleteMessages,label:y(l?"EditAdminDeleteMessages":"EditAdminGroupDeleteMessages"),blocking:!0,disabled:A("deleteMessages"),onChange:k})),!l&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"banUsers",checked:!!h.banUsers,label:y("EditAdminBanUsers"),blocking:!0,disabled:A("banUsers"),onChange:k})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"inviteUsers",checked:!!h.inviteUsers,label:y("EditAdminAddUsers"),blocking:!0,disabled:A("inviteUsers"),onChange:k})),!l&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"pinMessages",checked:!!h.pinMessages,label:y("EditAdminPinMessages"),blocking:!0,disabled:A("pinMessages"),onChange:k})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"addAdmins",checked:!!h.addAdmins,label:y("EditAdminAddAdmins"),blocking:!0,disabled:A("addAdmins"),onChange:k})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"manageCall",checked:!!h.manageCall,label:y("StartVoipChatPermission"),blocking:!0,disabled:A("manageCall"),onChange:k})),!l&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(en.Z,{name:"anonymous",checked:!!h.anonymous,label:y("EditAdminSendAnonymously"),blocking:!0,disabled:A("anonymous"),onChange:k})),i&&a.ZP.createElement("p",{className:"section-info mb-4",dir:"auto"},y("Channel.EditAdmin.CannotEdit")),!l&&a.ZP.createElement(ve.Z,{id:"admin-title",label:y("EditAdminRank"),onChange:R,value:b,disabled:i,maxLength:16}),r!==e&&!i&&a.ZP.createElement(Ee.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:C},y("EditAdminRemoveAdmin")))),a.ZP.createElement(Xt.Z,{isShown:P,onClick:w,ariaLabel:y("Save"),disabled:v},v?a.ZP.createElement(F.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Fe.Z,{isOpen:E,onClose:f,text:"Are you sure you want to dismiss this admin?",confirmLabel:"Dismiss",confirmHandler:N,confirmIsDestructive:!0}))}))),Br=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,m.Z1)(e,t),{byId:s}=e.users;return{members:null==a||null===(n=a.fullInfo)||void 0===n?void 0:n.members,usersById:s,isChannel:a&&(0,u.eA)(a),serverTimeOffset:e.serverTimeOffset}}),((e,t)=>(0,h.ei)(t,["openUserInfo"])))((({members:e,usersById:t,isChannel:n,openUserInfo:s,onClose:r,isActive:o,serverTimeOffset:l})=>{const i=(0,a.Ye)((()=>{if(e&&t)return(0,u.Z0)(e.map((({userId:e})=>e)),t,void 0,l)}),[e,l,t]),c=(0,a.I4)((e=>{s({id:e})}),[s]);return(0,T.ZP)(o,r),a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section",teactFastList:!0},i?i.map(((e,t)=>a.ZP.createElement(Ee.Z,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>c(e)},a.ZP.createElement(fe.Z,{userId:e,forceShowSelf:!0})))):a.ZP.createElement(it.Z,{teactOrderKey:0,key:"nothing-found",text:n?"No subscribers found":"No members found"}))))}))),$r=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,m.Z1)(e,t),{byId:s}=e.users;return{members:null==a||null===(n=a.fullInfo)||void 0===n?void 0:n.members,usersById:s,isChannel:a&&(0,u.eA)(a),serverTimeOffset:e.serverTimeOffset}}))((({usersById:e,members:t,isChannel:n,onScreenSelect:s,onChatMemberSelect:r,onClose:l,isActive:i,serverTimeOffset:c})=>{(0,T.ZP)(i,l);const d=(0,a.Ye)((()=>{if(t&&e)return(0,u.Z0)(t.filter((e=>!e.isOwner)).map((({userId:e})=>e)),e,void 0,c)}),[t,c,e]),m=(0,a.I4)((e=>{r(e),s(o.u1.GroupUserPermissions)}),[r,s]);return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section",teactFastList:!0},d?d.map(((e,t)=>a.ZP.createElement(Ee.Z,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>m(e)},a.ZP.createElement(fe.Z,{userId:e,forceShowSelf:!0})))):a.ZP.createElement(it.Z,{teactOrderKey:0,key:"nothing-found",text:n?"No subscribers found":"No members found"}))))}))),Dr=(0,a.X$)((0,s.c$)((e=>({managementType:(0,m.pP)(e)})))((({chatId:e,currentScreen:t,selectedChatMemberId:n,isPromotedByCurrentUser:s,onScreenSelect:r,onChatMemberSelect:l,onClose:i,isActive:c,managementType:d})=>{switch(t){case o.u1.Initial:switch(d){case"user":return a.ZP.createElement(Cr,{key:e,userId:e,onClose:i,isActive:c});case"group":return a.ZP.createElement(br,{key:e,chatId:e,onScreenSelect:r,onClose:i,isActive:c||[o.u1.ChatPrivacyType,o.u1.Discussion,o.u1.GroupPermissions,o.u1.ChatAdministrators,o.u1.GroupRemovedUsers,o.u1.GroupUserPermissionsCreate,o.u1.GroupUserPermissions,o.u1.ChatAdminRights,o.u1.GroupRecentActions].includes(t)});case"channel":return a.ZP.createElement(wr,{key:e,chatId:e,onScreenSelect:r,onClose:i,isActive:c||[o.u1.ChannelSubscribers,o.u1.ChatAdministrators,o.u1.Discussion,o.u1.ChatPrivacyType,o.u1.ChatAdminRights,o.u1.GroupRecentActions].includes(t)})}break;case o.u1.ChatPrivacyType:return a.ZP.createElement(Mr,{chatId:e,isActive:c,onClose:i});case o.u1.Discussion:return a.ZP.createElement(Tr,{chatId:e,onScreenSelect:r,isActive:c,onClose:i});case o.u1.GroupPermissions:return a.ZP.createElement(Ir,{chatId:e,onScreenSelect:r,onChatMemberSelect:l,isActive:c||[o.u1.GroupRemovedUsers,o.u1.GroupUserPermissionsCreate,o.u1.GroupUserPermissions].includes(t),onClose:i});case o.u1.GroupRemovedUsers:return a.ZP.createElement(Sr,{chatId:e,isActive:c,onClose:i});case o.u1.GroupUserPermissionsCreate:return a.ZP.createElement($r,{chatId:e,onChatMemberSelect:l,onScreenSelect:r,isActive:c||[o.u1.GroupUserPermissions].includes(t),onClose:i});case o.u1.GroupUserPermissions:return a.ZP.createElement(Fr,{chatId:e,selectedChatMemberId:n,isPromotedByCurrentUser:s,onScreenSelect:r,isActive:c,onClose:i});case o.u1.ChatAdministrators:return a.ZP.createElement(Ar,{chatId:e,onScreenSelect:r,onChatMemberSelect:l,isActive:c||[o.u1.ChatAdminRights,o.u1.GroupRecentActions].includes(t),onClose:i});case o.u1.GroupRecentActions:return a.ZP.createElement(Lr,{chatId:e,isActive:c,onClose:i});case o.u1.ChatAdminRights:return a.ZP.createElement(Rr,{chatId:e,selectedChatMemberId:n,isPromotedByCurrentUser:s,onScreenSelect:r,isActive:c,onClose:i});case o.u1.ChannelSubscribers:case o.u1.GroupMembers:return a.ZP.createElement(Br,{chatId:e,isActive:c,onClose:i})}})));var Ur=n(9937);const Or=/^4[0-9]{12}(?:[0-9]{1,3})?$/,xr=/^5[1-5][0-9]{11,14}$/,Gr=/^2[2-7][0-9]{11,14}$/;let Jr;!function(e){e[e.Default=0]="Default",e[e.Visa=1]="Visa",e[e.Mastercard=2]="Mastercard"}(Jr||(Jr={}));const zr={[Jr.Default]:"",[Jr.Visa]:"visa",[Jr.Mastercard]:"mastercard"};function Xr(e){return e=e.replace(/\s/g,""),Or.test(e)?Jr.Visa:xr.test(e)||Gr.test(e)?Jr.Mastercard:Jr.Default}const _r={},Yr=/(\d{1,3})(\d{1,3})?(\d{1,3})?(\d{1,3})?(\d{1,3})?/,Hr="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 Caledonia6\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 Yr;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+$/))}))),Vr={streetLine1:"",streetLine2:"",city:"",state:"",countryIso2:"",postCode:"",fullName:"",email:"",phone:"",shipping:"",cardNumber:"",cardholder:"",expiry:"",cvv:"",billingCountry:"",billingZip:"",saveInfo:!0,saveCredentials:!1,formErrors:{}},jr=(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:Kr(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:Kr(t.payload.countryIso2)}:{...e,...t.payload};case"setFormErrors":return{...e,formErrors:{...e.formErrors,...t.payload}};default:return e}};function Kr(e){const t=Hr.find((({id:t})=>t===e));return t?t.name:""}function qr(e,t=400){(0,a.d4)((()=>{i.$b||setTimeout((()=>{(0,z.T2)((()=>{e.current&&e.current.focus()}))}),t)}),[e,t])}const Wr=(0,a.X$)((e=>{const{id:t,value:n,label:s,hasArrow:r,error:o,ref:l,placeholder:i,onChange:c,children:d}=e,m=o||s,u=(0,X.Z)("input-group",n&&"touched",o&&"error",m&&"with-label",r&&"with-arrow","input-group");return a.ZP.createElement("div",{className:u},a.ZP.createElement("select",{className:"form-control",id:t,value:n||"",onChange:c,placeholder:i||s,ref:l},d),m&&t&&a.ZP.createElement("label",{htmlFor:t},m))})),Qr=(0,a.X$)((({state:e,needEmail:t,needPhone:n,needName:s,needAddress:r,dispatch:o})=>{const l=(0,a.sO)(null),i=(0,a.sO)(null),c=(0,a.sO)(null);(0,a.d4)((()=>{c.current&&c.current.value!==e.countryIso2&&(c.current.value=e.countryIso2)}),[e.countryIso2]);const d=(0,M.Z)();qr(l);const m=(0,a.I4)((e=>{o({type:"changeAddress1",payload:e.target.value})}),[o]),u=(0,a.I4)((e=>{o({type:"changeAddress2",payload:e.target.value})}),[o]),h=(0,a.I4)((e=>{o({type:"changeCity",payload:e.target.value})}),[o]),Z=(0,a.I4)((e=>{o({type:"changeState",payload:e.target.value})}),[o]),P=(0,a.I4)((e=>{o({type:"changeCountry",payload:e.target.value})}),[o]),g=(0,a.I4)((e=>{o({type:"changePostCode",payload:e.target.value})}),[o]),v=(0,a.I4)((e=>{o({type:"changeFullName",payload:e.target.value})}),[o]),p=(0,a.I4)((e=>{o({type:"changeEmail",payload:e.target.value})}),[o]),E=(0,a.I4)((e=>{let{value:t}=e.target;t=`+${t.replace(/\D/g,"")}`,i.current&&(i.current.value=t),o({type:"changePhone",payload:t})}),[o]),C=(0,a.I4)((e=>{o({type:"changeSaveInfo",payload:e.target.value})}),[o]),{formErrors:f}=e;return a.ZP.createElement("div",{className:"ShippingInfo"},a.ZP.createElement("form",null,r?a.ZP.createElement("div",null,a.ZP.createElement("h5",null,d("PaymentShippingAddress")),a.ZP.createElement(ve.Z,{ref:l,label:"Address1 (Street)",onChange:m,value:e.streetLine1,inputMode:"text",error:f.streetLine1}),a.ZP.createElement(ve.Z,{label:"Address2 (Street)",onChange:u,value:e.streetLine2,inputMode:"text",error:f.streetLine2}),a.ZP.createElement(ve.Z,{label:"City",onChange:h,value:e.city,inputMode:"text",error:f.city}),a.ZP.createElement(ve.Z,{label:"State",onChange:Z,value:e.state,inputMode:"text",error:f.state}),a.ZP.createElement(Wr,{label:"Country",placeholder:"Country",onChange:P,value:e.countryIso2,hasArrow:Boolean(!0),id:"shipping-country",error:f.countryIso2,ref:c},Hr.map((({name:e,id:t})=>a.ZP.createElement("option",{value:t,className:"county-item"},e)))),a.ZP.createElement(ve.Z,{label:"Post Code",onChange:g,value:e.postCode,inputMode:"text",error:f.postCode})):void 0,s||t||n?a.ZP.createElement("h5",null,d("PaymentShippingReceiver")):void 0,s&&a.ZP.createElement(ve.Z,{label:"Full name",onChange:v,value:e.fullName,inputMode:"text",error:f.fullName}),t&&a.ZP.createElement(ve.Z,{label:"Email",onChange:p,value:e.email,inputMode:"email",error:f.email}),n&&a.ZP.createElement(ve.Z,{label:"Phone number",onChange:E,value:e.phone,inputMode:"tel",error:f.phone,ref:i}),a.ZP.createElement(en.Z,{label:d("PaymentShippingSave"),subLabel:d("PaymentShippingSaveInfo"),checked:Boolean(e.saveInfo),onChange:C})))})),eo=(0,a.X$)((({state:e,shippingOptions:t,currency:n,dispatch:s})=>{const r=(0,M.Z)();(0,a.d4)((()=>{t&&!e.shipping&&s({type:"changeShipping",payload:t[0].id})}),[t,e.shipping,s]);const o=(0,a.I4)((e=>{s({type:"changeShipping",payload:e})}),[s]),l=(0,a.Ye)((()=>t.map((({id:e,title:t,amount:a})=>({label:t,subLabel:(0,Ur.x)(a,n,r.code),value:e})))),[t,n,r.code]);return a.ZP.createElement("div",{className:"Shipping"},a.ZP.createElement("form",null,a.ZP.createElement("p",null,"Select shipping method"),a.ZP.createElement(_e.Z,{name:"shipping-options",options:l,onChange:o,selected:e.shipping})))}));function to(e,t,n,s,r=!1){return a.ZP.createElement("div",{className:"price-info-item "+(r?"price-info-item-main":"")},a.ZP.createElement("div",{className:"title"},t),a.ZP.createElement("div",{className:"value"},(0,Ur.x)(n,s,e)))}function no(e,t,n){return a.ZP.createElement("div",{className:"checkout-info-item"},a.ZP.createElement("i",{className:e}," "),a.ZP.createElement("div",{className:"info"},a.ZP.createElement("div",{className:"title"},t),a.ZP.createElement("p",{className:"data"},n)))}const ao=(0,a.X$)((({invoiceContent:e,prices:t,shippingPrices:n,checkoutInfo:s,currency:r,totalPrice:o})=>{const l=(0,M.Z)(),{photoUrl:i,title:c,text:d}=e||{},{paymentMethod:m,paymentProvider:u,shippingAddress:h,name:Z,phone:P,shippingMethod:g}=s||{};return a.ZP.createElement("div",{className:"Checkout"},a.ZP.createElement("div",{className:"description has-image"},i&&a.ZP.createElement("img",{src:i,alt:""}),a.ZP.createElement("div",{className:"text"},a.ZP.createElement("h5",null,c),a.ZP.createElement("p",null,d))),a.ZP.createElement("div",{className:"price-info"},t&&t.map((e=>to(l.code,e.label,e.amount,r))),n&&n.map((e=>to(l.code,e.label,e.amount,r))),void 0!==o&&to(l.code,l("Checkout.TotalAmount"),o,r,!0)),a.ZP.createElement("div",{className:"invoice-info"},m&&no("icon-card",m,"Payment method"),u&&no("stripe-provider",u,"Payment provider"),h&&no("icon-location",h,"Shipping address"),Z&&no("icon-user",Z,"Name"),P&&no("icon-phone",P,"Phone number"),g&&no("icon-truck",g,"Shipping method")))})),so=(0,a.X$)((({value:e,error:t,onChange:n})=>{const s=(0,a.sO)(null),r=(0,a.I4)((t=>{if("Backspace"===t.key&&"/"===e.charAt(e.length-1)){const t=e.slice(0,e.length-1);s.current&&(s.current.value=t)}}),[e]),o=(0,a.I4)((e=>{n(function(e){const t=(e=e.replace(/[^\d]/g,"").slice(0,4)).match(/.{1,2}/g);return null!=t&&t[0]&&Number(t[0])>12&&(t[0]="12"),null!=t&&t[0]&&2===t[0].length&&!t[1]&&(t[1]=""),t?t.join("/"):""}(e.target.value))}),[n]);return a.ZP.createElement(ve.Z,{label:"Expiry date",ref:s,onChange:o,onKeyDown:r,value:e,error:t,inputMode:"numeric",maxLength:5})}));var ro=n(6352),oo=n(5753);const lo=(0,a.X$)((({value:e,error:t,onChange:n})=>{const s=(0,a.sO)(null);qr(s);const[r,o]=(0,a.eJ)(Jr.Default);(0,a.d4)((()=>{const t=Xr(e);o(t)}),[]);const l=(0,a.I4)((e=>{const t=function(e){const t=(e=e.replace(/[^\d]/g,"")).match(/.{1,4}/g);return t?t.join(" "):""}(e.target.value),a=Xr(e.target.value);o(a),n(t),s.current&&(s.current.value=t)}),[n,s]),i=function(e){switch(e){case Jr.Mastercard:return a.ZP.createElement("img",{src:ro,alt:""});case Jr.Visa:return a.ZP.createElement("img",{src:oo,alt:""});default:return}}(r);return a.ZP.createElement("div",{className:"CardInput"},a.ZP.createElement("span",{className:"left-addon"},i),a.ZP.createElement(ve.Z,{ref:s,label:"Card number",onChange:l,value:e,inputMode:"numeric",className:r?"has-left-addon":"",error:t,maxLength:23}))})),io=(0,a.X$)((({state:e,canSaveCredentials:t,needCardholderName:n,needCountry:s,needZip:r,dispatch:o})=>{const l=(0,a.sO)(null);(0,a.d4)((()=>{l.current&&l.current.value!==e.billingCountry&&(l.current.value=e.billingCountry)}),[e.billingCountry]);const i=(0,a.I4)((e=>{o({type:"changeCardNumber",payload:e})}),[o]),c=(0,a.I4)((e=>{o({type:"changeCardholder",payload:e.target.value.toUpperCase()})}),[o]),d=(0,a.I4)((e=>{o({type:"changeExpiryDate",payload:e})}),[o]),m=(0,a.I4)((e=>{o({type:"changeCvvCode",payload:e.target.value})}),[o]),u=(0,a.I4)((e=>{o({type:"changeBillingCountry",payload:e.target.value})}),[o]),h=(0,a.I4)((e=>{o({type:"changeBillingZip",payload:e.target.value})}),[o]),Z=(0,a.I4)((e=>{o({type:"changeSaveCredentials",payload:e.target.value})}),[o]),P=(0,M.Z)(),{formErrors:g={}}=e;return a.ZP.createElement("div",{className:"PaymentInfo"},a.ZP.createElement("form",null,a.ZP.createElement("h5",null,P("PaymentCardTitle")),a.ZP.createElement(lo,{onChange:i,value:e.cardNumber,error:g.cardNumber}),n&&a.ZP.createElement(ve.Z,{label:"Name on card",onChange:c,value:e.cardholder,inputMode:"text",error:g.cardholder}),a.ZP.createElement("section",{className:"inline-inputs"},a.ZP.createElement(so,{value:e.expiry,onChange:d,error:g.expiry}),a.ZP.createElement(ve.Z,{label:"CVV code",onChange:m,value:e.cvv,inputMode:"numeric",maxLength:3,error:g.cvv})),s||r?a.ZP.createElement("h5",null,P("PaymentBillingAddress")):void 0,s&&a.ZP.createElement(Wr,{label:"Country",placeholder:"Country",onChange:u,value:e.billingCountry,hasArrow:Boolean(!0),id:"billing-country",error:g.billingCountry,ref:l},Hr.map((({name:e})=>a.ZP.createElement("option",{value:e,className:"county-item"},e)))),r&&a.ZP.createElement(ve.Z,{label:"Post Code",onChange:h,value:e.billingZip,inputMode:"text",error:g.billingZip}),t&&a.ZP.createElement(en.Z,{label:P("PaymentCardSavePaymentInformation"),checked:e.saveCredentials,onChange:Z})))})),co=(0,a.X$)((0,s.c$)((e=>{const{step:t,shippingOptions:n,savedInfo:a,canSaveCredentials:s,invoice:r,invoiceContent:o,nativeProvider:l,nativeParams:i,passwordMissing:c,error:d}=e.payment,m=Boolean(r&&(!l||"stripe"!==l)),{needCardholderName:u,needCountry:h,needZip:Z}=i||{},{nameRequested:P,phoneRequested:g,emailRequested:v,shippingAddressRequested:p,flexible:E,phoneToProvider:C,emailToProvider:f,currency:b,prices:I}=r||{};return{step:t,shippingOptions:n,savedInfo:a,canSaveCredentials:s,nativeProvider:l,passwordMissing:c,nameRequested:P,shippingAddressRequested:p,phoneRequested:g,emailRequested:v,flexible:E,phoneToProvider:C,emailToProvider:f,currency:b,prices:I,isProviderError:m,invoiceContent:o,needCardholderName:u,needCountry:h,needZip:Z,error:d}}),((e,t)=>(0,h.ei)(t,["validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError"])))((({isOpen:e,onClose:t,step:n,shippingOptions:s,savedInfo:r,canSaveCredentials:l,nameRequested:i,shippingAddressRequested:c,phoneRequested:d,emailRequested:m,phoneToProvider:u,emailToProvider:h,currency:Z,passwordMissing:P,isProviderError:g,invoiceContent:v,nativeProvider:p,prices:E,needCardholderName:C,needCountry:f,needZip:b,error:I,validateRequestedInfo:y,sendPaymentForm:S,setPaymentStep:k,sendCredentialsInfo:w,clearPaymentError:N})=>{const[T,A]=(0,$t.Z)(jr,Vr),[B,$]=(0,a.eJ)(!1),D=(0,M.Z)();(0,a.d4)((()=>{(n||I)&&$(!1)}),[n,I]),(0,a.d4)((()=>{null!=I&&I.field&&A({type:"setFormErrors",payload:{[I.field]:I.message}})}),[I,A]),(0,a.d4)((()=>{if(r){const{name:e,phone:t,email:n,shippingAddress:a}=r;A({type:"updateUserInfo",payload:{fullName:e,phone:t&&"+"!==t.charAt(0)?`+${t}`:t,email:n,...a||{}}})}}),[r,A]);const U=(0,a.I4)((()=>{N()}),[N]),O=(0,a.Ye)((()=>n!==o.KB.Checkout?0:function(e=[],t,n){const a=t?uo(t,n):[];let s=0;return s=e.concat(a||[]).reduce(((e,t)=>e+t.amount),s),s}(E,s,T.shipping)),[n,T.shipping,E,s]),x=(0,a.Ye)((()=>{if(n===o.KB.Checkout)return function(e,t,n){const a=`${function(e){const t=Xr(e);return zr[t]||""}(e.cardNumber)} *${e.cardNumber.slice(-4)}`,s=e.streetLine1?`${e.streetLine1}, ${e.city}, ${e.countryIso2}`:void 0,{phone:r,fullName:o}=e,l=t?mo(t,e.shipping):void 0;return{paymentMethod:a,paymentProvider:n,shippingAddress:s,name:o,phone:r,shippingMethod:null==l?void 0:l.title}}(T,s,p||"")}),[n,T,s,p]),G=(0,a.I4)((()=>{const{saveInfo:e}=T,t=function(e){const{streetLine1:t,streetLine2:n,city:a,state:s,countryIso2:r,postCode:o,fullName:l,phone:i,email:c}=e;return{name:l,phone:i,email:c,shippingAddress:{streetLine1:t,streetLine2:n,city:a,state:s,countryIso2:r,postCode:o}}}(T);y({requestInfo:t,saveInfo:e})}),[y,T]),J=(0,a.I4)((()=>{const e=function(e){const{cardNumber:t,cardholder:n,expiry:a,cvv:s,billingCountry:r,billingZip:o}=e,[l,i]=a.split("/");return{data:{cardNumber:t,cardholder:n,expiryMonth:l,expiryYear:i,cvv:s,country:r,zip:o}}}(T);w({credentials:e})}),[w,T]),z=(0,a.I4)((()=>{S({shippingOptionId:T.shipping,saveCredentials:T.saveCredentials})}),[S,T]),X=(0,a.I4)((e=>{k({step:e})}),[k]),_=(0,a.I4)((()=>{switch($(!0),n){case o.KB.ShippingInfo:return G();case o.KB.Shipping:return X(o.KB.PaymentInfo);case o.KB.PaymentInfo:return J();case o.KB.Checkout:return z();default:return()=>{}}}),[n,G,X,J,z]),Y=(0,a.Ye)((()=>{switch(n){case o.KB.ShippingInfo:return D("PaymentShippingInfo");case o.KB.Shipping:return D("PaymentShippingMethod");case o.KB.PaymentInfo:return D("PaymentCardInfo");case o.KB.Checkout:return D("PaymentCheckout");default:return""}}),[n,D]),H=(0,a.Ye)((()=>{switch(n){case o.KB.Checkout:return D("Checkout.PayPrice",(0,Ur.x)(O,Z,D.code));default:return D("Next")}}),[n,D,Z,O]);return g?a.ZP.createElement(ge.Z,{className:"error",isOpen:e,onClose:t},a.ZP.createElement("p",null,"Sorry, Telegram WebZ doesn't support payments with this provider yet. ",a.ZP.createElement("br",null),"Please use one of our mobile apps to do this."),a.ZP.createElement(R.Z,{isText:!0,onClick:t},D("OK"))):a.ZP.createElement(ge.Z,{className:"PaymentModal",isOpen:e,onClose:t},a.ZP.createElement("div",{className:"header",dir:D.isRtl?"rtl":void 0},a.ZP.createElement(R.Z,{className:"close-button",color:"translucent",round:!0,size:"smaller",onClick:t,ariaLabel:"Close"},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement("h3",null,Y)),void 0!==n?a.ZP.createElement(L.Z,{name:"slide",activeKey:n},(()=>a.ZP.createElement("div",{className:"content custom-scroll"},function(e){switch(e){case o.KB.ShippingInfo:return a.ZP.createElement(Qr,{state:T,dispatch:A,needAddress:Boolean(c),needEmail:Boolean(m||h),needPhone:Boolean(d||u),needName:Boolean(i)});case o.KB.Shipping:return a.ZP.createElement(eo,{state:T,dispatch:A,shippingOptions:s||[],currency:Z});case o.KB.PaymentInfo:return a.ZP.createElement(io,{state:T,dispatch:A,canSaveCredentials:Boolean(!P&&l),needCardholderName:C,needCountry:f,needZip:b});case o.KB.Checkout:return a.ZP.createElement(ao,{prices:E,shippingPrices:T.shipping&&s?uo(s,T.shipping):void 0,totalPrice:O,invoiceContent:v,checkoutInfo:x,currency:Z});default:return}}(n)))):a.ZP.createElement("div",{className:"empty-content"},a.ZP.createElement(F.Z,{color:"gray"})),a.ZP.createElement("div",{className:"footer"},a.ZP.createElement(R.Z,{type:"submit",onClick:_,disabled:B,isLoading:B},H)),I&&!I.field&&function(){if(I)return a.ZP.createElement(ge.Z,{className:"error",isOpen:Boolean(I),onClose:U},a.ZP.createElement("h4",null,I.description||"Error"),a.ZP.createElement("p",null,I.description||"Error"),a.ZP.createElement(R.Z,{isText:!0,onClick:N},D("OK")))}())})));function mo(e,t){return e.find((({id:e})=>e===t))}function uo(e,t){const n=mo(e,t);return null==n?void 0:n.prices}const ho=(0,a.X$)((0,s.c$)((e=>{const{receipt:t}=e.payment,{currency:n,prices:a,info:s,totalAmount:r,credentialsTitle:o,shippingPrices:l,shippingMethod:i,photoUrl:c,text:d,title:m}=t||{};return{currency:n,prices:a,info:s,totalAmount:r,credentialsTitle:o,shippingPrices:l,shippingMethod:i,photoUrl:c,text:d,title:m}}))((({isOpen:e,onClose:t,prices:n,shippingPrices:s,totalAmount:r,currency:o,info:l,photoUrl:i,text:c,title:d,credentialsTitle:m,shippingMethod:u})=>{const h=(0,M.Z)(),Z=(0,a.Ye)((()=>function(e,t,n){if(!t)return{paymentMethod:e};const{shippingAddress:a}=t,s=null!=a&&a.streetLine1?`${a.streetLine1}, ${a.city}, ${a.countryIso2}`:void 0,{phone:r,name:o}=t;return{paymentMethod:e,paymentProvider:"Stripe",shippingAddress:s,name:o,phone:r,shippingMethod:n}}(m,l,u)),[l,u,m]);return a.ZP.createElement(ge.Z,{className:"PaymentModal PaymentModal-receipt",isOpen:e,onClose:t},a.ZP.createElement("div",null,a.ZP.createElement("div",{className:"header",dir:h.isRtl?"rtl":void 0},a.ZP.createElement(R.Z,{className:"close-button",color:"translucent",round:!0,size:"smaller",onClick:t,ariaLabel:"Close"},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement("h3",null," ",h("PaymentReceipt")," ")),a.ZP.createElement("div",{className:"receipt-content custom-scroll"},a.ZP.createElement(ao,{prices:n,shippingPrices:s,totalPrice:r,invoiceContent:{photoUrl:i,text:c,title:d},checkoutInfo:Z,currency:o}))))})))},9364:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(4050),s=n(3716),r=n(7361),o=n(6752),l=n(9107),i=n(231);const c=r.wB?550:400,d=(0,a.X$)((({isLoading:e=!1,isPasswordVisible:t,error:n,hint:d,placeholder:m="Password",submitLabel:u="Next",clearError:h,onChangePasswordVisibility:Z,onInputChange:P,onSubmit:g})=>{const v=(0,a.sO)(null),p=(0,l.Z)(),[E,C]=(0,a.eJ)(""),[f,b]=(0,a.eJ)(!1);return(0,a.d4)((()=>{r.$b||setTimeout((()=>{v.current.focus()}),c)}),[]),(0,a.d4)((()=>{n&&requestAnimationFrame((()=>{v.current.focus(),v.current.select()}))}),[n]),a.ZP.createElement("form",{action:"",onSubmit:function(t){t.preventDefault(),e||f&&g(E)},autoComplete:"off"},a.ZP.createElement("div",{className:(0,o.Z)("input-group password-input",E&&"touched",n&&"error"),dir:p.isRtl?"rtl":void 0},a.ZP.createElement("input",{ref:v,className:"form-control",type:t?"text":"password",id:"sign-in-password",value:E||"",autoComplete:"current-password",onChange:function(e){n&&h();const{target:t}=e;C(t.value),b(t.value.length>=s.lo),P&&P(t.value)},dir:"auto"}),a.ZP.createElement("label",null,n||d||m),a.ZP.createElement("div",{className:"toggle-password",onClick:function(){Z(!t)},role:"button",tabIndex:0,title:"Toggle password visibility"},a.ZP.createElement("i",{className:t?"icon-eye":"icon-eye-closed"}))),f&&a.ZP.createElement(i.Z,{type:"submit",ripple:!0,isLoading:e},u))}))},3490:(e,t,n)=>{n.d(t,{Z:()=>u});var a=n(4050),s=n(3716),r=n(7361),o=n(7324),l=n(7799);const i=[0,50],c=[0,20],d=[20,0],m=r.wB?s.qp:s.z7,u=(0,a.X$)((({isPasswordVisible:e,isBig:t})=>{const[n,r]=(0,a.eJ)(),[u,h]=(0,a.eJ)(),[Z,P]=(0,a.eJ)(!1),[g,v]=(0,a.eJ)(!1);(0,a.d4)((()=>{n?setTimeout((()=>v(!0)),2e3):(0,o.Z)("MonkeyClose").then(r)}),[n]),(0,a.d4)((()=>{u||(0,o.Z)("MonkeyPeek").then(h)}),[u]);const p=(0,a.I4)((()=>P(!0)),[]);return a.ZP.createElement("div",{id:"monkey",className:t?"big":""},!Z&&a.ZP.createElement("div",{className:"monkey-preview"}),n&&a.ZP.createElement(l.Z,{id:"closeMonkey",size:t?s.K2:m,className:g?"hidden":"shown",animationData:n,playSegment:i,noLoop:!0,onLoad:p}),u&&a.ZP.createElement(l.Z,{id:"peekMonkey",size:t?s.K2:m,className:g?"shown":"hidden",animationData:u,playSegment:e?c:d,noLoop:!0}))}))},7324:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(6137),s=n(647);const r={MonkeyIdle:n(1679),MonkeyTracking:n(4889),MonkeyClose:n(4185),MonkeyPeek:n(8431),FoldersAll:n(6041),FoldersNew:n(7196),DiscussionGroups:n(4349),CameraFlip:n(6280),HandFilled:n(9129),HandOutline:n(1039),Speaker:n(9261),VoiceAllowTalk:n(2873),VoiceMini:n(7242),VoiceMuted:n(1274),VoiceOutlined:n(973)};function o(e){const t=r[e].replace(window.location.origin,"");return s.he(`file${t}`,a.IU.Lottie)}},710:(e,t,n)=>{n.d(t,{Z:()=>g});var a=n(4050),s=n(6752),r=n(3716),o=n(1394),l=n(9107),i=n(231),c=n(3103),d=n(4288);const m={type:"blob",quality:1,format:"jpeg",circle:!1};let u,h,Z;const P=(0,a.X$)((({file:e,onChange:t,onClose:s})=>{const[P,g]=(0,a.eJ)(!1);(0,a.d4)((()=>{e&&(P?async function(e){try{const t=document.getElementById("avatar-crop");if(!t)return;const{offsetWidth:n,offsetHeight:a}=t;Z=new u(t,{enableZoom:!0,boundary:{width:n,height:a},viewport:{width:n-16,height:a-16,type:"circle"}});const s=await(0,o.YJ)(e);await Z.bind({url:s})}catch(e){r.eM&&console.error(e)}}(e):async function(){return h||(h=Promise.all([n.e(99),n.e(472)]).then(n.bind(n,3472)),u=(await h).default),h}().then((()=>g(!0))))}),[e,P]);const v=(0,l.Z)();return a.ZP.createElement(c.Z,{isOpen:Boolean(e),onClose:s,title:"Drag to reposition",className:"CropModal",hasCloseButton:!0},P?a.ZP.createElement("div",{id:"avatar-crop"}):a.ZP.createElement(d.Z,null),a.ZP.createElement(i.Z,{className:"confirm-button",round:!0,color:"primary",onClick:async function(){if(!Z)return;const e=await Z.result(m),n="string"==typeof e?e:(0,o.hl)(e,"avatar.jpg");t(n)},ariaLabel:v("CropImage")},a.ZP.createElement("i",{className:"icon-check"})))})),g=(0,a.X$)((({title:e="Change your profile picture",disabled:t,currentAvatarBlobUrl:n,onChange:r})=>{const[o,l]=(0,a.eJ)(),[i,c]=(0,a.eJ)(n);(0,a.d4)((()=>{c(n)}),[n]);const d=(0,s.Z)(i&&"filled",t&&"disabled");return a.ZP.createElement("div",{className:"AvatarEditable"},a.ZP.createElement("label",{className:d,role:"button",tabIndex:0,title:e},a.ZP.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"}),a.ZP.createElement("i",{className:"icon-camera-add"}),i&&a.ZP.createElement("img",{src:i,alt:"Avatar"})),a.ZP.createElement(P,{file:o,onClose:function(){l(void 0)},onChange:function(e){l(void 0),r(e),i&&URL.revokeObjectURL(i),c(URL.createObjectURL(e))}}))}))},4349:(e,t,n)=>{e.exports=n.p+"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a..tgs"},6041:(e,t,n)=>{e.exports=n.p+"FoldersAll.3f9f9e243d19f0fbf9aa..tgs"},7196:(e,t,n)=>{e.exports=n.p+"FoldersNew.9a40d71c0c8be70f5bd1..tgs"},4185:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3e..tgs"},1679:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab..tgs"},8431:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyPeek.1905436b042520363d7e..tgs"},4889:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12..tgs"},6280:(e,t,n)=>{e.exports=n.p+"CameraFlip.1a9fe44cf01fcb22347d..tgs"},9129:(e,t,n)=>{e.exports=n.p+"HandFilled.f87939d160f1dc288586..tgs"},1039:(e,t,n)=>{e.exports=n.p+"HandOutline.f9831751ba60df30c484..tgs"},9261:(e,t,n)=>{e.exports=n.p+"Speaker.04bb3743412b41ff83c5..tgs"},2873:(e,t,n)=>{e.exports=n.p+"VoiceAllowTalk.a9cc7c39ec438973ddc9..tgs"},7242:(e,t,n)=>{e.exports=n.p+"VoiceMini.bf00ffdf69625c579569..tgs"},1274:(e,t,n)=>{e.exports=n.p+"VoiceMuted.a4b4ec6bfd7c6c5fb275..tgs"},973:(e,t,n)=>{e.exports=n.p+"VoiceOutlined.91b394ab3562cdfad6bc..tgs"},6352:(e,t,n)=>{e.exports=n.p+"mastercard.4216118edafe23cc2dec..svg"},5753:(e,t,n)=>{e.exports=n.p+"visa.e5a7c336e1deb4b92a63..svg"}}]); +//# sourceMappingURL=701.b9c40fbb5ff59255dc0a.js.map \ No newline at end of file diff --git a/dist/701.b9c40fbb5ff59255dc0a.js.map b/dist/701.b9c40fbb5ff59255dc0a.js.map new file mode 100644 index 000000000..d365b4d55 --- /dev/null +++ b/dist/701.b9c40fbb5ff59255dc0a.js.map @@ -0,0 +1 @@ +{"version":3,"file":"701.b9c40fbb5ff59255dc0a.js","mappings":"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","sources":["webpack://telegram-t/./src/components/mediaViewer/helpers/ghostAnimation.ts","webpack://telegram-t/./src/components/mediaViewer/SenderInfo.tsx","webpack://telegram-t/./src/components/mediaViewer/MediaViewerActions.tsx","webpack://telegram-t/./src/components/mediaViewer/MediaViewerFooter.tsx","webpack://telegram-t/./src/hooks/useFullscreen.ts","webpack://telegram-t/./src/components/mediaViewer/helpers/formatFileSize.ts","webpack://telegram-t/./src/components/mediaViewer/VideoPlayerControls.tsx","webpack://telegram-t/./src/components/mediaViewer/VideoPlayer.tsx","webpack://telegram-t/./src/components/mediaViewer/ZoomControls.tsx","webpack://telegram-t/./src/components/mediaViewer/PanZoom.tsx","webpack://telegram-t/./src/components/mediaViewer/MediaViewer.tsx","webpack://telegram-t/./src/components/common/ChatOrUserPicker.tsx","webpack://telegram-t/./src/components/main/ForwardPicker.tsx","webpack://telegram-t/./src/components/main/Dialogs.tsx","webpack://telegram-t/./src/components/main/Notifications.tsx","webpack://telegram-t/./src/components/main/SafeLinkModal.tsx","webpack://telegram-t/./src/components/common/CalendarModal.tsx","webpack://telegram-t/./src/components/main/HistoryCalendar.tsx","webpack://telegram-t/./src/components/common/DeleteMessageModal.tsx","webpack://telegram-t/./src/components/common/PinMessageModal.tsx","webpack://telegram-t/./src/components/common/UnpinAllMessagesModal.tsx","webpack://telegram-t/./src/components/middle/DeleteSelectedMessageModal.tsx","webpack://telegram-t/./src/components/common/ReportMessageModal.tsx","webpack://telegram-t/./src/components/middle/MessageSelectToolbar.tsx","webpack://telegram-t/./src/hooks/useSelectWithEnter.ts","webpack://telegram-t/./src/components/left/search/LeftSearchResultChat.tsx","webpack://telegram-t/./src/components/left/search/RecentContacts.tsx","webpack://telegram-t/./src/components/left/search/ChatMessage.tsx","webpack://telegram-t/./src/components/left/search/DateSuggest.tsx","webpack://telegram-t/./src/components/left/search/ChatResults.tsx","webpack://telegram-t/./src/components/left/search/ChatMessageResults.tsx","webpack://telegram-t/./src/components/left/search/helpers/createMapStateToProps.ts","webpack://telegram-t/./src/components/left/search/MediaResults.tsx","webpack://telegram-t/./src/components/left/search/LinkResults.tsx","webpack://telegram-t/./src/components/left/search/FileResults.tsx","webpack://telegram-t/./src/components/left/search/AudioResults.tsx","webpack://telegram-t/./src/components/left/search/LeftSearch.tsx","webpack://telegram-t/./src/hooks/reducers/useTwoFaReducer.ts","webpack://telegram-t/./src/components/left/settings/SettingsHeader.tsx","webpack://telegram-t/./src/components/left/settings/SettingsMain.tsx","webpack://telegram-t/./src/components/common/UsernameInput.tsx","webpack://telegram-t/./src/components/left/settings/SettingsEditProfile.tsx","webpack://telegram-t/./src/components/left/settings/SettingsDataStorage.tsx","webpack://telegram-t/./src/components/left/settings/folders/SettingsFoldersMain.tsx","webpack://telegram-t/./src/components/ui/ShowMoreButton.tsx","webpack://telegram-t/./src/components/left/settings/folders/SettingsFoldersEdit.tsx","webpack://telegram-t/./src/components/left/settings/folders/SettingsFoldersChatsPicker.tsx","webpack://telegram-t/./src/components/left/settings/folders/SettingsFoldersChatFilters.tsx","webpack://telegram-t/./src/components/left/settings/folders/SettingsFolders.tsx","webpack://telegram-t/./src/components/middle/composer/StickerSetCoverAnimated.tsx","webpack://telegram-t/./src/components/middle/composer/StickerSetCover.tsx","webpack://telegram-t/./src/components/left/settings/SettingsStickerSet.tsx","webpack://telegram-t/./src/components/left/settings/SettingsGeneral.tsx","webpack://telegram-t/./src/util/systemFilesDialog.ts","webpack://telegram-t/./src/util/colors.ts","webpack://telegram-t/./src/components/left/settings/WallpaperTile.tsx","webpack://telegram-t/./src/components/left/settings/SettingsGeneralBackground.tsx","webpack://telegram-t/./src/components/left/settings/SettingsGeneralBackgroundColor.tsx","webpack://telegram-t/./src/components/left/settings/SettingsNotifications.tsx","webpack://telegram-t/./src/components/left/settings/SettingsPrivacy.tsx","webpack://telegram-t/./src/components/left/settings/SettingsLanguage.tsx","webpack://telegram-t/./src/components/left/settings/helper/privacy.ts","webpack://telegram-t/./src/components/left/settings/SettingsPrivacyVisibility.tsx","webpack://telegram-t/./src/components/left/settings/SettingsPrivacyActiveSessions.tsx","webpack://telegram-t/./src/components/left/settings/BlockUserModal.tsx","webpack://telegram-t/./src/components/left/settings/SettingsPrivacyBlockedUsers.tsx","webpack://telegram-t/./src/components/left/settings/twoFa/SettingsTwoFaEnabled.tsx","webpack://telegram-t/./src/components/left/settings/twoFa/SettingsTwoFaPassword.tsx","webpack://telegram-t/./src/components/left/settings/twoFa/SettingsTwoFaStart.tsx","webpack://telegram-t/./src/components/left/settings/twoFa/SettingsTwoFaSkippableForm.tsx","webpack://telegram-t/./src/components/left/settings/twoFa/SettingsTwoFaCongratulations.tsx","webpack://telegram-t/./src/components/left/settings/twoFa/SettingsTwoFaEmailCode.tsx","webpack://telegram-t/./src/components/left/settings/twoFa/SettingsTwoFa.tsx","webpack://telegram-t/./src/components/left/settings/SettingsPrivacyVisibilityExceptionList.tsx","webpack://telegram-t/./src/components/left/settings/Settings.tsx","webpack://telegram-t/./src/components/left/main/ContactList.tsx","webpack://telegram-t/./src/components/left/newChat/NewChatStep1.tsx","webpack://telegram-t/./src/components/left/newChat/NewChatStep2.tsx","webpack://telegram-t/./src/components/left/newChat/NewChat.tsx","webpack://telegram-t/./src/components/left/ArchivedChats.tsx","webpack://telegram-t/./src/components/left/ChatFolderModal.tsx","webpack://telegram-t/./src/components/middle/message/helpers/copyOptions.ts","webpack://telegram-t/./src/util/scrollLock.ts","webpack://telegram-t/./src/components/middle/message/MessageContextMenu.tsx","webpack://telegram-t/./src/components/middle/message/ContextMenuContainer.tsx","webpack://telegram-t/./src/components/common/StickerSetModal.tsx","webpack://telegram-t/./src/components/middle/HeaderMenuContainer.tsx","webpack://telegram-t/./src/components/middle/MobileSearch.tsx","webpack://telegram-t/./src/util/findInViewport.ts","webpack://telegram-t/./src/util/isFullyVisible.ts","webpack://telegram-t/./src/util/setTooltipItemVisible.ts","webpack://telegram-t/./src/components/middle/composer/hooks/useKeyboardNavigation.ts","webpack://telegram-t/./src/components/middle/composer/MentionTooltip.tsx","webpack://telegram-t/./src/components/middle/composer/AttachmentModal.tsx","webpack://telegram-t/./src/components/middle/composer/PollModal.tsx","webpack://telegram-t/./src/components/middle/composer/EmojiButton.tsx","webpack://telegram-t/./src/components/middle/composer/EmojiCategory.tsx","webpack://telegram-t/./src/components/middle/composer/EmojiPicker.tsx","webpack://telegram-t/./src/components/middle/composer/StickerSet.tsx","webpack://telegram-t/./src/components/middle/composer/StickerPicker.tsx","webpack://telegram-t/./src/components/common/GifButton.tsx","webpack://telegram-t/./src/components/middle/composer/GifPicker.tsx","webpack://telegram-t/./src/components/middle/composer/SymbolMenuFooter.tsx","webpack://telegram-t/./src/components/middle/composer/SymbolMenu.tsx","webpack://telegram-t/./src/components/middle/composer/AttachMenu.tsx","webpack://telegram-t/./src/components/middle/composer/BotCommand.tsx","webpack://telegram-t/./src/components/middle/composer/BotCommandTooltip.tsx","webpack://telegram-t/./src/components/middle/composer/BotCommandMenu.tsx","webpack://telegram-t/./src/components/middle/composer/StickerTooltip.tsx","webpack://telegram-t/./src/components/middle/composer/CustomSendMenu.tsx","webpack://telegram-t/./src/components/middle/composer/EmojiTooltip.tsx","webpack://telegram-t/./src/components/middle/composer/inlineResults/BaseResult.tsx","webpack://telegram-t/./src/components/middle/composer/inlineResults/MediaResult.tsx","webpack://telegram-t/./src/components/middle/composer/inlineResults/ArticleResult.tsx","webpack://telegram-t/./src/components/middle/composer/inlineResults/GifResult.tsx","webpack://telegram-t/./src/components/middle/composer/inlineResults/StickerResult.tsx","webpack://telegram-t/./src/components/middle/composer/InlineBotTooltip.tsx","webpack://telegram-t/./src/components/right/RightSearch.tsx","webpack://telegram-t/./src/components/right/StickerSetResult.tsx","webpack://telegram-t/./src/components/right/StickerSearch.tsx","webpack://telegram-t/./src/components/right/GifSearch.tsx","webpack://telegram-t/./src/components/right/PollAnswerResults.tsx","webpack://telegram-t/./src/components/right/PollResults.tsx","webpack://telegram-t/./src/components/right/management/ManageUser.tsx","webpack://telegram-t/./src/components/right/management/ManageGroup.tsx","webpack://telegram-t/./src/components/right/management/ManageGroupPermissions.tsx","webpack://telegram-t/./src/components/right/management/RemoveGroupUserModal.tsx","webpack://telegram-t/./src/components/right/management/ManageGroupRemovedUsers.tsx","webpack://telegram-t/./src/components/right/management/ManageChannel.tsx","webpack://telegram-t/./src/components/right/management/ManageChatPrivacyType.tsx","webpack://telegram-t/./src/components/right/management/ManageDiscussion.tsx","webpack://telegram-t/./src/components/right/management/ManageGroupUserPermissions.tsx","webpack://telegram-t/./src/components/right/management/ManageChatAdministrators.tsx","webpack://telegram-t/./src/components/right/management/ManageGroupRecentActions.tsx","webpack://telegram-t/./src/components/right/management/ManageGroupAdminRights.tsx","webpack://telegram-t/./src/components/right/management/ManageGroupMembers.tsx","webpack://telegram-t/./src/components/right/management/ManageGroupUserPermissionsCreate.tsx","webpack://telegram-t/./src/components/right/management/Management.tsx","webpack://telegram-t/./src/components/common/helpers/detectCardType.ts","webpack://telegram-t/./src/util/countries.ts","webpack://telegram-t/./src/hooks/reducers/usePaymentReducer.ts","webpack://telegram-t/./src/hooks/useFocusAfterAnimation.tsx","webpack://telegram-t/./src/components/ui/Select.tsx","webpack://telegram-t/./src/components/payment/ShippingInfo.tsx","webpack://telegram-t/./src/components/payment/Shipping.tsx","webpack://telegram-t/./src/components/payment/Checkout.tsx","webpack://telegram-t/./src/components/payment/ExpiryInput.tsx","webpack://telegram-t/./src/components/middle/helpers/inputFormatters.ts","webpack://telegram-t/./src/components/payment/CardInput.tsx","webpack://telegram-t/./src/components/payment/PaymentInfo.tsx","webpack://telegram-t/./src/components/payment/PaymentModal.tsx","webpack://telegram-t/./src/components/payment/ReceiptModal.tsx","webpack://telegram-t/./src/components/common/PasswordForm.tsx","webpack://telegram-t/./src/components/common/PasswordMonkey.tsx","webpack://telegram-t/./src/components/common/helpers/animatedAssets.ts","webpack://telegram-t/./src/components/ui/CropModal.tsx","webpack://telegram-t/./src/components/ui/AvatarEditable.tsx"],"sourcesContent":["import { ApiMessage, ApiDimensions } from '../../../api/types';\n\nimport { MediaViewerOrigin } from '../../../types';\n\nimport { ANIMATION_END_DELAY } from '../../../config';\nimport {\n calculateDimensions,\n getMediaViewerAvailableDimensions,\n MEDIA_VIEWER_MEDIA_QUERY,\n REM,\n} from '../../common/helpers/mediaDimensions';\nimport windowSize from '../../../util/windowSize';\n\nconst ANIMATION_DURATION = 200;\n\nexport function animateOpening(\n hasFooter: boolean,\n origin: MediaViewerOrigin,\n bestImageData: string,\n dimensions: ApiDimensions,\n isVideo: boolean,\n message?: ApiMessage,\n) {\n const { mediaEl: fromImage } = getNodes(origin, message);\n if (!fromImage) {\n return;\n }\n\n const { width: windowWidth } = windowSize.get();\n const {\n width: availableWidth, height: availableHeight,\n } = getMediaViewerAvailableDimensions(hasFooter, isVideo);\n const { width: toWidth, height: toHeight } = calculateDimensions(\n availableWidth, availableHeight, dimensions.width, dimensions.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 if (document.body.contains(ghost)) {\n document.body.removeChild(ghost);\n }\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 existingGhost = document.getElementsByClassName('ghost')[0] as HTMLDivElement;\n\n const ghost = existingGhost || createGhost(bestImageData || toImage, origin);\n if (!existingGhost) {\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\n requestAnimationFrame(() => {\n if (existingGhost) {\n const {\n top,\n left,\n width,\n height,\n } = existingGhost.getBoundingClientRect();\n const scaleX = width / toWidth;\n const scaleY = height / toHeight;\n\n applyStyles(ghost, {\n transition: 'none',\n top: `${toTop}px`,\n left: `${toLeft}px`,\n transformOrigin: 'top left',\n transform: `translate3d(${left - toLeft}px, ${top - toTop}px, 0) scale(${scaleX}, ${scaleY})`,\n width: `${toWidth}px`,\n height: `${toHeight}px`,\n });\n }\n document.body.classList.add('ghost-animating');\n if (!existingGhost) document.body.appendChild(ghost);\n\n requestAnimationFrame(() => {\n if (existingGhost) {\n existingGhost.style.transition = '';\n }\n\n ghost.style.transform = '';\n\n if (shouldFadeOut) {\n ghost.style.opacity = '0';\n }\n\n applyShape(ghost, origin);\n\n setTimeout(() => {\n requestAnimationFrame(() => {\n if (document.body.contains(ghost)) {\n document.body.removeChild(ghost);\n }\n document.body.classList.remove('ghost-animating');\n });\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n });\n });\n}\n\nfunction createGhost(source: string | HTMLImageElement | HTMLVideoElement, origin?: MediaViewerOrigin) {\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 if (origin === MediaViewerOrigin.ProfileAvatar || origin === MediaViewerOrigin.SettingsAvatar) {\n ghost.classList.add('ProfileInfo');\n if (origin === MediaViewerOrigin.SettingsAvatar) {\n ghost.classList.add('self');\n }\n const profileInfo = document.querySelector(\n origin === MediaViewerOrigin.ProfileAvatar\n ? '#RightColumn .ProfileInfo .info'\n : '#Settings .ProfileInfo .info',\n );\n if (profileInfo) {\n ghost.appendChild(profileInfo.cloneNode(true));\n }\n }\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.SettingsAvatar:\n containerSelector = '#Settings .ProfileInfo .active .ProfilePhoto';\n mediaSelector = 'img.avatar-media';\n break;\n\n case MediaViewerOrigin.ProfileAvatar:\n containerSelector = '#RightColumn .ProfileInfo .active .ProfilePhoto';\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.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.SettingsAvatar:\n case MediaViewerOrigin.ProfileAvatar:\n case MediaViewerOrigin.SearchResult:\n (ghost.firstChild as HTMLElement).style.objectFit = 'cover';\n break;\n\n case MediaViewerOrigin.MiddleHeaderAvatar:\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, isUserId } 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?: string;\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,\n messageId,\n sender,\n isAvatar,\n message,\n closeMediaViewer,\n focusMessage,\n}) => {\n const handleFocusMessage = useCallback(() => {\n closeMediaViewer();\n focusMessage({ chatId, messageId });\n }, [chatId, focusMessage, messageId, closeMediaViewer]);\n\n const lang = useLang();\n\n if (!sender || (!message && !isAvatar)) {\n return undefined;\n }\n\n const senderTitle = getSenderTitle(lang, sender);\n\n return (\n
\n {isUserId(sender.id) ? (\n \n ) : (\n \n )}\n
\n
\n {senderTitle && renderText(senderTitle)}\n
\n
\n {isAvatar\n ? lang('lng_mediaview_profile_photo')\n : formatMediaDateTime(lang, message!.date * 1000, true)}\n
\n
\n
\n );\n};\n\nexport default withGlobal(\n (global, { chatId, messageId, isAvatar }): StateProps => {\n if (isAvatar && chatId) {\n return {\n sender: isUserId(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,\n memo,\n useCallback,\n useMemo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiMessage } from '../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { getMessageMediaHash } from '../../modules/helpers';\nimport useLang from '../../hooks/useLang';\nimport useMediaWithLoadProgress from '../../hooks/useMediaWithLoadProgress';\nimport { selectIsDownloading } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\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 StateProps = {\n isDownloading: boolean;\n};\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\ntype DispatchProps = Pick;\n\nconst MediaViewerActions: FC = ({\n mediaData,\n isVideo,\n isZoomed,\n message,\n fileName,\n isAvatar,\n isDownloading,\n onCloseMediaViewer,\n onForward,\n onZoomToggle,\n downloadMessageMedia,\n cancelMessageMediaDownload,\n}) => {\n const { loadProgress: downloadProgress } = useMediaWithLoadProgress(\n message && getMessageMediaHash(message, 'download'),\n !isDownloading,\n );\n\n const handleDownloadClick = useCallback(() => {\n if (isDownloading) {\n cancelMessageMediaDownload({ message });\n } else {\n downloadMessageMedia({ message });\n }\n }, [cancelMessageMediaDownload, downloadMessageMedia, isDownloading, message]);\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_SINGLE_COLUMN_LAYOUT) {\n return (\n
\n \n {!isAvatar && (\n \n {lang('Forward')}\n \n )}\n {isVideo ? (\n \n {isDownloading ? `${Math.round(downloadProgress * 100)}% Downloading...` : 'Download'}\n \n ) : (\n \n {lang('AccActionDownload')}\n \n )}\n \n {isDownloading && }\n
\n );\n }\n\n return (\n
\n {!isAvatar && (\n <>\n \n \n \n \n )}\n {isVideo ? (\n \n {isDownloading ? (\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, { message }): StateProps => {\n const isDownloading = message ? selectIsDownloading(global, message) : false;\n\n return {\n isDownloading,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'downloadMessageMedia',\n 'cancelMessageMediaDownload',\n ]),\n)(MediaViewerActions));\n","import React, { FC, useEffect, useState } from '../../lib/teact/teact';\n\nimport { throttle } from '../../util/schedulers';\nimport { TextPart } from '../common/helpers/renderMessageText';\nimport buildClassName from '../../util/buildClassName';\nimport { REM } from '../common/helpers/mediaDimensions';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\n\nimport './MediaViewerFooter.scss';\n\nconst RESIZE_THROTTLE_MS = 500;\n\ntype OwnProps = {\n text: TextPart | TextPart[];\n onClick: () => void;\n isHidden?: boolean;\n isForVideo: boolean;\n};\n\nconst MediaViewerFooter: FC = ({\n text = '', isHidden, isForVideo, onClick,\n}) => {\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 const classNames = buildClassName(\n 'MediaViewerFooter',\n isForVideo && 'is-for-video',\n isHidden && 'is-hidden',\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, {\n FC, useState, useEffect, useRef, useCallback,\n} from '../../lib/teact/teact';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { formatMediaDuration } from '../../util/dateFormat';\nimport formatFileSize from './helpers/formatFileSize';\nimport useLang from '../../hooks/useLang';\nimport { captureEvents } from '../../util/captureEvents';\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: (position: number) => void;\n};\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 // eslint-disable-next-line no-null/no-null\n const seekerRef = useRef(null);\n const isSeeking = useRef(false);\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_SINGLE_COLUMN_LAYOUT) {\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 const handleSeek = useCallback((e: MouseEvent | TouchEvent) => {\n if (isSeeking.current && seekerRef.current) {\n const { width, left } = seekerRef.current.getBoundingClientRect();\n const clientX = e instanceof MouseEvent ? e.clientX : e.targetTouches[0].clientX;\n onSeek(Math.max(Math.min(duration * ((clientX - left) / width), duration), 0));\n }\n }, [duration, onSeek]);\n\n const handleStartSeek = useCallback((e: MouseEvent | TouchEvent) => {\n isSeeking.current = true;\n handleSeek(e);\n }, [handleSeek]);\n\n const handleStopSeek = useCallback(() => {\n isSeeking.current = false;\n }, []);\n\n useEffect(() => {\n if (!seekerRef.current || !isVisible) return undefined;\n return captureEvents(seekerRef.current, {\n onCapture: handleStartSeek,\n onRelease: handleStopSeek,\n onClick: handleStopSeek,\n onDrag: handleSeek,\n });\n }, [isVisible, handleStartSeek, handleSeek, handleStopSeek]);\n\n if (!isVisible && !isForceVisible) {\n return undefined;\n }\n\n return (\n
\n {renderSeekLine(currentTime, duration, bufferedProgress, seekerRef)}\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(loadedPercent: number, totalSize: number) {\n return (\n
\n {`${formatFileSize(totalSize * loadedPercent)} / ${formatFileSize(totalSize)}`}\n
\n );\n}\n\nfunction renderSeekLine(\n currentTime: number, duration: number, bufferedProgress: number, seekerRef: React.RefObject,\n) {\n const percentagePlayed = (currentTime / duration) * 100;\n const percentageBuffered = bufferedProgress * 100;\n\n return (\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 { ApiDimensions } from '../../api/types';\n\nimport { IS_IOS, IS_SINGLE_COLUMN_LAYOUT, 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';\nimport Button from '../ui/Button';\n\nimport './VideoPlayer.scss';\n\ntype OwnProps = {\n url?: string;\n isGif?: boolean;\n posterData?: string;\n posterSize?: ApiDimensions;\n loadProgress?: 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 loadProgress,\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 const {\n shouldRender: shouldRenderPlayButton,\n transitionClassNames: playButtonClassNames,\n } = useShowTransition(IS_IOS && !isPlayed && !shouldRenderSpinner, 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 safePlay(videoRef.current!);\n setIsPlayed(true);\n if (IS_SINGLE_COLUMN_LAYOUT) {\n setIsControlsVisible(false);\n }\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 setIsControlsVisible(true);\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((position: number) => {\n videoRef.current!.currentTime = position;\n }, []);\n\n const toggleControls = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n setIsControlsVisible(!isControlsVisible);\n if (!isControlsVisible) {\n videoRef.current!.pause();\n setIsPlayed(false);\n }\n }, [isControlsVisible]);\n\n useEffect(() => {\n const togglePayingStateBySpace = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\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 setIsPlayed(true) : undefined}\n onEnded={handleEnded}\n onClick={!IS_SINGLE_COLUMN_LAYOUT ? togglePlayState : undefined}\n onDoubleClick={handleFullscreenChange}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...bufferingHandlers}\n onTimeUpdate={handleTimeUpdate}\n >\n {url && }\n \n \n {shouldRenderPlayButton && (\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_SINGLE_COLUMN_LAYOUT } 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, ApiDimensions,\n} from '../../api/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport { IS_IOS, IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../util/environment';\nimport windowSize from '../../util/windowSize';\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 getMessageFileName,\n getMessageMediaFormat,\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n getMessagePhoto,\n getMessageVideo,\n getMessageDocument,\n isMessageDocumentPhoto,\n isMessageDocumentVideo,\n getMessageWebPagePhoto,\n getMessageWebPageVideo,\n getPhotoFullDimensions,\n getVideoDimensions, getMessageFileSize,\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 useMediaWithLoadProgress from '../../hooks/useMediaWithLoadProgress';\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';\nimport useHistoryBack from '../../hooks/useHistoryBack';\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?: string;\n threadId?: number;\n messageId?: number;\n senderId?: string;\n origin?: MediaViewerOrigin;\n avatarOwner?: ApiChat | ApiUser;\n profilePhotoIndex?: number;\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 profilePhotoIndex,\n message,\n chatMessages,\n collectionIds,\n openMediaViewer,\n closeMediaViewer,\n openForwardMenu,\n focusMessage,\n animationLevel,\n}) => {\n const isOpen = Boolean(avatarOwner || messageId);\n\n const isFromSharedMedia = origin === MediaViewerOrigin.SharedMedia;\n const isFromSearch = origin === MediaViewerOrigin.SearchResult;\n\n /* Content */\n const photo = message ? getMessagePhoto(message) : undefined;\n const video = message ? getMessageVideo(message) : undefined;\n const webPagePhoto = message ? getMessageWebPagePhoto(message) : undefined;\n const webPageVideo = message ? getMessageWebPageVideo(message) : undefined;\n const isDocumentPhoto = message ? isMessageDocumentPhoto(message) : false;\n const isDocumentVideo = message ? isMessageDocumentVideo(message) : false;\n const isVideo = Boolean(video || webPageVideo || isDocumentVideo);\n const isPhoto = Boolean(!isVideo && (photo || webPagePhoto || isDocumentPhoto));\n const { isGif } = video || webPageVideo || {};\n const isAvatar = Boolean(avatarOwner);\n\n /* Navigation */\n const isSingleSlide = Boolean(webPagePhoto || webPageVideo);\n const messageIds = useMemo(() => {\n return isSingleSlide && messageId\n ? [messageId]\n : getChatMediaMessageIds(chatMessages || {}, collectionIds || [], isFromSharedMedia);\n }, [isSingleSlide, 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\n /* Animation */\n const animationKey = useRef();\n const prevSenderId = usePrevious(senderId);\n if (isOpen && (!prevSenderId || prevSenderId !== senderId || !animationKey.current)) {\n animationKey.current = selectedMediaMessageIndex;\n }\n const slideAnimation = animationLevel >= 1 ? 'mv-slide' : 'none';\n const headerAnimation = animationLevel === 2 ? 'slide-fade' : 'none';\n const isGhostAnimation = animationLevel === 2;\n\n /* Controls */\n const [isFooterHidden, setIsFooterHidden] = useState(false);\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 /* Media data */\n function getMediaHash(isFull?: boolean) {\n if (isAvatar && profilePhotoIndex !== undefined) {\n const { photos } = avatarOwner!;\n return photos && photos[profilePhotoIndex]\n ? `photo${photos[profilePhotoIndex].id}?size=c`\n : getChatAvatarHash(avatarOwner!, isFull ? 'big' : 'normal');\n }\n\n return message && getMessageMediaHash(message, isFull ? 'viewerFull' : 'viewerPreview');\n }\n\n const pictogramBlobUrl = useMedia(\n message && (isFromSharedMedia || isFromSearch) && getMessageMediaHash(message, 'pictogram'),\n undefined,\n ApiMediaFormat.BlobUrl,\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n const previewMediaHash = getMediaHash();\n const previewBlobUrl = useMedia(\n previewMediaHash,\n undefined,\n ApiMediaFormat.BlobUrl,\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n const { mediaData: fullMediaBlobUrl, loadProgress } = useMediaWithLoadProgress(\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 || fullMediaBlobUrl)) || previewBlobUrl || pictogramBlobUrl;\n const thumbDataUri = useBlurSync(!bestImageData && message && getMessageMediaThumbDataUri(message));\n if (!bestImageData && origin !== MediaViewerOrigin.SearchResult) {\n bestImageData = thumbDataUri;\n }\n\n const videoSize = message ? getMessageFileSize(message) : undefined;\n const fileName = message\n ? getMessageFileName(message)\n : isAvatar\n ? `avatar${avatarOwner!.id}-${profilePhotoIndex}.jpg`\n : undefined;\n\n let dimensions!: ApiDimensions;\n if (message) {\n if (isDocumentPhoto || isDocumentVideo) {\n dimensions = getMessageDocument(message)!.mediaSize!;\n } else if (photo || webPagePhoto) {\n dimensions = getPhotoFullDimensions((photo || webPagePhoto)!)!;\n } else if (video || webPageVideo) {\n dimensions = getVideoDimensions((video || webPageVideo)!)!;\n }\n } else {\n dimensions = AVATAR_FULL_DIMENSIONS;\n }\n\n useEffect(() => {\n if (!IS_SINGLE_COLUMN_LAYOUT) {\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!, dimensions, isVideo, 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, message, prevMessage, prevAvatarOwner,\n bestImageData, prevBestImageData, dimensions, isVideo,\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 // Prevent refresh when rotating device to watch a video\n useEffect(() => {\n if (!isOpen) {\n return undefined;\n }\n\n windowSize.disableRefresh();\n\n return () => {\n windowSize.enableRefresh();\n };\n }, [isOpen]);\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 && !IS_TOUCH_ENV) {\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 if (!(e.target && (e.target as HTMLElement).closest('.MediaViewerFooter'))) {\n close();\n }\n\n return true;\n } : undefined,\n });\n }, [close, isFooterHidden, isGif, isPhoto, isZoomed, selectNextMedia, selectPreviousMedia]);\n\n const handlePan = useCallback((x: number, y: number) => {\n setPanDelta({ x, y });\n }, []);\n\n const handleToggleFooterVisibility = useCallback(() => {\n if (IS_TOUCH_ENV && (isPhoto || isGif)) {\n setIsFooterHidden(!isFooterHidden);\n }\n }, [isFooterHidden, isGif, isPhoto]);\n\n const lang = useLang();\n\n useHistoryBack(isOpen, closeMediaViewer, openMediaViewer, {\n chatId,\n threadId,\n messageId,\n origin,\n avatarOwnerId: avatarOwner && avatarOwner.id,\n });\n\n function renderSlide(isActive: boolean) {\n if (isAvatar) {\n return (\n
\n {renderPhoto(\n fullMediaBlobUrl || previewBlobUrl,\n calculateMediaViewerDimensions(AVATAR_FULL_DIMENSIONS, false),\n !IS_SINGLE_COLUMN_LAYOUT && !isZoomed,\n )}\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 || fullMediaBlobUrl || previewBlobUrl || pictogramBlobUrl,\n message && calculateMediaViewerDimensions(dimensions!, hasFooter),\n !IS_SINGLE_COLUMN_LAYOUT && !isZoomed,\n )}\n {isVideo && (\n \n )}\n {textParts && (\n \n )}\n \n );\n }\n\n return undefined;\n }\n\n function renderSenderInfo() {\n return isAvatar ? (\n \n ) : (\n \n );\n }\n\n return (\n \n {() => (\n <>\n
\n {IS_SINGLE_COLUMN_LAYOUT && (\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?: ApiDimensions, canDrag?: boolean) {\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, profilePhotoIndex, 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 = selectUser(global, avatarOwnerId) || selectChat(global, avatarOwnerId);\n\n return {\n messageId: -1,\n senderId: avatarOwnerId,\n avatarOwner: sender,\n profilePhotoIndex: profilePhotoIndex || 0,\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 { RefObject } from 'react';\nimport React, {\n FC, memo, useRef, useCallback,\n} from '../../lib/teact/teact';\n\nimport useInfiniteScroll from '../../hooks/useInfiniteScroll';\nimport useLang from '../../hooks/useLang';\nimport useKeyboardListNavigation from '../../hooks/useKeyboardListNavigation';\nimport useInputFocusOnOpen from '../../hooks/useInputFocusOnOpen';\nimport { isUserId } from '../../modules/helpers';\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 GroupChatInfo from './GroupChatInfo';\nimport PrivateChatInfo from './PrivateChatInfo';\n\nimport './ChatOrUserPicker.scss';\n\nexport type OwnProps = {\n currentUserId?: string;\n chatOrUserIds: string[];\n isOpen: boolean;\n filterRef: RefObject;\n filterPlaceholder: string;\n filter: string;\n onFilterChange: (filter: string) => void;\n loadMore: NoneToVoidFunction;\n onSelectChatOrUser: (chatOrUserId: string) => void;\n onClose: NoneToVoidFunction;\n};\n\nconst ChatOrUserPicker: FC = ({\n isOpen,\n currentUserId,\n chatOrUserIds,\n filterRef,\n filter,\n filterPlaceholder,\n onFilterChange,\n onClose,\n loadMore,\n onSelectChatOrUser,\n}) => {\n const lang = useLang();\n const [viewportIds, getMore] = useInfiniteScroll(loadMore, chatOrUserIds, Boolean(filter));\n\n useInputFocusOnOpen(filterRef, isOpen, () => { onFilterChange(''); });\n\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const handleFilterChange = useCallback((e: React.ChangeEvent) => {\n onFilterChange(e.currentTarget.value);\n }, [onFilterChange]);\n const handleKeyDown = useKeyboardListNavigation(containerRef, isOpen, (index) => {\n if (viewportIds && viewportIds.length > 0) {\n onSelectChatOrUser(viewportIds[index === -1 ? 0 : index]);\n }\n }, '.ListItem-button', true);\n\n const modalHeader = (\n
\n \n \n \n \n
\n );\n\n return (\n \n {viewportIds?.length ? (\n \n {viewportIds.map((id) => (\n onSelectChatOrUser(id)}\n >\n {isUserId(id) ? (\n \n ) : (\n \n )}\n \n ))}\n \n ) : viewportIds && !viewportIds.length ? (\n

{lang('lng_blocked_list_not_found')}

\n ) : (\n \n )}\n \n );\n};\n\nexport default memo(ChatOrUserPicker);\n","import React, {\n FC, useMemo, useState, memo, useRef, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, MAIN_THREAD_ID } from '../../api/types';\n\nimport { getCanPostInChat, getChatTitle, sortChatIds } from '../../modules/helpers';\nimport searchWords from '../../util/searchWords';\nimport { pick, unique } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport ChatOrUserPicker from '../common/ChatOrUserPicker';\n\nexport type OwnProps = {\n isOpen: boolean;\n};\n\ntype StateProps = {\n chatsById: Record;\n pinnedIds?: string[];\n activeListIds?: string[];\n archivedListIds?: string[];\n orderedPinnedIds?: string[];\n currentUserId?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst ForwardPicker: FC = ({\n chatsById,\n pinnedIds,\n activeListIds,\n archivedListIds,\n currentUserId,\n isOpen,\n setForwardChatId,\n exitForwardMode,\n loadMoreChats,\n}) => {\n const lang = useLang();\n const [filter, setFilter] = useState('');\n // eslint-disable-next-line no-null/no-null\n const filterRef = useRef(null);\n\n const chatIds = useMemo(() => {\n const listIds = [\n ...(activeListIds || []),\n ...(archivedListIds || []),\n ];\n\n let priorityIds = pinnedIds || [];\n if (currentUserId) {\n priorityIds = unique([currentUserId, ...priorityIds]);\n }\n\n return sortChatIds([\n ...listIds.filter((id) => {\n const chat = chatsById[id];\n if (!chat) {\n return true;\n }\n\n if (!getCanPostInChat(chat, MAIN_THREAD_ID)) {\n return false;\n }\n\n if (!filter) {\n return true;\n }\n\n return searchWords(getChatTitle(lang, chatsById[id], undefined, id === currentUserId), filter);\n }),\n ], chatsById, undefined, priorityIds);\n }, [activeListIds, archivedListIds, chatsById, currentUserId, filter, lang, pinnedIds]);\n\n const handleSelectUser = useCallback((userId: string) => {\n setForwardChatId({ id: userId });\n }, [setForwardChatId]);\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 currentUserId,\n } = global;\n\n return {\n chatsById,\n pinnedIds: orderedPinnedIds.active,\n activeListIds: listIds.active,\n archivedListIds: listIds.archived,\n currentUserId,\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, ApiInviteInfo } from '../../api/types';\n\nimport getReadableErrorText from '../../util/getReadableErrorText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\nimport renderText from '../common/helpers/renderText';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './Dialogs.scss';\n\ntype StateProps = {\n dialogs: (ApiError | ApiInviteInfo)[];\n};\n\ntype DispatchProps = Pick;\n\nconst Dialogs: FC = ({ dialogs, dismissDialog, acceptInviteConfirmation }) => {\n const lang = useLang();\n\n if (!dialogs.length) {\n return undefined;\n }\n\n const renderInvite = (invite: ApiInviteInfo) => {\n const {\n hash, title, participantsCount, isChannel,\n } = invite;\n\n const handleJoinClick = () => {\n acceptInviteConfirmation({\n hash,\n });\n dismissDialog();\n };\n\n const participantsText = isChannel\n ? lang('Subscribers', participantsCount, 'i')\n : lang('Members', participantsCount, 'i');\n\n const joinText = isChannel ? lang('ChannelJoin') : lang('JoinGroup');\n\n return (\n \n {participantsCount !== undefined &&

{participantsText}

}\n \n \n \n );\n };\n\n const renderError = (error: ApiError) => {\n return (\n \n {error.hasErrorKey ? getReadableErrorText(error) : renderText(error.message!, ['emoji', 'br'])}\n
\n \n
\n \n );\n };\n\n const renderDialog = (dialog: ApiError | ApiInviteInfo) => {\n if ('hash' in dialog) {\n return renderInvite(dialog);\n }\n\n return renderError(dialog);\n };\n\n return (\n
\n {dialogs.map(renderDialog)}\n
\n );\n};\n\nfunction getErrorHeader(error: ApiError) {\n if (error.isSlowMode) {\n return 'Slowmode enabled';\n }\n\n if (!error.hasErrorKey) {\n return 'Telegram';\n }\n\n return 'Something went wrong';\n}\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['dialogs']),\n (setGlobal, actions): DispatchProps => pick(actions, ['dismissDialog', 'acceptInviteConfirmation']),\n)(Dialogs));\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';\nimport renderText from '../common/helpers/renderText';\n\nimport Notification from '../ui/Notification';\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, localId }) => (\n dismissNotification({ localId })}\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, { FC, memo, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport { ensureProtocol } from '../../util/ensureProtocol';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\n\nimport ConfirmDialog from '../ui/ConfirmDialog';\n\nexport type OwnProps = {\n url?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst SafeLinkModal: FC = ({ url, toggleSafeLinkModal }) => {\n const lang = useLang();\n\n const handleOpen = useCallback(() => {\n window.open(ensureProtocol(url));\n toggleSafeLinkModal({ url: undefined });\n }, [toggleSafeLinkModal, url]);\n\n const handleDismiss = useCallback(() => {\n toggleSafeLinkModal({ url: undefined });\n }, [toggleSafeLinkModal]);\n\n const renderingUrl = useCurrentOrPrev(url);\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['toggleSafeLinkModal']),\n)(SafeLinkModal));\n","import React, {\n FC, memo, useState, useEffect, useMemo, useCallback,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport { formatTime, formatDateToString } from '../../util/dateFormat';\nimport useLang, { LangFn } from '../../hooks/useLang';\nimport usePrevious from '../../hooks/usePrevious';\nimport useFlag from '../../hooks/useFlag';\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 = [\n 'lng_weekday1',\n 'lng_weekday2',\n 'lng_weekday3',\n 'lng_weekday4',\n 'lng_weekday5',\n 'lng_weekday6',\n 'lng_weekday7',\n];\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 lang = useLang();\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 const prevIsOpen = usePrevious(isOpen);\n const [isTimeInputFocused, markTimeInputAsFocused, unmarkTimeInputAsFocused] = useFlag(false);\n\n const [selectedDate, setSelectedDate] = useState(defaultSelectedDate);\n const [currentMonthAndYear, setCurrentMonthAndYear] = useState(\n new Date(selectedDate.getFullYear(), selectedDate.getMonth(), 1),\n );\n const [selectedHours, setSelectedHours] = useState(\n formatInputTime(defaultSelectedDate.getHours()),\n );\n const [selectedMinutes, setSelectedMinutes] = useState(\n formatInputTime(defaultSelectedDate.getMinutes()),\n );\n\n const selectedDay = formatDay(selectedDate.getFullYear(), selectedDate.getMonth(), selectedDate.getDate());\n const currentYear = currentMonthAndYear.getFullYear();\n const currentMonth = currentMonthAndYear.getMonth();\n\n useEffect(() => {\n if (!prevIsOpen && isOpen) {\n setSelectedDate(defaultSelectedDate);\n setCurrentMonthAndYear(new Date(defaultSelectedDate.getFullYear(), defaultSelectedDate.getMonth(), 1));\n }\n }, [defaultSelectedDate, isOpen, prevIsOpen]);\n\n useEffect(() => {\n if (isFutureMode && !isTimeInputFocused && selectedDate.getTime() < defaultSelectedDate.getTime()) {\n setSelectedDate(defaultSelectedDate);\n setSelectedHours(formatInputTime(defaultSelectedDate.getHours()));\n setSelectedMinutes(formatInputTime(defaultSelectedDate.getMinutes()));\n }\n }, [defaultSelectedDate, isTimeInputFocused, isFutureMode, selectedDate]);\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 { prevMonthGrid, currentMonthGrid, nextMonthGrid } = useMemo(() => (\n buildCalendarGrid(currentYear, currentMonth)\n ), [currentMonth, currentYear]);\n\n function handlePrevMonth() {\n setCurrentMonthAndYear((d) => {\n const dateCopy = new Date(d);\n dateCopy.setMonth(dateCopy.getMonth() - 1);\n\n return dateCopy;\n });\n }\n\n function handleNextMonth() {\n setCurrentMonthAndYear((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 dateCopy.setMonth(currentMonth);\n dateCopy.setFullYear(currentYear);\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 {lang(`lng_month${currentMonth + 1}`)}\n {' '}\n {currentYear}\n

\n\n \n \n \n\n \n \n \n
\n
\n\n
\n
\n {WEEKDAY_LETTERS.map((day) => (\n
\n {lang(day)}\n
\n ))}\n {prevMonthGrid.map((gridDate) => (\n
{gridDate}
\n ))}\n {currentMonthGrid.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 selectedDay === formatDay(currentYear, currentMonth, gridDate) && 'selected',\n )}\n >\n {!!gridDate && (\n {gridDate}\n )}\n
\n ))}\n {nextMonthGrid.map((gridDate) => (\n
{gridDate}
\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 prevMonthGrid: number[] = [];\n const currentMonthGrid: number[] = [];\n const nextMonthGrid: number[] = [];\n\n const date = new Date();\n date.setDate(1);\n date.setMonth(month);\n date.setFullYear(year);\n const firstDay = date.getDay();\n const totalDaysInPrevMonth = new Date(year, month, 0).getDate();\n\n for (let i = 1; i < firstDay; i++) {\n prevMonthGrid.push(totalDaysInPrevMonth - firstDay + i + 1);\n }\n\n while (date.getMonth() === month) {\n const gridDate = date.getDate();\n currentMonthGrid.push(gridDate);\n date.setDate(gridDate + 1);\n }\n\n const lastRowDaysCount = (currentMonthGrid.length + prevMonthGrid.length) % 7;\n if (lastRowDaysCount > 0) {\n for (let i = 1; i <= 7 - lastRowDaysCount; i++) {\n nextMonthGrid.push(i);\n }\n }\n\n return { prevMonthGrid, currentMonthGrid, nextMonthGrid };\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 formatDay(year: number, month: number, day: number) {\n return `${year}-${month + 1}-${day}`;\n}\n\nfunction formatSubmitLabel(lang: LangFn, date: Date) {\n const day = formatDateToString(date, lang.code);\n const today = formatDateToString(new Date(), lang.code);\n\n if (day === today) {\n return lang('Conversation.ScheduleMessage.SendToday', formatTime(date, lang));\n }\n\n return lang('Conversation.ScheduleMessage.SendOn', [day, formatTime(date, lang)]);\n}\n\nexport default memo(CalendarModal);\n","import React, { FC, memo, useCallback } 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 CalendarModal from '../common/CalendarModal';\n\nexport type OwnProps = {\n isOpen: boolean;\n};\n\ntype StateProps = {\n selectedAt?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst HistoryCalendar: FC = ({\n isOpen, selectedAt, searchMessagesByDate, closeHistoryCalendar,\n}) => {\n const handleJumpToDate = useCallback((date: Date) => {\n searchMessagesByDate({ timestamp: date.valueOf() / 1000 });\n closeHistoryCalendar();\n }, [closeHistoryCalendar, searchMessagesByDate]);\n\n const lang = useLang();\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return { selectedAt: global.historyCalendarSelectedAt };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesByDate', 'closeHistoryCalendar',\n ]),\n)(HistoryCalendar));\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 isUserId,\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?.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?.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

{lang('lng_delete_for_me_chat_hint', 1, 'i')}

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

{lang('lng_delete_for_everyone_hint', 1, 'i')}

\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 && isUserId(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 isUserId,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n isChatChannel,\n} from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\nimport renderText from './helpers/renderText';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n chatId: string;\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 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 = isUserId(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 && isUserId(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';\n\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?: string;\n pinnedMessagesCount?: number;\n onClose: () => void;\n onUnpin: () => void;\n};\n\nconst UnpinAllMessagesModal: FC = ({\n isOpen,\n pinnedMessagesCount = 0,\n onClose,\n onUnpin,\n}) => {\n const lang = useLang();\n\n return (\n \n

{lang('Chat.UnpinAllMessagesConfirmation', pinnedMessagesCount, 'i')}

\n \n \n \n );\n};\n\nexport default memo(UnpinAllMessagesModal);\n","import React, {\n FC, useCallback, memo, useEffect,\n} 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 isUserId,\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';\nimport usePrevious from '../../hooks/usePrevious';\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 DeleteSelectedMessageModal: 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 prevIsOpen = usePrevious(isOpen);\n\n const handleDeleteMessageForAll = useCallback(() => {\n onClose();\n deleteMessages({ messageIds: selectedMessageIds, shouldDeleteForAll: true });\n }, [deleteMessages, 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 onClose();\n }, [isSchedule, onClose, deleteScheduledMessages, selectedMessageIds, deleteMessages]);\n\n const lang = useLang();\n\n // Returning `undefined` from FC instead of `` doesn't trigger useHistoryBack\n useEffect(() => {\n if (!isOpen && prevIsOpen) {\n exitMessageSelectMode();\n }\n }, [exitMessageSelectMode, isOpen, prevIsOpen]);\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 && isUserId(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)(DeleteSelectedMessageModal));\n","import { ChangeEvent } from 'react';\n\nimport React, {\n FC, memo, useCallback, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiReportReason } from '../../api/types';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\nimport RadioGroup from '../ui/RadioGroup';\nimport InputText from '../ui/InputText';\n\nexport type OwnProps = {\n isOpen: boolean;\n messageIds?: number[];\n onClose: () => void;\n};\n\ntype DispatchProps = Pick;\n\nconst ReportMessageModal: FC = ({\n isOpen,\n messageIds,\n reportMessages,\n exitMessageSelectMode,\n onClose,\n}) => {\n const [selectedReason, setSelectedReason] = useState('spam');\n const [description, setDescription] = useState('');\n\n const handleReport = () => {\n reportMessages({ messageIds, reason: selectedReason, description });\n exitMessageSelectMode();\n onClose();\n };\n\n const handleSelectReason = useCallback((value: string) => {\n setSelectedReason(value as ApiReportReason);\n }, []);\n\n const handleDescriptionChange = useCallback((e: ChangeEvent) => {\n setDescription(e.target.value);\n }, []);\n\n const lang = useLang();\n\n const REPORT_OPTIONS: { value: ApiReportReason; label: string }[] = [\n { value: 'spam', label: lang('lng_report_reason_spam') },\n { value: 'violence', label: lang('lng_report_reason_violence') },\n { value: 'pornography', label: lang('lng_report_reason_pornography') },\n { value: 'childAbuse', label: lang('lng_report_reason_child_abuse') },\n { value: 'copyright', label: lang('ReportPeer.ReasonCopyright') },\n { value: 'other', label: lang('lng_report_reason_other') },\n ];\n\n if (!messageIds) {\n return undefined;\n }\n\n return (\n \n \n \n \n \n \n );\n};\n\nexport default memo(withGlobal(\n undefined, (setGlobal, actions): DispatchProps => pick(actions, [\n 'reportMessages', 'exitMessageSelectMode',\n ]),\n)(ReportMessageModal));\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\n\nimport {\n selectCanDeleteSelectedMessages,\n selectCanDownloadSelectedMessages,\n selectCanReportSelectedMessages,\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';\n\nimport DeleteSelectedMessageModal from './DeleteSelectedMessageModal';\nimport ReportMessageModal from '../common/ReportMessageModal';\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 canReportMessages?: boolean;\n canDownloadMessages?: boolean;\n selectedMessageIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst MessageSelectToolbar: FC = ({\n canPost,\n isActive,\n messageListType,\n isSchedule,\n selectedMessagesCount,\n canDeleteMessages,\n canReportMessages,\n canDownloadMessages,\n selectedMessageIds,\n exitMessageSelectMode,\n openForwardMenuForSelectedMessages,\n downloadSelectedMessages,\n}) => {\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n const [isReportModalOpen, openReportModal, closeReportModal] = useFlag();\n\n useEffect(() => {\n return isActive && !isDeleteModalOpen && !isReportModalOpen\n ? captureKeyboardListeners({\n onBackspace: openDeleteModal,\n onDelete: openDeleteModal,\n onEsc: exitMessageSelectMode,\n })\n : undefined;\n }, [isActive, isDeleteModalOpen, isReportModalOpen, openDeleteModal, exitMessageSelectMode]);\n\n const handleDownload = useCallback(() => {\n downloadSelectedMessages();\n exitMessageSelectMode();\n }, [downloadSelectedMessages, 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, 'i');\n\n const className = buildClassName(\n 'MessageSelectToolbar',\n canPost && 'with-composer',\n isActive && 'shown',\n );\n\n const renderButton = (\n icon: string, label: string, onClick: AnyToVoidFunction, disabled?: boolean, destructive?: boolean,\n ) => {\n return (\n \n \n \n );\n };\n\n return (\n
\n
\n \n \n \n \n {formattedMessagesCount}\n \n\n {!!selectedMessagesCount && (\n
\n {messageListType !== 'scheduled' && (\n renderButton('forward', lang('Chat.ForwardActionHeader'), openForwardMenuForSelectedMessages)\n )}\n {canReportMessages && (\n renderButton('flag', lang('Conversation.ReportMessages'), openReportModal)\n )}\n {canDownloadMessages && (\n renderButton('download', lang('lng_media_download'), handleDownload)\n )}\n {renderButton('delete', lang('EditAdminGroupDeleteMessages'), openDeleteModal, !canDeleteMessages, true)}\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 const canReport = selectCanReportSelectedMessages(global);\n const canDownload = selectCanDownloadSelectedMessages(global);\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n\n return {\n isSchedule: messageListType === 'scheduled',\n selectedMessagesCount: selectSelectedMessagesCount(global),\n canDeleteMessages: canDelete,\n canReportMessages: canReport,\n canDownloadMessages: canDownload,\n selectedMessageIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'exitMessageSelectMode', 'openForwardMenuForSelectedMessages', 'downloadSelectedMessages',\n ]),\n)(MessageSelectToolbar));\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\n\nexport default (\n onSelect: NoneToVoidFunction,\n) => {\n // eslint-disable-next-line no-null/no-null\n const buttonRef = useRef(null);\n\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n if (e.key !== 'Enter') return;\n const isFocused = buttonRef.current === document.activeElement;\n\n if (isFocused) {\n onSelect();\n }\n }, [onSelect]);\n\n useEffect(() => {\n window.addEventListener('keydown', handleKeyDown, false);\n\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleKeyDown]);\n\n return buttonRef;\n};\n","import React, {\n FC, memo,\n} 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 { isUserId, getPrivateChatUserId, selectIsChatMuted } from '../../../modules/helpers';\nimport {\n selectChat, selectUser, selectIsChatPinned, selectNotifySettings, selectNotifyExceptions,\n} from '../../../modules/selectors';\nimport useSelectWithEnter from '../../../hooks/useSelectWithEnter';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport GroupChatInfo from '../../common/GroupChatInfo';\nimport DeleteChatModal from '../../common/DeleteChatModal';\nimport ListItem from '../../ui/ListItem';\nimport ChatFolderModal from '../ChatFolderModal.async';\n\ntype OwnProps = {\n chatId: string;\n withUsername?: boolean;\n onClick: (id: string) => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n privateChatUser?: ApiUser;\n isPinned?: boolean;\n isMuted?: boolean;\n};\n\nconst LeftSearchResultChat: FC = ({\n chatId,\n chat,\n privateChatUser,\n isPinned,\n isMuted,\n withUsername,\n onClick,\n}) => {\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n const [isChatFolderModalOpen, openChatFolderModal, closeChatFolderModal] = useFlag();\n\n const contextActions = useChatContextActions({\n chat,\n privateChatUser,\n isPinned,\n isMuted,\n handleDelete: openDeleteModal,\n handleChatFolderChange: openChatFolderModal,\n }, true);\n\n const handleClick = () => {\n onClick(chatId);\n };\n\n const buttonRef = useSelectWithEnter(handleClick);\n\n if (!chat) {\n return undefined;\n }\n\n return (\n \n {isUserId(chatId) ? (\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 privateChatUserId = chat && getPrivateChatUserId(chat);\n const privateChatUser = privateChatUserId ? selectUser(global, privateChatUserId) : undefined;\n const isPinned = selectIsChatPinned(global, chatId);\n const isMuted = chat\n ? selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global))\n : undefined;\n\n return {\n chat,\n privateChatUser,\n isPinned,\n isMuted,\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?: string[];\n usersById: Record;\n recentlyFoundChatIds?: string[];\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.current, !topUserIds);\n\n const handleClick = useCallback((id: string) => {\n openChat({ id, shouldReplaceHistory: true });\n onReset();\n setTimeout(() => {\n addRecentlyFoundChatId({ id });\n }, SEARCH_CLOSE_TIMEOUT_MS);\n }, [openChat, addRecentlyFoundChatId, onReset]);\n\n const lang = useLang();\n\n return (\n
\n {topUserIds && (\n
\n
\n {topUserIds.map((userId) => (\n
handleClick(userId)} dir={lang.isRtl ? 'rtl' : undefined}>\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_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport {\n getChatTitle,\n getPrivateChatUserId,\n getMessageMediaHash,\n getMessageSummaryText,\n getMessageMediaThumbDataUri,\n getMessageVideo,\n getMessageRoundVideo,\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, { LangFn } from '../../../hooks/useLang';\nimport useSelectWithEnter from '../../../hooks/useSelectWithEnter';\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: string;\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 const isRoundVideo = Boolean(getMessageRoundVideo(message));\n\n const handleClick = useCallback(() => {\n focusMessage({ chatId, messageId: message.id });\n }, [chatId, focusMessage, message.id]);\n\n const lang = useLang();\n\n const buttonRef = useSelectWithEnter(handleClick);\n\n if (!chat) {\n return undefined;\n }\n\n return (\n \n \n
\n
\n
\n

{renderText(getChatTitle(lang, chat, privateChatUser))}

\n {chat.isVerified && }\n
\n
\n \n {formatPastTimeShort(lang, message.date * 1000)}\n \n
\n\n
\n
\n
\n {renderMessageSummary(lang, message, mediaBlobUrl || mediaThumbnail, searchQuery, isRoundVideo)}\n
\n
\n
\n \n );\n};\n\nfunction renderMessageSummary(\n lang: LangFn, message: ApiMessage, blobUrl?: string, searchQuery?: string, isRoundVideo?: boolean,\n) {\n if (!blobUrl) {\n return renderText(getMessageSummaryText(lang, message));\n }\n\n return (\n \n \"\"\n {getMessageVideo(message) && }\n {renderText(getMessageSummaryText(lang, 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 lastSyncTime: global.lastSyncTime,\n ...(privateChatUserId && { privateChatUser: selectUser(global, privateChatUserId) }),\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_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport searchWords from '../../../util/searchWords';\nimport { unique, pick } from '../../../util/iteratees';\nimport { getUserFullName, getMessageSummaryText, sortChatIds } 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';\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?: string;\n localContactIds?: string[];\n localChatIds?: string[];\n localUserIds?: string[];\n globalChatIds?: string[];\n globalUserIds?: string[];\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 runThrottled = throttle((cb) => cb(), 500, true);\n\nconst ChatResults: FC = ({\n searchQuery, searchDate, dateSearchQuery, currentUserId,\n localContactIds, localChatIds, localUserIds, globalChatIds, globalUserIds,\n foundIds, globalMessagesByChatId, chatsById, usersById, fetchingStatus, lastSyncTime,\n onReset, onSearchDateSelect, openChat, addRecentlyFoundChatId, searchMessagesGlobal, setGlobalSearchChatId,\n}) => {\n const lang = useLang();\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: string) => {\n openChat({ id, shouldReplaceHistory: true });\n\n if (id !== currentUserId) {\n addRecentlyFoundChatId({ id });\n }\n\n if (!IS_SINGLE_COLUMN_LAYOUT) {\n onReset();\n }\n },\n [currentUserId, openChat, addRecentlyFoundChatId, onReset],\n );\n\n const handlePickerItemClick = useCallback((id: string) => {\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 foundContactIds = 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 })\n : [];\n\n return [\n ...(currentUserId && searchWords(lang('SavedMessages'), searchQuery) ? [currentUserId] : []),\n ...sortChatIds(unique([\n ...foundContactIds,\n ...(localChatIds || []),\n ...(localUserIds || []),\n ]), chatsById),\n ];\n }, [\n searchQuery, localContactIds, currentUserId, lang, localChatIds, localUserIds, chatsById, usersById,\n ]);\n\n const globalResults = useMemo(() => {\n if (!searchQuery || searchQuery.length < MIN_QUERY_LENGTH_FOR_GLOBAL_SEARCH || !globalChatIds || !globalUserIds) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return sortChatIds(unique([...globalChatIds, ...globalUserIds]),\n chatsById, true);\n }, [chatsById, globalChatIds, globalUserIds, 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('_');\n\n return globalMessagesByChatId?.[chatId]?.byId[Number(messageId)];\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 function renderFoundMessage(message: ApiMessage) {\n const text = getMessageSummaryText(lang, 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 \n )}\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 \n {lang(shouldShowMoreLocal ? 'ChatList.Search.ShowLess' : 'ChatList.Search.ShowMore')}\n \n )}\n {lang('DialogList.SearchSectionDialogs')}\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 \n {lang(shouldShowMoreGlobal ? 'ChatList.Search.ShowLess' : 'ChatList.Search.ShowMore')}\n \n )}\n {lang('DialogList.SearchSectionGlobal')}\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 {\n currentUserId, messages, lastSyncTime,\n } = global;\n const {\n fetchingStatus, globalResults, localResults, resultsByType,\n } = global.globalSearch;\n const { chatIds: globalChatIds, userIds: globalUserIds } = globalResults || {};\n const { chatIds: localChatIds, userIds: localUserIds } = localResults || {};\n const { byChatId: globalMessagesByChatId } = messages;\n const foundIds = resultsByType?.text?.foundIds;\n\n return {\n currentUserId,\n localContactIds,\n localChatIds,\n localUserIds,\n globalChatIds,\n globalUserIds,\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';\nimport useLang from '../../../hooks/useLang';\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?: string;\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 lang = useLang();\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('_');\n\n return globalMessagesByChatId?.[chatId]?.byId[Number(messageId)];\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(lang, 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 \n )}\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?.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';\nimport { ISettings } from '../../../../types';\n\nimport { selectTheme } from '../../../../modules/selectors';\n\nexport type StateProps = {\n theme: ISettings['theme'];\n isLoading?: boolean;\n chatsById: Record;\n usersById: Record;\n globalMessagesByChatId?: Record }>;\n foundIds?: string[];\n lastSyncTime?: number;\n searchChatId?: string;\n activeDownloads: Record;\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?.isVoice ? 'voice' : 'audio');\n\n const { byChatId: globalMessagesByChatId } = global.messages;\n const foundIds = resultsByType?.[currentType]?.foundIds;\n\n const activeDownloads = global.activeDownloads.byChatId;\n\n return {\n theme: selectTheme(global),\n isLoading: foundIds === undefined\n || (fetchingStatus ? Boolean(fetchingStatus.chats || fetchingStatus.messages) : false),\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n searchChatId: chatId,\n activeDownloads,\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 { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\nimport { throttle } from '../../../util/schedulers';\nimport useLang from '../../../hooks/useLang';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport Media from '../../common/Media';\nimport ChatMessage from './ChatMessage';\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 = '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 lang = useLang();\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('_');\n\n return globalMessagesByChatId[chatId]?.byId[Number(messageId)];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleSelectMedia = useCallback((messageId: number, chatId: string) => {\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 \n )}\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 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';\nimport useLang from '../../../hooks/useLang';\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 lang = useLang();\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('_');\n\n return globalMessagesByChatId[chatId]?.byId[Number(messageId)];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: string) => {\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

\n {formatMonthAndYear(lang, new Date(message.date * 1000))}\n

\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 \n )}\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';\nimport useLang from '../../../hooks/useLang';\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 activeDownloads,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\n}) => {\n const lang = useLang();\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('_');\n const message = globalMessagesByChatId[chatId]?.byId[Number(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: string) => {\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(lang, 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 \n )}\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 { AudioOrigin, 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';\nimport useLang from '../../../hooks/useLang';\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 theme,\n isVoice,\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n activeDownloads,\n searchMessagesGlobal,\n focusMessage,\n openAudioPlayer,\n}) => {\n const lang = useLang();\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('_');\n\n return globalMessagesByChatId[chatId]?.byId[Number(messageId)];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: string) => {\n focusMessage({ chatId, messageId });\n }, [focusMessage]);\n\n const handlePlayAudio = useCallback((messageId: number, chatId: string) => {\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

\n {formatMonthAndYear(lang, new Date(message.date * 1000))}\n

\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 \n )}\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, useRef,\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';\nimport useKeyboardListNavigation from '../../../hooks/useKeyboardListNavigation';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\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 isActive: boolean;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentContent?: GlobalSearchContent;\n chatId?: string;\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 isActive,\n currentContent = GlobalSearchContent.ChatList,\n chatId,\n setGlobalSearchContent,\n setGlobalSearchDate,\n onReset,\n}) => {\n const lang = useLang();\n const [activeTab, setActiveTab] = useState(currentContent);\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 useHistoryBack(isActive, onReset, undefined, undefined, true);\n\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const handleKeyDown = useKeyboardListNavigation(containerRef, isActive, undefined, '.ListItem-button', true);\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 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, memo, useCallback, useMemo, 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_SINGLE_COLUMN_LAYOUT } 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 onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsHeader: FC = ({\n currentScreen,\n editedFolderId,\n onReset,\n onSaveFilter,\n signOut,\n deleteChatFolder,\n onScreenSelect,\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('lng_settings_information')}

;\n case SettingsScreens.General:\n return

{lang('General')}

;\n case SettingsScreens.Notifications:\n return

{lang('Notifications')}

;\n case SettingsScreens.DataStorage:\n return

{lang('DataSettings')}

;\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('PleaseEnterCurrentPassword')}

;\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 case SettingsScreens.FoldersEditFolderFromChatList:\n return (\n
\n

{lang('FilterEdit')}

\n\n {editedFolderId && (\n \n \n {lang('Delete')}\n \n \n )}\n
\n );\n case SettingsScreens.FoldersIncludedChats:\n case SettingsScreens.FoldersIncludedChatsFromChatList:\n case SettingsScreens.FoldersExcludedChats:\n case SettingsScreens.FoldersExcludedChatsFromChatList:\n return (\n
\n {(currentScreen === SettingsScreens.FoldersIncludedChats\n || currentScreen === SettingsScreens.FoldersIncludedChatsFromChatList) ? (\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 onScreenSelect(SettingsScreens.EditProfile)}\n ariaLabel={lang('lng_settings_information')}\n >\n \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, useEffect } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens } from '../../../types';\nimport { ApiUser } from '../../../api/types';\n\nimport { selectUser } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport ProfileInfo from '../../common/ProfileInfo';\nimport ChatExtra from '../../common/ChatExtra';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentUser?: ApiUser;\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsMain: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n loadProfilePhotos,\n currentUser,\n lastSyncTime,\n}) => {\n const lang = useLang();\n const profileId = currentUser?.id;\n\n useEffect(() => {\n if (profileId && lastSyncTime) {\n loadProfilePhotos({ profileId });\n }\n }, [lastSyncTime, profileId, loadProfilePhotos]);\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Main);\n\n return (\n
\n
\n {currentUser && (\n \n )}\n {currentUser && (\n \n )}\n onScreenSelect(SettingsScreens.General)}\n >\n {lang('Telegram.GeneralSettingsViewController')}\n \n onScreenSelect(SettingsScreens.Notifications)}\n >\n {lang('Notifications')}\n \n onScreenSelect(SettingsScreens.Privacy)}\n >\n {lang('PrivacySettings')}\n \n onScreenSelect(SettingsScreens.DataStorage)}\n >\n {lang('DataSettings')}\n \n onScreenSelect(SettingsScreens.Folders)}\n >\n {lang('Filters')}\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, lastSyncTime } = global;\n\n return {\n currentUser: currentUserId ? selectUser(global, currentUserId) : undefined,\n lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadProfilePhotos']),\n)(SettingsMain));\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, SettingsScreens } 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';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\ntype OwnProps = {\n isActive: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\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 isActive,\n onScreenSelect,\n onReset,\n currentAvatarHash,\n currentFirstName,\n currentLastName,\n currentBio,\n currentUsername,\n progress,\n isUsernameAvailable,\n loadCurrentUser,\n updateProfile,\n checkUsername,\n}) => {\n const lang = useLang();\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 useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.EditProfile);\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 return (\n
\n
\n
\n \n \n \n \n\n

\n {renderText(lang('lng_settings_about_bio'), ['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 {lang('lng_username_link')}
\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, { FC, memo, useCallback } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, ISettings } from '../../../types';\n\nimport { AUTODOWNLOAD_FILESIZE_MB_LIMITS } from '../../../config';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport Checkbox from '../../ui/Checkbox';\nimport RangeSlider from '../../ui/RangeSlider';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = Pick;\n\ntype DispatchProps = Pick;\n\nconst SettingsDataStorage: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n canAutoLoadPhotoFromContacts,\n canAutoLoadPhotoInPrivateChats,\n canAutoLoadPhotoInGroups,\n canAutoLoadPhotoInChannels,\n canAutoLoadVideoFromContacts,\n canAutoLoadVideoInPrivateChats,\n canAutoLoadVideoInGroups,\n canAutoLoadVideoInChannels,\n canAutoLoadFileFromContacts,\n canAutoLoadFileInPrivateChats,\n canAutoLoadFileInGroups,\n canAutoLoadFileInChannels,\n canAutoPlayGifs,\n canAutoPlayVideos,\n autoLoadFileMaxSizeMb,\n setSettingOption,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.General);\n\n const renderFileSizeCallback = useCallback((value: number) => {\n return lang('AutodownloadSizeLimitUpTo', lang('FileSize.MB', String(AUTODOWNLOAD_FILESIZE_MB_LIMITS[value]), 'i'));\n }, [lang]);\n\n const handleFileSizeChange = useCallback((value: number) => {\n setSettingOption({ autoLoadFileMaxSizeMb: AUTODOWNLOAD_FILESIZE_MB_LIMITS[value] });\n }, [setSettingOption]);\n\n function renderContentSizeSlider() {\n const value = AUTODOWNLOAD_FILESIZE_MB_LIMITS.indexOf(autoLoadFileMaxSizeMb);\n\n return (\n
\n \n
\n );\n }\n\n function renderAutoDownloadBlock(\n title: string,\n key: 'Photo' | 'Video' | 'File',\n canAutoLoadFromContacts: boolean,\n canAutoLoadInPrivateChats: boolean,\n canAutoLoadInGroups: boolean,\n canAutoLoadInChannels: boolean,\n ) {\n return (\n
\n

{title}

\n\n setSettingOption({ [`canAutoLoad${key}FromContacts`]: isChecked })}\n />\n setSettingOption({ [`canAutoLoad${key}InPrivateChats`]: isChecked })}\n />\n setSettingOption({ [`canAutoLoad${key}InGroups`]: isChecked })}\n />\n setSettingOption({ [`canAutoLoad${key}InChannels`]: isChecked })}\n />\n\n {key === 'File' && renderContentSizeSlider()}\n
\n );\n }\n\n return (\n
\n {renderAutoDownloadBlock(\n lang('AutoDownloadPhotosTitle'),\n 'Photo',\n canAutoLoadPhotoFromContacts,\n canAutoLoadPhotoInPrivateChats,\n canAutoLoadPhotoInGroups,\n canAutoLoadPhotoInChannels,\n )}\n {renderAutoDownloadBlock(\n lang('AutoDownloadVideosTitle'),\n 'Video',\n canAutoLoadVideoFromContacts,\n canAutoLoadVideoInPrivateChats,\n canAutoLoadVideoInGroups,\n canAutoLoadVideoInChannels,\n )}\n {renderAutoDownloadBlock(\n 'Auto-download files', // Proper translation is not available yet\n 'File',\n canAutoLoadFileFromContacts,\n canAutoLoadFileInPrivateChats,\n canAutoLoadFileInGroups,\n canAutoLoadFileInChannels,\n )}\n\n
\n

{lang('AutoplayMedia')}

\n\n setSettingOption({ canAutoPlayGifs: isChecked })}\n />\n setSettingOption({ canAutoPlayVideos: isChecked })}\n />\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return pick(global.settings.byKey, [\n 'canAutoLoadPhotoFromContacts',\n 'canAutoLoadPhotoInPrivateChats',\n 'canAutoLoadPhotoInGroups',\n 'canAutoLoadPhotoInChannels',\n 'canAutoLoadVideoFromContacts',\n 'canAutoLoadVideoInPrivateChats',\n 'canAutoLoadVideoInGroups',\n 'canAutoLoadVideoInChannels',\n 'canAutoLoadFileFromContacts',\n 'canAutoLoadFileInPrivateChats',\n 'canAutoLoadFileInGroups',\n 'canAutoLoadFileInChannels',\n 'canAutoPlayGifs',\n 'canAutoPlayVideos',\n 'autoLoadFileMaxSizeMb',\n ]);\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setSettingOption',\n ]),\n)(SettingsDataStorage));\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';\nimport { NotifyException, NotifySettings, SettingsScreens } from '../../../../types';\n\nimport { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config';\nimport { pick } from '../../../../util/iteratees';\nimport { selectNotifyExceptions, selectNotifySettings } from '../../../../modules/selectors';\nimport { throttle } from '../../../../util/schedulers';\nimport getAnimationData from '../../../common/helpers/animatedAssets';\nimport { getFolderDescriptionText } from '../../../../modules/helpers';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\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 isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n chatsById: Record;\n usersById: Record;\n orderedFolderIds?: number[];\n foldersById: Record;\n recommendedChatFolders?: ApiChatFolder[];\n notifySettings: NotifySettings;\n notifyExceptions?: Record;\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 isActive,\n onScreenSelect,\n onReset,\n chatsById,\n usersById,\n orderedFolderIds,\n foldersById,\n recommendedChatFolders,\n notifySettings,\n notifyExceptions,\n loadRecommendedChatFolders,\n addChatFolder,\n showDialog,\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 showDialog({\n data: {\n message: 'DIALOG_FILTERS_TOO_MUCH',\n hasErrorKey: true,\n },\n });\n\n return;\n }\n\n onCreateFolder();\n }, [foldersById, showDialog, onCreateFolder]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Folders);\n\n const userFolders = useMemo(() => {\n if (!orderedFolderIds) {\n return undefined;\n }\n\n const chatIds = Object.keys(chatsById);\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(\n lang, chatsById, usersById, folder, chatIds, notifySettings, notifyExceptions,\n ),\n };\n });\n }, [orderedFolderIds, chatsById, foldersById, usersById, notifySettings, notifyExceptions, lang]);\n\n const handleCreateFolderFromRecommended = useCallback((folder: ApiChatFolder) => {\n if (Object.keys(foldersById).length >= MAX_ALLOWED_FOLDERS) {\n showDialog({\n data: {\n message: 'DIALOG_FILTERS_TOO_MUCH',\n hasErrorKey: true,\n },\n });\n\n return;\n }\n\n addChatFolder({ folder });\n }, [foldersById, addChatFolder, showDialog]);\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?.length ? userFolders.map((folder) => (\n onEditFolder(foldersById[folder.id])}\n >\n {folder.title}\n {folder.subtitle}\n \n )) : userFolders && !userFolders.length ? (\n

\n You have no folders yet.\n

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

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

\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 notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadRecommendedChatFolders', 'addChatFolder', 'showDialog']),\n)(SettingsFoldersMain));\n","import React, { FC } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\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 const lang = useLang();\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, useEffect, useMemo, useState,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config';\nimport { findIntersectionWithSet, pick } from '../../../../util/iteratees';\nimport { isUserId } from '../../../../modules/helpers';\nimport getAnimationData from '../../../common/helpers/animatedAssets';\nimport {\n EXCLUDED_CHAT_TYPES,\n FolderEditDispatch,\n FoldersState,\n INCLUDED_CHAT_TYPES,\n selectChatFilters,\n} from '../../../../hooks/reducers/useFoldersReducer';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\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 isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n onBack: () => void;\n};\n\ntype StateProps = {\n loadedActiveChatIds?: string[];\n loadedArchivedChatIds?: string[];\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 = 'ChatList.Filter.Error.Empty';\n\nconst SettingsFoldersEdit: FC = ({\n state,\n dispatch,\n onAddIncludedChats,\n onAddExcludedChats,\n isActive,\n onScreenSelect,\n onReset,\n onBack,\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 useHistoryBack(isActive, onBack, onScreenSelect, state.mode === 'edit'\n ? SettingsScreens.FoldersEditFolder\n : SettingsScreens.FoldersCreateFolder);\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 {isUserId(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 {lang(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 { isUserId } 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: string[];\n selectedIds: string[];\n selectedChatTypes: string[];\n filterValue?: string;\n onSelectedIdsChange: (ids: string[]) => 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: string) => {\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: string) {\n const isSelected = selectedIds.includes(id);\n\n return (\n handleItemClick(id)}\n ripple\n disabled={!isSelected && hasMaxChats}\n >\n {isUserId(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

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

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

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

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

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

\n \n )}\n\n {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';\nimport { SettingsScreens } from '../../../../types';\n\nimport useLang from '../../../../hooks/useLang';\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';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\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 isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n chatsById: Record;\n listIds?: string[];\n orderedPinnedIds?: string[];\n archivedListIds?: string[];\n archivedPinnedIds?: string[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsFoldersChatFilters: FC = ({\n isActive,\n onScreenSelect,\n onReset,\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 lang = useLang();\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(lang, chat), chatFilter)\n || selectedChatIds.includes(chat.id)\n ))\n .map(({ id }) => id);\n }, [chats, chatFilter, lang, 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: string[]) => {\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 useHistoryBack(isActive, onReset, onScreenSelect,\n mode === 'included' ? SettingsScreens.FoldersIncludedChats : SettingsScreens.FoldersExcludedChats);\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 { FolderEditDispatch, FoldersState } 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 shownScreen: SettingsScreens;\n state: FoldersState;\n dispatch: FolderEditDispatch;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\nconst SettingsFolders: FC = ({\n currentScreen,\n shownScreen,\n state,\n dispatch,\n isActive,\n onScreenSelect,\n onReset,\n}) => {\n const handleReset = useCallback(() => {\n if (\n currentScreen === SettingsScreens.FoldersCreateFolder\n || currentScreen === SettingsScreens.FoldersEditFolder\n || currentScreen === SettingsScreens.FoldersEditFolderFromChatList\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(currentScreen === SettingsScreens.FoldersEditFolderFromChatList\n ? SettingsScreens.FoldersIncludedChatsFromChatList\n : SettingsScreens.FoldersIncludedChats);\n }, [currentScreen, dispatch, onScreenSelect]);\n\n const handleAddExcludedChats = useCallback(() => {\n dispatch({ type: 'editExcludeFilters' });\n onScreenSelect(currentScreen === SettingsScreens.FoldersEditFolderFromChatList\n ? SettingsScreens.FoldersExcludedChatsFromChatList\n : SettingsScreens.FoldersExcludedChats);\n }, [currentScreen, dispatch, onScreenSelect]);\n\n switch (currentScreen) {\n case SettingsScreens.Folders:\n return (\n \n );\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n case SettingsScreens.FoldersEditFolderFromChatList:\n return (\n \n );\n case SettingsScreens.FoldersIncludedChats:\n case SettingsScreens.FoldersIncludedChatsFromChatList:\n return (\n \n );\n case SettingsScreens.FoldersExcludedChats:\n case SettingsScreens.FoldersExcludedChatsFromChatList:\n return (\n \n );\n\n default:\n return undefined;\n }\n};\n\nexport default memo(SettingsFolders);\n","import React, {\n FC, memo, useMemo, useRef,\n} 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 useMediaTransition from '../../../hooks/useMediaTransition';\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 transitionClassNames = useMediaTransition(lottieData);\n\n const firstLetters = useMemo(() => {\n if (lottieData) return undefined;\n\n return getFirstLetters(stickerSet.title, 2);\n }, [lottieData, stickerSet.title]);\n\n return (\n
\n {firstLetters}\n {lottieData && (\n \n )}\n
\n );\n};\n\nexport default memo(StickerSetCoverAnimated);\n","import React, {\n FC, memo, useMemo, useRef,\n} from '../../../lib/teact/teact';\n\nimport { ApiStickerSet } from '../../../api/types';\n\nimport { getFirstLetters } from '../../../util/textFormat';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMedia from '../../../hooks/useMedia';\nimport useMediaTransition from '../../../hooks/useMediaTransition';\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 transitionClassNames = useMediaTransition(mediaData);\n\n const firstLetters = useMemo(() => {\n if (mediaData) return undefined;\n\n return getFirstLetters(stickerSet.title, 2);\n }, [mediaData, stickerSet.title]);\n\n return (\n
\n {firstLetters}\n \"\"\n
\n );\n};\n\nexport default memo(StickerSetCover);\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?.[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, TimeFormat } from '../../../types';\nimport { ApiSticker, ApiStickerSet } from '../../../api/types';\n\nimport { IS_IOS, IS_MAC_OS, IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport { setTimeFormat } from '../../../util/langProvider';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport RangeSlider from '../../ui/RangeSlider';\nimport Checkbox from '../../ui/Checkbox';\nimport RadioGroup, { IRadioOption } from '../../ui/RadioGroup';\nimport SettingsStickerSet from './SettingsStickerSet';\nimport StickerSetModal from '../../common/StickerSetModal.async';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = Pick & {\n stickerSetIds?: string[];\n stickerSetsById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_LEVEL_OPTIONS = [\n 'Solid and Steady',\n 'Nice and Fast',\n 'Lots of Stuff',\n];\n\nconst TIME_FORMAT_OPTIONS: IRadioOption[] = [{\n label: '12-hour',\n value: '12h',\n}, {\n label: '24-hour',\n value: '24h',\n}];\n\nconst SettingsGeneral: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n stickerSetIds,\n stickerSetsById,\n messageTextSize,\n animationLevel,\n messageSendKeyCombo,\n shouldSuggestStickers,\n shouldLoopStickers,\n timeFormat,\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 const lang = useLang();\n\n const KEYBOARD_SEND_OPTIONS = !IS_TOUCH_ENV ? [\n { value: 'enter', label: lang('lng_settings_send_enter'), subLabel: 'New line by Shift + Enter' },\n {\n value: 'ctrl-enter',\n label: lang(IS_MAC_OS ? 'lng_settings_send_cmdenter' : 'lng_settings_send_ctrlenter'),\n subLabel: 'New line by Enter',\n },\n ] : undefined;\n\n useEffect(() => {\n loadStickerSets();\n }, [loadStickerSets]);\n\n useEffect(() => {\n if (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(\n '--composer-text-size', `${Math.max(newSize, IS_IOS ? 16 : 15)}px`,\n );\n document.documentElement.style.setProperty('--message-meta-height', `${Math.floor(newSize * 1.3125)}px`);\n document.documentElement.style.setProperty('--message-text-size', `${newSize}px`);\n document.documentElement.setAttribute('data-message-text-size', newSize.toString());\n\n setSettingOption({ messageTextSize: newSize });\n }, [setSettingOption]);\n\n const handleTimeFormatChange = useCallback((newTimeFormat: string) => {\n setSettingOption({ timeFormat: newTimeFormat });\n setSettingOption({ wasTimeFormatSetManually: true });\n\n setTimeFormat(newTimeFormat as TimeFormat);\n }, [setSettingOption]);\n\n const handleStickerSetClick = useCallback((value: ApiSticker) => {\n setSticker(value);\n openModal();\n }, [openModal]);\n\n const stickerSets = stickerSetIds && stickerSetIds.map((id: string) => {\n return stickerSetsById?.[id]?.installedDate ? stickerSetsById[id] : false;\n }).filter(Boolean as any);\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.General);\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 Time Format\n

\n \n
\n\n
\n

\n Animation Level\n

\n

\n Choose the desired animations amount.\n

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

{lang('VoiceOver.Keyboard')}

\n\n setSettingOption({ messageSendKeyCombo: value })}\n selected={messageSendKeyCombo}\n />\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 'messageTextSize',\n 'animationLevel',\n 'messageSendKeyCombo',\n 'shouldSuggestStickers',\n 'shouldLoopStickers',\n 'isSensitiveEnabled',\n 'canChangeSensitive',\n 'timeFormat',\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, useRef,\n} from '../../../lib/teact/teact';\nimport { ApiWallpaper } from '../../../api/types';\nimport { ThemeKey, 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 buildClassName from '../../../util/buildClassName';\nimport useMedia from '../../../hooks/useMedia';\nimport useMediaWithLoadProgress from '../../../hooks/useMediaWithLoadProgress';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useCanvasBlur from '../../../hooks/useCanvasBlur';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nimport './WallpaperTile.scss';\n\ntype OwnProps = {\n wallpaper: ApiWallpaper;\n theme: ThemeKey;\n isSelected: boolean;\n onClick: (slug: string) => void;\n};\n\nconst WallpaperTile: FC = ({\n wallpaper,\n theme,\n isSelected,\n onClick,\n}) => {\n const { slug, document } = wallpaper;\n const localMediaHash = `wallpaper${document.id!}`;\n const localBlobUrl = document.previewBlobUrl;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`);\n const thumbRef = useCanvasBlur(document.thumbnail?.dataUri, Boolean(previewBlobUrl), true);\n const { transitionClassNames } = useShowTransition(\n Boolean(previewBlobUrl || localBlobUrl),\n undefined,\n undefined,\n 'slow',\n );\n const [isLoadAllowed, setIsLoadAllowed] = useState(false);\n const {\n mediaData: fullMedia, loadProgress,\n } = useMediaWithLoadProgress(localMediaHash, !isLoadAllowed);\n const wasLoadDisabled = usePrevious(isLoadAllowed) === false;\n const { shouldRender: shouldRenderSpinner, transitionClassNames: spinnerClassNames } = useShowTransition(\n (isLoadAllowed && !fullMedia) || slug === UPLOADING_WALLPAPER_SLUG,\n undefined,\n wasLoadDisabled,\n 'slow',\n );\n // To prevent triggering of the effect for useCallback\n const cacheKeyRef = useRef();\n cacheKeyRef.current = theme;\n\n const handleSelect = useCallback(() => {\n (async () => {\n const blob = await fetchBlob(fullMedia!);\n await cacheApi.save(CUSTOM_BG_CACHE_NAME, cacheKeyRef.current!, 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 setIsLoadAllowed((isAllowed) => !isAllowed);\n }\n }, [fullMedia, handleSelect]);\n\n const className = buildClassName(\n 'WallpaperTile',\n isSelected && 'selected',\n );\n\n return (\n
\n
\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, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, ThemeKey, UPLOADING_WALLPAPER_SLUG } from '../../../types';\nimport { ApiWallpaper } from '../../../api/types';\n\nimport { DARK_THEME_PATTERN_COLOR, DEFAULT_PATTERN_COLOR } from '../../../config';\nimport { pick } from '../../../util/iteratees';\nimport { throttle } from '../../../util/schedulers';\nimport { openSystemFilesDialog } from '../../../util/systemFilesDialog';\nimport { getAverageColor, getPatternColor, rgb2hex } from '../../../util/colors';\nimport { selectTheme } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\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 isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n background?: string;\n isBlurred?: boolean;\n loadedWallpapers?: ApiWallpaper[];\n theme: ThemeKey;\n};\n\ntype DispatchProps = Pick;\n\nconst SUPPORTED_TYPES = 'image/jpeg';\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst SettingsGeneralBackground: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n background,\n isBlurred,\n loadedWallpapers,\n theme,\n loadWallpapers,\n uploadWallpaper,\n setThemeSettings,\n}) => {\n const themeRef = useRef();\n themeRef.current = theme;\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 setThemeSettings({\n theme,\n background: undefined,\n backgroundColor: undefined,\n isBlurred: true,\n patternColor: theme === 'dark' ? DARK_THEME_PATTERN_COLOR : DEFAULT_PATTERN_COLOR,\n });\n }, [setThemeSettings, theme]);\n\n const handleWallPaperSelect = useCallback((slug: string) => {\n setThemeSettings({ theme: themeRef.current, background: slug });\n const currentWallpaper = loadedWallpapers && loadedWallpapers.find((wallpaper) => wallpaper.slug === slug);\n if (currentWallpaper?.document.thumbnail) {\n getAverageColor(currentWallpaper.document.thumbnail.dataUri)\n .then((color) => {\n const patternColor = getPatternColor(color);\n const rgbColor = `#${rgb2hex(color)}`;\n setThemeSettings({ theme: themeRef.current, backgroundColor: rgbColor, patternColor });\n });\n }\n }, [loadedWallpapers, setThemeSettings]);\n\n const handleWallPaperBlurChange = useCallback((e: React.ChangeEvent) => {\n setThemeSettings({ theme: themeRef.current, isBlurred: e.target.checked });\n }, [setThemeSettings]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.GeneralChatBackground);\n\n const isUploading = 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 theme = selectTheme(global);\n const { background, isBlurred } = global.settings.themes[theme] || {};\n const { loadedWallpapers } = global.settings;\n\n return {\n background,\n isBlurred,\n loadedWallpapers,\n theme,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadWallpapers', 'uploadWallpaper', 'setThemeSettings',\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, ThemeKey } 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 { selectTheme } from '../../../modules/selectors';\nimport useFlag from '../../../hooks/useFlag';\nimport buildClassName from '../../../util/buildClassName';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport InputText from '../../ui/InputText';\n\nimport './SettingsGeneralBackgroundColor.scss';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n backgroundColor?: string;\n theme: ThemeKey;\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 isActive,\n onScreenSelect,\n onReset,\n theme,\n backgroundColor,\n setThemeSettings,\n}) => {\n const themeRef = useRef();\n themeRef.current = theme;\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(backgroundColor));\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 return true;\n }\n\n captureEvents(colorPickerRef.current!, {\n onCapture: handleColorDrag,\n onDrag: handleColorDrag,\n onRelease: unmarkIsDragging,\n onClick: unmarkIsDragging,\n selectorToPreventScroll: '.SettingsGeneralBackgroundColor',\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 return true;\n }\n\n captureEvents(huePickerRef.current!, {\n onCapture: handleHueDrag,\n onDrag: handleHueDrag,\n onRelease: unmarkIsDragging,\n onClick: unmarkIsDragging,\n selectorToPreventScroll: '.SettingsGeneralBackgroundColor',\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 const patternColor = getPatternColor(rgb);\n setThemeSettings({\n theme: themeRef.current,\n background: undefined,\n backgroundColor: color,\n patternColor,\n });\n }\n isFirstRunRef.current = false;\n }, [hsb, setThemeSettings]);\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 useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.GeneralChatBackgroundColor);\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(backgroundColor?: string) {\n return backgroundColor && backgroundColor.startsWith('#')\n ? rgb2hsb(hex2rgb(backgroundColor.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 const theme = selectTheme(global);\n const { backgroundColor } = global.settings.themes[theme] || {};\n return {\n backgroundColor,\n theme,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setThemeSettings']),\n)(SettingsGeneralBackground));\n","import { ChangeEvent } from 'react';\nimport useDebounce from '../../../hooks/useDebounce';\nimport React, {\n FC, memo, useCallback, useEffect,\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 useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\nimport { playNotifySound } from '../../../util/notifications';\n\nimport Checkbox from '../../ui/Checkbox';\nimport RangeSlider from '../../ui/RangeSlider';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\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 hasWebNotifications: boolean;\n hasPushNotifications: boolean;\n notificationSoundVolume: number;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsNotifications: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n hasPrivateChatsNotifications,\n hasPrivateChatsMessagePreview,\n hasGroupNotifications,\n hasGroupMessagePreview,\n hasBroadcastNotifications,\n hasBroadcastMessagePreview,\n hasContactJoinedNotifications,\n hasPushNotifications,\n hasWebNotifications,\n notificationSoundVolume,\n loadNotificationSettings,\n updateContactSignUpNotification,\n updateNotificationSettings,\n updateWebNotificationSettings,\n}) => {\n useEffect(() => {\n loadNotificationSettings();\n }, [loadNotificationSettings]);\n\n const runDebounced = useDebounce(500, false, true);\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 currentShouldShowPreviews = peerType === 'contact'\n ? hasPrivateChatsMessagePreview\n : (peerType === 'group' ? hasGroupMessagePreview : hasBroadcastMessagePreview);\n\n updateNotificationSettings({\n peerType,\n ...(setting === 'silent' && { isSilent: !e.target.checked, shouldShowPreviews: currentShouldShowPreviews }),\n ...(setting === 'showPreviews' && { shouldShowPreviews: 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 useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Notifications);\n\n return (\n
\n
\n

\n Web notifications\n

\n {\n updateWebNotificationSettings({ hasWebNotifications: e.target.checked });\n }}\n />\n {\n updateWebNotificationSettings({ hasPushNotifications: e.target.checked });\n }}\n />\n
\n {\n updateWebNotificationSettings({ notificationSoundVolume: volume });\n runDebounced(() => playNotifySound(undefined, volume));\n }}\n />\n
\n
\n
\n

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

\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 hasWebNotifications: global.settings.byKey.hasWebNotifications,\n hasPushNotifications: global.settings.byKey.hasPushNotifications,\n notificationSoundVolume: global.settings.byKey.notificationSoundVolume,\n };\n},\n(setGlobal, actions): DispatchProps => pick(actions, [\n 'loadNotificationSettings',\n 'updateContactSignUpNotification',\n 'updateNotificationSettings',\n 'updateWebNotificationSettings',\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';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n hasPassword?: boolean;\n blockedCount: number;\n sessionsCount: number;\n isSensitiveEnabled?: boolean;\n canChangeSensitive?: boolean;\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 isActive,\n onScreenSelect,\n onReset,\n hasPassword,\n blockedCount,\n sessionsCount,\n isSensitiveEnabled,\n canChangeSensitive,\n visibilityPrivacyPhoneNumber,\n visibilityPrivacyLastSeen,\n visibilityPrivacyProfilePhoto,\n visibilityPrivacyForwarding,\n visibilityPrivacyGroupChats,\n loadPrivacySettings,\n loadBlockedContacts,\n loadAuthorizations,\n loadContentSettings,\n updateContentSettings,\n}) => {\n useEffect(() => {\n loadBlockedContacts();\n loadAuthorizations();\n loadPrivacySettings();\n loadContentSettings();\n }, [loadBlockedContacts, loadAuthorizations, loadPrivacySettings, loadContentSettings]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Privacy);\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 \n {lang(hasPassword ? 'PasswordOn' : 'PasswordOff')}\n \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 \n {getVisibilityValue(visibilityPrivacyPhoneNumber)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyLastSeen)}\n >\n
\n {lang('LastSeenTitle')}\n \n {getVisibilityValue(visibilityPrivacyLastSeen)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyProfilePhoto)}\n >\n
\n {lang('PrivacyProfilePhotoTitle')}\n \n {getVisibilityValue(visibilityPrivacyProfilePhoto)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyForwarding)}\n >\n
\n {lang('PrivacyForwardsTitle')}\n \n {getVisibilityValue(visibilityPrivacyForwarding)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyGroupChats)}\n >\n
\n {lang('WhoCanAddMe')}\n \n {getVisibilityValue(visibilityPrivacyGroupChats)}\n \n
\n \n
\n\n {canChangeSensitive && (\n
\n

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

\n \n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n settings: {\n byKey: { hasPassword, isSensitiveEnabled, canChangeSensitive },\n privacy,\n },\n blocked,\n activeSessions,\n } = global;\n\n return {\n hasPassword,\n blockedCount: blocked.totalCount,\n sessionsCount: activeSessions.length,\n isSensitiveEnabled,\n canChangeSensitive,\n visibilityPrivacyPhoneNumber: privacy.phoneNumber?.visibility,\n visibilityPrivacyLastSeen: privacy.lastSeen?.visibility,\n visibilityPrivacyProfilePhoto: privacy.profilePhoto?.visibility,\n visibilityPrivacyForwarding: privacy.forwards?.visibility,\n visibilityPrivacyGroupChats: privacy.chatInvite?.visibility,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadBlockedContacts', 'loadAuthorizations', 'loadPrivacySettings', 'loadContentSettings', 'updateContentSettings',\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, LangCode, SettingsScreens } 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';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = Pick;\n\ntype DispatchProps = Pick;\n\nconst SettingsLanguage: FC = ({\n isActive,\n onScreenSelect,\n onReset,\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 void setLanguage(langCode as LangCode, () => {\n unmarkIsLoading();\n\n setSettingOption({ language: langCode });\n });\n }, [markIsLoading, unmarkIsLoading, setSettingOption]);\n\n const options = useMemo(() => {\n return languages ? buildOptions(languages) : undefined;\n }, [languages]);\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Language);\n\n return (\n
\n {options ? (\n \n ) : (\n \n )}\n
\n );\n};\n\nfunction buildOptions(languages: ApiLanguage[]) {\n const currentLangCode = (window.navigator.language || 'en').toLowerCase();\n const shortLangCode = currentLangCode.substr(0, 2);\n\n return languages.map(({ langCode, nativeName, name }) => ({\n value: langCode,\n label: nativeName,\n subLabel: name,\n })).sort((a) => {\n return currentLangCode && (a.value === currentLangCode || a.value === shortLangCode) ? -1 : 0;\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';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport RadioGroup from '../../ui/RadioGroup';\nimport { getPrivacyKey } from './helper/privacy';\n\ntype OwnProps = {\n screen: SettingsScreens;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = Partial & {\n chatsById?: Record;\n usersById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyVisibility: FC = ({\n screen,\n isActive,\n onScreenSelect,\n onReset,\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 useHistoryBack(isActive, onReset, onScreenSelect, 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';\nimport { SettingsScreens } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { formatPastTimeShort } from '../../../util/dateFormat';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n activeSessions: ApiSession[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyActiveSessions: FC = ({\n isActive,\n onScreenSelect,\n onReset,\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 useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.PrivacyActiveSessions);\n\n function renderCurrentSession(session: ApiSession) {\n return (\n
\n

\n {lang('AuthSessions.CurrentSession')}\n

\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

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

\n\n {sessions.map(renderSession)}\n
\n );\n }\n\n function renderSession(session: ApiSession) {\n return (\n {\n handleTerminateSessionClick(session.hash);\n },\n }]}\n className=\"no-icon\"\n >\n
\n {formatPastTimeShort(lang, 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 {otherSessions && renderOtherSessions(otherSessions)}\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 => {\n return {\n activeSessions: global.activeSessions,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadAuthorizations', 'terminateAuthorization', 'terminateAllAuthorizations',\n ]),\n)(SettingsPrivacyActiveSessions));\n","import React, {\n FC, useMemo, useState, memo, useRef, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiUser } from '../../../api/types';\n\nimport { getUserFullName } from '../../../modules/helpers';\nimport searchWords from '../../../util/searchWords';\nimport { pick, unique } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport ChatOrUserPicker from '../../common/ChatOrUserPicker';\n\nexport type OwnProps = {\n isOpen: boolean;\n onClose: NoneToVoidFunction;\n};\n\ntype StateProps = {\n usersById: Record;\n blockedIds: string[];\n contactIds?: string[];\n localContactIds?: string[];\n currentUserId?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst BlockUserModal: FC = ({\n usersById,\n blockedIds,\n contactIds,\n localContactIds,\n currentUserId,\n isOpen,\n onClose,\n loadContactList,\n setUserSearchQuery,\n blockContact,\n}) => {\n const lang = useLang();\n const [filter, setFilter] = useState('');\n // eslint-disable-next-line no-null/no-null\n const filterRef = useRef(null);\n\n useEffect(() => {\n setUserSearchQuery({ query: filter });\n }, [filter, setUserSearchQuery]);\n\n const filteredContactsId = useMemo(() => {\n const availableContactsId = (contactIds || []).concat(localContactIds || []).filter((contactId) => {\n return !blockedIds.includes(contactId) && contactId !== currentUserId;\n });\n\n return unique(availableContactsId).reduce((acc, contactId) => {\n if (\n !filter\n || !usersById[contactId]\n || searchWords(getUserFullName(usersById[contactId]) || '', filter)\n || usersById[contactId]?.username.toLowerCase().includes(filter)\n ) {\n acc.push(contactId);\n }\n\n return acc;\n }, [])\n .sort((firstId, secondId) => {\n const firstName = getUserFullName(usersById[firstId]) || '';\n const secondName = getUserFullName(usersById[secondId]) || '';\n\n return firstName.localeCompare(secondName);\n });\n }, [blockedIds, contactIds, currentUserId, filter, localContactIds, usersById]);\n\n const handleRemoveUser = useCallback((userId: string) => {\n const { id: contactId, accessHash } = usersById[userId] || {};\n if (!contactId || !accessHash) {\n return;\n }\n blockContact({ contactId, accessHash });\n onClose();\n }, [blockContact, onClose, usersById]);\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n users: {\n byId: usersById,\n },\n blocked: {\n ids: blockedIds,\n },\n contactList,\n currentUserId,\n } = global;\n\n return {\n usersById,\n blockedIds,\n contactIds: contactList?.userIds,\n localContactIds: global.userSearch.localUserIds,\n currentUserId,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadContactList', 'setUserSearchQuery', 'blockContact',\n ]),\n)(BlockUserModal));\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, ApiCountryCode, ApiUser } from '../../../api/types';\nimport { SettingsScreens } from '../../../types';\n\nimport { CHAT_HEIGHT_PX } from '../../../config';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\nimport { pick } from '../../../util/iteratees';\nimport {\n getChatTitle, getUserFullName, isUserId,\n} from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\nimport buildClassName from '../../../util/buildClassName';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\nimport useFlag from '../../../hooks/useFlag';\n\nimport ListItem from '../../ui/ListItem';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Avatar from '../../common/Avatar';\nimport Loading from '../../ui/Loading';\nimport BlockUserModal from './BlockUserModal';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n chatsByIds: Record;\n usersByIds: Record;\n blockedIds: string[];\n phoneCodeList: ApiCountryCode[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyBlockedUsers: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n chatsByIds,\n usersByIds,\n blockedIds,\n phoneCodeList,\n unblockContact,\n}) => {\n const lang = useLang();\n const [isBlockUserModalOpen, openBlockUserModal, closeBlockUserModal] = useFlag();\n const handleUnblockClick = useCallback((contactId: string) => {\n unblockContact({ contactId });\n }, [unblockContact]);\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.PrivacyBlockedUsers);\n\n function renderContact(contactId: string, i: number, viewportOffset: number) {\n const isPrivate = isUserId(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 small-icon',\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(lang, chat!)) || '')}

\n {user?.phoneNumber && (\n
{formatPhoneNumberWithCode(phoneCodeList, 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?.length ? (\n
\n {blockedIds!.map((contactId, i) => renderContact(contactId, i, 0))}\n
\n ) : blockedIds && !blockedIds.length ? (\n
{lang('NoBlocked')}
\n ) : (\n \n )}\n
\n
\n\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 countryList: {\n phoneCodes: phoneCodeList,\n },\n } = global;\n\n return {\n chatsByIds,\n usersByIds,\n blockedIds: ids,\n phoneCodeList,\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';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport ListItem from '../../../ui/ListItem';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport renderText from '../../../common/helpers/renderText';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaEnabled: FC = ({\n isActive, onReset, animatedEmoji, onScreenSelect,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.TwoFaEnabled);\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 { SettingsScreens } from '../../../../types';\n\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport PasswordMonkey from '../../../common/PasswordMonkey';\nimport PasswordForm from '../../../common/PasswordForm';\n\ntype OwnProps = {\n screen: SettingsScreens;\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 isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\nconst EQUAL_PASSWORD_ERROR = 'Passwords Should Be Equal';\n\nconst SettingsTwoFaPassword: FC = ({\n screen,\n isActive,\n onScreenSelect,\n onReset,\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 useHistoryBack(isActive, onReset, onScreenSelect, screen);\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';\nimport { SettingsScreens } from '../../../../types';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport Button from '../../../ui/Button';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\n\ntype OwnProps = {\n onStart: NoneToVoidFunction;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaStart: FC = ({\n isActive, onScreenSelect, onReset, animatedEmoji, onStart,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.TwoFaDisabled);\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';\nimport { SettingsScreens } from '../../../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../../util/environment';\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useFlag from '../../../../hooks/useFlag';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\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 isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n screen: SettingsScreens;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_SINGLE_COLUMN_LAYOUT ? 550 : 400;\n\nconst SettingsTwoFaSkippableForm: FC = ({\n animatedEmoji,\n type = 'text',\n isLoading,\n error,\n placeholder,\n shouldConfirm,\n clearError,\n onSubmit,\n isActive,\n onScreenSelect,\n onReset,\n screen,\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 useHistoryBack(isActive, onReset, onScreenSelect, screen);\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';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport Button from '../../../ui/Button';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaCongratulations: FC = ({\n isActive, onReset, animatedEmoji, onScreenSelect,\n}) => {\n const lang = useLang();\n\n const handleClick = () => {\n onScreenSelect(SettingsScreens.Privacy);\n };\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.TwoFaCongratulations);\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';\nimport { SettingsScreens } from '../../../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../../util/environment';\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\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 isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n screen: SettingsScreens;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n codeLength: number;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_SINGLE_COLUMN_LAYOUT ? 550 : 400;\n\nconst SettingsTwoFaEmailCode: FC = ({\n animatedEmoji,\n codeLength,\n isLoading,\n error,\n clearError,\n onSubmit,\n isActive,\n onScreenSelect,\n onReset,\n screen,\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 useHistoryBack(isActive, onReset, onScreenSelect, screen);\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 shownScreen: SettingsScreens;\n dispatch: TwoFaDispatch;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = GlobalState['twoFaSettings'];\n\ntype DispatchProps = Pick;\n\nconst SettingsTwoFa: FC = ({\n currentScreen,\n shownScreen,\n state,\n hint,\n isLoading,\n error,\n waitingEmailCodeLength,\n dispatch,\n isActive,\n onScreenSelect,\n onReset,\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, 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, isUserId, prepareChatList,\n} from '../../../modules/helpers';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport Picker from '../../common/Picker';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\n\nexport type OwnProps = {\n isAllowList?: boolean;\n screen: SettingsScreens;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentUserId?: string;\n chatsById: Record;\n listIds?: string[];\n orderedPinnedIds?: string[];\n archivedListIds?: string[];\n archivedPinnedIds?: string[];\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 isActive,\n onScreenSelect,\n onReset,\n}) => {\n const lang = useLang();\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 ((isUserId(chat.id) && chat.id !== currentUserId) || isChatGroup(chat))\n && (\n !searchQuery\n || searchWords(getChatTitle(lang, chat), searchQuery)\n || selectedContactIds.includes(chat.id)\n )\n ))\n .map(({ id }) => id);\n }, [chats, currentUserId, lang, searchQuery, selectedContactIds]);\n\n const handleSelectedContactIdsChange = useCallback((value: string[]) => {\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 useHistoryBack(isActive, onReset, onScreenSelect, screen);\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';\nimport { FolderEditDispatch, FoldersState } from '../../../hooks/reducers/useFoldersReducer';\n\nimport { LAYERS_ANIMATION_NAME } from '../../../util/environment';\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 SettingsDataStorage from './SettingsDataStorage';\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\nconst TWO_FA_SCREENS = [\n SettingsScreens.TwoFaDisabled,\n SettingsScreens.TwoFaNewPassword,\n SettingsScreens.TwoFaNewPasswordConfirm,\n SettingsScreens.TwoFaNewPasswordHint,\n SettingsScreens.TwoFaNewPasswordEmail,\n SettingsScreens.TwoFaNewPasswordEmailCode,\n SettingsScreens.TwoFaCongratulations,\n SettingsScreens.TwoFaEnabled,\n SettingsScreens.TwoFaChangePasswordCurrent,\n SettingsScreens.TwoFaChangePasswordNew,\n SettingsScreens.TwoFaChangePasswordConfirm,\n SettingsScreens.TwoFaChangePasswordHint,\n SettingsScreens.TwoFaTurnOff,\n SettingsScreens.TwoFaRecoveryEmailCurrentPassword,\n SettingsScreens.TwoFaRecoveryEmail,\n SettingsScreens.TwoFaRecoveryEmailCode,\n];\n\nconst FOLDERS_SCREENS = [\n SettingsScreens.Folders,\n SettingsScreens.FoldersCreateFolder,\n SettingsScreens.FoldersEditFolder,\n SettingsScreens.FoldersEditFolderFromChatList,\n SettingsScreens.FoldersIncludedChats,\n SettingsScreens.FoldersIncludedChatsFromChatList,\n SettingsScreens.FoldersExcludedChats,\n SettingsScreens.FoldersExcludedChatsFromChatList,\n];\n\nconst PRIVACY_SCREENS = [\n SettingsScreens.PrivacyBlockedUsers,\n SettingsScreens.PrivacyActiveSessions,\n];\n\nconst PRIVACY_PHONE_NUMBER_SCREENS = [\n SettingsScreens.PrivacyPhoneNumberAllowedContacts,\n SettingsScreens.PrivacyPhoneNumberDeniedContacts,\n];\n\nconst PRIVACY_LAST_SEEN_PHONE_SCREENS = [\n SettingsScreens.PrivacyLastSeenAllowedContacts,\n SettingsScreens.PrivacyLastSeenDeniedContacts,\n];\n\nconst PRIVACY_PROFILE_PHOTO_SCREENS = [\n SettingsScreens.PrivacyProfilePhotoAllowedContacts,\n SettingsScreens.PrivacyProfilePhotoDeniedContacts,\n];\n\nconst PRIVACY_FORWARDING_SCREENS = [\n SettingsScreens.PrivacyForwardingAllowedContacts,\n SettingsScreens.PrivacyForwardingDeniedContacts,\n];\n\nconst PRIVACY_GROUP_CHATS_SCREENS = [\n SettingsScreens.PrivacyGroupChatsAllowedContacts,\n SettingsScreens.PrivacyGroupChatsDeniedContacts,\n];\n\nexport type OwnProps = {\n isActive: boolean;\n currentScreen: SettingsScreens;\n foldersState: FoldersState;\n foldersDispatch: FolderEditDispatch;\n onScreenSelect: (screen: SettingsScreens) => void;\n shouldSkipTransition?: boolean;\n onReset: () => void;\n};\n\nconst Settings: FC = ({\n isActive,\n currentScreen,\n foldersState,\n foldersDispatch,\n onScreenSelect,\n onReset,\n shouldSkipTransition,\n}) => {\n const [twoFaState, twoFaDispatch] = useTwoFaReducer();\n\n const handleReset = useCallback(() => {\n if (\n currentScreen === SettingsScreens.FoldersCreateFolder\n || currentScreen === SettingsScreens.FoldersEditFolder\n || currentScreen === SettingsScreens.FoldersEditFolderFromChatList\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(isScreenActive: boolean, screen: SettingsScreens) {\n const privacyAllowScreens: Record = {\n [SettingsScreens.PrivacyPhoneNumber]: PRIVACY_PHONE_NUMBER_SCREENS.includes(screen),\n [SettingsScreens.PrivacyLastSeen]: PRIVACY_LAST_SEEN_PHONE_SCREENS.includes(screen),\n [SettingsScreens.PrivacyProfilePhoto]: PRIVACY_PROFILE_PHOTO_SCREENS.includes(screen),\n [SettingsScreens.PrivacyForwarding]: PRIVACY_FORWARDING_SCREENS.includes(screen),\n [SettingsScreens.PrivacyGroupChats]: PRIVACY_GROUP_CHATS_SCREENS.includes(screen),\n };\n\n const isTwoFaScreen = TWO_FA_SCREENS.includes(screen);\n const isFoldersScreen = FOLDERS_SCREENS.includes(screen);\n const isPrivacyScreen = PRIVACY_SCREENS.includes(screen)\n || isTwoFaScreen\n || Object.keys(privacyAllowScreens).includes(screen.toString())\n || Object.values(privacyAllowScreens).find((key) => key === true);\n\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.DataStorage:\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.FoldersEditFolderFromChatList:\n case SettingsScreens.FoldersIncludedChats:\n case SettingsScreens.FoldersIncludedChatsFromChatList:\n case SettingsScreens.FoldersExcludedChats:\n case SettingsScreens.FoldersExcludedChatsFromChatList:\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(isScreenActive: boolean, isFrom: boolean, currentKey: SettingsScreens) {\n return (\n <>\n \n {renderCurrentSectionContent(isScreenActive, currentKey)}\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_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { throttle } from '../../../util/schedulers';\nimport searchWords from '../../../util/searchWords';\nimport { pick } from '../../../util/iteratees';\nimport { getUserFullName, sortUserIds } from '../../../modules/helpers';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\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 isActive: boolean;\n onReset: () => void;\n};\n\ntype StateProps = {\n usersById: Record;\n contactIds?: string[];\n serverTimeOffset: number;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst ContactList: FC = ({\n isActive, onReset,\n filter, usersById, contactIds, loadContactList, openChat, serverTimeOffset,\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 useHistoryBack(isActive, onReset);\n\n const handleClick = useCallback((id: string) => {\n openChat({ id, shouldReplaceHistory: true });\n }, [openChat]);\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 sortUserIds(resultIds, usersById, undefined, serverTimeOffset);\n }, [contactIds, filter, usersById, serverTimeOffset]);\n\n const [viewportIds, getMore] = useInfiniteScroll(undefined, listIds, Boolean(filter));\n\n return (\n \n {viewportIds?.length ? (\n viewportIds.map((id) => (\n handleClick(id)}\n ripple={!IS_SINGLE_COLUMN_LAYOUT}\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 serverTimeOffset: global.serverTimeOffset,\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 { ApiChat, ApiUser } from '../../../api/types';\n\nimport { pick, unique } from '../../../util/iteratees';\nimport { throttle } from '../../../util/schedulers';\nimport searchWords from '../../../util/searchWords';\nimport { getUserFullName, isUserBot, sortChatIds } from '../../../modules/helpers';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport Picker from '../../common/Picker';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Button from '../../ui/Button';\n\nexport type OwnProps = {\n isChannel?: boolean;\n isActive: boolean;\n selectedMemberIds: string[];\n onSelectedMemberIdsChange: (ids: string[]) => void;\n onNextStep: () => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentUserId?: string;\n usersById: Record;\n chatsById: Record;\n localContactIds?: string[];\n searchQuery?: string;\n isSearching?: boolean;\n localUserIds?: string[];\n globalUserIds?: string[];\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst NewChatStep1: FC = ({\n isChannel,\n isActive,\n selectedMemberIds,\n onSelectedMemberIdsChange,\n onNextStep,\n onReset,\n currentUserId,\n usersById,\n chatsById,\n localContactIds,\n searchQuery,\n isSearching,\n localUserIds,\n globalUserIds,\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 lang = useLang();\n\n useHistoryBack(isActive, onReset);\n\n const handleFilterChange = useCallback((query: string) => {\n setGlobalSearchQuery({ query });\n }, [setGlobalSearchQuery]);\n\n const displayedIds = useMemo(() => {\n const contactIds = localContactIds\n ? sortChatIds(localContactIds.filter((id) => id !== currentUserId), chatsById)\n : [];\n\n if (!searchQuery) {\n return contactIds;\n }\n\n const foundContactIds = 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 sortChatIds(\n unique([\n ...foundContactIds,\n ...(localUserIds || []),\n ...(globalUserIds || []),\n ]).filter((contactId) => {\n const user = usersById[contactId];\n\n return !user || !isUserBot(user) || user.canBeInvitedToGroup;\n }),\n chatsById,\n false,\n selectedMemberIds,\n );\n }, [\n localContactIds, chatsById, searchQuery, localUserIds, globalUserIds, selectedMemberIds,\n currentUserId, usersById,\n ]);\n\n const handleNextStep = useCallback(() => {\n if (selectedMemberIds.length || isChannel) {\n setGlobalSearchQuery({ query: '' });\n onNextStep();\n }\n }, [selectedMemberIds.length, isChannel, setGlobalSearchQuery, onNextStep]);\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 { byId: chatsById } = global.chats;\n const { currentUserId } = global;\n\n const {\n query: searchQuery,\n fetchingStatus,\n globalResults,\n localResults,\n } = global.globalSearch;\n const { userIds: globalUserIds } = globalResults || {};\n const { userIds: localUserIds } = localResults || {};\n\n return {\n currentUserId,\n usersById,\n chatsById,\n localContactIds,\n searchQuery,\n isSearching: fetchingStatus?.chats,\n globalUserIds,\n localUserIds,\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';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\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 isActive: boolean;\n memberIds: string[];\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 isActive,\n memberIds,\n onReset,\n creationProgress,\n creationError,\n createGroupChat,\n createChannel,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset);\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 && lang(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 {memberIds.length > 0 && (\n <>\n

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

\n\n
\n {memberIds.map((id) => (\n \n \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 { LAYERS_ANIMATION_NAME } 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 isActive: boolean;\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 isActive,\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 {(isStepActive) => {\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';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Button from '../ui/Button';\nimport ChatList from './main/ChatList';\nimport { LeftColumnContent } from '../../types';\n\nimport './ArchivedChats.scss';\n\nexport type OwnProps = {\n isActive: boolean;\n onReset: () => void;\n onContentChange: (content: LeftColumnContent) => void;\n};\n\nconst ArchivedChats: FC = ({ isActive, onReset, onContentChange }) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onContentChange, LeftColumnContent.Archived);\n\n return (\n
\n
\n \n \n \n

{lang('ArchivedChats')}

\n
\n \n
\n );\n};\n\nexport default memo(ArchivedChats);\n","import React, {\n FC, useCallback, memo, useMemo, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChatFolder } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\nimport CheckboxGroup from '../ui/CheckboxGroup';\n\nexport type OwnProps = {\n isOpen: boolean;\n chatId: string;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n};\n\ntype StateProps = {\n foldersById?: Record;\n folderOrderedIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst ChatFolderModal: FC = ({\n isOpen,\n chatId,\n foldersById,\n folderOrderedIds,\n onClose,\n onCloseAnimationEnd,\n editChatFolders,\n}) => {\n const lang = useLang();\n\n const initialSelectedFolderIds = useMemo(() => {\n if (!foldersById) {\n return [];\n }\n\n return Object.keys(foldersById).reduce((result, folderId) => {\n const { includedChatIds, pinnedChatIds } = foldersById[Number(folderId)];\n if (includedChatIds.includes(chatId) || pinnedChatIds?.includes(chatId)) {\n result.push(folderId);\n }\n\n return result;\n }, [] as string[]);\n }, [chatId, foldersById]);\n\n const [selectedFolderIds, setSelectedFolderIds] = useState(initialSelectedFolderIds);\n\n const folders = useMemo(() => {\n return folderOrderedIds?.map((folderId) => ({\n label: foldersById ? foldersById[folderId].title : '',\n value: String(folderId),\n })) || [];\n }, [folderOrderedIds, foldersById]);\n\n const handleSubmit = useCallback(() => {\n const idsToRemove = initialSelectedFolderIds.filter((id) => !selectedFolderIds.includes(id));\n const idsToAdd = selectedFolderIds.filter((id) => !initialSelectedFolderIds.includes(id));\n\n editChatFolders({ chatId, idsToRemove, idsToAdd });\n onClose();\n }, [chatId, editChatFolders, initialSelectedFolderIds, onClose, selectedFolderIds]);\n\n if (!foldersById || !folderOrderedIds) {\n return undefined;\n }\n\n return (\n \n \n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { byId: foldersById, orderedIds: folderOrderedIds } = global.chatFolders;\n\n return {\n foldersById,\n folderOrderedIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['editChatFolders']),\n)(ChatFolderModal));\n","import { ApiMediaFormat, ApiMessage } from '../../../../api/types';\n\nimport * as mediaLoader from '../../../../util/mediaLoader';\nimport {\n getMessageMediaHash,\n getMessagePhoto,\n getMessageText,\n getMessageWebPagePhoto,\n getMessageWebPageVideo,\n hasMessageLocalBlobUrl,\n} 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 || (!getMessageWebPageVideo(message) ? getMessageWebPagePhoto(message) : undefined);\n const mediaHash = getMessageMediaHash(message, 'inline');\n const canImageBeCopied = photo && (mediaHash || hasMessageLocalBlobUrl(message)) && CLIPBOARD_ITEM_SUPPORTED;\n const selection = window.getSelection();\n\n if (canImageBeCopied) {\n options.push({\n label: 'lng_context_copy_image',\n handler: () => {\n Promise.resolve(mediaHash ? mediaLoader.fetch(mediaHash, ApiMediaFormat.BlobUrl) : photo!.blobUrl)\n .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?.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),\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: 'lng_context_copy_message_link',\n handler: () => {\n onCopyLink();\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n return options;\n}\n\nfunction getCopyLabel(hasSelection: boolean): string {\n if (hasSelection) {\n return 'lng_context_copy_selected';\n }\n return 'lng_context_copy_text';\n}\n","let scrollLockEl: HTMLElement | null | undefined;\n\nconst 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\nfunction isTextBox(target: EventTarget | null) {\n if (!target || !(target instanceof HTMLElement)) return false;\n const element = target;\n const tagName = element.tagName.toLowerCase();\n if (tagName === 'textarea') return true;\n if (tagName !== 'input') return false;\n const type = element.getAttribute('type');\n if (!type) return false;\n const inputTypes = [\n 'text', 'password', 'number', 'email', 'tel', 'url',\n 'search', 'date', 'datetime', 'datetime-local', 'time', 'month', 'week',\n ];\n return inputTypes.indexOf(type.toLowerCase()) > -1;\n}\n\nconst getTouchY = (e: WheelEvent | TouchEvent) => ('changedTouches' in e ? e.changedTouches[0].clientY : 0);\n\nconst preventDefault = (e: WheelEvent | TouchEvent) => {\n const deltaY = 'deltaY' in e ? e.deltaY : getTouchY(e);\n\n if (\n !scrollLockEl\n // Allow overlay scrolling\n || !scrollLockEl.contains(e.target as HTMLElement)\n // Prevent top overscroll\n || (scrollLockEl.scrollTop <= 0 && deltaY <= 0)\n // Prevent bottom overscroll\n || (scrollLockEl.scrollTop >= (scrollLockEl.scrollHeight - scrollLockEl.offsetHeight) && deltaY >= 0)\n ) {\n e.preventDefault();\n }\n};\n\nfunction preventDefaultForScrollKeys(e: KeyboardEvent) {\n if (IGNORED_KEYS[e.key] && !isTextBox(e.target)) {\n e.preventDefault();\n }\n}\n\nexport function disableScrolling(el?: HTMLElement | null) {\n scrollLockEl = el;\n // Disable scrolling in Chrome\n document.addEventListener('wheel', preventDefault, { passive: false });\n document.addEventListener('touchmove', preventDefault, { passive: false });\n document.onkeydown = preventDefaultForScrollKeys;\n}\n\nexport function enableScrolling() {\n scrollLockEl = undefined;\n document.removeEventListener('wheel', preventDefault); // Enable scrolling in Chrome\n document.removeEventListener('touchmove', preventDefault);\n // eslint-disable-next-line no-null/no-null\n document.onkeydown = null;\n}\n","import React, {\n FC, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { IAnchorPosition } from '../../../types';\n\nimport { getMessageCopyOptions } from './helpers/copyOptions';\nimport { disableScrolling, enableScrolling } from '../../../util/scrollLock';\nimport useContextMenuPosition from '../../../hooks/useContextMenuPosition';\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 canReport?: boolean;\n canEdit?: boolean;\n canForward?: boolean;\n canFaveSticker?: boolean;\n canUnfaveSticker?: boolean;\n canCopy?: boolean;\n canCopyLink?: boolean;\n canSelect?: boolean;\n canDownload?: boolean;\n isDownloading?: boolean;\n onReply: () => void;\n onEdit: () => void;\n onPin: () => void;\n onUnpin: () => void;\n onForward: () => void;\n onDelete: () => void;\n onReport: () => 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 onDownload?: () => void;\n};\n\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 canReport,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n canDownload,\n isDownloading,\n onReply,\n onEdit,\n onPin,\n onUnpin,\n onForward,\n onDelete,\n onReport,\n onFaveSticker,\n onUnfaveSticker,\n onSelect,\n onSend,\n onReschedule,\n onClose,\n onCloseAnimationEnd,\n onCopyLink,\n onDownload,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const menuRef = useRef(null);\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 {\n positionX, positionY, style, menuStyle, withScroll,\n } = useContextMenuPosition(\n anchor,\n getTriggerElement,\n getRootElement,\n getMenuElement,\n SCROLLBAR_WIDTH,\n (document.querySelector('.MiddleHeader') as HTMLElement).offsetHeight,\n );\n\n useEffect(() => {\n disableScrolling(withScroll ? menuRef.current : undefined);\n\n return enableScrolling;\n }, [withScroll]);\n\n const lang = useLang();\n\n return (\n \n {canSendNow && {lang('MessageScheduleSend')}}\n {canReschedule && (\n {lang('MessageScheduleEditTime')}\n )}\n {canReply && {lang('Reply')}}\n {canEdit && {lang('Edit')}}\n {canFaveSticker && (\n {lang('AddToFavorites')}\n )}\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 {canDownload && (\n \n {isDownloading ? lang('lng_context_cancel_download') : lang('lng_media_download')}\n \n )}\n {canForward && {lang('Forward')}}\n {canSelect && {lang('Common.Select')}}\n {canReport && {lang('lng_context_report_msg')}}\n {canDelete && {lang('Delete')}}\n \n );\n};\n\nexport default MessageContextMenu;\n","import React, {\n FC, memo, useCallback, useMemo, 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 {\n selectActiveDownloadIds,\n selectAllowedMessageActions,\n selectCurrentMessageList,\n} from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useFlag from '../../../hooks/useFlag';\n\nimport DeleteMessageModal from '../../common/DeleteMessageModal';\nimport ReportMessageModal from '../../common/ReportMessageModal';\nimport PinMessageModal from '../../common/PinMessageModal';\nimport MessageContextMenu from './MessageContextMenu';\nimport CalendarModal from '../../common/CalendarModal';\nimport { getDayStartAt } from '../../../util/dateFormat';\nimport { copyTextToClipboard } from '../../../util/clipboard';\n\nexport type OwnProps = {\n isOpen: boolean;\n chatUsername?: string;\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 canReport?: boolean;\n canEdit?: boolean;\n canForward?: boolean;\n canFaveSticker?: boolean;\n canUnfaveSticker?: boolean;\n canCopy?: boolean;\n canCopyLink?: boolean;\n canSelect?: boolean;\n canDownload?: boolean;\n activeDownloads: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst ContextMenuContainer: FC = ({\n isOpen,\n messageListType,\n chatUsername,\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 canReport,\n canEdit,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n canDownload,\n activeDownloads,\n setReplyingToId,\n setEditingId,\n pinMessage,\n openForwardMenu,\n faveSticker,\n unfaveSticker,\n toggleMessageSelection,\n sendScheduledMessages,\n rescheduleMessage,\n downloadMessageMedia,\n cancelMessageMediaDownload,\n}) => {\n const { transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd, undefined, false);\n const [isMenuOpen, setIsMenuOpen] = useState(true);\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);\n const [isReportModalOpen, setIsReportModalOpen] = useState(false);\n const [isPinModalOpen, setIsPinModalOpen] = useState(false);\n const [isCalendarOpen, openCalendar, closeCalendar] = useFlag();\n\n const isDownloading = album ? album.messages.some((msg) => activeDownloads.includes(msg.id))\n : activeDownloads.includes(message.id);\n\n const handleDelete = useCallback(() => {\n setIsMenuOpen(false);\n setIsDeleteModalOpen(true);\n }, []);\n\n const handleReport = useCallback(() => {\n setIsMenuOpen(false);\n setIsReportModalOpen(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 closeReportModal = useCallback(() => {\n setIsReportModalOpen(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?.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?.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 copyTextToClipboard(`https://t.me/${chatUsername || `c/${message.chatId.replace('-', '')}`}/${message.id}`);\n closeMenu();\n }, [chatUsername, closeMenu, message.chatId, message.id]);\n\n const handleDownloadClick = useCallback(() => {\n (album?.messages || [message]).forEach((msg) => {\n if (isDownloading) {\n cancelMessageMediaDownload({ message: msg });\n } else {\n downloadMessageMedia({ message: msg });\n }\n });\n closeMenu();\n }, [album, message, closeMenu, isDownloading, cancelMessageMediaDownload, downloadMessageMedia]);\n\n const reportMessageIds = useMemo(() => (album ? album.messages : [message]).map(({ id }) => id), [album, message]);\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};\n\nexport default memo(withGlobal(\n (global, { message, messageListType }): StateProps => {\n const { threadId } = selectCurrentMessageList(global) || {};\n const activeDownloads = selectActiveDownloadIds(global, message.chatId);\n const {\n noOptions,\n canReply,\n canPin,\n canUnpin,\n canDelete,\n canReport,\n canEdit,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n canDownload,\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 canReport,\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 canDownload,\n activeDownloads,\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 'downloadMessageMedia',\n 'cancelMessageMediaDownload',\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 {\n selectChat, selectCurrentMessageList, selectStickerSet, selectStickerSetByShortName,\n} from '../../modules/selectors';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useLang from '../../hooks/useLang';\nimport renderText from './helpers/renderText';\nimport { getAllowedAttachmentOptions, getCanPostInChat } from '../../modules/helpers';\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 stickerSetShortName?: string;\n onClose: () => void;\n};\n\ntype StateProps = {\n canSendStickers?: boolean;\n stickerSet?: ApiStickerSet;\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst StickerSetModal: FC = ({\n isOpen,\n fromSticker,\n stickerSetShortName,\n stickerSet,\n canSendStickers,\n onClose,\n loadStickers,\n toggleStickerSet,\n sendMessage,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const lang = useLang();\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE, isDisabled: !isOpen });\n\n useEffect(() => {\n if (isOpen) {\n if (fromSticker) {\n const { stickerSetId, stickerSetAccessHash } = fromSticker;\n loadStickers({\n stickerSetId,\n stickerSetAccessHash,\n });\n } else if (stickerSetShortName) {\n loadStickers({\n stickerSetShortName,\n });\n }\n }\n }, [isOpen, fromSticker, loadStickers, stickerSetShortName]);\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 if (stickerSet) {\n toggleStickerSet({ stickerSetId: stickerSet.id });\n onClose();\n }\n }, [onClose, stickerSet, toggleStickerSet]);\n\n return (\n \n {stickerSet?.stickers ? (\n <>\n
\n {stickerSet.stickers.map((sticker) => (\n \n ))}\n
\n
\n \n {lang(\n stickerSet.installedDate ? 'StickerPack.RemoveStickerCount' : 'StickerPack.AddStickerCount',\n stickerSet.count,\n 'i',\n )}\n \n
\n \n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { fromSticker, stickerSetShortName }): StateProps => {\n const currentMessageList = selectCurrentMessageList(global);\n const { chatId, threadId } = currentMessageList || {};\n const chat = chatId && selectChat(global, chatId);\n const sendOptions = chat ? getAllowedAttachmentOptions(chat) : undefined;\n const canSendStickers = Boolean(\n chat && threadId && getCanPostInChat(chat, threadId) && sendOptions?.canSendStickers,\n );\n\n return {\n canSendStickers,\n stickerSet: fromSticker\n ? selectStickerSet(global, fromSticker.stickerSetId)\n : stickerSetShortName\n ? selectStickerSetByShortName(global, stickerSetShortName)\n : undefined,\n };\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_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { disableScrolling, enableScrolling } from '../../util/scrollLock';\nimport {\n selectChat, selectNotifySettings, selectNotifyExceptions, selectUser,\n} from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport {\n isUserId, getCanDeleteChat, selectIsChatMuted, getCanAddContact,\n} 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: string;\n threadId: number;\n isOpen: boolean;\n withExtraActions: boolean;\n anchor: IAnchorPosition;\n isChannel?: boolean;\n canStartBot?: boolean;\n canRestartBot?: boolean;\n canSubscribe?: boolean;\n canSearch?: boolean;\n canCall?: boolean;\n canMute?: boolean;\n canLeave?: boolean;\n canEnterVoiceChat?: boolean;\n canCreateVoiceChat?: 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 canAddContact?: boolean;\n canDeleteChat?: boolean;\n hasLinkedChat?: boolean;\n};\n\nconst HeaderMenuContainer: FC = ({\n chatId,\n isOpen,\n withExtraActions,\n anchor,\n isChannel,\n canStartBot,\n canRestartBot,\n canSubscribe,\n canSearch,\n canCall,\n canMute,\n canLeave,\n canEnterVoiceChat,\n canCreateVoiceChat,\n chat,\n isPrivate,\n isMuted,\n canDeleteChat,\n hasLinkedChat,\n canAddContact,\n onSubscribeChannel,\n onSearchClick,\n onClose,\n onCloseAnimationEnd,\n updateChatMutedState,\n enterMessageSelectMode,\n sendBotCommand,\n restartBot,\n joinGroupCall,\n createGroupCall,\n openLinkedChat,\n addContact,\n openCallFallbackConfirm,\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 handleStartBot = useCallback(() => {\n sendBotCommand({ command: '/start' });\n }, [sendBotCommand]);\n\n const handleRestartBot = useCallback(() => {\n restartBot({ chatId });\n }, [chatId, restartBot]);\n\n const handleToggleMuteClick = useCallback(() => {\n updateChatMutedState({ chatId, isMuted: !isMuted });\n closeMenu();\n }, [chatId, closeMenu, isMuted, updateChatMutedState]);\n\n const handleEnterVoiceChatClick = useCallback(() => {\n if (canCreateVoiceChat) {\n // TODO show popup to schedule\n createGroupCall({\n chatId,\n });\n } else {\n joinGroupCall({\n chatId,\n });\n }\n closeMenu();\n }, [closeMenu, canCreateVoiceChat, chatId, joinGroupCall, createGroupCall]);\n\n const handleLinkedChatClick = useCallback(() => {\n openLinkedChat({ id: chatId });\n closeMenu();\n }, [chatId, closeMenu, openLinkedChat]);\n\n const handleAddContactClick = useCallback(() => {\n addContact({ userId: chatId });\n closeMenu();\n }, [addContact, chatId, closeMenu]);\n\n const handleSubscribe = useCallback(() => {\n onSubscribeChannel();\n closeMenu();\n }, [closeMenu, onSubscribeChannel]);\n\n const handleCall = useCallback(() => {\n openCallFallbackConfirm();\n closeMenu();\n }, [closeMenu, openCallFallbackConfirm]);\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 {withExtraActions && canStartBot && (\n \n {lang('BotStart')}\n \n )}\n {withExtraActions && canRestartBot && (\n \n {lang('BotRestart')}\n \n )}\n {withExtraActions && canSubscribe && (\n \n {lang(isChannel ? 'ProfileJoinChannel' : 'ProfileJoinGroup')}\n \n )}\n {canAddContact && (\n \n {lang('AddContact')}\n \n )}\n {IS_SINGLE_COLUMN_LAYOUT && canCall && (\n \n {lang('Call')}\n \n )}\n {IS_SINGLE_COLUMN_LAYOUT && canSearch && (\n \n {lang('Search')}\n \n )}\n {canMute && (\n \n {lang(isMuted ? 'ChatsUnmute' : 'ChatsMute')}\n \n )}\n {(canEnterVoiceChat || canCreateVoiceChat) && (\n \n {lang(canCreateVoiceChat ? 'StartVoipChat' : 'VoipGroupJoinCall')}\n \n )}\n {hasLinkedChat && (\n \n {lang(isChannel ? 'ViewDiscussion' : 'lng_profile_view_channel')}\n \n )}\n \n {lang('ReportSelectMessages')}\n \n {canLeave && (\n \n {lang(isPrivate\n ? 'DeleteChatUser'\n : (canDeleteChat ? 'GroupInfo.DeleteAndExit' : (isChannel ? 'LeaveChannel' : 'Group.LeaveGroup')))}\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 const isPrivate = isUserId(chat.id);\n const user = isPrivate ? selectUser(global, chatId) : undefined;\n const canAddContact = user && getCanAddContact(user);\n\n return {\n chat,\n isMuted: selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global)),\n isPrivate,\n canAddContact,\n canDeleteChat: getCanDeleteChat(chat),\n hasLinkedChat: Boolean(chat?.fullInfo?.linkedChatId),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'updateChatMutedState',\n 'enterMessageSelectMode',\n 'sendBotCommand',\n 'restartBot',\n 'joinGroupCall',\n 'createGroupCall',\n 'openLinkedChat',\n 'addContact',\n 'openCallFallbackConfirm',\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 { getDayStartAt } from '../../util/dateFormat';\n\nimport Button from '../ui/Button';\nimport SearchInput from '../ui/SearchInput';\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 isHistoryCalendarOpen?: boolean;\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 isHistoryCalendarOpen,\n setLocalTextSearchQuery,\n searchTextMessagesLocal,\n focusMessage,\n closeLocalTextSearch,\n openHistoryCalendar,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const [focusedIndex, setFocusedIndex] = useState(0);\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 }, [isHistoryCalendarOpen]);\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 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 return (\n
\n
\n \n \n \n \n
\n
\n
\n {query ? (\n foundIds?.length ? (\n `${focusedIndex + 1} of ${totalCount}`\n ) : foundIds && !foundIds.length ? (\n 'No results'\n ) : (\n ''\n )\n ) : (\n openHistoryCalendar({ selectedAt: getDayStartAt(Date.now()) })}\n ariaLabel=\"Search messages by date\"\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 isHistoryCalendarOpen: Boolean(global.historyCalendarSelectedAt),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalTextSearchQuery',\n 'searchTextMessagesLocal',\n 'focusMessage',\n 'closeLocalTextSearch',\n 'openHistoryCalendar',\n ]),\n)(MobileSearchFooter));\n","export default function findInViewport(\n container: HTMLElement,\n selectorOrElements: string | NodeListOf,\n margin = 0,\n isDense = false,\n shouldContainBottom = false,\n isHorizontal = false,\n) {\n const viewportY1 = container[isHorizontal ? 'scrollLeft' : 'scrollTop'];\n const viewportY2 = viewportY1 + container[isHorizontal ? 'offsetWidth' : '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[isHorizontal ? 'offsetLeft' : 'offsetTop'];\n const y2 = y1 + element[isHorizontal ? 'offsetWidth' : '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","function isFullyVisible(container: HTMLElement, element: HTMLElement, isHorizontal = false) {\n const viewportY1 = container[isHorizontal ? 'scrollLeft' : 'scrollTop'];\n const viewportY2 = viewportY1 + container[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n const y1 = element[isHorizontal ? 'offsetLeft' : 'offsetTop'];\n const y2 = y1 + element[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n return y1 > viewportY1 && y2 < viewportY2;\n}\n\nexport default isFullyVisible;\n","import findInViewport from './findInViewport';\nimport isFullyVisible from './isFullyVisible';\nimport fastSmoothScroll from './fastSmoothScroll';\n\nconst VIEWPORT_MARGIN = 8;\nconst SCROLL_MARGIN = 10;\n\nexport default function setTooltipItemVisible(selector: string, 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 selector,\n VIEWPORT_MARGIN,\n true,\n true,\n );\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","import { useCallback, useEffect, useState } from '../../../../lib/teact/teact';\nimport captureKeyboardListeners from '../../../../util/captureKeyboardListeners';\nimport cycleRestrict from '../../../../util/cycleRestrict';\n\nexport function useKeyboardNavigation({\n isActive,\n isHorizontal,\n shouldSaveSelectionOnUpdateItems,\n shouldRemoveSelectionOnReset,\n noArrowNavigation,\n items,\n shouldSelectOnTab,\n onSelect,\n onClose,\n}: {\n isActive: boolean;\n isHorizontal?: boolean;\n shouldSaveSelectionOnUpdateItems?: boolean;\n shouldRemoveSelectionOnReset?: boolean;\n noArrowNavigation?: boolean;\n items?: any[];\n shouldSelectOnTab?: boolean;\n onSelect: AnyToVoidFunction;\n onClose: NoneToVoidFunction;\n}) {\n const [selectedItemIndex, setSelectedItemIndex] = useState(-1);\n\n const getSelectedIndex = useCallback((newIndex: number) => {\n if (!items) {\n return -1;\n }\n\n return cycleRestrict(items.length, newIndex);\n }, [items]);\n\n const handleArrowKey = useCallback((value: number, e: KeyboardEvent) => {\n e.preventDefault();\n setSelectedItemIndex((index) => (getSelectedIndex(index + value)));\n }, [setSelectedItemIndex, getSelectedIndex]);\n\n const handleItemSelect = useCallback((e: KeyboardEvent) => {\n if (items && items.length && selectedItemIndex > -1) {\n const item = items[selectedItemIndex];\n if (item) {\n e.preventDefault();\n onSelect(item);\n }\n }\n }, [items, onSelect, selectedItemIndex]);\n\n const isSelectionOutOfRange = !items || selectedItemIndex > items.length - 1;\n useEffect(() => {\n if (!shouldSaveSelectionOnUpdateItems || isSelectionOutOfRange) {\n setSelectedItemIndex(shouldRemoveSelectionOnReset ? -1 : 0);\n }\n }, [isSelectionOutOfRange, shouldRemoveSelectionOnReset, shouldSaveSelectionOnUpdateItems]);\n\n useEffect(() => (isActive ? captureKeyboardListeners({\n onEsc: onClose,\n onUp: noArrowNavigation || isHorizontal ? undefined : (e: KeyboardEvent) => handleArrowKey(-1, e),\n onDown: noArrowNavigation || isHorizontal ? undefined : (e: KeyboardEvent) => handleArrowKey(1, e),\n onLeft: noArrowNavigation || !isHorizontal ? undefined : (e: KeyboardEvent) => handleArrowKey(-1, e),\n onRight: noArrowNavigation || !isHorizontal ? undefined : (e: KeyboardEvent) => handleArrowKey(1, e),\n onTab: shouldSelectOnTab ? handleItemSelect : undefined,\n onEnter: handleItemSelect,\n }) : undefined), [\n noArrowNavigation, handleArrowKey, handleItemSelect, isActive, isHorizontal, onClose, shouldSelectOnTab,\n ]);\n\n return selectedItemIndex;\n}\n","import React, {\n FC, useCallback, useEffect, useRef, memo,\n} from '../../../lib/teact/teact';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport { ApiUser } from '../../../api/types';\n\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport setTooltipItemVisible from '../../../util/setTooltipItemVisible';\nimport { useKeyboardNavigation } from './hooks/useKeyboardNavigation';\n\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\nimport './MentionTooltip.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n onInsertUserName: (user: ApiUser, forceFocus?: boolean) => void;\n filteredUsers?: ApiUser[];\n usersById?: Record;\n};\n\nconst MentionTooltip: FC = ({\n isOpen,\n onClose,\n onInsertUserName,\n usersById,\n filteredUsers,\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 handleUserSelect = useCallback((userId: string, forceFocus = false) => {\n const user = usersById?.[userId];\n if (!user) {\n return;\n }\n\n onInsertUserName(user, forceFocus);\n }, [usersById, onInsertUserName]);\n\n const handleSelectMention = useCallback((member: ApiUser) => {\n handleUserSelect(member.id, true);\n }, [handleUserSelect]);\n\n const selectedMentionIndex = useKeyboardNavigation({\n isActive: isOpen,\n items: filteredUsers,\n onSelect: handleSelectMention,\n shouldSelectOnTab: true,\n shouldSaveSelectionOnUpdateItems: true,\n onClose,\n });\n\n useEffect(() => {\n setTooltipItemVisible('.chat-item-clickable', selectedMentionIndex, containerRef);\n }, [selectedMentionIndex]);\n\n useEffect(() => {\n if (filteredUsers && !filteredUsers.length) {\n onClose();\n }\n }, [filteredUsers, onClose]);\n\n const prevChatMembers = usePrevious(\n filteredUsers?.length\n ? filteredUsers\n : undefined,\n shouldRender,\n );\n const renderedChatMembers = filteredUsers && !filteredUsers.length\n ? prevChatMembers\n : filteredUsers;\n\n if (!shouldRender || (renderedChatMembers && !renderedChatMembers.length)) {\n return undefined;\n }\n\n const className = buildClassName(\n 'MentionTooltip composer-tooltip custom-scroll',\n transitionClassNames,\n );\n\n return (\n
\n {renderedChatMembers?.map(({ id }, index) => (\n handleUserSelect(id)}\n focus={selectedMentionIndex === index}\n >\n \n \n ))}\n
\n );\n};\n\nexport default memo(MentionTooltip);\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { ApiAttachment, ApiChatMember, ApiUser } from '../../../api/types';\n\nimport {\n CONTENT_TYPES_WITH_PREVIEW,\n EDITABLE_INPUT_MODAL_ID,\n SUPPORTED_IMAGE_CONTENT_TYPES,\n SUPPORTED_VIDEO_CONTENT_TYPES,\n} from '../../../config';\nimport { getFileExtension } from '../../common/helpers/documentInfo';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useMentionTooltip from './hooks/useMentionTooltip';\nimport useEmojiTooltip from './hooks/useEmojiTooltip';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\n\nimport Button from '../../ui/Button';\nimport Modal from '../../ui/Modal';\nimport File from '../../common/File';\nimport MessageInput from './MessageInput';\nimport MentionTooltip from './MentionTooltip';\nimport EmojiTooltip from './EmojiTooltip.async';\n\nimport './AttachmentModal.scss';\n\nexport type OwnProps = {\n attachments: ApiAttachment[];\n caption: string;\n isReady?: boolean;\n currentUserId?: string;\n groupChatMembers?: ApiChatMember[];\n usersById?: Record;\n recentEmojis: string[];\n baseEmojiKeywords?: Record;\n emojiKeywords?: Record;\n addRecentEmoji: AnyToVoidFunction;\n onCaptionUpdate: (html: string) => void;\n onSend: () => void;\n onFileAppend: (files: File[], isQuick: boolean) => void;\n onClear: () => void;\n};\n\nconst DROP_LEAVE_TIMEOUT_MS = 150;\n\nconst AttachmentModal: FC = ({\n attachments,\n caption,\n isReady,\n currentUserId,\n groupChatMembers,\n usersById,\n recentEmojis,\n baseEmojiKeywords,\n emojiKeywords,\n addRecentEmoji,\n onCaptionUpdate,\n onSend,\n onFileAppend,\n onClear,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const hideTimeoutRef = useRef(null);\n const prevAttachments = usePrevious(attachments);\n const renderingAttachments = attachments.length ? attachments : prevAttachments;\n const isOpen = Boolean(attachments.length);\n const [isHovered, markHovered, unmarkHovered] = useFlag();\n const isQuick = Boolean(renderingAttachments && renderingAttachments.every((a) => a.quick));\n const lang = useLang();\n\n const {\n isMentionTooltipOpen, closeMentionTooltip, insertMention, mentionFilteredUsers,\n } = useMentionTooltip(\n isOpen,\n caption,\n onCaptionUpdate,\n EDITABLE_INPUT_MODAL_ID,\n groupChatMembers,\n undefined,\n currentUserId,\n usersById,\n );\n const {\n isEmojiTooltipOpen, closeEmojiTooltip, filteredEmojis, insertEmoji,\n } = useEmojiTooltip(\n isOpen,\n caption,\n recentEmojis,\n EDITABLE_INPUT_MODAL_ID,\n onCaptionUpdate,\n baseEmojiKeywords,\n emojiKeywords,\n !isReady,\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 handleDragLeave = (e: React.DragEvent) => {\n const { relatedTarget: toTarget, target: fromTarget } = e;\n\n // Esc button pressed during drag event\n if ((fromTarget as HTMLDivElement).matches('.drop-target') && !toTarget) {\n hideTimeoutRef.current = window.setTimeout(unmarkHovered, DROP_LEAVE_TIMEOUT_MS);\n }\n\n // Prevent DragLeave event from firing when the pointer moves inside the AttachmentModal drop target\n if (fromTarget && (fromTarget as HTMLElement).closest('.AttachmentModal.hovered')) {\n return;\n }\n\n if (toTarget) {\n e.stopPropagation();\n }\n\n unmarkHovered();\n };\n\n const handleFilesDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n unmarkHovered();\n\n const { dataTransfer: { files } } = e;\n\n if (files?.length) {\n const newFiles = isQuick\n ? Array.from(files).filter((file) => {\n return file.type && CONTENT_TYPES_WITH_PREVIEW.has(file.type);\n })\n : Array.from(files);\n\n onFileAppend(newFiles, isQuick);\n }\n }, [isQuick, onFileAppend, unmarkHovered]);\n\n function handleDragOver(e: React.MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n\n if (hideTimeoutRef.current) {\n window.clearTimeout(hideTimeoutRef.current);\n }\n }\n\n if (!renderingAttachments) {\n return undefined;\n }\n\n const areAllPhotos = renderingAttachments.every((a) => SUPPORTED_IMAGE_CONTENT_TYPES.has(a.mimeType));\n const areAllVideos = renderingAttachments.every((a) => SUPPORTED_VIDEO_CONTENT_TYPES.has(a.mimeType));\n const areAllAudios = renderingAttachments.every((a) => a.mimeType.startsWith('audio/'));\n\n let title = '';\n if (areAllPhotos) {\n title = lang('PreviewSender.SendPhoto', renderingAttachments.length, 'i');\n } else if (areAllVideos) {\n title = lang('PreviewSender.SendVideo', renderingAttachments.length, 'i');\n } else if (areAllAudios) {\n title = lang('PreviewSender.SendAudio', renderingAttachments.length, 'i');\n } else {\n title = lang('PreviewSender.SendFile', renderingAttachments.length, 'i');\n }\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 \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 );\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 '../../../util/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 lang = useLang();\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 lang('lng_polls_choose_question');\n }\n\n return undefined;\n }, [hasErrors, lang, 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 lang('lng_polls_choose_answers');\n }\n return undefined;\n }, [hasErrors, lang, options]);\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

{lang('lng_polls_choose_correct')}

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

{lang('PollOptions')}

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

{lang('lng_polls_solution_title')}

\n setSolution(e.currentTarget.innerHTML)}\n />\n
{lang('CreatePoll.ExplanationInfo')}
\n \n )}\n
\n \n );\n};\n\nexport default memo(PollModal);\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 focus?: boolean;\n onClick: (emoji: string, name: string) => void;\n};\n\nconst EmojiButton: FC = ({ emoji, focus, onClick }) => {\n const handleClick = useCallback((e: React.MouseEvent) => {\n // Preventing safari from losing focus on Composer MessageInput\n e.preventDefault();\n\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_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport windowSize from '../../../util/windowSize';\nimport { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver';\nimport useMediaTransition from '../../../hooks/useMediaTransition';\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 = useMediaTransition(shouldRender);\n\n const lang = useLang();\n\n const emojisPerRow = IS_SINGLE_COLUMN_LAYOUT\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

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

\n \n {shouldRender && category.emojis.map((name) => {\n const emoji = allEmojis[name];\n // Recent emojis may contain emoticons that are no longer in the list\n if (!emoji) {\n return undefined;\n }\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 } from '../../../global/types';\n\nimport { MENU_TRANSITION_DURATION } from '../../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../util/environment';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\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, name: string) => void;\n};\n\ntype StateProps = 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,\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.current, !IS_SINGLE_COLUMN_LAYOUT);\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?.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, name);\n }, [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)(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_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport windowSize from '../../../util/windowSize';\nimport StickerButton from '../../common/StickerButton';\nimport useMediaTransition from '../../../hooks/useMediaTransition';\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_SINGLE_COLUMN_LAYOUT ? 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 = useMediaTransition(shouldRender);\n\n const stickersPerRow = IS_SINGLE_COLUMN_LAYOUT\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 { IS_TOUCH_ENV } from '../../../util/environment';\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?.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?.length) {\n loadAddedStickers();\n }\n }, [addedSetIds, loadAddedStickers]);\n\n useHorizontalScroll(headerRef.current);\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?.[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
{lang('ErrorSendRestrictedStickersAll')}
\n ) : noPopulatedSets ? (\n
{lang('NoStickers')}
\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 useVideoCleanup from '../../hooks/useVideoCleanup';\nimport useBuffering from '../../hooks/useBuffering';\nimport useCanvasBlur from '../../hooks/useCanvasBlur';\nimport { preventMessageInputBlurWithBubbling } from '../middle/helpers/preventMessageInputBlur';\n\nimport Spinner from '../ui/Spinner';\n\nimport './GifButton.scss';\n\ntype OwnProps = {\n gif: ApiVideo;\n observeIntersection: ObserveFn;\n isDisabled?: boolean;\n className?: string;\n onClick: (gif: ApiVideo) => void;\n};\n\nconst GifButton: FC = ({\n gif, observeIntersection, isDisabled, className, 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 hasThumbnail = Boolean(gif.thumbnail?.dataUri);\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 thumbRef = useCanvasBlur(gif.thumbnail?.dataUri, Boolean(previewBlobUrl));\n const videoData = useMedia(localMediaHash, !loadAndPlay, ApiMediaFormat.BlobUrl);\n const shouldRenderVideo = Boolean(loadAndPlay && videoData);\n const { isBuffered, bufferingHandlers } = useBuffering(true);\n const shouldRenderSpinner = loadAndPlay && !isBuffered;\n const isVideoReady = 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 fullClassName = buildClassName(\n 'GifButton',\n gif.width && gif.height && gif.width < gif.height ? 'vertical' : 'horizontal',\n localMediaHash,\n className,\n );\n\n return (\n \n {hasThumbnail && (\n \n )}\n {previewBlobUrl && !isVideoReady && (\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 { IS_TOUCH_ENV } from '../../../util/environment';\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 useLang from '../../../hooks/useLang';\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 const lang = useLang();\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, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiSticker, ApiVideo } from '../../../api/types';\n\nimport { IAllowedAttachmentOptions } from '../../../modules/helpers';\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } 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, { SYMBOL_MENU_TAB_TITLES, SymbolMenuTabs } 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, shouldPreserveInput?: boolean) => void;\n onGifSelect: (gif: ApiVideo) => void;\n onRemoveSymbol: () => void;\n onSearchOpen: (type: 'stickers' | 'gifs') => void;\n addRecentEmoji: AnyToVoidFunction;\n};\n\ntype StateProps = {\n isLeftColumnShown: boolean;\n};\n\nlet isActivated = false;\n\nconst SymbolMenu: FC = ({\n isOpen, allowedAttachmentOptions, isLeftColumnShown,\n onLoad, onClose,\n onEmojiSelect, onStickerSelect, onGifSelect,\n onRemoveSymbol, onSearchOpen, addRecentEmoji,\n}) => {\n const [activeTab, setActiveTab] = useState(0);\n const [recentEmojis, setRecentEmojis] = useState([]);\n\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose, undefined, IS_SINGLE_COLUMN_LAYOUT);\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_SINGLE_COLUMN_LAYOUT) {\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 recentEmojisRef = useRef(recentEmojis);\n recentEmojisRef.current = recentEmojis;\n useEffect(() => {\n if (!recentEmojisRef.current.length) {\n return;\n }\n\n recentEmojisRef.current.forEach((name) => {\n addRecentEmoji({ emoji: name });\n });\n\n setRecentEmojis([]);\n }, [isOpen, activeTab, addRecentEmoji]);\n\n const handleEmojiSelect = useCallback((emoji: string, name: string) => {\n setRecentEmojis((emojis) => {\n return [...emojis, name];\n });\n\n onEmojiSelect(emoji);\n }, [onEmojiSelect]);\n\n const handleSearch = useCallback((type: 'stickers' | 'gifs') => {\n onClose();\n onSearchOpen(type);\n }, [onClose, onSearchOpen]);\n\n const handleStickerSelect = useCallback((sticker: ApiSticker) => {\n onStickerSelect(sticker, true);\n }, [onStickerSelect]);\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_SINGLE_COLUMN_LAYOUT && (\n \n \n \n )}\n \n \n );\n\n if (IS_SINGLE_COLUMN_LAYOUT) {\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'SymbolMenu mobile-menu',\n transitionClassNames,\n !isLeftColumnShown && 'middle-column-open',\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(withGlobal(\n (global): StateProps => {\n return {\n isLeftColumnShown: global.isLeftColumnShown,\n };\n },\n)(SymbolMenu));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { CONTENT_TYPES_WITH_PREVIEW } 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 Array.from(CONTENT_TYPES_WITH_PREVIEW).join(','),\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 \n {lang('AttachmentMenu.PhotoOrVideo')}\n \n {lang('AttachDocument')}\n \n )}\n {canAttachPolls && (\n {lang('Poll')}\n )}\n \n );\n};\n\nexport default memo(AttachMenu);\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { ApiBotCommand, ApiUser } from '../../../api/types';\n\nimport renderText from '../../common/helpers/renderText';\nimport buildClassName from '../../../util/buildClassName';\n\nimport ListItem from '../../ui/ListItem';\nimport Avatar from '../../common/Avatar';\n\nimport './BotCommand.scss';\n\ntype OwnProps = {\n botCommand: ApiBotCommand;\n bot?: ApiUser;\n withAvatar?: boolean;\n focus?: boolean;\n onClick: (botCommand: ApiBotCommand) => void;\n};\n\nconst BotCommand: FC = ({\n withAvatar,\n focus,\n botCommand,\n bot,\n onClick,\n}) => {\n return (\n onClick(botCommand)}\n focus={focus}\n >\n {withAvatar && (\n \n )}\n
\n /{botCommand.command}\n {renderText(botCommand.description)}\n
\n \n );\n};\n\nexport default memo(BotCommand);\n","import React, {\n FC, useCallback, useEffect, useRef, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiBotCommand, ApiUser } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\nimport setTooltipItemVisible from '../../../util/setTooltipItemVisible';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\nimport { useKeyboardNavigation } from './hooks/useKeyboardNavigation';\n\nimport BotCommand from './BotCommand';\n\nimport './BotCommandTooltip.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n withUsername?: boolean;\n botCommands?: ApiBotCommand[];\n onClick: NoneToVoidFunction;\n onClose: NoneToVoidFunction;\n};\n\ntype StateProps = {\n usersById: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst BotCommandTooltip: FC = ({\n usersById,\n isOpen,\n withUsername,\n botCommands,\n onClick,\n onClose,\n sendBotCommand,\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 handleSendCommand = useCallback(({ botId, command }: ApiBotCommand) => {\n const bot = usersById[botId];\n sendBotCommand({\n command: `/${command}${withUsername && bot ? `@${bot.username}` : ''}`,\n botId,\n });\n onClick();\n }, [onClick, sendBotCommand, usersById, withUsername]);\n\n const selectedCommandIndex = useKeyboardNavigation({\n isActive: isOpen,\n items: botCommands,\n onSelect: handleSendCommand,\n onClose,\n });\n\n useEffect(() => {\n if (botCommands && !botCommands.length) {\n onClose();\n }\n }, [botCommands, onClose]);\n\n useEffect(() => {\n setTooltipItemVisible('.chat-item-clickable', selectedCommandIndex, containerRef);\n }, [selectedCommandIndex]);\n\n const prevCommands = usePrevious(botCommands && botCommands.length ? botCommands : undefined, shouldRender);\n const renderedCommands = botCommands && !botCommands.length ? prevCommands : botCommands;\n\n if (!shouldRender || (renderedCommands && !renderedCommands.length)) {\n return undefined;\n }\n\n const className = buildClassName(\n 'BotCommandTooltip composer-tooltip custom-scroll',\n transitionClassNames,\n );\n\n return (\n
\n {renderedCommands && renderedCommands.map((chatBotCommand, index) => (\n \n ))}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => ({\n usersById: global.users.byId,\n }),\n (setGlobal, actions): DispatchProps => pick(actions, ['sendBotCommand']),\n)(BotCommandTooltip));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiBotCommand } from '../../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport useMouseInside from '../../../hooks/useMouseInside';\n\nimport Menu from '../../ui/Menu';\nimport BotCommand from './BotCommand';\n\nimport './BotCommandMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n botCommands: ApiBotCommand[];\n onClose: NoneToVoidFunction;\n};\n\ntype DispatchProps = Pick;\n\nconst BotCommandMenu: FC = ({\n isOpen, botCommands, onClose, sendBotCommand,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose, undefined, IS_SINGLE_COLUMN_LAYOUT);\n\n const handleClick = useCallback((botCommand: ApiBotCommand) => {\n sendBotCommand({\n command: `/${botCommand.command}`,\n botId: botCommand.botId,\n });\n onClose();\n }, [onClose, sendBotCommand]);\n\n return (\n \n {botCommands.map((botCommand) => (\n \n ))}\n \n );\n};\n\nexport default memo(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['sendBotCommand']),\n)(BotCommandMenu));\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 './StickerTooltip.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 StickerTooltip: 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 'StickerTooltip composer-tooltip custom-scroll',\n transitionClassNames,\n !(displayedStickers?.length) && 'hidden',\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)(StickerTooltip));\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, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport findInViewport from '../../../util/findInViewport';\nimport isFullyVisible from '../../../util/isFullyVisible';\nimport fastSmoothScrollHorizontal from '../../../util/fastSmoothScrollHorizontal';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevDuringAnimation from '../../../hooks/usePrevDuringAnimation';\nimport { useKeyboardNavigation } from './hooks/useKeyboardNavigation';\n\nimport Loading from '../../ui/Loading';\nimport EmojiButton from './EmojiButton';\n\nimport './EmojiTooltip.scss';\n\nconst VIEWPORT_MARGIN = 8;\nconst EMOJI_BUTTON_WIDTH = 44;\nconst CLOSE_DURATION = 350;\n\nfunction setItemVisible(index: number, containerRef: Record) {\n const container = containerRef.current!;\n if (!container) {\n return;\n }\n\n const { visibleIndexes, allElements } = findInViewport(\n container,\n '.EmojiButton',\n VIEWPORT_MARGIN,\n true,\n true,\n true,\n );\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], true))) {\n const position = index > visibleIndexes[visibleIndexes.length - 1] ? 'start' : 'end';\n const newLeft = position === 'start' ? index * EMOJI_BUTTON_WIDTH : 0;\n\n fastSmoothScrollHorizontal(container, newLeft);\n }\n}\n\nexport type OwnProps = {\n isOpen: boolean;\n onEmojiSelect: (text: string) => void;\n onClose: NoneToVoidFunction;\n addRecentEmoji: AnyToVoidFunction;\n emojis: Emoji[];\n};\n\nconst EmojiTooltip: FC = ({\n isOpen,\n emojis,\n onClose,\n onEmojiSelect,\n addRecentEmoji,\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 listEmojis: Emoji[] = usePrevDuringAnimation(emojis.length ? emojis : undefined, CLOSE_DURATION) || [];\n\n const handleSelectEmoji = useCallback((emoji: Emoji) => {\n onEmojiSelect(emoji.native);\n addRecentEmoji({ emoji: emoji.id });\n }, [addRecentEmoji, onEmojiSelect]);\n\n const handleClick = useCallback((native: string, id: string) => {\n onEmojiSelect(native);\n addRecentEmoji({ emoji: id });\n }, [addRecentEmoji, onEmojiSelect]);\n\n const selectedIndex = useKeyboardNavigation({\n isActive: isOpen,\n isHorizontal: true,\n items: emojis,\n onSelect: handleSelectEmoji,\n onClose,\n });\n\n useEffect(() => {\n setItemVisible(selectedIndex, containerRef);\n }, [selectedIndex]);\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 composer-tooltip custom-scroll-x',\n transitionClassNames,\n );\n\n return (\n \n {shouldRender && listEmojis ? (\n listEmojis.map((emoji, index) => (\n \n ))\n ) : shouldRender ? (\n \n ) : undefined}\n \n );\n};\n\nexport default memo(EmojiTooltip);\n","import React, { FC, memo } from '../../../../lib/teact/teact';\n\nimport { ApiWebDocument } from '../../../../api/types';\n\nimport { getFirstLetters } from '../../../../util/textFormat';\nimport renderText from '../../../common/helpers/renderText';\nimport useMedia from '../../../../hooks/useMedia';\n\nimport ListItem from '../../../ui/ListItem';\n\nimport './BaseResult.scss';\nimport { preventMessageInputBlurWithBubbling } from '../../helpers/preventMessageInputBlur';\n\nexport type OwnProps = {\n focus?: boolean;\n thumbnail?: ApiWebDocument;\n thumbUrl?: string;\n title?: string;\n description?: string;\n transitionClassNames?: string;\n onClick: NoneToVoidFunction;\n};\n\nconst BaseResult: FC = ({\n title,\n description,\n thumbnail,\n thumbUrl,\n focus,\n transitionClassNames = '',\n onClick,\n}) => {\n let content: string | undefined = '';\n\n const thumbnailDataUrl = useMedia(thumbnail ? `webDocument:${thumbnail.url}` : undefined);\n thumbUrl = thumbUrl || thumbnailDataUrl;\n\n if (thumbUrl) {\n content = (\n \"\"\n );\n } else if (title) {\n content = getFirstLetters(title, 1);\n }\n\n return (\n \n \n {typeof content === 'string' ? renderText(content) : content}\n \n
\n {title && (
{title}
)}\n {description && (
{description}
)}\n
\n \n );\n};\n\nexport default memo(BaseResult);\n","import React, { FC, memo, useCallback } from '../../../../lib/teact/teact';\n\nimport {\n ApiBotInlineMediaResult, ApiBotInlineResult, ApiPhoto, ApiThumbnail, ApiWebDocument,\n} from '../../../../api/types';\n\nimport buildClassName from '../../../../util/buildClassName';\nimport useMedia from '../../../../hooks/useMedia';\nimport useMediaTransition from '../../../../hooks/useMediaTransition';\n\nimport BaseResult from './BaseResult';\n\nimport './MediaResult.scss';\n\nexport type OwnProps = {\n focus?: boolean;\n isForGallery?: boolean;\n inlineResult: ApiBotInlineMediaResult | ApiBotInlineResult;\n onClick: (result: ApiBotInlineResult) => void;\n};\n\nconst MediaResult: FC = ({\n focus, isForGallery, inlineResult, onClick,\n}) => {\n let photo: ApiPhoto | undefined;\n let thumbnail: ApiThumbnail | undefined;\n let webThumbnail: ApiWebDocument | undefined;\n\n if ('photo' in inlineResult) {\n photo = inlineResult.photo;\n }\n // For results with type=video (for example @stikstokbot)\n if ('thumbnail' in inlineResult) {\n thumbnail = inlineResult.thumbnail;\n }\n if ('webThumbnail' in inlineResult && isForGallery) {\n webThumbnail = inlineResult.webThumbnail;\n }\n\n const thumbnailDataUrl = useMedia(webThumbnail ? `webDocument:${webThumbnail.url}` : undefined);\n const mediaBlobUrl = useMedia(photo && `photo${photo.id}?size=m`);\n const transitionClassNames = useMediaTransition(mediaBlobUrl);\n\n const handleClick = useCallback(() => {\n onClick(inlineResult);\n }, [inlineResult, onClick]);\n\n if (isForGallery) {\n return (\n
\n \"\"\n \"\"\n
\n );\n }\n\n const { title, description } = inlineResult;\n\n return (\n \n );\n};\n\nexport default memo(MediaResult);\n","import React, { FC, memo, useCallback } from '../../../../lib/teact/teact';\n\nimport { ApiBotInlineResult } from '../../../../api/types';\n\nimport BaseResult from './BaseResult';\n\nexport type OwnProps = {\n focus?: boolean;\n inlineResult: ApiBotInlineResult;\n onClick: (result: ApiBotInlineResult) => void;\n};\n\nconst ArticleResult: FC = ({ focus, inlineResult, onClick }) => {\n const {\n title, url, description, webThumbnail,\n } = inlineResult;\n\n const handleClick = useCallback(() => {\n onClick(inlineResult);\n }, [inlineResult, onClick]);\n\n return (\n \n );\n};\n\nexport default memo(ArticleResult);\n","import React, {\n FC, memo, useCallback,\n} from '../../../../lib/teact/teact';\n\nimport { ApiBotInlineMediaResult, ApiBotInlineResult } from '../../../../api/types';\n\nimport { ObserveFn } from '../../../../hooks/useIntersectionObserver';\n\nimport GifButton from '../../../common/GifButton';\n\ntype OwnProps = {\n inlineResult: ApiBotInlineMediaResult;\n observeIntersection: ObserveFn;\n onClick: (result: ApiBotInlineResult) => void;\n};\n\nconst GifResult: FC = ({\n inlineResult, observeIntersection, onClick,\n}) => {\n const { gif } = inlineResult;\n\n const handleClick = useCallback(() => {\n onClick(inlineResult);\n }, [inlineResult, onClick]);\n\n if (!gif) {\n return undefined;\n }\n\n return (\n \n );\n};\n\nexport default memo(GifResult);\n","import React, { FC, memo } from '../../../../lib/teact/teact';\n\nimport { ApiBotInlineMediaResult, ApiBotInlineResult } from '../../../../api/types';\n\nimport { STICKER_SIZE_INLINE_BOT_RESULT } from '../../../../config';\nimport { ObserveFn } from '../../../../hooks/useIntersectionObserver';\n\nimport StickerButton from '../../../common/StickerButton';\n\ntype OwnProps = {\n inlineResult: ApiBotInlineMediaResult;\n observeIntersection: ObserveFn;\n onClick: (result: ApiBotInlineResult) => void;\n};\n\nconst StickerResult: FC = ({ inlineResult, observeIntersection, onClick }) => {\n const { sticker } = inlineResult;\n\n if (!sticker) {\n return undefined;\n }\n\n return (\n \n );\n};\n\nexport default memo(StickerResult);\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiBotInlineMediaResult, ApiBotInlineResult, ApiBotInlineSwitchPm } from '../../../api/types';\nimport { IAllowedAttachmentOptions } from '../../../modules/helpers';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport setTooltipItemVisible from '../../../util/setTooltipItemVisible';\nimport buildClassName from '../../../util/buildClassName';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport { throttle } from '../../../util/schedulers';\nimport { pick } from '../../../util/iteratees';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport usePrevious from '../../../hooks/usePrevious';\nimport { useKeyboardNavigation } from './hooks/useKeyboardNavigation';\n\nimport MediaResult from './inlineResults/MediaResult';\nimport ArticleResult from './inlineResults/ArticleResult';\nimport GifResult from './inlineResults/GifResult';\nimport StickerResult from './inlineResults/StickerResult';\nimport ListItem from '../../ui/ListItem';\nimport InfiniteScroll from '../../ui/InfiniteScroll';\n\nimport './InlineBotTooltip.scss';\n\nconst INTERSECTION_DEBOUNCE_MS = 200;\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nexport type OwnProps = {\n isOpen: boolean;\n botId?: string;\n isGallery?: boolean;\n allowedAttachmentOptions: IAllowedAttachmentOptions;\n inlineBotResults?: (ApiBotInlineResult | ApiBotInlineMediaResult)[];\n switchPm?: ApiBotInlineSwitchPm;\n onSelectResult: (inlineResult: ApiBotInlineMediaResult | ApiBotInlineResult) => void;\n loadMore: NoneToVoidFunction;\n onClose: NoneToVoidFunction;\n};\n\ntype DispatchProps = Pick;\n\nconst InlineBotTooltip: FC = ({\n isOpen,\n botId,\n isGallery,\n inlineBotResults,\n switchPm,\n loadMore,\n onClose,\n openChat,\n startBot,\n onSelectResult,\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 {\n observe: observeIntersection,\n } = useIntersectionObserver({\n rootRef: containerRef,\n debounceMs: INTERSECTION_DEBOUNCE_MS,\n isDisabled: !isOpen,\n });\n\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (direction === LoadMoreDirection.Backwards) {\n runThrottled(loadMore);\n }\n }, [loadMore]);\n\n const selectedIndex = useKeyboardNavigation({\n isActive: isOpen,\n shouldRemoveSelectionOnReset: isGallery,\n noArrowNavigation: isGallery,\n items: inlineBotResults,\n onSelect: onSelectResult,\n onClose,\n });\n\n useEffect(() => {\n setTooltipItemVisible('.chat-item-clickable', selectedIndex, containerRef);\n }, [selectedIndex]);\n\n const handleSendPm = useCallback(() => {\n openChat({ id: botId });\n startBot({ botId, param: switchPm!.startParam });\n }, [botId, openChat, startBot, switchPm]);\n\n const prevInlineBotResults = usePrevious(\n inlineBotResults?.length\n ? inlineBotResults\n : undefined,\n shouldRender,\n );\n const renderedInlineBotResults = inlineBotResults && !inlineBotResults.length\n ? prevInlineBotResults\n : inlineBotResults;\n\n if (!shouldRender || !renderedInlineBotResults || (!renderedInlineBotResults.length && !switchPm)) {\n return undefined;\n }\n\n const className = buildClassName(\n 'InlineBotTooltip composer-tooltip',\n IS_TOUCH_ENV ? 'no-scrollbar' : 'custom-scroll',\n isGallery && 'gallery',\n transitionClassNames,\n );\n\n function renderSwitchPm() {\n return (\n \n {switchPm!.text}\n \n );\n }\n\n function renderContent() {\n return renderedInlineBotResults!.map((inlineBotResult, index) => {\n switch (inlineBotResult.type) {\n case 'gif':\n return (\n \n );\n\n case 'photo':\n return (\n \n );\n\n case 'sticker':\n return (\n \n );\n\n case 'video':\n case 'game':\n return (\n \n );\n case 'article':\n case 'audio':\n return (\n \n );\n\n default:\n return undefined;\n }\n });\n }\n\n return (\n \n {switchPm && renderSwitchPm()}\n {renderContent()}\n \n );\n};\n\nexport default memo(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'startBot', 'openChat', 'sendInlineBotResult',\n ]),\n)(InlineBotTooltip));\n","import React, {\n FC, useMemo, memo, useRef,\n} 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 useLang from '../../hooks/useLang';\nimport { orderBy, pick } from '../../util/iteratees';\nimport { MEMO_EMPTY_ARRAY } from '../../util/memo';\nimport useKeyboardListNavigation from '../../hooks/useKeyboardListNavigation';\nimport useHistoryBack from '../../hooks/useHistoryBack';\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: string;\n threadId: number;\n onClose: NoneToVoidFunction;\n isActive: boolean;\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 onClose,\n isActive,\n chat,\n messagesById,\n query,\n totalCount,\n foundIds,\n searchTextMessagesLocal,\n focusMessage,\n}) => {\n const lang = useLang();\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(lang, senderChat) : getUserFullName(senderUser);\n const text = getMessageSummaryText(lang, 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 useHistoryBack(isActive, onClose);\n\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const handleKeyDown = useKeyboardListNavigation(containerRef, true, (index) => {\n const foundResult = foundResults?.[index === -1 ? 0 : index];\n if (foundResult) {\n foundResult.onClick();\n }\n }, '.ListItem-button', true);\n\n return (\n \n

\n {!query ? (\n lang('lng_dlg_search_for_messages')\n ) : (totalCount === 0 || !foundResults.length) ? (\n lang('lng_search_no_results')\n ) : totalCount === 1 ? (\n '1 message found'\n ) : (\n `${(foundResults.length && (totalCount || foundResults.length))} 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';\nimport useLang from '../../hooks/useLang';\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,\n loadStickers, toggleStickerSet, isSomeModalOpen, onModalToggle,\n}) => {\n const lang = useLang();\n const isAdded = set && Boolean(set.installedDate);\n const areStickersLoaded = Boolean(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

{lang('Stickers', set.count, 'i')}

\n
\n \n {lang(isAdded ? 'Stickers.Installed' : 'Stickers.Install')}\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';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Loading from '../ui/Loading';\nimport StickerSetResult from './StickerSetResult';\n\nimport './StickerSearch.scss';\n\ntype OwnProps = {\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\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 onClose,\n isActive,\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 lang = useLang();\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 useHistoryBack(isActive, onClose);\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';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport GifButton from '../common/GifButton';\nimport Loading from '../ui/Loading';\n\nimport './GifSearch.scss';\n\ntype OwnProps = {\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\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 onClose,\n isActive,\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 useHistoryBack(isActive, onClose);\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\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, 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';\nimport useLang from '../../hooks/useLang';\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?: string[];\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 const lang = useLang();\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: string) => {\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 \n {getPercentage(answerVote.votersCount, totalVoters)}%\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 memo(withGlobal(\n (global, { answer }: OwnProps): StateProps => {\n const { voters, offsets } = global.pollResults;\n\n return {\n voters: voters?.[answer.option],\n offset: (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';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport PollAnswerResults from './PollAnswerResults';\nimport Loading from '../ui/Loading';\n\nimport './PollResults.scss';\n\ntype OwnProps = {\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n message?: ApiMessage;\n lastSyncTime?: number;\n};\n\nconst PollResults: FC = ({\n onClose,\n isActive,\n chat,\n message,\n lastSyncTime,\n}) => {\n const lang = useLang();\n useHistoryBack(isActive, onClose);\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

{renderText(summary.question, ['emoji', 'br'])}

\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 {\n selectChat, selectNotifyExceptions, selectNotifySettings, selectUser,\n} from '../../../modules/selectors';\nimport { selectIsChatMuted } from '../../../modules/helpers';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\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: string;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n user?: ApiUser;\n chat: ApiChat;\n progress?: ManagementProgress;\n isMuted?: boolean;\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 isMuted,\n updateContact,\n deleteUser,\n deleteHistory,\n closeManagement,\n openChat,\n onClose,\n isActive,\n}) => {\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [error, setError] = useState();\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n const currentFirstName = user ? (user.firstName || '') : '';\n const currentLastName = user ? (user.lastName || '') : '';\n\n const [firstName, setFirstName] = useState(currentFirstName);\n const [lastName, setLastName] = useState(currentLastName);\n const [isNotificationsEnabled, setIsNotificationsEnabled] = useState(!isMuted);\n\n useEffect(() => {\n setIsNotificationsEnabled(!isMuted);\n }, [isMuted]);\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 deleteHistory({\n chatId: chat.id,\n shouldDeleteForAll: false,\n });\n deleteUser({ userId });\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [chat.id, 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 const isMuted = selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global));\n\n return {\n user, chat, progress, isMuted,\n };\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';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\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: string;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\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 deleteChat,\n leaveChannel,\n deleteChannel,\n closeManagement,\n openChat,\n onClose,\n isActive,\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 useHistoryBack(isActive, onClose);\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?.adminMembers?.length) || 0;\n\n const handleDeleteGroup = useCallback(() => {\n if (isBasicGroup) {\n deleteChat({ chatId: chat.id });\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,\n closeDeleteDialog, closeManagement, leaveChannel, deleteChannel, deleteChat, 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 {lang('GroupType')}\n {chat.username ? lang('TypePublic') : lang('TypePrivate')}\n \n )}\n {hasLinkedChannel && (\n \n {lang('LinkedChannel')}\n {lang('DiscussionUnlink')}\n \n )}\n \n {lang('ChannelPermissions')}\n \n {enabledPermissionsCount}/{TOTAL_PERMISSIONS_COUNT}\n \n \n \n {lang('ChannelAdministrators')}\n {formatInteger(adminsCount)}\n \n
\n
\n \n {lang('GroupMembers')}\n {formatInteger(chat.membersCount ?? 0)}\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?.linkedChatId);\n const isBasicGroup = isChatBasicGroup(chat);\n\n return {\n chat,\n progress,\n isBasicGroup,\n hasLinkedChannel,\n canChangeInfo: isBasicGroup ? chat.isCreator : getHasAdminRight(chat, 'changeInfo'),\n canBanUsers: isBasicGroup ? chat.isCreator : getHasAdminRight(chat, 'banUsers'),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'togglePreHistoryHidden', 'updateChat', 'closeManagement',\n 'leaveChannel', 'deleteChannel', 'deleteChat', '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';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\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: string;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: string, isPromotedByCurrentUser?: boolean) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n currentUserId?: string;\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 onClose,\n isActive,\n}) => {\n const [permissions, setPermissions] = useState({});\n const [havePermissionChanged, setHavePermissionChanged] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\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?.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 Exclude]),\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?.[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 {lang('ChannelBlockedUsers')}\n {removedUsersCount}\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, useMemo, useState, memo, useRef, 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 { getUserFullName } from '../../../modules/helpers';\nimport searchWords from '../../../util/searchWords';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport ChatOrUserPicker from '../../common/ChatOrUserPicker';\n\nexport type OwnProps = {\n chat: ApiChat;\n isOpen: boolean;\n onClose: NoneToVoidFunction;\n};\n\ntype StateProps = {\n usersById: Record;\n currentUserId?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst RemoveGroupUserModal: FC = ({\n chat,\n usersById,\n currentUserId,\n isOpen,\n onClose,\n loadMoreMembers,\n deleteChatMember,\n}) => {\n const lang = useLang();\n const [filter, setFilter] = useState('');\n // eslint-disable-next-line no-null/no-null\n const filterRef = useRef(null);\n\n const usersId = useMemo(() => {\n const availableMembers = (chat.fullInfo?.members || []).filter((member) => {\n return !member.isAdmin && !member.isOwner && member.userId !== currentUserId;\n });\n\n return availableMembers.reduce((acc, member) => {\n if (\n !filter\n || !usersById[member.userId]\n || searchWords(getUserFullName(usersById[member.userId]) || '', filter)\n ) {\n acc.push(member.userId);\n }\n\n return acc;\n }, []);\n }, [chat.fullInfo?.members, currentUserId, filter, usersById]);\n\n const handleRemoveUser = useCallback((userId: string) => {\n deleteChatMember({ chatId: chat.id, userId });\n onClose();\n }, [chat.id, deleteChatMember, onClose]);\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n users: {\n byId: usersById,\n },\n currentUserId,\n } = global;\n\n return { usersById, currentUserId };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadMoreMembers', 'deleteChatMember']),\n)(RemoveGroupUserModal));\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 { getHasAdminRight, getUserFullName } from '../../../modules/helpers';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\nimport useFlag from '../../../hooks/useFlag';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport RemoveGroupUserModal from './RemoveGroupUserModal';\n\ntype OwnProps = {\n chatId: string;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n usersById: Record;\n canDeleteMembers?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupRemovedUsers: FC = ({\n chat,\n usersById,\n canDeleteMembers,\n updateChatMemberBannedRights,\n onClose,\n isActive,\n}) => {\n const lang = useLang();\n const [isRemoveUserModalOpen, openRemoveUserModal, closeRemoveUserModal] = useFlag();\n\n useHistoryBack(isActive, onClose);\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 {canDeleteMembers && (\n \n \n \n )}\n {chat && canDeleteMembers && (\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 canDeleteMembers = chat && (getHasAdminRight(chat, 'banUsers') || chat.isCreator);\n\n return { chat, usersById, canDeleteMembers };\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';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport './Management.scss';\n\ntype OwnProps = {\n chatId: string;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\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 onClose,\n isActive,\n}) => {\n const currentTitle = chat ? (chat.title || '') : '';\n const currentAbout = chat?.fullInfo ? (chat.fullInfo.about || '') : '';\n const hasLinkedChat = 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 useHistoryBack(isActive, onClose);\n\n useEffect(() => {\n if (progress === ManagementProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setError(undefined);\n }\n }, [progress]);\n\n const adminsCount = (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 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 {lang('ChannelType')}\n {chat.username ? lang('TypePublic') : lang('TypePrivate')}\n \n )}\n \n {lang('Discussion')}\n {hasLinkedChat ? lang('DiscussionUnlink') : lang('Add')}\n \n \n {lang('ChannelAdministrators')}\n {adminsCount}\n \n
\n \n
\n
\n
\n \n {lang('ChannelSubscribers')}\n {lang('Subscribers', chat.membersCount ?? 0, 'i')}\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?.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';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\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: string;\n onClose: NoneToVoidFunction;\n isActive: boolean;\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 onClose,\n isActive,\n isChannel,\n progress,\n isUsernameAvailable,\n checkPublicLink,\n updatePublicLink,\n updatePrivateLink,\n}) => {\n const isPublic = Boolean(chat.username);\n const privateLink = 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 = Boolean(\n (privacyType === 'public' && username && isUsernameAvailable)\n || (privacyType === 'private' && isPublic),\n );\n\n useHistoryBack(isActive, onClose);\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

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

\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';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\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: string;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n chatsByIds: Record;\n linkedChat?: ApiChat;\n forDiscussionIds?: string[];\n isChannel?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageDiscussion: FC = ({\n chat,\n onClose,\n isActive,\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?.id;\n\n useHistoryBack(isActive, onClose);\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: string) => {\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?.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';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\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: string;\n selectedChatMemberId?: string;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\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 onClose,\n isActive,\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 useHistoryBack(isActive, onClose);\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?.fullInfo && selectedChatMemberId && !selectedChatMember) {\n onScreenSelect(ManagementScreens.GroupPermissions);\n }\n }, [chat, onScreenSelect, selectedChatMember, selectedChatMemberId]);\n\n useEffect(() => {\n setPermissions((selectedChatMember?.bannedRights) || (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 Exclude]),\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: Exclude) => {\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\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';\n\nimport { getUserFullName, isChatChannel } from '../../../modules/helpers';\nimport { selectChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: string;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: string, isPromotedByCurrentUser?: boolean) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat: ApiChat;\n currentUserId?: string;\n isChannel: boolean;\n usersById: Record;\n};\n\nconst ManageChatAdministrators: FC = ({\n chat,\n isChannel,\n currentUserId,\n usersById,\n onScreenSelect,\n onChatMemberSelect,\n onClose,\n isActive,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\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 {lang('EventLog')}\n {lang(isChannel ? 'EventLogInfoDetailChannel' : 'EventLogInfoDetail')}\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';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: string;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n};\n\nconst ManageGroupRecentActions: FC = ({ chat, onClose, isActive }) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\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

{lang('Channel.Management.Title')}

\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';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\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: string;\n selectedChatMemberId?: string;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat: ApiChat;\n usersById: Record;\n currentUserId?: string;\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 onClose,\n isActive,\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 useHistoryBack(isActive, onClose);\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?.fullInfo && selectedChatMemberId && !selectedChatMember) {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }\n }, [chat, onScreenSelect, selectedChatMember, selectedChatMemberId]);\n\n useEffect(() => {\n setPermissions((selectedChatMember?.adminRights) || {});\n setCustomTitle(((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
\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\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 { sortUserIds, isChatChannel } from '../../../modules/helpers';\nimport { pick } from '../../../util/iteratees';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport NothingFound from '../../common/NothingFound';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: string;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n usersById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n serverTimeOffset: number;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupMembers: FC = ({\n members,\n usersById,\n isChannel,\n openUserInfo,\n onClose,\n isActive,\n serverTimeOffset,\n}) => {\n const memberIds = useMemo(() => {\n if (!members || !usersById) {\n return undefined;\n }\n\n return sortUserIds(members.map(({ userId }) => userId), usersById, undefined, serverTimeOffset);\n }, [members, serverTimeOffset, usersById]);\n\n const handleMemberClick = useCallback((id: string) => {\n openUserInfo({ id });\n }, [openUserInfo]);\n\n useHistoryBack(isActive, onClose);\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?.fullInfo?.members;\n const isChannel = chat && isChatChannel(chat);\n\n return {\n members,\n usersById,\n isChannel,\n serverTimeOffset: global.serverTimeOffset,\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 { sortUserIds, isChatChannel } from '../../../modules/helpers';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport NothingFound from '../../common/NothingFound';\n\ntype OwnProps = {\n chatId: string;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: string) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n usersById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n serverTimeOffset: number;\n};\n\nconst ManageGroupUserPermissionsCreate: FC = ({\n usersById,\n members,\n isChannel,\n onScreenSelect,\n onChatMemberSelect,\n onClose,\n isActive,\n serverTimeOffset,\n}) => {\n useHistoryBack(isActive, onClose);\n\n const memberIds = useMemo(() => {\n if (!members || !usersById) {\n return undefined;\n }\n\n return sortUserIds(\n members.filter((member) => !member.isOwner).map(({ userId }) => userId),\n usersById, undefined, serverTimeOffset,\n );\n }, [members, serverTimeOffset, usersById]);\n\n const handleExceptionMemberClick = useCallback((memberId: string) => {\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\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { byId: usersById } = global.users;\n const members = chat?.fullInfo?.members;\n const isChannel = chat && isChatChannel(chat);\n\n return {\n members,\n usersById,\n isChannel,\n serverTimeOffset: global.serverTimeOffset,\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: string;\n currentScreen: ManagementScreens;\n selectedChatMemberId?: string;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: string, isPromotedByCurrentUser?: boolean) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\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 onClose,\n isActive,\n managementType,\n}) => {\n switch (currentScreen) {\n case ManagementScreens.Initial: {\n switch (managementType) {\n case 'user':\n return (\n \n );\n case 'group':\n return (\n \n );\n case 'channel':\n return (\n \n );\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 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","// 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 Caledonia6\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 useReducer, { StateReducer, Dispatch } from '../useReducer';\nimport countryList from '../../util/countries';\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\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/countries';\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';\n\nimport { formatCurrency } from '../../util/formatCurrency';\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\nimport useLang from '../../hooks/useLang';\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 const lang = useLang();\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: formatCurrency(amount, currency, lang.code),\n value,\n }))), [shippingOptions, currency, lang.code]);\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 { LangCode, Price } from '../../types';\n\nimport { formatCurrency } from '../../util/formatCurrency';\nimport useLang from '../../hooks/useLang';\n\nimport './Checkout.scss';\n\nexport type OwnProps = {\n invoiceContent?: {\n title?: 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 const lang = useLang();\n\n const { photoUrl, title, text } = invoiceContent || {};\n const {\n paymentMethod,\n paymentProvider,\n shippingAddress,\n name,\n phone,\n shippingMethod,\n } = (checkoutInfo || {});\n\n return (\n
\n
\n {photoUrl && \"\"}\n
\n
{title}
\n

{text}

\n
\n
\n
\n { prices && prices.map((item) => (\n renderPaymentItem(lang.code, item.label, item.amount, currency)\n )) }\n { shippingPrices && shippingPrices.map((item) => (\n renderPaymentItem(lang.code, item.label, item.amount, currency)\n )) }\n { totalPrice !== undefined && (\n renderPaymentItem(lang.code, lang('Checkout.TotalAmount'), 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(\n langCode: LangCode | undefined, title: string, value: number, currency?: string, main = false,\n) {\n return (\n
\n
\n { title }\n
\n
\n {formatCurrency(value, currency, langCode)}\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?.[0] && Number(parts[0]) > 12) {\n parts[0] = '12';\n }\n if (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","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/countries';\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';\n\nimport { pick } from '../../util/iteratees';\nimport { formatCurrency } from '../../util/formatCurrency';\nimport { detectCardTypeText } from '../common/helpers/detectCardType';\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};\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 validateRequestedInfo,\n sendPaymentForm,\n setPaymentStep,\n sendCredentialsInfo,\n clearPaymentError,\n}) => {\n const [paymentState, paymentDispatch] = usePaymentReducer();\n const [isLoading, setIsLoading] = useState(false);\n const lang = useLang();\n\n useEffect(() => {\n if (step || error) {\n setIsLoading(false);\n }\n }, [step, error]);\n\n useEffect(() => {\n if (error?.field) {\n paymentDispatch({\n type: 'setFormErrors',\n payload: {\n [error.field]: error.message,\n },\n });\n }\n }, [error, 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 {lang('OK')}\n \n
\n );\n }\n\n function renderModalContent(currentStep: PaymentStep) {\n switch (currentStep) {\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 lang('Checkout.PayPrice', formatCurrency(totalPrice, currency, lang.code));\n default:\n return lang('Next');\n }\n }, [step, lang, currency, totalPrice]);\n\n if (isProviderError) {\n return (\n \n

\n Sorry, Telegram WebZ doesn't support payments with this provider yet.
\n Please use one of our mobile apps to do this.\n

\n \n {lang('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 };\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?.prices;\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?.title;\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';\n\nimport useLang from '../../hooks/useLang';\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 checkoutInfo = useMemo(() => {\n return getCheckoutInfo(credentialsTitle, info, shippingMethod);\n }, [info, shippingMethod, credentialsTitle]);\n\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,\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,\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?.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 { 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_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\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_SINGLE_COLUMN_LAYOUT ? 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 const lang = useLang();\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_SINGLE_COLUMN_LAYOUT } 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_SINGLE_COLUMN_LAYOUT ? 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 { 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// @ts-ignore\nimport CameraFlip from '../../../assets/animatedIcons/CameraFlip.tgs';\n// @ts-ignore\nimport HandFilled from '../../../assets/animatedIcons/HandFilled.tgs';\n// @ts-ignore\nimport HandOutline from '../../../assets/animatedIcons/HandOutline.tgs';\n// @ts-ignore\nimport Speaker from '../../../assets/animatedIcons/Speaker.tgs';\n// @ts-ignore\nimport VoiceAllowTalk from '../../../assets/animatedIcons/VoiceAllowTalk.tgs';\n// @ts-ignore\nimport VoiceMini from '../../../assets/animatedIcons/VoiceMini.tgs';\n// @ts-ignore\nimport VoiceMuted from '../../../assets/animatedIcons/VoiceMuted.tgs';\n// @ts-ignore\nimport VoiceOutlined from '../../../assets/animatedIcons/VoiceOutlined.tgs';\n\nexport const ANIMATED_STICKERS_PATHS = {\n MonkeyIdle,\n MonkeyTracking,\n MonkeyClose,\n MonkeyPeek,\n FoldersAll,\n FoldersNew,\n DiscussionGroups,\n CameraFlip,\n HandFilled,\n HandOutline,\n Speaker,\n VoiceAllowTalk,\n VoiceMini,\n VoiceMuted,\n VoiceOutlined,\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","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: 1,\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"],"names":["createGhost","source","origin","ghost","document","createElement","classList","add","img","Image","src","HTMLVideoElement","poster","appendChild","MediaViewerOrigin","profileInfo","querySelector","cloneNode","isMessageImageFullyVisible","container","imageEl","messageListElement","imgOffsetTop","offsetTop","closest","id","includes","parentElement","scrollTop","offsetHeight","applyStyles","element","styles","Object","assign","style","getNodes","message","containerSelector","mediaSelector","mediaEls","querySelectorAll","mediaEl","length","applyShape","firstChild","objectFit","withGlobal","global","chatId","messageId","isAvatar","sender","isUserId","selectUser","selectChat","selectChatMessage","selectSender","setGlobal","actions","pick","closeMediaViewer","focusMessage","handleFocusMessage","useCallback","lang","useLang","senderTitle","getSenderTitle","className","onClick","Avatar","key","size","user","chat","dir","renderText","formatMediaDateTime","date","memo","isDownloading","selectIsDownloading","mediaData","isVideo","isZoomed","fileName","onCloseMediaViewer","onForward","onZoomToggle","downloadMessageMedia","cancelMessageMediaDownload","loadProgress","downloadProgress","useMediaWithLoadProgress","getMessageMediaHash","handleDownloadClick","MenuButton","useMemo","onTrigger","isOpen","Button","round","color","undefined","ariaLabel","IS_SINGLE_COLUMN_LAYOUT","DropdownMenu","trigger","positionX","MenuItem","icon","Math","href","download","ProgressSpinner","progress","noCross","text","isHidden","isForVideo","isMultiline","setIsMultiline","useState","useEffect","footerContent","checkIsMultiline","height","clientHeight","REM","handleResize","throttle","window","addEventListener","removeEventListener","classNames","buildClassName","e","stopPropagation","prop","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","units","bytes","number","floor","log","toFixed","stopEvent","bufferedProgress","currentTime","duration","fileSize","isForceVisible","isForceMobileVersion","isPlayed","isFullscreenSupported","isFullscreen","onChangeFullscreen","onPlayPause","onSeek","isVisible","setVisibility","seekerRef","useRef","isSeeking","timeout","setTimeout","clearTimeout","body","remove","handleSeek","current","width","left","getBoundingClientRect","clientX","MouseEvent","targetTouches","max","min","handleStartSeek","handleStopSeek","loadedPercent","totalSize","captureEvents","onCapture","onRelease","onDrag","percentagePlayed","percentageBuffered","ref","renderSeekLine","ripple","formatMediaDuration","renderTime","formatFileSize","url","isGif","posterData","posterSize","isMediaViewerOpen","noPlay","onClose","videoRef","setIsPlayed","IS_TOUCH_ENV","IS_IOS","setCurrentTime","isControlsVisible","setIsControlsVisible","setFullscreen","exitFullscreen","elRef","setIsFullscreen","Boolean","useLayoutEffect","listener","listenerEnter","listenerExit","video","PLATFORM_ENV","requestFullscreen","webkitRequestFullscreen","webkitEnterFullscreen","mozRequestFullScreen","mozCancelFullScreen","webkitCancelFullScreen","webkitExitFullscreen","useFullscreenStatus","isBuffered","bufferingHandlers","useBuffering","shouldRender","shouldRenderSpinner","transitionClassNames","spinnerClassNames","useShowTransition","shouldRenderPlayButton","playButtonClassNames","pause","safePlay","togglePlayState","useVideoCleanup","handleMouseOver","handleMouseOut","handleTimeUpdate","currentTarget","handleEnded","handleFullscreenChange","position","toggleControls","togglePayingStateBySpace","preventDefault","wrapperStyle","videoStyle","onMouseOver","onMouseOut","autoPlay","playsInline","loop","muted","onPlay","onEnded","onDoubleClick","onTimeUpdate","join","square","isShown","onChangeZoom","prevIsShown","usePrevious","inputRef","zoomLevel","setZoomLevel","disabled","step","value","type","onChange","Number","target","onMouseDown","onMouseUp","INITIAL_MATRIX","SCALE_VALUES","ZOOM_SAFE_AREA","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","transform","toString","newDragData","pageX","pageY","onMouseMove","deltaX","deltaY","getNewMatrixData","ANIMATION_DURATION","renderPhoto","blobUrl","imageSize","canDrag","alt","draggable","Spinner","threadId","avatarOwnerId","profilePhotoIndex","mediaViewer","animationLevel","settings","byKey","senderId","avatarOwner","chatMessages","collectionIds","selectScheduledMessage","selectScheduledMessages","selectChatMessages","selectOutlyingIds","selectListedIds","currentSearch","selectCurrentMediaSearch","foundIds","resultsByType","media","openMediaViewer","openForwardMenu","isFromSharedMedia","isFromSearch","photo","getMessagePhoto","getMessageVideo","webPagePhoto","getMessageWebPagePhoto","webPageVideo","getMessageWebPageVideo","isDocumentPhoto","isMessageDocumentPhoto","isDocumentVideo","isMessageDocumentVideo","isPhoto","isSingleSlide","messageIds","getChatMediaMessageIds","selectedMediaMessageIndex","indexOf","isFirst","isLast","animationKey","prevSenderId","slideAnimation","headerAnimation","isGhostAnimation","isFooterHidden","setIsFooterHidden","canPanZoomWrap","setCanPanZoomWrap","setIsZoomed","panDelta","setPanDelta","getMediaHash","isFull","photos","getChatAvatarHash","pictogramBlobUrl","useMedia","ApiMediaFormat","previewMediaHash","previewBlobUrl","fullMediaBlobUrl","getMessageMediaFormat","localBlobUrl","bestImageData","thumbDataUri","useBlurSync","getMessageMediaThumbDataUri","videoSize","getMessageFileSize","getMessageFileName","dimensions","getMessageDocument","mediaSize","getPhotoFullDimensions","getVideoDimensions","AVATAR_FULL_DIMENSIONS","toggle","forceUpdate","useForceUpdate","mql","matchMedia","MEDIA_VIEWER_MEDIA_QUERY","addListener","removeListener","prevMessage","prevOrigin","prevAvatarOwner","prevBestImageData","dispatchHeavyAnimationEvent","ANIMATION_END_DELAY","textParts","renderMessageText","hasFooter","fromImage","windowWidth","windowSize","availableWidth","availableHeight","getMediaViewerAvailableDimensions","toWidth","toHeight","calculateDimensions","toLeft","toTop","topOffsetRem","matches","getTopOffset","top","fromTop","fromLeft","fromWidth","fromHeight","uncovered","realWidth","realHeight","srcWidth","srcHeight","uncover","fromTranslateX","fromTranslateY","fromScaleX","fromScaleY","requestAnimationFrame","clearShape","contains","removeChild","animateOpening","toImage","getElementById","targetTop","el","display","rect","windowHeight","isElementInViewport","shouldFadeOut","existingGhost","getElementsByClassName","transition","transformOrigin","opacity","animateClosing","timer","closeZoom","handleZoomToggle","handleZoomValue","level","canCloseZoom","close","handleFooterClick","handleForward","fromChatId","captureEscKeyListener","stopCurrentAudio","getMessageId","fromId","direction","index","selectPreviousMedia","selectNextMedia","handleKeyDown","shouldCloseOnVideo","excludedClosestSelector","onSwipe","SwipeDirection","handlePan","handleToggleFooterVisibility","renderSlide","isActive","calculateMediaViewerDimensions","renderSenderInfo","useHistoryBack","ShowTransition","isRtl","Transition","activeKey","name","currentUserId","chatOrUserIds","filterRef","filter","filterPlaceholder","onFilterChange","loadMore","onSelectChatOrUser","viewportIds","getMore","useInfiniteScroll","useInputFocusOnOpen","containerRef","handleFilterChange","useKeyboardListNavigation","modalHeader","InputText","onKeyDown","placeholder","Modal","header","InfiniteScroll","items","onLoadMore","noScrollRestore","map","ListItem","PrivateChatInfo","status","userId","GroupChatInfo","Loading","chats","byId","chatsById","listIds","orderedPinnedIds","pinnedIds","active","activeListIds","archivedListIds","archived","setForwardChatId","exitForwardMode","loadMoreChats","setFilter","chatIds","priorityIds","unique","sortChatIds","getCanPostInChat","MAIN_THREAD_ID","searchWords","getChatTitle","handleSelectUser","getErrorHeader","error","isSlowMode","hasErrorKey","dialogs","dismissDialog","acceptInviteConfirmation","dialog","invite","hash","title","participantsCount","isChannel","participantsText","joinText","isText","renderInvite","getReadableErrorText","notifications","dismissNotification","localId","Notification","onDismiss","toggleSafeLinkModal","handleOpen","open","ensureProtocol","handleDismiss","renderingUrl","useCurrentOrPrev","ConfirmDialog","confirmLabel","confirmHandler","WEEKDAY_LETTERS","isDisabledDay","year","month","day","minDate","maxDate","selectedDay","Date","fixedMinDate","getFullYear","getMonth","getDate","fixedMaxDate","formatInputTime","String","padStart","formatDay","selectedAt","maxAt","isFutureMode","isPastMode","withTimePicker","submitButtonLabel","secondButtonLabel","onSubmit","onSecondButtonClick","now","defaultSelectedDate","prevIsOpen","isTimeInputFocused","markTimeInputAsFocused","unmarkTimeInputAsFocused","useFlag","selectedDate","setSelectedDate","currentMonthAndYear","setCurrentMonthAndYear","selectedHours","setSelectedHours","getHours","selectedMinutes","setSelectedMinutes","getMinutes","currentYear","currentMonth","getTime","shouldDisableNextMonth","shouldDisablePrevMonth","prevMonthGrid","currentMonthGrid","nextMonthGrid","setDate","setMonth","setFullYear","firstDay","getDay","totalDaysInPrevMonth","i","push","gridDate","lastRowDaysCount","buildCalendarGrid","handleChangeHours","replace","hours","setHours","hoursStr","handleChangeMinutes","minutes","setMinutes","minutesStr","d","dateCopy","role","tabIndex","handleDateSelect","inputMode","onFocus","onBlur","formatDateToString","code","formatTime","formatSubmitLabel","historyCalendarSelectedAt","searchMessagesByDate","closeHistoryCalendar","handleJumpToDate","timestamp","valueOf","isSchedule","selectCurrentMessageList","canDeleteForAll","selectAllowedMessageActions","contactName","getUserFirstOrLastName","getPrivateChatUserId","willDeleteForCurrentUserOnly","isChatBasicGroup","willDeleteForAll","isChatSuperGroup","album","deleteMessages","deleteScheduledMessages","handleDeleteMessageForAll","messages","shouldDeleteForAll","handleDeleteMessageForSelf","onEnter","isPrivateChat","isChatWithSelf","selectIsChatWithSelf","isChatChannel","isGroup","isSuperGroup","canPinForAll","pinMessage","handlePinMessageForAll","isUnpin","handlePinMessage","isOneSide","isSilent","pinnedMessagesCount","onUnpin","selectedMessageIds","selectedMessages","selectCanDeleteSelectedMessages","selectCurrentChat","exitMessageSelectMode","reportMessages","selectedReason","setSelectedReason","description","setDescription","handleReport","reason","handleSelectReason","handleDescriptionChange","REPORT_OPTIONS","label","RadioGroup","options","selected","messageListType","canDelete","canReport","selectCanReportSelectedMessages","canDownload","selectCanDownloadSelectedMessages","selectedMessagesCount","selectSelectedMessagesCount","canDeleteMessages","canReportMessages","canDownloadMessages","canPost","openForwardMenuForSelectedMessages","downloadSelectedMessages","isDeleteModalOpen","openDeleteModal","closeDeleteModal","isReportModalOpen","openReportModal","closeReportModal","captureKeyboardListeners","onBackspace","onDelete","onEsc","handleDownload","prevSelectedMessagesCount","renderingSelectedMessagesCount","formattedMessagesCount","renderButton","destructive","onSelect","buttonRef","activeElement","privateChatUserId","privateChatUser","isPinned","selectIsChatPinned","isMuted","selectIsChatMuted","selectNotifySettings","selectNotifyExceptions","withUsername","isChatFolderModalOpen","openChatFolderModal","closeChatFolderModal","contextActions","useChatContextActions","handleDelete","handleChatFolderChange","handleClick","useSelectWithEnter","avatarSize","DeleteChatModal","runThrottled","cb","userIds","topUserIds","topPeers","usersById","users","recentlyFoundChatIds","globalSearch","onReset","loadTopUsers","loadContactList","openChat","addRecentlyFoundChatId","clearRecentlyFoundChats","topUsersRef","useHorizontalScroll","shouldReplaceHistory","lastSyncTime","searchQuery","mediaThumbnail","mediaBlobUrl","isRoundVideo","getMessageRoundVideo","withOnlineStatus","isSavedMessages","isSelf","isVerified","VerifiedIcon","Link","formatPastTimeShort","getMessageSummaryText","highlight","renderMessageSummary","searchDate","suggestions","match","suggestion","currentDate","latestYear","getSuggestionsFromDate","localContactIds","contactList","fetchingStatus","globalResults","localResults","globalChatIds","globalUserIds","localChatIds","localUserIds","byChatId","globalMessagesByChatId","dateSearchQuery","onSearchDateSelect","searchMessagesGlobal","setGlobalSearchChatId","shouldShowMoreLocal","setShouldShowMoreLocal","shouldShowMoreGlobal","setShouldShowMoreGlobal","handleLoadMore","LoadMoreDirection","query","handleChatClick","handlePickerItemClick","startsWith","MEMO_EMPTY_ARRAY","foundContactIds","fullName","getUserFullName","username","foundMessages","split","sort","a","b","handleClickShowMoreLocal","handleClickShowMoreGlobal","nothingFound","noScrollRestoreOnTop","noFastList","NothingFound","PickerSelectedItem","chatOrUserId","clickArg","createMapStateToProps","props","currentType","isVoice","activeDownloads","theme","selectTheme","isLoading","searchChatId","CURRENT_TYPE","handleSelectMedia","canRenderContents","useAsyncRendering","SLIDE_TRANSITION_DURATION","isMediaGrid","isMessageList","itemSelector","Media","idPrefix","handleMessageFocus","shouldDrawDateDivider","toYearMonth","formatMonthAndYear","WebLink","getSenderName","onMessageClick","Document","withDate","datetime","smaller","onDateClick","openAudioPlayer","handlePlayAudio","Audio","AudioOrigin","TABS","GlobalSearchContent","CHAT_TABS","slice","TRANSITION_RENDER_COUNT","keys","currentContent","setGlobalSearchContent","setGlobalSearchDate","activeTab","setActiveTab","parseDateString","handleSwitchTab","tab","content","handleSearchDateSelect","TabList","tabs","onSwitchTab","renderCount","INITIAL_STATE","currentPassword","password","hint","email","twoFaReducer","state","action","payload","currentScreen","editedFolderId","onSaveFilter","signOut","deleteChatFolder","onScreenSelect","isSignOutDialogOpen","setIsSignOutDialogOpen","isDeleteFolderDialogOpen","setIsDeleteFolderDialogOpen","openSignOutConfirmation","closeSignOutConfirmation","openDeleteFolderConfirmation","closeDeleteFolderConfirmation","handleSignOutMessage","handleDeleteFolderMessage","SettingsMenuButton","SettingsScreens","renderHeaderContent","confirmIsDestructive","currentUser","loadProfilePhotos","profileId","ProfileInfo","forceShowSelf","ChatExtra","LINK_PREFIX","LINK_PREFIX_REGEX","USERNAME_REGEX","runDebouncedForCheckUsername","debounce","currentUsername","asLink","isUsernameAvailable","checkUsername","setUsername","langPrefix","usernameSuccess","usernameError","test","handleUsernameChange","newUsername","trim","isValid","isUsernameValid","success","readOnly","ERROR_FIRST_NAME_MISSING","ERROR_BIO_TOO_LONG","profileEdit","firstName","currentFirstName","lastName","currentLastName","fullInfo","bio","currentBio","currentAvatarHash","loadCurrentUser","updateProfile","isUsernameTouched","setIsUsernameTouched","isProfileFieldsTouched","setIsProfileFieldsTouched","setError","setPhoto","setFirstName","setLastName","setBio","currentAvatarBlobUrl","ProfileEditProgress","isUsernameError","isSaveButtonShown","handlePhotoChange","newPhoto","handleFirstNameChange","handleLastNameChange","handleBioChange","handleProfileSave","trimmedFirstName","trimmedLastName","trimmedBio","AvatarEditable","UsernameInput","FloatingActionButton","canAutoLoadPhotoFromContacts","canAutoLoadPhotoInPrivateChats","canAutoLoadPhotoInGroups","canAutoLoadPhotoInChannels","canAutoLoadVideoFromContacts","canAutoLoadVideoInPrivateChats","canAutoLoadVideoInGroups","canAutoLoadVideoInChannels","canAutoLoadFileFromContacts","canAutoLoadFileInPrivateChats","canAutoLoadFileInGroups","canAutoLoadFileInChannels","canAutoPlayGifs","canAutoPlayVideos","autoLoadFileMaxSizeMb","setSettingOption","renderFileSizeCallback","AUTODOWNLOAD_FILESIZE_MB_LIMITS","handleFileSizeChange","renderAutoDownloadBlock","canAutoLoadFromContacts","canAutoLoadInPrivateChats","canAutoLoadInGroups","canAutoLoadInChannels","Checkbox","checked","onCheck","isChecked","RangeSlider","renderValue","renderContentSizeSlider","runThrottledForLoadRecommended","orderedIds","orderedFolderIds","foldersById","recommended","recommendedChatFolders","chatFolders","notifySettings","notifyExceptions","onCreateFolder","onEditFolder","loadRecommendedChatFolders","addChatFolder","showDialog","animationData","setAnimationData","isAnimationLoaded","setIsAnimationLoaded","handleAnimationLoad","getAnimationData","then","handleCreateFolder","data","userFolders","folder","subtitle","getFolderDescriptionText","handleCreateFolderFromRecommended","AnimatedSticker","STICKER_SIZE_FOLDER_SETTINGS","play","noLoop","onLoad","pill","fluid","narrow","multiline","count","itemName","itemPluralName","ERROR_NO_TITLE","ERROR_NO_CHATS","loadedActiveChatIds","loadedArchivedChatIds","dispatch","onAddIncludedChats","onAddExcludedChats","onBack","editChatFolder","isIncludedChatsListExpanded","setIsIncludedChatsListExpanded","isExcludedChatsListExpanded","setIsExcludedChatsListExpanded","selectedChatIds","includedChatIds","selectedChatTypes","includedChatTypes","selectChatFilters","excludedChatIds","excludedChatTypes","folderId","visibleIncludedChatIds","visibleExcludedChatIds","allLoadedChatsSet","Set","loadedIncludedChatIds","findIntersectionWithSet","loadedExcludedChatIds","listType","renderChats","mode","visibleChatIds","isExpanded","leftChatsCount","clickHandler","chatType","INCLUDED_CHAT_TYPES","typeKey","EXCLUDED_CHAT_TYPES","inactive","renderChatType","event","isTouched","folderUpdate","selectedIds","filterValue","onSelectedIdsChange","onSelectedChatTypesChange","chatTypes","shouldMinimize","hasMaxChats","focus","handleItemClick","newSelectedIds","splice","handleChatTypeClick","newSelectedChatTypes","selectedType","find","isMinimized","canClose","isSelected","withChatType","archivedPinnedIds","chatFilter","activeChatArrays","prepareChatList","archivedChatArrays","pinnedChats","otherChats","displayedIds","newFilter","handleSelectedIdsChange","ids","includeFilters","excludeFilters","handleSelectedChatTypesChange","newFilters","forEach","shownScreen","handleReset","handleEditFolder","handleAddIncludedChats","handleAddExcludedChats","STICKER_SIZE_PICKER_HEADER","stickerSet","observeIntersection","isIntersecting","useIsIntersecting","mediaHash","lottieData","useMediaTransition","firstLetters","getFirstLetters","hasThumbnail","stickers","firstSticker","isAnimated","STICKER_SIZE_GENERAL_SETTINGS","StickerButton","sticker","ANIMATION_LEVEL_OPTIONS","TIME_FORMAT_OPTIONS","stickerSetIds","added","setIds","stickerSetsById","setsById","messageTextSize","messageSendKeyCombo","shouldSuggestStickers","shouldLoopStickers","timeFormat","loadStickerSets","loadAddedStickers","stickerSettingsRef","observe","observeIntersectionForCovers","useIntersectionObserver","rootRef","isModalOpen","openModal","closeModal","setSticker","KEYBOARD_SEND_OPTIONS","subLabel","IS_MAC_OS","handleAnimationLevelChange","newLevel","_","handleMessageTextSizeChange","newSize","documentElement","setProperty","setAttribute","handleTimeFormatChange","newTimeFormat","wasTimeFormatSetManually","setTimeFormat","handleStickerSetClick","stickerSets","installedDate","fromSticker","fileSelector","openSystemFilesDialog","accept","callback","noMultiple","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","localMediaHash","thumbRef","useCanvasBlur","thumbnail","dataUri","isLoadAllowed","setIsLoadAllowed","fullMedia","wasLoadDisabled","UPLOADING_WALLPAPER_SLUG","cacheKeyRef","handleSelect","blob","fetchBlob","cacheApi","save","CUSTOM_BG_CACHE_NAME","isAllowed","background","isBlurred","themes","loadedWallpapers","loadWallpapers","uploadWallpaper","setThemeSettings","themeRef","handleFileSelect","files","handleUploadWallpaper","handleSetColor","handleResetToDefault","backgroundColor","patternColor","DARK_THEME_PATTERN_COLOR","DEFAULT_PATTERN_COLOR","handleWallPaperSelect","currentWallpaper","async","defaultRGB","rgb","canvas","context","getContext","preloadImage","naturalHeight","naturalWidth","offsetWidth","drawImage","getImageData","blockSize","getAverageColor","handleWallPaperBlurChange","isUploading","DEFAULT_HSB","PREDEFINED_COLORS","hsb2positions","hsb","rects","colorPosition","colorRect","huePosition","hueRect","positions2hsb","colorPickerRef","huePickerRef","isFirstRunRef","setHsb","getInitialHsb","hsbRef","markIsDragging","unmarkIsDragging","rgbInput","setRgbInput","hexInput","setHexInput","rectsRef","colorCtxRef","offsetLeft","handleColorDrag","handleHueDrag","selectorToPreventScroll","withCursor","hex","hueHex","w","ctx","imgData","createImageData","pixels","col","perY","st","ed","perX","putImageData","drawColor","drawHue","handleRgbChange","rgbValue","channel","handleHexChange","hexValue","handlePredefinedColorClick","dataset","hasPrivateChatsNotifications","hasPrivateChatsMessagePreview","hasGroupNotifications","hasGroupMessagePreview","hasBroadcastNotifications","hasBroadcastMessagePreview","hasContactJoinedNotifications","hasWebNotifications","hasPushNotifications","notificationSoundVolume","loadNotificationSettings","updateContactSignUpNotification","updateNotificationSettings","updateWebNotificationSettings","runDebounced","useDebounce","handleSettingsChange","peerType","setting","currentIsSilent","currentShouldShowPreviews","shouldShowPreviews","handleContactNotificationChange","volume","playNotifySound","hasPassword","isSensitiveEnabled","canChangeSensitive","privacy","blocked","activeSessions","blockedCount","totalCount","sessionsCount","visibilityPrivacyPhoneNumber","phoneNumber","visibility","visibilityPrivacyLastSeen","lastSeen","visibilityPrivacyProfilePhoto","profilePhoto","visibilityPrivacyForwarding","forwards","visibilityPrivacyGroupChats","chatInvite","loadPrivacySettings","loadBlockedContacts","loadAuthorizations","loadContentSettings","updateContentSettings","getVisibilityValue","languages","language","loadLanguages","selectedLanguage","setSelectedLanguage","markIsLoading","unmarkIsLoading","handleChange","langCode","setLanguage","currentLangCode","navigator","toLowerCase","shortLangCode","substr","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","handleTerminateAllSessions","currentSession","isCurrent","otherSessions","appName","ip","sessions","handler","dateActive","blockedIds","contactIds","userSearch","setUserSearchQuery","blockContact","filteredContactsId","availableContactsId","concat","contactId","acc","firstId","secondId","secondName","localeCompare","handleRemoveUser","accessHash","chatsByIds","usersByIds","countryList","phoneCodes","phoneCodeList","unblockContact","isBlockUserModalOpen","openBlockUserModal","closeBlockUserModal","handleUnblockClick","viewportOffset","isPrivate","CHAT_HEIGHT_PX","formatPhoneNumberWithCode","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","getCurrentPrivacySettings","isAllowList","setPrivacySettings","selectedContactIds","setSearchQuery","isSubmitShown","setIsSubmitShown","newSelectedContactIds","setNewSelectedContactIds","isChatGroup","handleSelectedContactIdsChange","contactsIds","Picker","itemIds","searchInputId","TWO_FA_SCREENS","FOLDERS_SCREENS","PRIVACY_SCREENS","PRIVACY_PHONE_NUMBER_SCREENS","PRIVACY_LAST_SEEN_PHONE_SCREENS","PRIVACY_PROFILE_PHOTO_SCREENS","PRIVACY_FORWARDING_SCREENS","PRIVACY_GROUP_CHATS_SCREENS","foldersState","foldersDispatch","shouldSkipTransition","twoFaState","twoFaDispatch","useReducer","handleSaveFilter","renderCurrentSection","isScreenActive","isFrom","currentKey","privacyAllowScreens","isTwoFaScreen","isFoldersScreen","isPrivacyScreen","values","SettingsGeneralBackgroundColor","renderCurrentSectionContent","LAYERS_ANIMATION_NAME","serverTimeOffset","resultIds","sortUserIds","isSearching","selectedMemberIds","onSelectedMemberIdsChange","onNextStep","setGlobalSearchQuery","isUserBot","canBeInvitedToGroup","handleNextStep","creationProgress","creationError","chatCreation","memberIds","createGroupChat","createChannel","setTitle","about","setAbout","chatTitleEmptyError","channelTitleEmptyError","chatTooManyUsersError","ChatCreationProgress","handleTitleChange","handleCreateGroup","handleCreateChannel","renderedError","RENDER_COUNT","LeftColumnContent","onContentChange","newChatMemberIds","setNewChatMemberIds","isStepActive","ChatList","folderType","folderOrderedIds","onCloseAnimationEnd","editChatFolders","initialSelectedFolderIds","pinnedChatIds","selectedFolderIds","setSelectedFolderIds","folders","idsToRemove","idsToAdd","CheckboxGroup","getCopyLabel","hasSelection","scrollLockEl","IGNORED_KEYS","Down","ArrowDown","Up","ArrowUp","Left","ArrowLeft","Right","ArrowRight","PageUp","PageDown","End","Home","Tab","changedTouches","clientY","getTouchY","scrollHeight","preventDefaultForScrollKeys","HTMLElement","tagName","getAttribute","isTextBox","disableScrolling","passive","onkeydown","enableScrolling","anchor","canSendNow","canReschedule","canReply","canEdit","canPin","canUnpin","canForward","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","onReply","onEdit","onPin","onReport","onFaveSticker","onUnfaveSticker","onSend","onReschedule","onCopyLink","onDownload","menuRef","copyOptions","afterEffect","getMessageText","canImageBeCopied","hasMessageLocalBlobUrl","CLIPBOARD_ITEM_SUPPORTED","selection","getSelection","Promise","resolve","mediaLoader","copyImageToClipboard","anchorNode","parentNode","clipboardText","copyTextToClipboard","getMessageCopyOptions","getTriggerElement","getRootElement","getMenuElement","positionY","menuStyle","withScroll","useContextMenuPosition","Menu","selectActiveDownloadIds","noOptions","isScheduled","chatUsername","setReplyingToId","setEditingId","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","isMenuOpen","setIsMenuOpen","setIsDeleteModalOpen","setIsReportModalOpen","isPinModalOpen","setIsPinModalOpen","isCalendarOpen","openCalendar","closeCalendar","some","msg","closeMenu","closePinModal","handleCloseCalendar","handleReply","handleEdit","handlePin","handleUnpin","handleFaveSticker","handleUnfaveSticker","handleSelectMessage","params","childMessageIds","withShift","handleScheduledMessageSend","handleOpenCalendar","handleRescheduleMessage","scheduledAt","handleCopyLink","reportMessageIds","scheduledMaxDate","getDayStartAt","stickerSetShortName","currentMessageList","sendOptions","getAllowedAttachmentOptions","canSendStickers","selectStickerSet","stickerSetId","selectStickerSetByShortName","loadStickers","toggleStickerSet","sendMessage","throttleMs","isDisabled","stickerSetAccessHash","isPreloadedGlobally","handleButtonClick","hasCloseButton","STICKER_SIZE_MODAL","isRestricted","canAddContact","getCanAddContact","canDeleteChat","getCanDeleteChat","hasLinkedChat","linkedChatId","withExtraActions","canStartBot","canRestartBot","canSubscribe","canSearch","canCall","canMute","canLeave","canEnterVoiceChat","canCreateVoiceChat","onSubscribeChannel","onSearchClick","updateChatMutedState","enterMessageSelectMode","sendBotCommand","restartBot","joinGroupCall","createGroupCall","openLinkedChat","addContact","openCallFallbackConfirm","handleStartBot","command","handleRestartBot","handleToggleMuteClick","handleEnterVoiceChatClick","handleLinkedChatClick","handleAddContactClick","handleSubscribe","handleCall","handleSearch","handleSelectMessages","Portal","runDebouncedForSearch","results","selectCurrentTextSearch","isHistoryCalendarOpen","setLocalTextSearchQuery","searchTextMessagesLocal","closeLocalTextSearch","openHistoryCalendar","focusedIndex","setFocusedIndex","visualViewport","mainEl","pageTop","Array","from","input","div","contentEditable","blur","handleMessageSearchQueryChange","newQuery","handleUp","newFocusIndex","handleDown","SearchInput","findInViewport","selectorOrElements","margin","isDense","shouldContainBottom","isHorizontal","viewportY1","viewportY2","allElements","visibleIndexes","isFound","y1","y2","setTooltipItemVisible","selector","first","isFullyVisible","fastSmoothScroll","useKeyboardNavigation","shouldSaveSelectionOnUpdateItems","shouldRemoveSelectionOnReset","noArrowNavigation","shouldSelectOnTab","selectedItemIndex","setSelectedItemIndex","getSelectedIndex","newIndex","cycleRestrict","handleArrowKey","handleItemSelect","item","isSelectionOutOfRange","onUp","onDown","onLeft","onRight","onTab","onInsertUserName","filteredUsers","handleUserSelect","forceFocus","handleSelectMention","member","selectedMentionIndex","prevChatMembers","renderedChatMembers","attachments","caption","isReady","groupChatMembers","recentEmojis","baseEmojiKeywords","emojiKeywords","addRecentEmoji","onCaptionUpdate","onFileAppend","onClear","hideTimeoutRef","prevAttachments","renderingAttachments","isHovered","markHovered","unmarkHovered","isQuick","every","quick","isMentionTooltipOpen","closeMentionTooltip","insertMention","mentionFilteredUsers","useMentionTooltip","EDITABLE_INPUT_MODAL_ID","isEmojiTooltipOpen","closeEmojiTooltip","filteredEmojis","insertEmoji","useEmojiTooltip","sendAttachments","handleFilesDrop","dataTransfer","newFiles","file","CONTENT_TYPES_WITH_PREVIEW","areAllPhotos","SUPPORTED_IMAGE_CONTENT_TYPES","mimeType","areAllVideos","SUPPORTED_VIDEO_CONTENT_TYPES","areAllAudios","renderHeader","onDragEnter","onDrop","onDragOver","onDragLeave","relatedTarget","toTarget","fromTarget","attachment","File","filename","extension","getFileExtension","previewData","emojis","onEmojiSelect","MessageInput","isAttachmentModalInput","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","scrollTo","behavior","handleCreate","questionTrimmed","optionsTrimmed","o","summary","answers","option","correct","isPublic","multipleChoice","quiz","entities","parseMessageInput","correctAnswers","solutionEntities","updateOption","removeOption","handleCorrectOptionChange","handleIsAnonymousChange","handleMultipleAnswersChange","handleQuizModeChange","handleKeyPress","keyCode","getQuestionError","getOptionsError","renderOptions","onKeyPress","renderQuizNoOptionError","hidden","emoji","native","names","IS_EMOJI_SUPPORTED","loading","category","allEmojis","useOnIntersect","emojisPerRow","ceil","displayedEmoji","ICONS_BY_CATEGORY","recent","people","nature","foods","activity","places","objects","symbols","flags","categoryIntersections","emojiDataPromise","emojiRawData","emojiData","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","noAnimate","onUnfaveClick","stickerSetIntersections","favorite","recentStickers","favoriteStickers","addedSetIds","shouldPlay","loadRecentStickers","loadFavoriteStickers","addRecentSticker","activeSetIndex","setActiveSetIndex","areAddedLoaded","allSets","noPopulatedSets","set","stickerSetEl","handleStickerSelect","handleStickerUnfave","fullClassName","buttonClassName","gif","videoData","shouldRenderVideo","isVideoReady","preventMessageInputBlurWithBubbling","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","isLeftColumnShown","allowedAttachmentOptions","setRecentEmojis","handleMouseEnter","handleMouseLeave","useMouseInside","fastRaf","recentEmojisRef","renderContent","onMouseEnter","onMouseLeave","noCloseOnBackdrop","onFileSelect","onPollCreate","handleQuickSelect","handleDocumentSelect","canAttachMedia","canAttachPolls","autoClose","withAvatar","botCommand","bot","botCommands","handleSendCommand","botId","selectedCommandIndex","prevCommands","renderedCommands","chatBotCommand","forEmoji","clearStickersForEmoji","prevStickers","displayedStickers","onSilentSend","onScheduleSend","listEmojis","usePrevDuringAnimation","handleSelectEmoji","selectedIndex","setItemVisible","thumbUrl","thumbnailDataUrl","decoding","isForGallery","inlineResult","webThumbnail","STICKER_SIZE_INLINE_BOT_RESULT","isGallery","inlineBotResults","switchPm","startBot","onSelectResult","handleSendPm","startParam","prevInlineBotResults","renderedInlineBotResults","sensitiveArea","inlineBotResult","messagesById","foundResults","senderUser","getGlobal","senderChat","forwardInfo","isChannelPost","orderBy","foundResult","preloadBackwards","LastMessageMeta","selectShouldLoopStickers","isSomeModalOpen","onModalToggle","isAdded","areStickersLoaded","useOnChange","coverStickerIds","covers","otherStickers","handleAddClick","canRenderStickers","STICKER_SIZE_SEARCH","selectCurrentStickerSearch","featured","featuredIds","loadFeaturedStickers","setIsModalOpen","selectCurrentGifSearch","isChatWithBot","selectIsChatWithBot","searchMoreGifs","setGifSearchQuery","handleGifClick","hasResults","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","isNotificationsEnabled","setIsNotificationsEnabled","ManagementProgress","handleNotificationChange","handleDeleteContact","withFullInfo","GROUP_TITLE_EMPTY","hasLinkedChannel","isBasicGroup","canChangeInfo","isCreator","getHasAdminRight","canBanUsers","togglePreHistoryHidden","updateChat","deleteChat","leaveChannel","deleteChannel","currentTitle","currentAbout","imageHash","handleClickEditType","ManagementScreens","handleClickDiscussion","handleClickPermissions","handleClickAdministrators","handleSetPhoto","handleAboutChange","handleUpdateGroup","trimmedTitle","trimmedAbout","handleClickMembers","handleTogglePreHistory","isPreHistoryHidden","isEnabled","enabledPermissionsCount","defaultBannedRights","sendStickers","sendGifs","adminsCount","adminMembers","handleDeleteGroup","formatInteger","onChatMemberSelect","updateChatDefaultBannedRights","permissions","setPermissions","havePermissionChanged","setHavePermissionChanged","handleRemovedUsersClick","handleAddExceptionClick","handleExceptionMemberClick","promotedByUserId","handlePermissionChange","getUpdatedPermissionValue","handleSavePermissions","bannedRights","removedUsersCount","kickedMembers","exceptionMembers","members","getMemberExceptions","langKey","getLangKeyForBannedRightKey","translatedString","sendMessages","blocking","sendMedia","sendPolls","embedLinks","inviteUsers","pinMessages","changeInfo","loadMoreMembers","deleteChatMember","usersId","isAdmin","isOwner","canDeleteMembers","updateChatMemberBannedRights","isRemoveUserModalOpen","openRemoveUserModal","closeRemoveUserModal","removedMembers","getRemovedBy","kickedByUserId","kickedByUser","getContextActions","CHANNEL_TITLE_EMPTY","isSignaturesShown","toggleSignatures","handleUpdateChannel","handleToggleSignatures","handleClickSubscribers","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","handleLinkGroupSessions","STICKER_SIZE_DISCUSSION_GROUPS","teactFastList","teactOrderKey","linkedGroup","renderLinkGroupHeader","hasPrivateLink","renderLinkGroupConfirmText","isButtonsInOneRow","isPromotedByCurrentUser","isFormFullyDisabled","selectedChatMemberId","isBanConfirmationDialogOpen","openBanConfirmationDialog","closeBanConfirmationDialog","selectedChatMember","handleBanFromGroup","viewMessages","getControlIsDisabled","handleAdminMemberClick","getMemberStatus","promotedByUser","updateChatAdmin","setIsTouched","isDismissConfirmationDialogOpen","openDismissConfirmationDialog","closeDismissConfirmationDialog","customTitle","setCustomTitle","adminRights","handleDismissAdmin","memberStatus","handleCustomTitleChange","postMessages","editMessages","banUsers","addAdmins","manageCall","anonymous","maxLength","openUserInfo","memberId","managementType","selectCurrentManagementType","VISA","MASTERCARD1","MASTERCARD2","CardType","cards","Default","Visa","Mastercard","detectCardType","cardNumber","formatsCache","defaultPhoneNumberFormat","str","flag","phoneFormat","format","formatValue","phoneNumberFormat","phoneNumberGroups","RegExp","repeat","getPhoneNumberFormat","streetLine1","streetLine2","city","countryIso2","postCode","phone","shipping","cardholder","expiry","cvv","billingCountry","billingZip","saveInfo","saveCredentials","formErrors","reducer","getBillingCountry","countryCode","useFocusAfterAnimation","animationDuration","hasArrow","labelText","htmlFor","needEmail","needPhone","needName","needAddress","phoneRef","selectCountryRef","handleAddress1Change","handleAddress2Change","handleCityChange","handleStateChange","handleCountryChange","handlePostCodeChange","handleFullNameChange","handleEmailChange","handlePhoneChange","handleSaveInfoChange","shippingOptions","currency","handleShippingSelect","amount","formatCurrency","renderPaymentItem","main","renderCheckoutItem","invoiceContent","prices","shippingPrices","checkoutInfo","totalPrice","photoUrl","paymentMethod","paymentProvider","shippingAddress","shippingMethod","expiryInputRef","charAt","parts","formatCardExpiry","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","validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError","paymentState","paymentDispatch","field","handleErrorModalClose","PaymentStep","shippingOption","getShippingPrices","cur","getTotalPrice","detectCardTypeText","findShippingOption","getCheckoutInfo","validateRequest","requestInfo","getRequestInfo","sendCredentials","credentials","expiryMonth","expiryYear","zip","getCredentials","sendForm","shippingOptionId","setStep","nextStep","buttonText","currentStep","renderModalContent","renderError","optionId","receipt","info","totalAmount","credentialsTitle","fullAddress","onInputChange","setPassword","canSubmit","setCanSubmit","select","autoComplete","MIN_PASSWORD_LENGTH","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","ANIMATED_STICKERS_PATHS","MonkeyIdle","MonkeyTracking","MonkeyClose","MonkeyPeek","FoldersAll","FoldersNew","DiscussionGroups","CameraFlip","HandFilled","HandOutline","Speaker","VoiceAllowTalk","VoiceMini","VoiceMuted","VoiceOutlined","path","location","cropperResultOptions","quality","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"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/701.f1f158c205e1345450d1.js.map b/dist/701.f1f158c205e1345450d1.js.map deleted file mode 100644 index b15a4a3e4..000000000 --- a/dist/701.f1f158c205e1345450d1.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"701.f1f158c205e1345450d1.js","mappings":"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","sources":["webpack://telegram-t/./src/components/mediaViewer/helpers/ghostAnimation.ts","webpack://telegram-t/./src/components/mediaViewer/SenderInfo.tsx","webpack://telegram-t/./src/components/mediaViewer/MediaViewerActions.tsx","webpack://telegram-t/./src/components/mediaViewer/MediaViewerFooter.tsx","webpack://telegram-t/./src/hooks/useFullscreen.ts","webpack://telegram-t/./src/components/mediaViewer/helpers/formatFileSize.ts","webpack://telegram-t/./src/components/mediaViewer/VideoPlayerControls.tsx","webpack://telegram-t/./src/components/mediaViewer/VideoPlayer.tsx","webpack://telegram-t/./src/components/mediaViewer/ZoomControls.tsx","webpack://telegram-t/./src/components/mediaViewer/PanZoom.tsx","webpack://telegram-t/./src/components/mediaViewer/MediaViewer.tsx","webpack://telegram-t/./src/components/common/ChatOrUserPicker.tsx","webpack://telegram-t/./src/components/main/ForwardPicker.tsx","webpack://telegram-t/./src/components/main/Dialogs.tsx","webpack://telegram-t/./src/components/main/Notifications.tsx","webpack://telegram-t/./src/components/main/SafeLinkModal.tsx","webpack://telegram-t/./src/components/common/CalendarModal.tsx","webpack://telegram-t/./src/components/main/HistoryCalendar.tsx","webpack://telegram-t/./src/components/common/DeleteMessageModal.tsx","webpack://telegram-t/./src/components/common/PinMessageModal.tsx","webpack://telegram-t/./src/components/common/UnpinAllMessagesModal.tsx","webpack://telegram-t/./src/components/middle/DeleteSelectedMessageModal.tsx","webpack://telegram-t/./src/components/common/ReportMessageModal.tsx","webpack://telegram-t/./src/components/middle/MessageSelectToolbar.tsx","webpack://telegram-t/./src/hooks/useSelectWithEnter.ts","webpack://telegram-t/./src/components/left/search/LeftSearchResultChat.tsx","webpack://telegram-t/./src/components/left/search/RecentContacts.tsx","webpack://telegram-t/./src/components/left/search/ChatMessage.tsx","webpack://telegram-t/./src/components/left/search/DateSuggest.tsx","webpack://telegram-t/./src/components/left/search/ChatResults.tsx","webpack://telegram-t/./src/components/left/search/ChatMessageResults.tsx","webpack://telegram-t/./src/components/left/search/helpers/createMapStateToProps.ts","webpack://telegram-t/./src/components/left/search/MediaResults.tsx","webpack://telegram-t/./src/components/left/search/LinkResults.tsx","webpack://telegram-t/./src/components/left/search/FileResults.tsx","webpack://telegram-t/./src/components/left/search/AudioResults.tsx","webpack://telegram-t/./src/components/left/search/LeftSearch.tsx","webpack://telegram-t/./src/hooks/reducers/useTwoFaReducer.ts","webpack://telegram-t/./src/components/left/settings/SettingsHeader.tsx","webpack://telegram-t/./src/components/left/settings/SettingsMain.tsx","webpack://telegram-t/./src/components/common/UsernameInput.tsx","webpack://telegram-t/./src/components/left/settings/SettingsEditProfile.tsx","webpack://telegram-t/./src/components/left/settings/SettingsDataStorage.tsx","webpack://telegram-t/./src/components/left/settings/folders/SettingsFoldersMain.tsx","webpack://telegram-t/./src/components/ui/ShowMoreButton.tsx","webpack://telegram-t/./src/components/left/settings/folders/SettingsFoldersEdit.tsx","webpack://telegram-t/./src/components/left/settings/folders/SettingsFoldersChatsPicker.tsx","webpack://telegram-t/./src/components/left/settings/folders/SettingsFoldersChatFilters.tsx","webpack://telegram-t/./src/components/left/settings/folders/SettingsFolders.tsx","webpack://telegram-t/./src/components/middle/composer/StickerSetCoverAnimated.tsx","webpack://telegram-t/./src/components/middle/composer/StickerSetCover.tsx","webpack://telegram-t/./src/components/left/settings/SettingsStickerSet.tsx","webpack://telegram-t/./src/components/left/settings/SettingsGeneral.tsx","webpack://telegram-t/./src/util/systemFilesDialog.ts","webpack://telegram-t/./src/util/colors.ts","webpack://telegram-t/./src/components/left/settings/WallpaperTile.tsx","webpack://telegram-t/./src/components/left/settings/SettingsGeneralBackground.tsx","webpack://telegram-t/./src/components/left/settings/SettingsGeneralBackgroundColor.tsx","webpack://telegram-t/./src/components/left/settings/SettingsNotifications.tsx","webpack://telegram-t/./src/components/left/settings/SettingsPrivacy.tsx","webpack://telegram-t/./src/components/left/settings/SettingsLanguage.tsx","webpack://telegram-t/./src/components/left/settings/helper/privacy.ts","webpack://telegram-t/./src/components/left/settings/SettingsPrivacyVisibility.tsx","webpack://telegram-t/./src/components/left/settings/SettingsPrivacyActiveSessions.tsx","webpack://telegram-t/./src/components/left/settings/BlockUserModal.tsx","webpack://telegram-t/./src/components/left/settings/SettingsPrivacyBlockedUsers.tsx","webpack://telegram-t/./src/components/left/settings/twoFa/SettingsTwoFaEnabled.tsx","webpack://telegram-t/./src/components/left/settings/twoFa/SettingsTwoFaPassword.tsx","webpack://telegram-t/./src/components/left/settings/twoFa/SettingsTwoFaStart.tsx","webpack://telegram-t/./src/components/left/settings/twoFa/SettingsTwoFaSkippableForm.tsx","webpack://telegram-t/./src/components/left/settings/twoFa/SettingsTwoFaCongratulations.tsx","webpack://telegram-t/./src/components/left/settings/twoFa/SettingsTwoFaEmailCode.tsx","webpack://telegram-t/./src/components/left/settings/twoFa/SettingsTwoFa.tsx","webpack://telegram-t/./src/components/left/settings/SettingsPrivacyVisibilityExceptionList.tsx","webpack://telegram-t/./src/components/left/settings/Settings.tsx","webpack://telegram-t/./src/components/left/main/ContactList.tsx","webpack://telegram-t/./src/components/left/newChat/NewChatStep1.tsx","webpack://telegram-t/./src/components/left/newChat/NewChatStep2.tsx","webpack://telegram-t/./src/components/left/newChat/NewChat.tsx","webpack://telegram-t/./src/components/left/ArchivedChats.tsx","webpack://telegram-t/./src/components/left/ChatFolderModal.tsx","webpack://telegram-t/./src/components/middle/message/helpers/copyOptions.ts","webpack://telegram-t/./src/util/scrollLock.ts","webpack://telegram-t/./src/components/middle/message/MessageContextMenu.tsx","webpack://telegram-t/./src/components/middle/message/ContextMenuContainer.tsx","webpack://telegram-t/./src/components/common/StickerSetModal.tsx","webpack://telegram-t/./src/components/middle/HeaderMenuContainer.tsx","webpack://telegram-t/./src/components/middle/MobileSearch.tsx","webpack://telegram-t/./src/util/findInViewport.ts","webpack://telegram-t/./src/util/isFullyVisible.ts","webpack://telegram-t/./src/util/setTooltipItemVisible.ts","webpack://telegram-t/./src/components/middle/composer/hooks/useKeyboardNavigation.ts","webpack://telegram-t/./src/components/middle/composer/MentionTooltip.tsx","webpack://telegram-t/./src/components/middle/composer/AttachmentModal.tsx","webpack://telegram-t/./src/components/middle/composer/PollModal.tsx","webpack://telegram-t/./src/components/middle/composer/EmojiButton.tsx","webpack://telegram-t/./src/components/middle/composer/EmojiCategory.tsx","webpack://telegram-t/./src/components/middle/composer/EmojiPicker.tsx","webpack://telegram-t/./src/components/middle/composer/StickerSet.tsx","webpack://telegram-t/./src/components/middle/composer/StickerPicker.tsx","webpack://telegram-t/./src/components/common/GifButton.tsx","webpack://telegram-t/./src/components/middle/composer/GifPicker.tsx","webpack://telegram-t/./src/components/middle/composer/SymbolMenuFooter.tsx","webpack://telegram-t/./src/components/middle/composer/SymbolMenu.tsx","webpack://telegram-t/./src/components/middle/composer/AttachMenu.tsx","webpack://telegram-t/./src/components/middle/composer/BotCommand.tsx","webpack://telegram-t/./src/components/middle/composer/BotCommandTooltip.tsx","webpack://telegram-t/./src/components/middle/composer/BotCommandMenu.tsx","webpack://telegram-t/./src/components/middle/composer/StickerTooltip.tsx","webpack://telegram-t/./src/components/middle/composer/CustomSendMenu.tsx","webpack://telegram-t/./src/components/middle/composer/EmojiTooltip.tsx","webpack://telegram-t/./src/components/middle/composer/inlineResults/BaseResult.tsx","webpack://telegram-t/./src/components/middle/composer/inlineResults/MediaResult.tsx","webpack://telegram-t/./src/components/middle/composer/inlineResults/ArticleResult.tsx","webpack://telegram-t/./src/components/middle/composer/inlineResults/GifResult.tsx","webpack://telegram-t/./src/components/middle/composer/inlineResults/StickerResult.tsx","webpack://telegram-t/./src/components/middle/composer/InlineBotTooltip.tsx","webpack://telegram-t/./src/components/right/RightSearch.tsx","webpack://telegram-t/./src/components/right/StickerSetResult.tsx","webpack://telegram-t/./src/components/right/StickerSearch.tsx","webpack://telegram-t/./src/components/right/GifSearch.tsx","webpack://telegram-t/./src/components/right/PollAnswerResults.tsx","webpack://telegram-t/./src/components/right/PollResults.tsx","webpack://telegram-t/./src/components/right/management/ManageUser.tsx","webpack://telegram-t/./src/components/right/management/ManageGroup.tsx","webpack://telegram-t/./src/components/right/management/ManageGroupPermissions.tsx","webpack://telegram-t/./src/components/right/management/RemoveGroupUserModal.tsx","webpack://telegram-t/./src/components/right/management/ManageGroupRemovedUsers.tsx","webpack://telegram-t/./src/components/right/management/ManageChannel.tsx","webpack://telegram-t/./src/components/right/management/ManageChatPrivacyType.tsx","webpack://telegram-t/./src/components/right/management/ManageDiscussion.tsx","webpack://telegram-t/./src/components/right/management/ManageGroupUserPermissions.tsx","webpack://telegram-t/./src/components/right/management/ManageChatAdministrators.tsx","webpack://telegram-t/./src/components/right/management/ManageGroupRecentActions.tsx","webpack://telegram-t/./src/components/right/management/ManageGroupAdminRights.tsx","webpack://telegram-t/./src/components/right/management/ManageGroupMembers.tsx","webpack://telegram-t/./src/components/right/management/ManageGroupUserPermissionsCreate.tsx","webpack://telegram-t/./src/components/right/management/Management.tsx","webpack://telegram-t/./src/components/common/helpers/detectCardType.ts","webpack://telegram-t/./src/util/countries.ts","webpack://telegram-t/./src/hooks/reducers/usePaymentReducer.ts","webpack://telegram-t/./src/hooks/useFocusAfterAnimation.tsx","webpack://telegram-t/./src/components/ui/Select.tsx","webpack://telegram-t/./src/components/payment/ShippingInfo.tsx","webpack://telegram-t/./src/components/payment/Shipping.tsx","webpack://telegram-t/./src/components/payment/Checkout.tsx","webpack://telegram-t/./src/components/payment/ExpiryInput.tsx","webpack://telegram-t/./src/components/middle/helpers/inputFormatters.ts","webpack://telegram-t/./src/components/payment/CardInput.tsx","webpack://telegram-t/./src/components/payment/PaymentInfo.tsx","webpack://telegram-t/./src/components/payment/PaymentModal.tsx","webpack://telegram-t/./src/components/payment/ReceiptModal.tsx","webpack://telegram-t/./src/components/common/PasswordForm.tsx","webpack://telegram-t/./src/components/common/PasswordMonkey.tsx","webpack://telegram-t/./src/components/common/helpers/animatedAssets.ts","webpack://telegram-t/./src/components/ui/CropModal.tsx","webpack://telegram-t/./src/components/ui/AvatarEditable.tsx"],"sourcesContent":["import { ApiMessage, ApiDimensions } from '../../../api/types';\n\nimport { MediaViewerOrigin } from '../../../types';\n\nimport { ANIMATION_END_DELAY } from '../../../config';\nimport {\n calculateDimensions,\n getMediaViewerAvailableDimensions,\n MEDIA_VIEWER_MEDIA_QUERY,\n REM,\n} from '../../common/helpers/mediaDimensions';\nimport windowSize from '../../../util/windowSize';\n\nconst ANIMATION_DURATION = 200;\n\nexport function animateOpening(\n hasFooter: boolean,\n origin: MediaViewerOrigin,\n bestImageData: string,\n dimensions: ApiDimensions,\n isVideo: boolean,\n message?: ApiMessage,\n) {\n const { mediaEl: fromImage } = getNodes(origin, message);\n if (!fromImage) {\n return;\n }\n\n const { width: windowWidth } = windowSize.get();\n const {\n width: availableWidth, height: availableHeight,\n } = getMediaViewerAvailableDimensions(hasFooter, isVideo);\n const { width: toWidth, height: toHeight } = calculateDimensions(\n availableWidth, availableHeight, dimensions.width, dimensions.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 if (document.body.contains(ghost)) {\n document.body.removeChild(ghost);\n }\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 existingGhost = document.getElementsByClassName('ghost')[0] as HTMLDivElement;\n\n const ghost = existingGhost || createGhost(bestImageData || toImage, origin);\n if (!existingGhost) {\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\n requestAnimationFrame(() => {\n if (existingGhost) {\n const {\n top,\n left,\n width,\n height,\n } = existingGhost.getBoundingClientRect();\n const scaleX = width / toWidth;\n const scaleY = height / toHeight;\n\n applyStyles(ghost, {\n transition: 'none',\n top: `${toTop}px`,\n left: `${toLeft}px`,\n transformOrigin: 'top left',\n transform: `translate3d(${left - toLeft}px, ${top - toTop}px, 0) scale(${scaleX}, ${scaleY})`,\n width: `${toWidth}px`,\n height: `${toHeight}px`,\n });\n }\n document.body.classList.add('ghost-animating');\n if (!existingGhost) document.body.appendChild(ghost);\n\n requestAnimationFrame(() => {\n if (existingGhost) {\n existingGhost.style.transition = '';\n }\n\n ghost.style.transform = '';\n\n if (shouldFadeOut) {\n ghost.style.opacity = '0';\n }\n\n applyShape(ghost, origin);\n\n setTimeout(() => {\n requestAnimationFrame(() => {\n if (document.body.contains(ghost)) {\n document.body.removeChild(ghost);\n }\n document.body.classList.remove('ghost-animating');\n });\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n });\n });\n}\n\nfunction createGhost(source: string | HTMLImageElement | HTMLVideoElement, origin?: MediaViewerOrigin) {\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 if (origin === MediaViewerOrigin.ProfileAvatar || origin === MediaViewerOrigin.SettingsAvatar) {\n ghost.classList.add('ProfileInfo');\n if (origin === MediaViewerOrigin.SettingsAvatar) {\n ghost.classList.add('self');\n }\n const profileInfo = document.querySelector(\n origin === MediaViewerOrigin.ProfileAvatar\n ? '#RightColumn .ProfileInfo .info'\n : '#Settings .ProfileInfo .info',\n );\n if (profileInfo) {\n ghost.appendChild(profileInfo.cloneNode(true));\n }\n }\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.SettingsAvatar:\n containerSelector = '#Settings .ProfileInfo .active .ProfilePhoto';\n mediaSelector = 'img.avatar-media';\n break;\n\n case MediaViewerOrigin.ProfileAvatar:\n containerSelector = '#RightColumn .ProfileInfo .active .ProfilePhoto';\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.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.SettingsAvatar:\n case MediaViewerOrigin.ProfileAvatar:\n case MediaViewerOrigin.SearchResult:\n (ghost.firstChild as HTMLElement).style.objectFit = 'cover';\n break;\n\n case MediaViewerOrigin.MiddleHeaderAvatar:\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, isUserId } 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?: string;\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,\n messageId,\n sender,\n isAvatar,\n message,\n closeMediaViewer,\n focusMessage,\n}) => {\n const handleFocusMessage = useCallback(() => {\n closeMediaViewer();\n focusMessage({ chatId, messageId });\n }, [chatId, focusMessage, messageId, closeMediaViewer]);\n\n const lang = useLang();\n\n if (!sender || (!message && !isAvatar)) {\n return undefined;\n }\n\n const senderTitle = getSenderTitle(lang, sender);\n\n return (\n
\n {isUserId(sender.id) ? (\n \n ) : (\n \n )}\n
\n
\n {senderTitle && renderText(senderTitle)}\n
\n
\n {isAvatar\n ? lang('lng_mediaview_profile_photo')\n : formatMediaDateTime(lang, message!.date * 1000, true)}\n
\n
\n
\n );\n};\n\nexport default withGlobal(\n (global, { chatId, messageId, isAvatar }): StateProps => {\n if (isAvatar && chatId) {\n return {\n sender: isUserId(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,\n memo,\n useCallback,\n useMemo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiMessage } from '../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { getMessageMediaHash } from '../../modules/helpers';\nimport useLang from '../../hooks/useLang';\nimport useMediaWithLoadProgress from '../../hooks/useMediaWithLoadProgress';\nimport { selectIsDownloading } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\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 StateProps = {\n isDownloading: boolean;\n};\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\ntype DispatchProps = Pick;\n\nconst MediaViewerActions: FC = ({\n mediaData,\n isVideo,\n isZoomed,\n message,\n fileName,\n isAvatar,\n isDownloading,\n onCloseMediaViewer,\n onForward,\n onZoomToggle,\n downloadMessageMedia,\n cancelMessageMediaDownload,\n}) => {\n const { loadProgress: downloadProgress } = useMediaWithLoadProgress(\n message && getMessageMediaHash(message, 'download'),\n !isDownloading,\n );\n\n const handleDownloadClick = useCallback(() => {\n if (isDownloading) {\n cancelMessageMediaDownload({ message });\n } else {\n downloadMessageMedia({ message });\n }\n }, [cancelMessageMediaDownload, downloadMessageMedia, isDownloading, message]);\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_SINGLE_COLUMN_LAYOUT) {\n return (\n
\n \n {!isAvatar && (\n \n {lang('Forward')}\n \n )}\n {isVideo ? (\n \n {isDownloading ? `${Math.round(downloadProgress * 100)}% Downloading...` : 'Download'}\n \n ) : (\n \n {lang('AccActionDownload')}\n \n )}\n \n {isDownloading && }\n
\n );\n }\n\n return (\n
\n {!isAvatar && (\n <>\n \n \n \n \n )}\n {isVideo ? (\n \n {isDownloading ? (\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, { message }): StateProps => {\n const isDownloading = message ? selectIsDownloading(global, message) : false;\n\n return {\n isDownloading,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'downloadMessageMedia',\n 'cancelMessageMediaDownload',\n ]),\n)(MediaViewerActions));\n","import React, { FC, useEffect, useState } from '../../lib/teact/teact';\n\nimport { throttle } from '../../util/schedulers';\nimport { TextPart } from '../common/helpers/renderMessageText';\nimport buildClassName from '../../util/buildClassName';\nimport { REM } from '../common/helpers/mediaDimensions';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\n\nimport './MediaViewerFooter.scss';\n\nconst RESIZE_THROTTLE_MS = 500;\n\ntype OwnProps = {\n text: TextPart | TextPart[];\n onClick: () => void;\n isHidden?: boolean;\n isForVideo: boolean;\n};\n\nconst MediaViewerFooter: FC = ({\n text = '', isHidden, isForVideo, onClick,\n}) => {\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 const classNames = buildClassName(\n 'MediaViewerFooter',\n isForVideo && 'is-for-video',\n isHidden && 'is-hidden',\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, {\n FC, useState, useEffect, useRef, useCallback,\n} from '../../lib/teact/teact';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { formatMediaDuration } from '../../util/dateFormat';\nimport formatFileSize from './helpers/formatFileSize';\nimport useLang from '../../hooks/useLang';\nimport { captureEvents } from '../../util/captureEvents';\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: (position: number) => void;\n};\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 // eslint-disable-next-line no-null/no-null\n const seekerRef = useRef(null);\n const isSeeking = useRef(false);\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_SINGLE_COLUMN_LAYOUT) {\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 const handleSeek = useCallback((e: MouseEvent | TouchEvent) => {\n if (isSeeking.current && seekerRef.current) {\n const { width, left } = seekerRef.current.getBoundingClientRect();\n const clientX = e instanceof MouseEvent ? e.clientX : e.targetTouches[0].clientX;\n onSeek(Math.max(Math.min(duration * ((clientX - left) / width), duration), 0));\n }\n }, [duration, onSeek]);\n\n const handleStartSeek = useCallback((e: MouseEvent | TouchEvent) => {\n isSeeking.current = true;\n handleSeek(e);\n }, [handleSeek]);\n\n const handleStopSeek = useCallback(() => {\n isSeeking.current = false;\n }, []);\n\n useEffect(() => {\n if (!seekerRef.current || !isVisible) return undefined;\n return captureEvents(seekerRef.current, {\n onCapture: handleStartSeek,\n onRelease: handleStopSeek,\n onClick: handleStopSeek,\n onDrag: handleSeek,\n });\n }, [isVisible, handleStartSeek, handleSeek, handleStopSeek]);\n\n if (!isVisible && !isForceVisible) {\n return undefined;\n }\n\n return (\n
\n {renderSeekLine(currentTime, duration, bufferedProgress, seekerRef)}\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(loadedPercent: number, totalSize: number) {\n return (\n
\n {`${formatFileSize(totalSize * loadedPercent)} / ${formatFileSize(totalSize)}`}\n
\n );\n}\n\nfunction renderSeekLine(\n currentTime: number, duration: number, bufferedProgress: number, seekerRef: React.RefObject,\n) {\n const percentagePlayed = (currentTime / duration) * 100;\n const percentageBuffered = bufferedProgress * 100;\n\n return (\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 { ApiDimensions } from '../../api/types';\n\nimport { IS_IOS, IS_SINGLE_COLUMN_LAYOUT, 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';\nimport Button from '../ui/Button';\n\nimport './VideoPlayer.scss';\n\ntype OwnProps = {\n url?: string;\n isGif?: boolean;\n posterData?: string;\n posterSize?: ApiDimensions;\n loadProgress?: 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 loadProgress,\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 const {\n shouldRender: shouldRenderPlayButton,\n transitionClassNames: playButtonClassNames,\n } = useShowTransition(IS_IOS && !isPlayed && !shouldRenderSpinner, 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 safePlay(videoRef.current!);\n setIsPlayed(true);\n if (IS_SINGLE_COLUMN_LAYOUT) {\n setIsControlsVisible(false);\n }\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 setIsControlsVisible(true);\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((position: number) => {\n videoRef.current!.currentTime = position;\n }, []);\n\n const toggleControls = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n setIsControlsVisible(!isControlsVisible);\n if (!isControlsVisible) {\n videoRef.current!.pause();\n setIsPlayed(false);\n }\n }, [isControlsVisible]);\n\n useEffect(() => {\n const togglePayingStateBySpace = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\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 setIsPlayed(true) : undefined}\n onEnded={handleEnded}\n onClick={!IS_SINGLE_COLUMN_LAYOUT ? togglePlayState : undefined}\n onDoubleClick={handleFullscreenChange}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...bufferingHandlers}\n onTimeUpdate={handleTimeUpdate}\n >\n {url && }\n \n
\n {shouldRenderPlayButton && (\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_SINGLE_COLUMN_LAYOUT } 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, ApiDimensions,\n} from '../../api/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport { IS_IOS, IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../util/environment';\nimport windowSize from '../../util/windowSize';\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 getMessageFileName,\n getMessageMediaFormat,\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n getMessagePhoto,\n getMessageVideo,\n getMessageDocument,\n isMessageDocumentPhoto,\n isMessageDocumentVideo,\n getMessageWebPagePhoto,\n getMessageWebPageVideo,\n getPhotoFullDimensions,\n getVideoDimensions, getMessageFileSize,\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 useMediaWithLoadProgress from '../../hooks/useMediaWithLoadProgress';\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';\nimport useHistoryBack from '../../hooks/useHistoryBack';\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?: string;\n threadId?: number;\n messageId?: number;\n senderId?: string;\n origin?: MediaViewerOrigin;\n avatarOwner?: ApiChat | ApiUser;\n profilePhotoIndex?: number;\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 profilePhotoIndex,\n message,\n chatMessages,\n collectionIds,\n openMediaViewer,\n closeMediaViewer,\n openForwardMenu,\n focusMessage,\n animationLevel,\n}) => {\n const isOpen = Boolean(avatarOwner || messageId);\n\n const isFromSharedMedia = origin === MediaViewerOrigin.SharedMedia;\n const isFromSearch = origin === MediaViewerOrigin.SearchResult;\n\n /* Content */\n const photo = message ? getMessagePhoto(message) : undefined;\n const video = message ? getMessageVideo(message) : undefined;\n const webPagePhoto = message ? getMessageWebPagePhoto(message) : undefined;\n const webPageVideo = message ? getMessageWebPageVideo(message) : undefined;\n const isDocumentPhoto = message ? isMessageDocumentPhoto(message) : false;\n const isDocumentVideo = message ? isMessageDocumentVideo(message) : false;\n const isVideo = Boolean(video || webPageVideo || isDocumentVideo);\n const isPhoto = Boolean(!isVideo && (photo || webPagePhoto || isDocumentPhoto));\n const { isGif } = video || webPageVideo || {};\n const isAvatar = Boolean(avatarOwner);\n\n /* Navigation */\n const isSingleSlide = Boolean(webPagePhoto || webPageVideo);\n const messageIds = useMemo(() => {\n return isSingleSlide && messageId\n ? [messageId]\n : getChatMediaMessageIds(chatMessages || {}, collectionIds || [], isFromSharedMedia);\n }, [isSingleSlide, 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\n /* Animation */\n const animationKey = useRef();\n const prevSenderId = usePrevious(senderId);\n if (isOpen && (!prevSenderId || prevSenderId !== senderId || !animationKey.current)) {\n animationKey.current = selectedMediaMessageIndex;\n }\n const slideAnimation = animationLevel >= 1 ? 'mv-slide' : 'none';\n const headerAnimation = animationLevel === 2 ? 'slide-fade' : 'none';\n const isGhostAnimation = animationLevel === 2;\n\n /* Controls */\n const [isFooterHidden, setIsFooterHidden] = useState(false);\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 /* Media data */\n function getMediaHash(isFull?: boolean) {\n if (isAvatar && profilePhotoIndex !== undefined) {\n const { photos } = avatarOwner!;\n return photos && photos[profilePhotoIndex]\n ? `photo${photos[profilePhotoIndex].id}?size=c`\n : getChatAvatarHash(avatarOwner!, isFull ? 'big' : 'normal');\n }\n\n return message && getMessageMediaHash(message, isFull ? 'viewerFull' : 'viewerPreview');\n }\n\n const pictogramBlobUrl = useMedia(\n message && (isFromSharedMedia || isFromSearch) && getMessageMediaHash(message, 'pictogram'),\n undefined,\n ApiMediaFormat.BlobUrl,\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n const previewMediaHash = getMediaHash();\n const previewBlobUrl = useMedia(\n previewMediaHash,\n undefined,\n ApiMediaFormat.BlobUrl,\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n const { mediaData: fullMediaBlobUrl, loadProgress } = useMediaWithLoadProgress(\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 || fullMediaBlobUrl)) || previewBlobUrl || pictogramBlobUrl;\n const thumbDataUri = useBlurSync(!bestImageData && message && getMessageMediaThumbDataUri(message));\n if (!bestImageData && origin !== MediaViewerOrigin.SearchResult) {\n bestImageData = thumbDataUri;\n }\n\n const videoSize = message ? getMessageFileSize(message) : undefined;\n const fileName = message\n ? getMessageFileName(message)\n : isAvatar\n ? `avatar${avatarOwner!.id}-${profilePhotoIndex}.jpg`\n : undefined;\n\n let dimensions!: ApiDimensions;\n if (message) {\n if (isDocumentPhoto || isDocumentVideo) {\n dimensions = getMessageDocument(message)!.mediaSize!;\n } else if (photo || webPagePhoto) {\n dimensions = getPhotoFullDimensions((photo || webPagePhoto)!)!;\n } else if (video || webPageVideo) {\n dimensions = getVideoDimensions((video || webPageVideo)!)!;\n }\n } else {\n dimensions = AVATAR_FULL_DIMENSIONS;\n }\n\n useEffect(() => {\n if (!IS_SINGLE_COLUMN_LAYOUT) {\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!, dimensions, isVideo, 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, message, prevMessage, prevAvatarOwner,\n bestImageData, prevBestImageData, dimensions, isVideo,\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 // Prevent refresh when rotating device to watch a video\n useEffect(() => {\n if (!isOpen) {\n return undefined;\n }\n\n windowSize.disableRefresh();\n\n return () => {\n windowSize.enableRefresh();\n };\n }, [isOpen]);\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 && !IS_TOUCH_ENV) {\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 if (!(e.target && (e.target as HTMLElement).closest('.MediaViewerFooter'))) {\n close();\n }\n\n return true;\n } : undefined,\n });\n }, [close, isFooterHidden, isGif, isPhoto, isZoomed, selectNextMedia, selectPreviousMedia]);\n\n const handlePan = useCallback((x: number, y: number) => {\n setPanDelta({ x, y });\n }, []);\n\n const handleToggleFooterVisibility = useCallback(() => {\n if (IS_TOUCH_ENV && (isPhoto || isGif)) {\n setIsFooterHidden(!isFooterHidden);\n }\n }, [isFooterHidden, isGif, isPhoto]);\n\n const lang = useLang();\n\n useHistoryBack(isOpen, closeMediaViewer, openMediaViewer, {\n chatId,\n threadId,\n messageId,\n origin,\n avatarOwnerId: avatarOwner && avatarOwner.id,\n });\n\n function renderSlide(isActive: boolean) {\n if (isAvatar) {\n return (\n
\n {renderPhoto(\n fullMediaBlobUrl || previewBlobUrl,\n calculateMediaViewerDimensions(AVATAR_FULL_DIMENSIONS, false),\n !IS_SINGLE_COLUMN_LAYOUT && !isZoomed,\n )}\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 || fullMediaBlobUrl || previewBlobUrl || pictogramBlobUrl,\n message && calculateMediaViewerDimensions(dimensions!, hasFooter),\n !IS_SINGLE_COLUMN_LAYOUT && !isZoomed,\n )}\n {isVideo && (\n \n )}\n {textParts && (\n \n )}\n \n );\n }\n\n return undefined;\n }\n\n function renderSenderInfo() {\n return isAvatar ? (\n \n ) : (\n \n );\n }\n\n return (\n \n {() => (\n <>\n
\n {IS_SINGLE_COLUMN_LAYOUT && (\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?: ApiDimensions, canDrag?: boolean) {\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, profilePhotoIndex, 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 = selectUser(global, avatarOwnerId) || selectChat(global, avatarOwnerId);\n\n return {\n messageId: -1,\n senderId: avatarOwnerId,\n avatarOwner: sender,\n profilePhotoIndex: profilePhotoIndex || 0,\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 { RefObject } from 'react';\nimport React, {\n FC, memo, useRef, useCallback,\n} from '../../lib/teact/teact';\n\nimport useInfiniteScroll from '../../hooks/useInfiniteScroll';\nimport useLang from '../../hooks/useLang';\nimport useKeyboardListNavigation from '../../hooks/useKeyboardListNavigation';\nimport useInputFocusOnOpen from '../../hooks/useInputFocusOnOpen';\nimport { isUserId } from '../../modules/helpers';\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 GroupChatInfo from './GroupChatInfo';\nimport PrivateChatInfo from './PrivateChatInfo';\n\nimport './ChatOrUserPicker.scss';\n\nexport type OwnProps = {\n currentUserId?: string;\n chatOrUserIds: string[];\n isOpen: boolean;\n filterRef: RefObject;\n filterPlaceholder: string;\n filter: string;\n onFilterChange: (filter: string) => void;\n loadMore: NoneToVoidFunction;\n onSelectChatOrUser: (chatOrUserId: string) => void;\n onClose: NoneToVoidFunction;\n};\n\nconst ChatOrUserPicker: FC = ({\n isOpen,\n currentUserId,\n chatOrUserIds,\n filterRef,\n filter,\n filterPlaceholder,\n onFilterChange,\n onClose,\n loadMore,\n onSelectChatOrUser,\n}) => {\n const lang = useLang();\n const [viewportIds, getMore] = useInfiniteScroll(loadMore, chatOrUserIds, Boolean(filter));\n\n useInputFocusOnOpen(filterRef, isOpen, () => { onFilterChange(''); });\n\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const handleFilterChange = useCallback((e: React.ChangeEvent) => {\n onFilterChange(e.currentTarget.value);\n }, [onFilterChange]);\n const handleKeyDown = useKeyboardListNavigation(containerRef, isOpen, (index) => {\n if (viewportIds && viewportIds.length > 0) {\n onSelectChatOrUser(viewportIds[index === -1 ? 0 : index]);\n }\n }, '.ListItem-button', true);\n\n const modalHeader = (\n
\n \n \n \n \n
\n );\n\n return (\n \n {viewportIds?.length ? (\n \n {viewportIds.map((id) => (\n onSelectChatOrUser(id)}\n >\n {isUserId(id) ? (\n \n ) : (\n \n )}\n \n ))}\n \n ) : viewportIds && !viewportIds.length ? (\n

{lang('lng_blocked_list_not_found')}

\n ) : (\n \n )}\n \n );\n};\n\nexport default memo(ChatOrUserPicker);\n","import React, {\n FC, useMemo, useState, memo, useRef, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, MAIN_THREAD_ID } from '../../api/types';\n\nimport { getCanPostInChat, getChatTitle, sortChatIds } from '../../modules/helpers';\nimport searchWords from '../../util/searchWords';\nimport { pick, unique } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport ChatOrUserPicker from '../common/ChatOrUserPicker';\n\nexport type OwnProps = {\n isOpen: boolean;\n};\n\ntype StateProps = {\n chatsById: Record;\n pinnedIds?: string[];\n activeListIds?: string[];\n archivedListIds?: string[];\n orderedPinnedIds?: string[];\n currentUserId?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst ForwardPicker: FC = ({\n chatsById,\n pinnedIds,\n activeListIds,\n archivedListIds,\n currentUserId,\n isOpen,\n setForwardChatId,\n exitForwardMode,\n loadMoreChats,\n}) => {\n const lang = useLang();\n const [filter, setFilter] = useState('');\n // eslint-disable-next-line no-null/no-null\n const filterRef = useRef(null);\n\n const chatIds = useMemo(() => {\n const listIds = [\n ...(activeListIds || []),\n ...(archivedListIds || []),\n ];\n\n let priorityIds = pinnedIds || [];\n if (currentUserId) {\n priorityIds = unique([currentUserId, ...priorityIds]);\n }\n\n return sortChatIds([\n ...listIds.filter((id) => {\n const chat = chatsById[id];\n if (!chat) {\n return true;\n }\n\n if (!getCanPostInChat(chat, MAIN_THREAD_ID)) {\n return false;\n }\n\n if (!filter) {\n return true;\n }\n\n return searchWords(getChatTitle(lang, chatsById[id], undefined, id === currentUserId), filter);\n }),\n ], chatsById, undefined, priorityIds);\n }, [activeListIds, archivedListIds, chatsById, currentUserId, filter, lang, pinnedIds]);\n\n const handleSelectUser = useCallback((userId: string) => {\n setForwardChatId({ id: userId });\n }, [setForwardChatId]);\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 currentUserId,\n } = global;\n\n return {\n chatsById,\n pinnedIds: orderedPinnedIds.active,\n activeListIds: listIds.active,\n archivedListIds: listIds.archived,\n currentUserId,\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, ApiInviteInfo } from '../../api/types';\n\nimport getReadableErrorText from '../../util/getReadableErrorText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\nimport renderText from '../common/helpers/renderText';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './Dialogs.scss';\n\ntype StateProps = {\n dialogs: (ApiError | ApiInviteInfo)[];\n};\n\ntype DispatchProps = Pick;\n\nconst Dialogs: FC = ({ dialogs, dismissDialog, acceptInviteConfirmation }) => {\n const lang = useLang();\n\n if (!dialogs.length) {\n return undefined;\n }\n\n const renderInvite = (invite: ApiInviteInfo) => {\n const {\n hash, title, participantsCount, isChannel,\n } = invite;\n\n const handleJoinClick = () => {\n acceptInviteConfirmation({\n hash,\n });\n dismissDialog();\n };\n\n const participantsText = isChannel\n ? lang('Subscribers', participantsCount, 'i')\n : lang('Members', participantsCount, 'i');\n\n const joinText = isChannel ? lang('ChannelJoin') : lang('JoinGroup');\n\n return (\n \n {participantsCount !== undefined &&

{participantsText}

}\n \n \n \n );\n };\n\n const renderError = (error: ApiError) => {\n return (\n \n {error.hasErrorKey ? getReadableErrorText(error) : renderText(error.message!, ['emoji', 'br'])}\n
\n \n
\n \n );\n };\n\n const renderDialog = (dialog: ApiError | ApiInviteInfo) => {\n if ('hash' in dialog) {\n return renderInvite(dialog);\n }\n\n return renderError(dialog);\n };\n\n return (\n
\n {dialogs.map(renderDialog)}\n
\n );\n};\n\nfunction getErrorHeader(error: ApiError) {\n if (error.isSlowMode) {\n return 'Slowmode enabled';\n }\n\n if (!error.hasErrorKey) {\n return 'Telegram';\n }\n\n return 'Something went wrong';\n}\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['dialogs']),\n (setGlobal, actions): DispatchProps => pick(actions, ['dismissDialog', 'acceptInviteConfirmation']),\n)(Dialogs));\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';\nimport renderText from '../common/helpers/renderText';\n\nimport Notification from '../ui/Notification';\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, localId }) => (\n dismissNotification({ localId })}\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, { FC, memo, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport { ensureProtocol } from '../../util/ensureProtocol';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\n\nimport ConfirmDialog from '../ui/ConfirmDialog';\n\nexport type OwnProps = {\n url?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst SafeLinkModal: FC = ({ url, toggleSafeLinkModal }) => {\n const lang = useLang();\n\n const handleOpen = useCallback(() => {\n window.open(ensureProtocol(url));\n toggleSafeLinkModal({ url: undefined });\n }, [toggleSafeLinkModal, url]);\n\n const handleDismiss = useCallback(() => {\n toggleSafeLinkModal({ url: undefined });\n }, [toggleSafeLinkModal]);\n\n const renderingUrl = useCurrentOrPrev(url);\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['toggleSafeLinkModal']),\n)(SafeLinkModal));\n","import React, {\n FC, memo, useState, useEffect, useMemo, useCallback,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport { formatTime, formatDateToString } from '../../util/dateFormat';\nimport useLang, { LangFn } from '../../hooks/useLang';\nimport usePrevious from '../../hooks/usePrevious';\nimport useFlag from '../../hooks/useFlag';\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 = [\n 'lng_weekday1',\n 'lng_weekday2',\n 'lng_weekday3',\n 'lng_weekday4',\n 'lng_weekday5',\n 'lng_weekday6',\n 'lng_weekday7',\n];\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 lang = useLang();\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 const prevIsOpen = usePrevious(isOpen);\n const [isTimeInputFocused, markTimeInputAsFocused, unmarkTimeInputAsFocused] = useFlag(false);\n\n const [selectedDate, setSelectedDate] = useState(defaultSelectedDate);\n const [currentMonthAndYear, setCurrentMonthAndYear] = useState(\n new Date(selectedDate.getFullYear(), selectedDate.getMonth(), 1),\n );\n const [selectedHours, setSelectedHours] = useState(\n formatInputTime(defaultSelectedDate.getHours()),\n );\n const [selectedMinutes, setSelectedMinutes] = useState(\n formatInputTime(defaultSelectedDate.getMinutes()),\n );\n\n const selectedDay = formatDay(selectedDate.getFullYear(), selectedDate.getMonth(), selectedDate.getDate());\n const currentYear = currentMonthAndYear.getFullYear();\n const currentMonth = currentMonthAndYear.getMonth();\n\n useEffect(() => {\n if (!prevIsOpen && isOpen) {\n setSelectedDate(defaultSelectedDate);\n setCurrentMonthAndYear(new Date(defaultSelectedDate.getFullYear(), defaultSelectedDate.getMonth(), 1));\n }\n }, [defaultSelectedDate, isOpen, prevIsOpen]);\n\n useEffect(() => {\n if (isFutureMode && !isTimeInputFocused && selectedDate.getTime() < defaultSelectedDate.getTime()) {\n setSelectedDate(defaultSelectedDate);\n setSelectedHours(formatInputTime(defaultSelectedDate.getHours()));\n setSelectedMinutes(formatInputTime(defaultSelectedDate.getMinutes()));\n }\n }, [defaultSelectedDate, isTimeInputFocused, isFutureMode, selectedDate]);\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 { prevMonthGrid, currentMonthGrid, nextMonthGrid } = useMemo(() => (\n buildCalendarGrid(currentYear, currentMonth)\n ), [currentMonth, currentYear]);\n\n function handlePrevMonth() {\n setCurrentMonthAndYear((d) => {\n const dateCopy = new Date(d);\n dateCopy.setMonth(dateCopy.getMonth() - 1);\n\n return dateCopy;\n });\n }\n\n function handleNextMonth() {\n setCurrentMonthAndYear((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 dateCopy.setMonth(currentMonth);\n dateCopy.setFullYear(currentYear);\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 {lang(`lng_month${currentMonth + 1}`)}\n {' '}\n {currentYear}\n

\n\n \n \n \n\n \n \n \n
\n
\n\n
\n
\n {WEEKDAY_LETTERS.map((day) => (\n
\n {lang(day)}\n
\n ))}\n {prevMonthGrid.map((gridDate) => (\n
{gridDate}
\n ))}\n {currentMonthGrid.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 selectedDay === formatDay(currentYear, currentMonth, gridDate) && 'selected',\n )}\n >\n {!!gridDate && (\n {gridDate}\n )}\n
\n ))}\n {nextMonthGrid.map((gridDate) => (\n
{gridDate}
\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 prevMonthGrid: number[] = [];\n const currentMonthGrid: number[] = [];\n const nextMonthGrid: number[] = [];\n\n const date = new Date();\n date.setDate(1);\n date.setMonth(month);\n date.setFullYear(year);\n const firstDay = date.getDay();\n const totalDaysInPrevMonth = new Date(year, month, 0).getDate();\n\n for (let i = 1; i < firstDay; i++) {\n prevMonthGrid.push(totalDaysInPrevMonth - firstDay + i + 1);\n }\n\n while (date.getMonth() === month) {\n const gridDate = date.getDate();\n currentMonthGrid.push(gridDate);\n date.setDate(gridDate + 1);\n }\n\n const lastRowDaysCount = (currentMonthGrid.length + prevMonthGrid.length) % 7;\n if (lastRowDaysCount > 0) {\n for (let i = 1; i <= 7 - lastRowDaysCount; i++) {\n nextMonthGrid.push(i);\n }\n }\n\n return { prevMonthGrid, currentMonthGrid, nextMonthGrid };\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 formatDay(year: number, month: number, day: number) {\n return `${year}-${month + 1}-${day}`;\n}\n\nfunction formatSubmitLabel(lang: LangFn, date: Date) {\n const day = formatDateToString(date, lang.code);\n const today = formatDateToString(new Date(), lang.code);\n\n if (day === today) {\n return lang('Conversation.ScheduleMessage.SendToday', formatTime(date, lang));\n }\n\n return lang('Conversation.ScheduleMessage.SendOn', [day, formatTime(date, lang)]);\n}\n\nexport default memo(CalendarModal);\n","import React, { FC, memo, useCallback } 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 CalendarModal from '../common/CalendarModal';\n\nexport type OwnProps = {\n isOpen: boolean;\n};\n\ntype StateProps = {\n selectedAt?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst HistoryCalendar: FC = ({\n isOpen, selectedAt, searchMessagesByDate, closeHistoryCalendar,\n}) => {\n const handleJumpToDate = useCallback((date: Date) => {\n searchMessagesByDate({ timestamp: date.valueOf() / 1000 });\n closeHistoryCalendar();\n }, [closeHistoryCalendar, searchMessagesByDate]);\n\n const lang = useLang();\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return { selectedAt: global.historyCalendarSelectedAt };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesByDate', 'closeHistoryCalendar',\n ]),\n)(HistoryCalendar));\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 isUserId,\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?.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?.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

{lang('lng_delete_for_me_chat_hint', 1, 'i')}

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

{lang('lng_delete_for_everyone_hint', 1, 'i')}

\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 && isUserId(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 isUserId,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n isChatChannel,\n} from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\nimport renderText from './helpers/renderText';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n chatId: string;\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 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 = isUserId(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 && isUserId(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';\n\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?: string;\n pinnedMessagesCount?: number;\n onClose: () => void;\n onUnpin: () => void;\n};\n\nconst UnpinAllMessagesModal: FC = ({\n isOpen,\n pinnedMessagesCount = 0,\n onClose,\n onUnpin,\n}) => {\n const lang = useLang();\n\n return (\n \n

{lang('Chat.UnpinAllMessagesConfirmation', pinnedMessagesCount, 'i')}

\n \n \n \n );\n};\n\nexport default memo(UnpinAllMessagesModal);\n","import React, {\n FC, useCallback, memo, useEffect,\n} 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 isUserId,\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';\nimport usePrevious from '../../hooks/usePrevious';\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 DeleteSelectedMessageModal: 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 prevIsOpen = usePrevious(isOpen);\n\n const handleDeleteMessageForAll = useCallback(() => {\n onClose();\n deleteMessages({ messageIds: selectedMessageIds, shouldDeleteForAll: true });\n }, [deleteMessages, 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 onClose();\n }, [isSchedule, onClose, deleteScheduledMessages, selectedMessageIds, deleteMessages]);\n\n const lang = useLang();\n\n // Returning `undefined` from FC instead of `` doesn't trigger useHistoryBack\n useEffect(() => {\n if (!isOpen && prevIsOpen) {\n exitMessageSelectMode();\n }\n }, [exitMessageSelectMode, isOpen, prevIsOpen]);\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 && isUserId(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)(DeleteSelectedMessageModal));\n","import { ChangeEvent } from 'react';\n\nimport React, {\n FC, memo, useCallback, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiReportReason } from '../../api/types';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\nimport RadioGroup from '../ui/RadioGroup';\nimport InputText from '../ui/InputText';\n\nexport type OwnProps = {\n isOpen: boolean;\n messageIds?: number[];\n onClose: () => void;\n};\n\ntype DispatchProps = Pick;\n\nconst ReportMessageModal: FC = ({\n isOpen,\n messageIds,\n reportMessages,\n exitMessageSelectMode,\n onClose,\n}) => {\n const [selectedReason, setSelectedReason] = useState('spam');\n const [description, setDescription] = useState('');\n\n const handleReport = () => {\n reportMessages({ messageIds, reason: selectedReason, description });\n exitMessageSelectMode();\n onClose();\n };\n\n const handleSelectReason = useCallback((value: string) => {\n setSelectedReason(value as ApiReportReason);\n }, []);\n\n const handleDescriptionChange = useCallback((e: ChangeEvent) => {\n setDescription(e.target.value);\n }, []);\n\n const lang = useLang();\n\n const REPORT_OPTIONS: { value: ApiReportReason; label: string }[] = [\n { value: 'spam', label: lang('lng_report_reason_spam') },\n { value: 'violence', label: lang('lng_report_reason_violence') },\n { value: 'pornography', label: lang('lng_report_reason_pornography') },\n { value: 'childAbuse', label: lang('lng_report_reason_child_abuse') },\n { value: 'copyright', label: lang('ReportPeer.ReasonCopyright') },\n { value: 'other', label: lang('lng_report_reason_other') },\n ];\n\n if (!messageIds) {\n return undefined;\n }\n\n return (\n \n \n \n \n \n \n );\n};\n\nexport default memo(withGlobal(\n undefined, (setGlobal, actions): DispatchProps => pick(actions, [\n 'reportMessages', 'exitMessageSelectMode',\n ]),\n)(ReportMessageModal));\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\n\nimport {\n selectCanDeleteSelectedMessages,\n selectCanDownloadSelectedMessages,\n selectCanReportSelectedMessages,\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';\n\nimport DeleteSelectedMessageModal from './DeleteSelectedMessageModal';\nimport ReportMessageModal from '../common/ReportMessageModal';\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 canReportMessages?: boolean;\n canDownloadMessages?: boolean;\n selectedMessageIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst MessageSelectToolbar: FC = ({\n canPost,\n isActive,\n messageListType,\n isSchedule,\n selectedMessagesCount,\n canDeleteMessages,\n canReportMessages,\n canDownloadMessages,\n selectedMessageIds,\n exitMessageSelectMode,\n openForwardMenuForSelectedMessages,\n downloadSelectedMessages,\n}) => {\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n const [isReportModalOpen, openReportModal, closeReportModal] = useFlag();\n\n useEffect(() => {\n return isActive && !isDeleteModalOpen && !isReportModalOpen\n ? captureKeyboardListeners({\n onBackspace: openDeleteModal,\n onDelete: openDeleteModal,\n onEsc: exitMessageSelectMode,\n })\n : undefined;\n }, [isActive, isDeleteModalOpen, isReportModalOpen, openDeleteModal, exitMessageSelectMode]);\n\n const handleDownload = useCallback(() => {\n downloadSelectedMessages();\n exitMessageSelectMode();\n }, [downloadSelectedMessages, 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, 'i');\n\n const className = buildClassName(\n 'MessageSelectToolbar',\n canPost && 'with-composer',\n isActive && 'shown',\n );\n\n const renderButton = (\n icon: string, label: string, onClick: AnyToVoidFunction, disabled?: boolean, destructive?: boolean,\n ) => {\n return (\n \n \n \n );\n };\n\n return (\n
\n
\n \n \n \n \n {formattedMessagesCount}\n \n\n {!!selectedMessagesCount && (\n
\n {messageListType !== 'scheduled' && (\n renderButton('forward', lang('Chat.ForwardActionHeader'), openForwardMenuForSelectedMessages)\n )}\n {canReportMessages && (\n renderButton('flag', lang('Conversation.ReportMessages'), openReportModal)\n )}\n {canDownloadMessages && (\n renderButton('download', lang('lng_media_download'), handleDownload)\n )}\n {renderButton('delete', lang('EditAdminGroupDeleteMessages'), openDeleteModal, !canDeleteMessages, true)}\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 const canReport = selectCanReportSelectedMessages(global);\n const canDownload = selectCanDownloadSelectedMessages(global);\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n\n return {\n isSchedule: messageListType === 'scheduled',\n selectedMessagesCount: selectSelectedMessagesCount(global),\n canDeleteMessages: canDelete,\n canReportMessages: canReport,\n canDownloadMessages: canDownload,\n selectedMessageIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'exitMessageSelectMode', 'openForwardMenuForSelectedMessages', 'downloadSelectedMessages',\n ]),\n)(MessageSelectToolbar));\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\n\nexport default (\n onSelect: NoneToVoidFunction,\n) => {\n // eslint-disable-next-line no-null/no-null\n const buttonRef = useRef(null);\n\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n if (e.key !== 'Enter') return;\n const isFocused = buttonRef.current === document.activeElement;\n\n if (isFocused) {\n onSelect();\n }\n }, [onSelect]);\n\n useEffect(() => {\n window.addEventListener('keydown', handleKeyDown, false);\n\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleKeyDown]);\n\n return buttonRef;\n};\n","import React, {\n FC, memo,\n} 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 { isUserId, getPrivateChatUserId, selectIsChatMuted } from '../../../modules/helpers';\nimport {\n selectChat, selectUser, selectIsChatPinned, selectNotifySettings, selectNotifyExceptions,\n} from '../../../modules/selectors';\nimport useSelectWithEnter from '../../../hooks/useSelectWithEnter';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport GroupChatInfo from '../../common/GroupChatInfo';\nimport DeleteChatModal from '../../common/DeleteChatModal';\nimport ListItem from '../../ui/ListItem';\nimport ChatFolderModal from '../ChatFolderModal.async';\n\ntype OwnProps = {\n chatId: string;\n withUsername?: boolean;\n onClick: (id: string) => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n privateChatUser?: ApiUser;\n isPinned?: boolean;\n isMuted?: boolean;\n};\n\nconst LeftSearchResultChat: FC = ({\n chatId,\n chat,\n privateChatUser,\n isPinned,\n isMuted,\n withUsername,\n onClick,\n}) => {\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n const [isChatFolderModalOpen, openChatFolderModal, closeChatFolderModal] = useFlag();\n\n const contextActions = useChatContextActions({\n chat,\n privateChatUser,\n isPinned,\n isMuted,\n handleDelete: openDeleteModal,\n handleChatFolderChange: openChatFolderModal,\n }, true);\n\n const handleClick = () => {\n onClick(chatId);\n };\n\n const buttonRef = useSelectWithEnter(handleClick);\n\n if (!chat) {\n return undefined;\n }\n\n return (\n \n {isUserId(chatId) ? (\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 privateChatUserId = chat && getPrivateChatUserId(chat);\n const privateChatUser = privateChatUserId ? selectUser(global, privateChatUserId) : undefined;\n const isPinned = selectIsChatPinned(global, chatId);\n const isMuted = chat\n ? selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global))\n : undefined;\n\n return {\n chat,\n privateChatUser,\n isPinned,\n isMuted,\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?: string[];\n usersById: Record;\n recentlyFoundChatIds?: string[];\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.current, !topUserIds);\n\n const handleClick = useCallback((id: string) => {\n openChat({ id, shouldReplaceHistory: true });\n onReset();\n setTimeout(() => {\n addRecentlyFoundChatId({ id });\n }, SEARCH_CLOSE_TIMEOUT_MS);\n }, [openChat, addRecentlyFoundChatId, onReset]);\n\n const lang = useLang();\n\n return (\n
\n {topUserIds && (\n
\n
\n {topUserIds.map((userId) => (\n
handleClick(userId)} dir={lang.isRtl ? 'rtl' : undefined}>\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_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport {\n getChatTitle,\n getPrivateChatUserId,\n getMessageMediaHash,\n getMessageSummaryText,\n getMessageMediaThumbDataUri,\n getMessageVideo,\n getMessageRoundVideo,\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, { LangFn } from '../../../hooks/useLang';\nimport useSelectWithEnter from '../../../hooks/useSelectWithEnter';\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: string;\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 const isRoundVideo = Boolean(getMessageRoundVideo(message));\n\n const handleClick = useCallback(() => {\n focusMessage({ chatId, messageId: message.id });\n }, [chatId, focusMessage, message.id]);\n\n const lang = useLang();\n\n const buttonRef = useSelectWithEnter(handleClick);\n\n if (!chat) {\n return undefined;\n }\n\n return (\n \n \n
\n
\n
\n

{renderText(getChatTitle(lang, chat, privateChatUser))}

\n {chat.isVerified && }\n
\n
\n \n {formatPastTimeShort(lang, message.date * 1000)}\n \n
\n\n
\n
\n
\n {renderMessageSummary(lang, message, mediaBlobUrl || mediaThumbnail, searchQuery, isRoundVideo)}\n
\n
\n
\n \n );\n};\n\nfunction renderMessageSummary(\n lang: LangFn, message: ApiMessage, blobUrl?: string, searchQuery?: string, isRoundVideo?: boolean,\n) {\n if (!blobUrl) {\n return renderText(getMessageSummaryText(lang, message));\n }\n\n return (\n \n \"\"\n {getMessageVideo(message) && }\n {renderText(getMessageSummaryText(lang, 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 lastSyncTime: global.lastSyncTime,\n ...(privateChatUserId && { privateChatUser: selectUser(global, privateChatUserId) }),\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_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport searchWords from '../../../util/searchWords';\nimport { unique, pick } from '../../../util/iteratees';\nimport { getUserFullName, getMessageSummaryText, sortChatIds } 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';\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?: string;\n localContactIds?: string[];\n localChatIds?: string[];\n localUserIds?: string[];\n globalChatIds?: string[];\n globalUserIds?: string[];\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 runThrottled = throttle((cb) => cb(), 500, true);\n\nconst ChatResults: FC = ({\n searchQuery, searchDate, dateSearchQuery, currentUserId,\n localContactIds, localChatIds, localUserIds, globalChatIds, globalUserIds,\n foundIds, globalMessagesByChatId, chatsById, usersById, fetchingStatus, lastSyncTime,\n onReset, onSearchDateSelect, openChat, addRecentlyFoundChatId, searchMessagesGlobal, setGlobalSearchChatId,\n}) => {\n const lang = useLang();\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: string) => {\n openChat({ id, shouldReplaceHistory: true });\n\n if (id !== currentUserId) {\n addRecentlyFoundChatId({ id });\n }\n\n if (!IS_SINGLE_COLUMN_LAYOUT) {\n onReset();\n }\n },\n [currentUserId, openChat, addRecentlyFoundChatId, onReset],\n );\n\n const handlePickerItemClick = useCallback((id: string) => {\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 foundContactIds = 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 })\n : [];\n\n return [\n ...(currentUserId && searchWords(lang('SavedMessages'), searchQuery) ? [currentUserId] : []),\n ...sortChatIds(unique([\n ...foundContactIds,\n ...(localChatIds || []),\n ...(localUserIds || []),\n ]), chatsById),\n ];\n }, [\n searchQuery, localContactIds, currentUserId, lang, localChatIds, localUserIds, chatsById, usersById,\n ]);\n\n const globalResults = useMemo(() => {\n if (!searchQuery || searchQuery.length < MIN_QUERY_LENGTH_FOR_GLOBAL_SEARCH || !globalChatIds || !globalUserIds) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return sortChatIds(unique([...globalChatIds, ...globalUserIds]),\n chatsById, true);\n }, [chatsById, globalChatIds, globalUserIds, 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('_');\n\n return globalMessagesByChatId?.[chatId]?.byId[Number(messageId)];\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 function renderFoundMessage(message: ApiMessage) {\n const text = getMessageSummaryText(lang, 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 \n )}\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 \n {lang(shouldShowMoreLocal ? 'ChatList.Search.ShowLess' : 'ChatList.Search.ShowMore')}\n \n )}\n {lang('DialogList.SearchSectionDialogs')}\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 \n {lang(shouldShowMoreGlobal ? 'ChatList.Search.ShowLess' : 'ChatList.Search.ShowMore')}\n \n )}\n {lang('DialogList.SearchSectionGlobal')}\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 {\n currentUserId, messages, lastSyncTime,\n } = global;\n const {\n fetchingStatus, globalResults, localResults, resultsByType,\n } = global.globalSearch;\n const { chatIds: globalChatIds, userIds: globalUserIds } = globalResults || {};\n const { chatIds: localChatIds, userIds: localUserIds } = localResults || {};\n const { byChatId: globalMessagesByChatId } = messages;\n const foundIds = resultsByType?.text?.foundIds;\n\n return {\n currentUserId,\n localContactIds,\n localChatIds,\n localUserIds,\n globalChatIds,\n globalUserIds,\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';\nimport useLang from '../../../hooks/useLang';\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?: string;\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 lang = useLang();\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('_');\n\n return globalMessagesByChatId?.[chatId]?.byId[Number(messageId)];\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(lang, 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 \n )}\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?.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';\nimport { ISettings } from '../../../../types';\n\nimport { selectTheme } from '../../../../modules/selectors';\n\nexport type StateProps = {\n theme: ISettings['theme'];\n isLoading?: boolean;\n chatsById: Record;\n usersById: Record;\n globalMessagesByChatId?: Record }>;\n foundIds?: string[];\n lastSyncTime?: number;\n searchChatId?: string;\n activeDownloads: Record;\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?.isVoice ? 'voice' : 'audio');\n\n const { byChatId: globalMessagesByChatId } = global.messages;\n const foundIds = resultsByType?.[currentType]?.foundIds;\n\n const activeDownloads = global.activeDownloads.byChatId;\n\n return {\n theme: selectTheme(global),\n isLoading: foundIds === undefined\n || (fetchingStatus ? Boolean(fetchingStatus.chats || fetchingStatus.messages) : false),\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n searchChatId: chatId,\n activeDownloads,\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 { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\nimport { throttle } from '../../../util/schedulers';\nimport useLang from '../../../hooks/useLang';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport Media from '../../common/Media';\nimport ChatMessage from './ChatMessage';\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 = '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 lang = useLang();\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('_');\n\n return globalMessagesByChatId[chatId]?.byId[Number(messageId)];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleSelectMedia = useCallback((messageId: number, chatId: string) => {\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 \n )}\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 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';\nimport useLang from '../../../hooks/useLang';\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 lang = useLang();\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('_');\n\n return globalMessagesByChatId[chatId]?.byId[Number(messageId)];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: string) => {\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

\n {formatMonthAndYear(lang, new Date(message.date * 1000))}\n

\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 \n )}\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';\nimport useLang from '../../../hooks/useLang';\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 activeDownloads,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\n}) => {\n const lang = useLang();\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('_');\n const message = globalMessagesByChatId[chatId]?.byId[Number(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: string) => {\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(lang, 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 \n )}\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 { AudioOrigin, 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';\nimport useLang from '../../../hooks/useLang';\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 theme,\n isVoice,\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n activeDownloads,\n searchMessagesGlobal,\n focusMessage,\n openAudioPlayer,\n}) => {\n const lang = useLang();\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('_');\n\n return globalMessagesByChatId[chatId]?.byId[Number(messageId)];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: string) => {\n focusMessage({ chatId, messageId });\n }, [focusMessage]);\n\n const handlePlayAudio = useCallback((messageId: number, chatId: string) => {\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

\n {formatMonthAndYear(lang, new Date(message.date * 1000))}\n

\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 \n )}\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, useRef,\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';\nimport useKeyboardListNavigation from '../../../hooks/useKeyboardListNavigation';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\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 isActive: boolean;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentContent?: GlobalSearchContent;\n chatId?: string;\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 isActive,\n currentContent = GlobalSearchContent.ChatList,\n chatId,\n setGlobalSearchContent,\n setGlobalSearchDate,\n onReset,\n}) => {\n const lang = useLang();\n const [activeTab, setActiveTab] = useState(currentContent);\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 useHistoryBack(isActive, onReset, undefined, undefined, true);\n\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const handleKeyDown = useKeyboardListNavigation(containerRef, isActive, undefined, '.ListItem-button', true);\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 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, memo, useCallback, useMemo, 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_SINGLE_COLUMN_LAYOUT } 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 onScreenSelect: (screen: SettingsScreens) => void;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsHeader: FC = ({\n currentScreen,\n editedFolderId,\n onReset,\n onSaveFilter,\n signOut,\n deleteChatFolder,\n onScreenSelect,\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('lng_settings_information')}

;\n case SettingsScreens.General:\n return

{lang('General')}

;\n case SettingsScreens.Notifications:\n return

{lang('Notifications')}

;\n case SettingsScreens.DataStorage:\n return

{lang('DataSettings')}

;\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('PleaseEnterCurrentPassword')}

;\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 case SettingsScreens.FoldersEditFolderFromChatList:\n return (\n
\n

{lang('FilterEdit')}

\n\n {editedFolderId && (\n \n \n {lang('Delete')}\n \n \n )}\n
\n );\n case SettingsScreens.FoldersIncludedChats:\n case SettingsScreens.FoldersIncludedChatsFromChatList:\n case SettingsScreens.FoldersExcludedChats:\n case SettingsScreens.FoldersExcludedChatsFromChatList:\n return (\n
\n {(currentScreen === SettingsScreens.FoldersIncludedChats\n || currentScreen === SettingsScreens.FoldersIncludedChatsFromChatList) ? (\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 onScreenSelect(SettingsScreens.EditProfile)}\n ariaLabel={lang('lng_settings_information')}\n >\n \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, useEffect } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens } from '../../../types';\nimport { ApiUser } from '../../../api/types';\n\nimport { selectUser } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport ProfileInfo from '../../common/ProfileInfo';\nimport ChatExtra from '../../common/ChatExtra';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentUser?: ApiUser;\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsMain: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n loadProfilePhotos,\n currentUser,\n lastSyncTime,\n}) => {\n const lang = useLang();\n const profileId = currentUser?.id;\n\n useEffect(() => {\n if (profileId && lastSyncTime) {\n loadProfilePhotos({ profileId });\n }\n }, [lastSyncTime, profileId, loadProfilePhotos]);\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Main);\n\n return (\n
\n
\n {currentUser && (\n \n )}\n {currentUser && (\n \n )}\n onScreenSelect(SettingsScreens.General)}\n >\n {lang('Telegram.GeneralSettingsViewController')}\n \n onScreenSelect(SettingsScreens.Notifications)}\n >\n {lang('Notifications')}\n \n onScreenSelect(SettingsScreens.Privacy)}\n >\n {lang('PrivacySettings')}\n \n onScreenSelect(SettingsScreens.DataStorage)}\n >\n {lang('DataSettings')}\n \n onScreenSelect(SettingsScreens.Folders)}\n >\n {lang('Filters')}\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, lastSyncTime } = global;\n\n return {\n currentUser: currentUserId ? selectUser(global, currentUserId) : undefined,\n lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadProfilePhotos']),\n)(SettingsMain));\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, SettingsScreens } 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';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\ntype OwnProps = {\n isActive: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\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 isActive,\n onScreenSelect,\n onReset,\n currentAvatarHash,\n currentFirstName,\n currentLastName,\n currentBio,\n currentUsername,\n progress,\n isUsernameAvailable,\n loadCurrentUser,\n updateProfile,\n checkUsername,\n}) => {\n const lang = useLang();\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 useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.EditProfile);\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 return (\n
\n
\n
\n \n \n \n \n\n

\n {renderText(lang('lng_settings_about_bio'), ['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 {lang('lng_username_link')}
\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, { FC, memo, useCallback } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, ISettings } from '../../../types';\n\nimport { AUTODOWNLOAD_FILESIZE_MB_LIMITS } from '../../../config';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport Checkbox from '../../ui/Checkbox';\nimport RangeSlider from '../../ui/RangeSlider';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = Pick;\n\ntype DispatchProps = Pick;\n\nconst SettingsDataStorage: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n canAutoLoadPhotoFromContacts,\n canAutoLoadPhotoInPrivateChats,\n canAutoLoadPhotoInGroups,\n canAutoLoadPhotoInChannels,\n canAutoLoadVideoFromContacts,\n canAutoLoadVideoInPrivateChats,\n canAutoLoadVideoInGroups,\n canAutoLoadVideoInChannels,\n canAutoLoadFileFromContacts,\n canAutoLoadFileInPrivateChats,\n canAutoLoadFileInGroups,\n canAutoLoadFileInChannels,\n canAutoPlayGifs,\n canAutoPlayVideos,\n autoLoadFileMaxSizeMb,\n setSettingOption,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.General);\n\n const renderFileSizeCallback = useCallback((value: number) => {\n return lang('AutodownloadSizeLimitUpTo', lang('FileSize.MB', String(AUTODOWNLOAD_FILESIZE_MB_LIMITS[value]), 'i'));\n }, [lang]);\n\n const handleFileSizeChange = useCallback((value: number) => {\n setSettingOption({ autoLoadFileMaxSizeMb: AUTODOWNLOAD_FILESIZE_MB_LIMITS[value] });\n }, [setSettingOption]);\n\n function renderContentSizeSlider() {\n const value = AUTODOWNLOAD_FILESIZE_MB_LIMITS.indexOf(autoLoadFileMaxSizeMb);\n\n return (\n
\n \n
\n );\n }\n\n function renderAutoDownloadBlock(\n title: string,\n key: 'Photo' | 'Video' | 'File',\n canAutoLoadFromContacts: boolean,\n canAutoLoadInPrivateChats: boolean,\n canAutoLoadInGroups: boolean,\n canAutoLoadInChannels: boolean,\n ) {\n return (\n
\n

{title}

\n\n setSettingOption({ [`canAutoLoad${key}FromContacts`]: isChecked })}\n />\n setSettingOption({ [`canAutoLoad${key}InPrivateChats`]: isChecked })}\n />\n setSettingOption({ [`canAutoLoad${key}InGroups`]: isChecked })}\n />\n setSettingOption({ [`canAutoLoad${key}InChannels`]: isChecked })}\n />\n\n {key === 'File' && renderContentSizeSlider()}\n
\n );\n }\n\n return (\n
\n {renderAutoDownloadBlock(\n lang('AutoDownloadPhotosTitle'),\n 'Photo',\n canAutoLoadPhotoFromContacts,\n canAutoLoadPhotoInPrivateChats,\n canAutoLoadPhotoInGroups,\n canAutoLoadPhotoInChannels,\n )}\n {renderAutoDownloadBlock(\n lang('AutoDownloadVideosTitle'),\n 'Video',\n canAutoLoadVideoFromContacts,\n canAutoLoadVideoInPrivateChats,\n canAutoLoadVideoInGroups,\n canAutoLoadVideoInChannels,\n )}\n {renderAutoDownloadBlock(\n 'Auto-download files', // Proper translation is not available yet\n 'File',\n canAutoLoadFileFromContacts,\n canAutoLoadFileInPrivateChats,\n canAutoLoadFileInGroups,\n canAutoLoadFileInChannels,\n )}\n\n
\n

{lang('AutoplayMedia')}

\n\n setSettingOption({ canAutoPlayGifs: isChecked })}\n />\n setSettingOption({ canAutoPlayVideos: isChecked })}\n />\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return pick(global.settings.byKey, [\n 'canAutoLoadPhotoFromContacts',\n 'canAutoLoadPhotoInPrivateChats',\n 'canAutoLoadPhotoInGroups',\n 'canAutoLoadPhotoInChannels',\n 'canAutoLoadVideoFromContacts',\n 'canAutoLoadVideoInPrivateChats',\n 'canAutoLoadVideoInGroups',\n 'canAutoLoadVideoInChannels',\n 'canAutoLoadFileFromContacts',\n 'canAutoLoadFileInPrivateChats',\n 'canAutoLoadFileInGroups',\n 'canAutoLoadFileInChannels',\n 'canAutoPlayGifs',\n 'canAutoPlayVideos',\n 'autoLoadFileMaxSizeMb',\n ]);\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setSettingOption',\n ]),\n)(SettingsDataStorage));\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';\nimport { NotifyException, NotifySettings, SettingsScreens } from '../../../../types';\n\nimport { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config';\nimport { pick } from '../../../../util/iteratees';\nimport { selectNotifyExceptions, selectNotifySettings } from '../../../../modules/selectors';\nimport { throttle } from '../../../../util/schedulers';\nimport getAnimationData from '../../../common/helpers/animatedAssets';\nimport { getFolderDescriptionText } from '../../../../modules/helpers';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\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 isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n chatsById: Record;\n usersById: Record;\n orderedFolderIds?: number[];\n foldersById: Record;\n recommendedChatFolders?: ApiChatFolder[];\n notifySettings: NotifySettings;\n notifyExceptions?: Record;\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 isActive,\n onScreenSelect,\n onReset,\n chatsById,\n usersById,\n orderedFolderIds,\n foldersById,\n recommendedChatFolders,\n notifySettings,\n notifyExceptions,\n loadRecommendedChatFolders,\n addChatFolder,\n showDialog,\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 showDialog({\n data: {\n message: 'DIALOG_FILTERS_TOO_MUCH',\n hasErrorKey: true,\n },\n });\n\n return;\n }\n\n onCreateFolder();\n }, [foldersById, showDialog, onCreateFolder]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Folders);\n\n const userFolders = useMemo(() => {\n if (!orderedFolderIds) {\n return undefined;\n }\n\n const chatIds = Object.keys(chatsById);\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(\n lang, chatsById, usersById, folder, chatIds, notifySettings, notifyExceptions,\n ),\n };\n });\n }, [orderedFolderIds, chatsById, foldersById, usersById, notifySettings, notifyExceptions, lang]);\n\n const handleCreateFolderFromRecommended = useCallback((folder: ApiChatFolder) => {\n if (Object.keys(foldersById).length >= MAX_ALLOWED_FOLDERS) {\n showDialog({\n data: {\n message: 'DIALOG_FILTERS_TOO_MUCH',\n hasErrorKey: true,\n },\n });\n\n return;\n }\n\n addChatFolder({ folder });\n }, [foldersById, addChatFolder, showDialog]);\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?.length ? userFolders.map((folder) => (\n onEditFolder(foldersById[folder.id])}\n >\n {folder.title}\n {folder.subtitle}\n \n )) : userFolders && !userFolders.length ? (\n

\n You have no folders yet.\n

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

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

\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 notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadRecommendedChatFolders', 'addChatFolder', 'showDialog']),\n)(SettingsFoldersMain));\n","import React, { FC } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\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 const lang = useLang();\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, useEffect, useMemo, useState,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config';\nimport { findIntersectionWithSet, pick } from '../../../../util/iteratees';\nimport { isUserId } from '../../../../modules/helpers';\nimport getAnimationData from '../../../common/helpers/animatedAssets';\nimport {\n EXCLUDED_CHAT_TYPES,\n FolderEditDispatch,\n FoldersState,\n INCLUDED_CHAT_TYPES,\n selectChatFilters,\n} from '../../../../hooks/reducers/useFoldersReducer';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\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 isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n onBack: () => void;\n};\n\ntype StateProps = {\n loadedActiveChatIds?: string[];\n loadedArchivedChatIds?: string[];\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 = 'ChatList.Filter.Error.Empty';\n\nconst SettingsFoldersEdit: FC = ({\n state,\n dispatch,\n onAddIncludedChats,\n onAddExcludedChats,\n isActive,\n onScreenSelect,\n onReset,\n onBack,\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 useHistoryBack(isActive, onBack, onScreenSelect, state.mode === 'edit'\n ? SettingsScreens.FoldersEditFolder\n : SettingsScreens.FoldersCreateFolder);\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 {isUserId(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 {lang(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 { isUserId } 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: string[];\n selectedIds: string[];\n selectedChatTypes: string[];\n filterValue?: string;\n onSelectedIdsChange: (ids: string[]) => 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: string) => {\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: string) {\n const isSelected = selectedIds.includes(id);\n\n return (\n handleItemClick(id)}\n ripple\n disabled={!isSelected && hasMaxChats}\n >\n {isUserId(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

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

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

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

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

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

\n \n )}\n\n {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';\nimport { SettingsScreens } from '../../../../types';\n\nimport useLang from '../../../../hooks/useLang';\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';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\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 isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n chatsById: Record;\n listIds?: string[];\n orderedPinnedIds?: string[];\n archivedListIds?: string[];\n archivedPinnedIds?: string[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsFoldersChatFilters: FC = ({\n isActive,\n onScreenSelect,\n onReset,\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 lang = useLang();\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(lang, chat), chatFilter)\n || selectedChatIds.includes(chat.id)\n ))\n .map(({ id }) => id);\n }, [chats, chatFilter, lang, 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: string[]) => {\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 useHistoryBack(isActive, onReset, onScreenSelect,\n mode === 'included' ? SettingsScreens.FoldersIncludedChats : SettingsScreens.FoldersExcludedChats);\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 { FolderEditDispatch, FoldersState } 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 shownScreen: SettingsScreens;\n state: FoldersState;\n dispatch: FolderEditDispatch;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\nconst SettingsFolders: FC = ({\n currentScreen,\n shownScreen,\n state,\n dispatch,\n isActive,\n onScreenSelect,\n onReset,\n}) => {\n const handleReset = useCallback(() => {\n if (\n currentScreen === SettingsScreens.FoldersCreateFolder\n || currentScreen === SettingsScreens.FoldersEditFolder\n || currentScreen === SettingsScreens.FoldersEditFolderFromChatList\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(currentScreen === SettingsScreens.FoldersEditFolderFromChatList\n ? SettingsScreens.FoldersIncludedChatsFromChatList\n : SettingsScreens.FoldersIncludedChats);\n }, [currentScreen, dispatch, onScreenSelect]);\n\n const handleAddExcludedChats = useCallback(() => {\n dispatch({ type: 'editExcludeFilters' });\n onScreenSelect(currentScreen === SettingsScreens.FoldersEditFolderFromChatList\n ? SettingsScreens.FoldersExcludedChatsFromChatList\n : SettingsScreens.FoldersExcludedChats);\n }, [currentScreen, dispatch, onScreenSelect]);\n\n switch (currentScreen) {\n case SettingsScreens.Folders:\n return (\n \n );\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n case SettingsScreens.FoldersEditFolderFromChatList:\n return (\n \n );\n case SettingsScreens.FoldersIncludedChats:\n case SettingsScreens.FoldersIncludedChatsFromChatList:\n return (\n \n );\n case SettingsScreens.FoldersExcludedChats:\n case SettingsScreens.FoldersExcludedChatsFromChatList:\n return (\n \n );\n\n default:\n return undefined;\n }\n};\n\nexport default memo(SettingsFolders);\n","import React, {\n FC, memo, useMemo, useRef,\n} 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 useMediaTransition from '../../../hooks/useMediaTransition';\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 transitionClassNames = useMediaTransition(lottieData);\n\n const firstLetters = useMemo(() => {\n if (lottieData) return undefined;\n\n return getFirstLetters(stickerSet.title, 2);\n }, [lottieData, stickerSet.title]);\n\n return (\n
\n {firstLetters}\n {lottieData && (\n \n )}\n
\n );\n};\n\nexport default memo(StickerSetCoverAnimated);\n","import React, {\n FC, memo, useMemo, useRef,\n} from '../../../lib/teact/teact';\n\nimport { ApiStickerSet } from '../../../api/types';\n\nimport { getFirstLetters } from '../../../util/textFormat';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMedia from '../../../hooks/useMedia';\nimport useMediaTransition from '../../../hooks/useMediaTransition';\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 transitionClassNames = useMediaTransition(mediaData);\n\n const firstLetters = useMemo(() => {\n if (mediaData) return undefined;\n\n return getFirstLetters(stickerSet.title, 2);\n }, [mediaData, stickerSet.title]);\n\n return (\n
\n {firstLetters}\n \"\"\n
\n );\n};\n\nexport default memo(StickerSetCover);\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?.[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, TimeFormat } from '../../../types';\nimport { ApiSticker, ApiStickerSet } from '../../../api/types';\n\nimport { IS_IOS, IS_MAC_OS, IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport { setTimeFormat } from '../../../util/langProvider';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport RangeSlider from '../../ui/RangeSlider';\nimport Checkbox from '../../ui/Checkbox';\nimport RadioGroup, { IRadioOption } from '../../ui/RadioGroup';\nimport SettingsStickerSet from './SettingsStickerSet';\nimport StickerSetModal from '../../common/StickerSetModal.async';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = Pick & {\n stickerSetIds?: string[];\n stickerSetsById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_LEVEL_OPTIONS = [\n 'Solid and Steady',\n 'Nice and Fast',\n 'Lots of Stuff',\n];\n\nconst TIME_FORMAT_OPTIONS: IRadioOption[] = [{\n label: '12-hour',\n value: '12h',\n}, {\n label: '24-hour',\n value: '24h',\n}];\n\nconst SettingsGeneral: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n stickerSetIds,\n stickerSetsById,\n messageTextSize,\n animationLevel,\n messageSendKeyCombo,\n shouldSuggestStickers,\n shouldLoopStickers,\n timeFormat,\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 const lang = useLang();\n\n const KEYBOARD_SEND_OPTIONS = !IS_TOUCH_ENV ? [\n { value: 'enter', label: lang('lng_settings_send_enter'), subLabel: 'New line by Shift + Enter' },\n {\n value: 'ctrl-enter',\n label: lang(IS_MAC_OS ? 'lng_settings_send_cmdenter' : 'lng_settings_send_ctrlenter'),\n subLabel: 'New line by Enter',\n },\n ] : undefined;\n\n useEffect(() => {\n loadStickerSets();\n }, [loadStickerSets]);\n\n useEffect(() => {\n if (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(\n '--composer-text-size', `${Math.max(newSize, IS_IOS ? 16 : 15)}px`,\n );\n document.documentElement.style.setProperty('--message-meta-height', `${Math.floor(newSize * 1.3125)}px`);\n document.documentElement.style.setProperty('--message-text-size', `${newSize}px`);\n document.documentElement.setAttribute('data-message-text-size', newSize.toString());\n\n setSettingOption({ messageTextSize: newSize });\n }, [setSettingOption]);\n\n const handleTimeFormatChange = useCallback((newTimeFormat: string) => {\n setSettingOption({ timeFormat: newTimeFormat });\n setSettingOption({ wasTimeFormatSetManually: true });\n\n setTimeFormat(newTimeFormat as TimeFormat);\n }, [setSettingOption]);\n\n const handleStickerSetClick = useCallback((value: ApiSticker) => {\n setSticker(value);\n openModal();\n }, [openModal]);\n\n const stickerSets = stickerSetIds && stickerSetIds.map((id: string) => {\n return stickerSetsById?.[id]?.installedDate ? stickerSetsById[id] : false;\n }).filter(Boolean as any);\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.General);\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 Time Format\n

\n \n
\n\n
\n

\n Animation Level\n

\n

\n Choose the desired animations amount.\n

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

{lang('VoiceOver.Keyboard')}

\n\n setSettingOption({ messageSendKeyCombo: value })}\n selected={messageSendKeyCombo}\n />\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 'messageTextSize',\n 'animationLevel',\n 'messageSendKeyCombo',\n 'shouldSuggestStickers',\n 'shouldLoopStickers',\n 'isSensitiveEnabled',\n 'canChangeSensitive',\n 'timeFormat',\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, useRef,\n} from '../../../lib/teact/teact';\nimport { ApiWallpaper } from '../../../api/types';\nimport { ThemeKey, 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 buildClassName from '../../../util/buildClassName';\nimport useMedia from '../../../hooks/useMedia';\nimport useMediaWithLoadProgress from '../../../hooks/useMediaWithLoadProgress';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useCanvasBlur from '../../../hooks/useCanvasBlur';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nimport './WallpaperTile.scss';\n\ntype OwnProps = {\n wallpaper: ApiWallpaper;\n theme: ThemeKey;\n isSelected: boolean;\n onClick: (slug: string) => void;\n};\n\nconst WallpaperTile: FC = ({\n wallpaper,\n theme,\n isSelected,\n onClick,\n}) => {\n const { slug, document } = wallpaper;\n const localMediaHash = `wallpaper${document.id!}`;\n const localBlobUrl = document.previewBlobUrl;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`);\n const thumbRef = useCanvasBlur(document.thumbnail?.dataUri, Boolean(previewBlobUrl), true);\n const { transitionClassNames } = useShowTransition(\n Boolean(previewBlobUrl || localBlobUrl),\n undefined,\n undefined,\n 'slow',\n );\n const [isLoadAllowed, setIsLoadAllowed] = useState(false);\n const {\n mediaData: fullMedia, loadProgress,\n } = useMediaWithLoadProgress(localMediaHash, !isLoadAllowed);\n const wasLoadDisabled = usePrevious(isLoadAllowed) === false;\n const { shouldRender: shouldRenderSpinner, transitionClassNames: spinnerClassNames } = useShowTransition(\n (isLoadAllowed && !fullMedia) || slug === UPLOADING_WALLPAPER_SLUG,\n undefined,\n wasLoadDisabled,\n 'slow',\n );\n // To prevent triggering of the effect for useCallback\n const cacheKeyRef = useRef();\n cacheKeyRef.current = theme;\n\n const handleSelect = useCallback(() => {\n (async () => {\n const blob = await fetchBlob(fullMedia!);\n await cacheApi.save(CUSTOM_BG_CACHE_NAME, cacheKeyRef.current!, 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 setIsLoadAllowed((isAllowed) => !isAllowed);\n }\n }, [fullMedia, handleSelect]);\n\n const className = buildClassName(\n 'WallpaperTile',\n isSelected && 'selected',\n );\n\n return (\n
\n
\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, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, ThemeKey, UPLOADING_WALLPAPER_SLUG } from '../../../types';\nimport { ApiWallpaper } from '../../../api/types';\n\nimport { DARK_THEME_PATTERN_COLOR, DEFAULT_PATTERN_COLOR } from '../../../config';\nimport { pick } from '../../../util/iteratees';\nimport { throttle } from '../../../util/schedulers';\nimport { openSystemFilesDialog } from '../../../util/systemFilesDialog';\nimport { getAverageColor, getPatternColor, rgb2hex } from '../../../util/colors';\nimport { selectTheme } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\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 isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n background?: string;\n isBlurred?: boolean;\n loadedWallpapers?: ApiWallpaper[];\n theme: ThemeKey;\n};\n\ntype DispatchProps = Pick;\n\nconst SUPPORTED_TYPES = 'image/jpeg';\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst SettingsGeneralBackground: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n background,\n isBlurred,\n loadedWallpapers,\n theme,\n loadWallpapers,\n uploadWallpaper,\n setThemeSettings,\n}) => {\n const themeRef = useRef();\n themeRef.current = theme;\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 setThemeSettings({\n theme,\n background: undefined,\n backgroundColor: undefined,\n isBlurred: true,\n patternColor: theme === 'dark' ? DARK_THEME_PATTERN_COLOR : DEFAULT_PATTERN_COLOR,\n });\n }, [setThemeSettings, theme]);\n\n const handleWallPaperSelect = useCallback((slug: string) => {\n setThemeSettings({ theme: themeRef.current, background: slug });\n const currentWallpaper = loadedWallpapers && loadedWallpapers.find((wallpaper) => wallpaper.slug === slug);\n if (currentWallpaper?.document.thumbnail) {\n getAverageColor(currentWallpaper.document.thumbnail.dataUri)\n .then((color) => {\n const patternColor = getPatternColor(color);\n const rgbColor = `#${rgb2hex(color)}`;\n setThemeSettings({ theme: themeRef.current, backgroundColor: rgbColor, patternColor });\n });\n }\n }, [loadedWallpapers, setThemeSettings]);\n\n const handleWallPaperBlurChange = useCallback((e: React.ChangeEvent) => {\n setThemeSettings({ theme: themeRef.current, isBlurred: e.target.checked });\n }, [setThemeSettings]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.GeneralChatBackground);\n\n const isUploading = 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 theme = selectTheme(global);\n const { background, isBlurred } = global.settings.themes[theme] || {};\n const { loadedWallpapers } = global.settings;\n\n return {\n background,\n isBlurred,\n loadedWallpapers,\n theme,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadWallpapers', 'uploadWallpaper', 'setThemeSettings',\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, ThemeKey } 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 { selectTheme } from '../../../modules/selectors';\nimport useFlag from '../../../hooks/useFlag';\nimport buildClassName from '../../../util/buildClassName';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport InputText from '../../ui/InputText';\n\nimport './SettingsGeneralBackgroundColor.scss';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n backgroundColor?: string;\n theme: ThemeKey;\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 isActive,\n onScreenSelect,\n onReset,\n theme,\n backgroundColor,\n setThemeSettings,\n}) => {\n const themeRef = useRef();\n themeRef.current = theme;\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(backgroundColor));\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 return true;\n }\n\n captureEvents(colorPickerRef.current!, {\n onCapture: handleColorDrag,\n onDrag: handleColorDrag,\n onRelease: unmarkIsDragging,\n onClick: unmarkIsDragging,\n selectorToPreventScroll: '.SettingsGeneralBackgroundColor',\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 return true;\n }\n\n captureEvents(huePickerRef.current!, {\n onCapture: handleHueDrag,\n onDrag: handleHueDrag,\n onRelease: unmarkIsDragging,\n onClick: unmarkIsDragging,\n selectorToPreventScroll: '.SettingsGeneralBackgroundColor',\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 const patternColor = getPatternColor(rgb);\n setThemeSettings({\n theme: themeRef.current,\n background: undefined,\n backgroundColor: color,\n patternColor,\n });\n }\n isFirstRunRef.current = false;\n }, [hsb, setThemeSettings]);\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 useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.GeneralChatBackgroundColor);\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(backgroundColor?: string) {\n return backgroundColor && backgroundColor.startsWith('#')\n ? rgb2hsb(hex2rgb(backgroundColor.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 const theme = selectTheme(global);\n const { backgroundColor } = global.settings.themes[theme] || {};\n return {\n backgroundColor,\n theme,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setThemeSettings']),\n)(SettingsGeneralBackground));\n","import { ChangeEvent } from 'react';\nimport useDebounce from '../../../hooks/useDebounce';\nimport React, {\n FC, memo, useCallback, useEffect,\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 useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\nimport { playNotifySound } from '../../../util/notifications';\n\nimport Checkbox from '../../ui/Checkbox';\nimport RangeSlider from '../../ui/RangeSlider';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\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 hasWebNotifications: boolean;\n hasPushNotifications: boolean;\n notificationSoundVolume: number;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsNotifications: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n hasPrivateChatsNotifications,\n hasPrivateChatsMessagePreview,\n hasGroupNotifications,\n hasGroupMessagePreview,\n hasBroadcastNotifications,\n hasBroadcastMessagePreview,\n hasContactJoinedNotifications,\n hasPushNotifications,\n hasWebNotifications,\n notificationSoundVolume,\n loadNotificationSettings,\n updateContactSignUpNotification,\n updateNotificationSettings,\n updateWebNotificationSettings,\n}) => {\n useEffect(() => {\n loadNotificationSettings();\n }, [loadNotificationSettings]);\n\n const runDebounced = useDebounce(500, false, true);\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 currentShouldShowPreviews = peerType === 'contact'\n ? hasPrivateChatsMessagePreview\n : (peerType === 'group' ? hasGroupMessagePreview : hasBroadcastMessagePreview);\n\n updateNotificationSettings({\n peerType,\n ...(setting === 'silent' && { isSilent: !e.target.checked, shouldShowPreviews: currentShouldShowPreviews }),\n ...(setting === 'showPreviews' && { shouldShowPreviews: 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 useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Notifications);\n\n return (\n
\n
\n

\n Web notifications\n

\n {\n updateWebNotificationSettings({ hasWebNotifications: e.target.checked });\n }}\n />\n {\n updateWebNotificationSettings({ hasPushNotifications: e.target.checked });\n }}\n />\n
\n {\n updateWebNotificationSettings({ notificationSoundVolume: volume });\n runDebounced(() => playNotifySound(undefined, volume));\n }}\n />\n
\n
\n
\n

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

\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 hasWebNotifications: global.settings.byKey.hasWebNotifications,\n hasPushNotifications: global.settings.byKey.hasPushNotifications,\n notificationSoundVolume: global.settings.byKey.notificationSoundVolume,\n };\n},\n(setGlobal, actions): DispatchProps => pick(actions, [\n 'loadNotificationSettings',\n 'updateContactSignUpNotification',\n 'updateNotificationSettings',\n 'updateWebNotificationSettings',\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';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n hasPassword?: boolean;\n blockedCount: number;\n sessionsCount: number;\n isSensitiveEnabled?: boolean;\n canChangeSensitive?: boolean;\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 isActive,\n onScreenSelect,\n onReset,\n hasPassword,\n blockedCount,\n sessionsCount,\n isSensitiveEnabled,\n canChangeSensitive,\n visibilityPrivacyPhoneNumber,\n visibilityPrivacyLastSeen,\n visibilityPrivacyProfilePhoto,\n visibilityPrivacyForwarding,\n visibilityPrivacyGroupChats,\n loadPrivacySettings,\n loadBlockedContacts,\n loadAuthorizations,\n loadContentSettings,\n updateContentSettings,\n}) => {\n useEffect(() => {\n loadBlockedContacts();\n loadAuthorizations();\n loadPrivacySettings();\n loadContentSettings();\n }, [loadBlockedContacts, loadAuthorizations, loadPrivacySettings, loadContentSettings]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Privacy);\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 \n {lang(hasPassword ? 'PasswordOn' : 'PasswordOff')}\n \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 \n {getVisibilityValue(visibilityPrivacyPhoneNumber)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyLastSeen)}\n >\n
\n {lang('LastSeenTitle')}\n \n {getVisibilityValue(visibilityPrivacyLastSeen)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyProfilePhoto)}\n >\n
\n {lang('PrivacyProfilePhotoTitle')}\n \n {getVisibilityValue(visibilityPrivacyProfilePhoto)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyForwarding)}\n >\n
\n {lang('PrivacyForwardsTitle')}\n \n {getVisibilityValue(visibilityPrivacyForwarding)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyGroupChats)}\n >\n
\n {lang('WhoCanAddMe')}\n \n {getVisibilityValue(visibilityPrivacyGroupChats)}\n \n
\n \n
\n\n {canChangeSensitive && (\n
\n

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

\n \n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n settings: {\n byKey: { hasPassword, isSensitiveEnabled, canChangeSensitive },\n privacy,\n },\n blocked,\n activeSessions,\n } = global;\n\n return {\n hasPassword,\n blockedCount: blocked.totalCount,\n sessionsCount: activeSessions.length,\n isSensitiveEnabled,\n canChangeSensitive,\n visibilityPrivacyPhoneNumber: privacy.phoneNumber?.visibility,\n visibilityPrivacyLastSeen: privacy.lastSeen?.visibility,\n visibilityPrivacyProfilePhoto: privacy.profilePhoto?.visibility,\n visibilityPrivacyForwarding: privacy.forwards?.visibility,\n visibilityPrivacyGroupChats: privacy.chatInvite?.visibility,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadBlockedContacts', 'loadAuthorizations', 'loadPrivacySettings', 'loadContentSettings', 'updateContentSettings',\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, LangCode, SettingsScreens } 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';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = Pick;\n\ntype DispatchProps = Pick;\n\nconst SettingsLanguage: FC = ({\n isActive,\n onScreenSelect,\n onReset,\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 void setLanguage(langCode as LangCode, () => {\n unmarkIsLoading();\n\n setSettingOption({ language: langCode });\n });\n }, [markIsLoading, unmarkIsLoading, setSettingOption]);\n\n const options = useMemo(() => {\n return languages ? buildOptions(languages) : undefined;\n }, [languages]);\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Language);\n\n return (\n
\n {options ? (\n \n ) : (\n \n )}\n
\n );\n};\n\nfunction buildOptions(languages: ApiLanguage[]) {\n const currentLangCode = (window.navigator.language || 'en').toLowerCase();\n const shortLangCode = currentLangCode.substr(0, 2);\n\n return languages.map(({ langCode, nativeName, name }) => ({\n value: langCode,\n label: nativeName,\n subLabel: name,\n })).sort((a) => {\n return currentLangCode && (a.value === currentLangCode || a.value === shortLangCode) ? -1 : 0;\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';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport RadioGroup from '../../ui/RadioGroup';\nimport { getPrivacyKey } from './helper/privacy';\n\ntype OwnProps = {\n screen: SettingsScreens;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = Partial & {\n chatsById?: Record;\n usersById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyVisibility: FC = ({\n screen,\n isActive,\n onScreenSelect,\n onReset,\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 useHistoryBack(isActive, onReset, onScreenSelect, 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';\nimport { SettingsScreens } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { formatPastTimeShort } from '../../../util/dateFormat';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n activeSessions: ApiSession[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyActiveSessions: FC = ({\n isActive,\n onScreenSelect,\n onReset,\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 useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.PrivacyActiveSessions);\n\n function renderCurrentSession(session: ApiSession) {\n return (\n
\n

\n {lang('AuthSessions.CurrentSession')}\n

\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

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

\n\n {sessions.map(renderSession)}\n
\n );\n }\n\n function renderSession(session: ApiSession) {\n return (\n {\n handleTerminateSessionClick(session.hash);\n },\n }]}\n className=\"no-icon\"\n >\n
\n {formatPastTimeShort(lang, 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 {otherSessions && renderOtherSessions(otherSessions)}\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 => {\n return {\n activeSessions: global.activeSessions,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadAuthorizations', 'terminateAuthorization', 'terminateAllAuthorizations',\n ]),\n)(SettingsPrivacyActiveSessions));\n","import React, {\n FC, useMemo, useState, memo, useRef, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiUser } from '../../../api/types';\n\nimport { getUserFullName } from '../../../modules/helpers';\nimport searchWords from '../../../util/searchWords';\nimport { pick, unique } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport ChatOrUserPicker from '../../common/ChatOrUserPicker';\n\nexport type OwnProps = {\n isOpen: boolean;\n onClose: NoneToVoidFunction;\n};\n\ntype StateProps = {\n usersById: Record;\n blockedIds: string[];\n contactIds?: string[];\n localContactIds?: string[];\n currentUserId?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst BlockUserModal: FC = ({\n usersById,\n blockedIds,\n contactIds,\n localContactIds,\n currentUserId,\n isOpen,\n onClose,\n loadContactList,\n setUserSearchQuery,\n blockContact,\n}) => {\n const lang = useLang();\n const [filter, setFilter] = useState('');\n // eslint-disable-next-line no-null/no-null\n const filterRef = useRef(null);\n\n useEffect(() => {\n setUserSearchQuery({ query: filter });\n }, [filter, setUserSearchQuery]);\n\n const filteredContactsId = useMemo(() => {\n const availableContactsId = (contactIds || []).concat(localContactIds || []).filter((contactId) => {\n return !blockedIds.includes(contactId) && contactId !== currentUserId;\n });\n\n return unique(availableContactsId).reduce((acc, contactId) => {\n if (\n !filter\n || !usersById[contactId]\n || searchWords(getUserFullName(usersById[contactId]) || '', filter)\n || usersById[contactId]?.username.toLowerCase().includes(filter)\n ) {\n acc.push(contactId);\n }\n\n return acc;\n }, [])\n .sort((firstId, secondId) => {\n const firstName = getUserFullName(usersById[firstId]) || '';\n const secondName = getUserFullName(usersById[secondId]) || '';\n\n return firstName.localeCompare(secondName);\n });\n }, [blockedIds, contactIds, currentUserId, filter, localContactIds, usersById]);\n\n const handleRemoveUser = useCallback((userId: string) => {\n const { id: contactId, accessHash } = usersById[userId] || {};\n if (!contactId || !accessHash) {\n return;\n }\n blockContact({ contactId, accessHash });\n onClose();\n }, [blockContact, onClose, usersById]);\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n users: {\n byId: usersById,\n },\n blocked: {\n ids: blockedIds,\n },\n contactList,\n currentUserId,\n } = global;\n\n return {\n usersById,\n blockedIds,\n contactIds: contactList?.userIds,\n localContactIds: global.userSearch.localUserIds,\n currentUserId,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadContactList', 'setUserSearchQuery', 'blockContact',\n ]),\n)(BlockUserModal));\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, ApiCountryCode, ApiUser } from '../../../api/types';\nimport { SettingsScreens } from '../../../types';\n\nimport { CHAT_HEIGHT_PX } from '../../../config';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\nimport { pick } from '../../../util/iteratees';\nimport {\n getChatTitle, getUserFullName, isUserId,\n} from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\nimport buildClassName from '../../../util/buildClassName';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\nimport useFlag from '../../../hooks/useFlag';\n\nimport ListItem from '../../ui/ListItem';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Avatar from '../../common/Avatar';\nimport Loading from '../../ui/Loading';\nimport BlockUserModal from './BlockUserModal';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n chatsByIds: Record;\n usersByIds: Record;\n blockedIds: string[];\n phoneCodeList: ApiCountryCode[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyBlockedUsers: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n chatsByIds,\n usersByIds,\n blockedIds,\n phoneCodeList,\n unblockContact,\n}) => {\n const lang = useLang();\n const [isBlockUserModalOpen, openBlockUserModal, closeBlockUserModal] = useFlag();\n const handleUnblockClick = useCallback((contactId: string) => {\n unblockContact({ contactId });\n }, [unblockContact]);\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.PrivacyBlockedUsers);\n\n function renderContact(contactId: string, i: number, viewportOffset: number) {\n const isPrivate = isUserId(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 small-icon',\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(lang, chat!)) || '')}

\n {user?.phoneNumber && (\n
{formatPhoneNumberWithCode(phoneCodeList, 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?.length ? (\n
\n {blockedIds!.map((contactId, i) => renderContact(contactId, i, 0))}\n
\n ) : blockedIds && !blockedIds.length ? (\n
{lang('NoBlocked')}
\n ) : (\n \n )}\n
\n
\n\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 countryList: {\n phoneCodes: phoneCodeList,\n },\n } = global;\n\n return {\n chatsByIds,\n usersByIds,\n blockedIds: ids,\n phoneCodeList,\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';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport ListItem from '../../../ui/ListItem';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport renderText from '../../../common/helpers/renderText';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaEnabled: FC = ({\n isActive, onReset, animatedEmoji, onScreenSelect,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.TwoFaEnabled);\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 { SettingsScreens } from '../../../../types';\n\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport PasswordMonkey from '../../../common/PasswordMonkey';\nimport PasswordForm from '../../../common/PasswordForm';\n\ntype OwnProps = {\n screen: SettingsScreens;\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 isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\nconst EQUAL_PASSWORD_ERROR = 'Passwords Should Be Equal';\n\nconst SettingsTwoFaPassword: FC = ({\n screen,\n isActive,\n onScreenSelect,\n onReset,\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 useHistoryBack(isActive, onReset, onScreenSelect, screen);\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';\nimport { SettingsScreens } from '../../../../types';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport Button from '../../../ui/Button';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\n\ntype OwnProps = {\n onStart: NoneToVoidFunction;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaStart: FC = ({\n isActive, onScreenSelect, onReset, animatedEmoji, onStart,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.TwoFaDisabled);\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';\nimport { SettingsScreens } from '../../../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../../util/environment';\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useFlag from '../../../../hooks/useFlag';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\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 isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n screen: SettingsScreens;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_SINGLE_COLUMN_LAYOUT ? 550 : 400;\n\nconst SettingsTwoFaSkippableForm: FC = ({\n animatedEmoji,\n type = 'text',\n isLoading,\n error,\n placeholder,\n shouldConfirm,\n clearError,\n onSubmit,\n isActive,\n onScreenSelect,\n onReset,\n screen,\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 useHistoryBack(isActive, onReset, onScreenSelect, screen);\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';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport Button from '../../../ui/Button';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaCongratulations: FC = ({\n isActive, onReset, animatedEmoji, onScreenSelect,\n}) => {\n const lang = useLang();\n\n const handleClick = () => {\n onScreenSelect(SettingsScreens.Privacy);\n };\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.TwoFaCongratulations);\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';\nimport { SettingsScreens } from '../../../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../../util/environment';\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\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 isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n screen: SettingsScreens;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n codeLength: number;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_SINGLE_COLUMN_LAYOUT ? 550 : 400;\n\nconst SettingsTwoFaEmailCode: FC = ({\n animatedEmoji,\n codeLength,\n isLoading,\n error,\n clearError,\n onSubmit,\n isActive,\n onScreenSelect,\n onReset,\n screen,\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 useHistoryBack(isActive, onReset, onScreenSelect, screen);\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 shownScreen: SettingsScreens;\n dispatch: TwoFaDispatch;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = GlobalState['twoFaSettings'];\n\ntype DispatchProps = Pick;\n\nconst SettingsTwoFa: FC = ({\n currentScreen,\n shownScreen,\n state,\n hint,\n isLoading,\n error,\n waitingEmailCodeLength,\n dispatch,\n isActive,\n onScreenSelect,\n onReset,\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, 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, isUserId, prepareChatList,\n} from '../../../modules/helpers';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport Picker from '../../common/Picker';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\n\nexport type OwnProps = {\n isAllowList?: boolean;\n screen: SettingsScreens;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentUserId?: string;\n chatsById: Record;\n listIds?: string[];\n orderedPinnedIds?: string[];\n archivedListIds?: string[];\n archivedPinnedIds?: string[];\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 isActive,\n onScreenSelect,\n onReset,\n}) => {\n const lang = useLang();\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 ((isUserId(chat.id) && chat.id !== currentUserId) || isChatGroup(chat))\n && (\n !searchQuery\n || searchWords(getChatTitle(lang, chat), searchQuery)\n || selectedContactIds.includes(chat.id)\n )\n ))\n .map(({ id }) => id);\n }, [chats, currentUserId, lang, searchQuery, selectedContactIds]);\n\n const handleSelectedContactIdsChange = useCallback((value: string[]) => {\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 useHistoryBack(isActive, onReset, onScreenSelect, screen);\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';\nimport { FolderEditDispatch, FoldersState } from '../../../hooks/reducers/useFoldersReducer';\n\nimport { LAYERS_ANIMATION_NAME } from '../../../util/environment';\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 SettingsDataStorage from './SettingsDataStorage';\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\nconst TWO_FA_SCREENS = [\n SettingsScreens.TwoFaDisabled,\n SettingsScreens.TwoFaNewPassword,\n SettingsScreens.TwoFaNewPasswordConfirm,\n SettingsScreens.TwoFaNewPasswordHint,\n SettingsScreens.TwoFaNewPasswordEmail,\n SettingsScreens.TwoFaNewPasswordEmailCode,\n SettingsScreens.TwoFaCongratulations,\n SettingsScreens.TwoFaEnabled,\n SettingsScreens.TwoFaChangePasswordCurrent,\n SettingsScreens.TwoFaChangePasswordNew,\n SettingsScreens.TwoFaChangePasswordConfirm,\n SettingsScreens.TwoFaChangePasswordHint,\n SettingsScreens.TwoFaTurnOff,\n SettingsScreens.TwoFaRecoveryEmailCurrentPassword,\n SettingsScreens.TwoFaRecoveryEmail,\n SettingsScreens.TwoFaRecoveryEmailCode,\n];\n\nconst FOLDERS_SCREENS = [\n SettingsScreens.Folders,\n SettingsScreens.FoldersCreateFolder,\n SettingsScreens.FoldersEditFolder,\n SettingsScreens.FoldersEditFolderFromChatList,\n SettingsScreens.FoldersIncludedChats,\n SettingsScreens.FoldersIncludedChatsFromChatList,\n SettingsScreens.FoldersExcludedChats,\n SettingsScreens.FoldersExcludedChatsFromChatList,\n];\n\nconst PRIVACY_SCREENS = [\n SettingsScreens.PrivacyBlockedUsers,\n SettingsScreens.PrivacyActiveSessions,\n];\n\nconst PRIVACY_PHONE_NUMBER_SCREENS = [\n SettingsScreens.PrivacyPhoneNumberAllowedContacts,\n SettingsScreens.PrivacyPhoneNumberDeniedContacts,\n];\n\nconst PRIVACY_LAST_SEEN_PHONE_SCREENS = [\n SettingsScreens.PrivacyLastSeenAllowedContacts,\n SettingsScreens.PrivacyLastSeenDeniedContacts,\n];\n\nconst PRIVACY_PROFILE_PHOTO_SCREENS = [\n SettingsScreens.PrivacyProfilePhotoAllowedContacts,\n SettingsScreens.PrivacyProfilePhotoDeniedContacts,\n];\n\nconst PRIVACY_FORWARDING_SCREENS = [\n SettingsScreens.PrivacyForwardingAllowedContacts,\n SettingsScreens.PrivacyForwardingDeniedContacts,\n];\n\nconst PRIVACY_GROUP_CHATS_SCREENS = [\n SettingsScreens.PrivacyGroupChatsAllowedContacts,\n SettingsScreens.PrivacyGroupChatsDeniedContacts,\n];\n\nexport type OwnProps = {\n isActive: boolean;\n currentScreen: SettingsScreens;\n foldersState: FoldersState;\n foldersDispatch: FolderEditDispatch;\n onScreenSelect: (screen: SettingsScreens) => void;\n shouldSkipTransition?: boolean;\n onReset: () => void;\n};\n\nconst Settings: FC = ({\n isActive,\n currentScreen,\n foldersState,\n foldersDispatch,\n onScreenSelect,\n onReset,\n shouldSkipTransition,\n}) => {\n const [twoFaState, twoFaDispatch] = useTwoFaReducer();\n\n const handleReset = useCallback(() => {\n if (\n currentScreen === SettingsScreens.FoldersCreateFolder\n || currentScreen === SettingsScreens.FoldersEditFolder\n || currentScreen === SettingsScreens.FoldersEditFolderFromChatList\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(isScreenActive: boolean, screen: SettingsScreens) {\n const privacyAllowScreens: Record = {\n [SettingsScreens.PrivacyPhoneNumber]: PRIVACY_PHONE_NUMBER_SCREENS.includes(screen),\n [SettingsScreens.PrivacyLastSeen]: PRIVACY_LAST_SEEN_PHONE_SCREENS.includes(screen),\n [SettingsScreens.PrivacyProfilePhoto]: PRIVACY_PROFILE_PHOTO_SCREENS.includes(screen),\n [SettingsScreens.PrivacyForwarding]: PRIVACY_FORWARDING_SCREENS.includes(screen),\n [SettingsScreens.PrivacyGroupChats]: PRIVACY_GROUP_CHATS_SCREENS.includes(screen),\n };\n\n const isTwoFaScreen = TWO_FA_SCREENS.includes(screen);\n const isFoldersScreen = FOLDERS_SCREENS.includes(screen);\n const isPrivacyScreen = PRIVACY_SCREENS.includes(screen)\n || isTwoFaScreen\n || Object.keys(privacyAllowScreens).includes(screen.toString())\n || Object.values(privacyAllowScreens).find((key) => key === true);\n\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.DataStorage:\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.FoldersEditFolderFromChatList:\n case SettingsScreens.FoldersIncludedChats:\n case SettingsScreens.FoldersIncludedChatsFromChatList:\n case SettingsScreens.FoldersExcludedChats:\n case SettingsScreens.FoldersExcludedChatsFromChatList:\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(isScreenActive: boolean, isFrom: boolean, currentKey: SettingsScreens) {\n return (\n <>\n \n {renderCurrentSectionContent(isScreenActive, currentKey)}\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_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { throttle } from '../../../util/schedulers';\nimport searchWords from '../../../util/searchWords';\nimport { pick } from '../../../util/iteratees';\nimport { getUserFullName, sortUserIds } from '../../../modules/helpers';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\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 isActive: boolean;\n onReset: () => void;\n};\n\ntype StateProps = {\n usersById: Record;\n contactIds?: string[];\n serverTimeOffset: number;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst ContactList: FC = ({\n isActive, onReset,\n filter, usersById, contactIds, loadContactList, openChat, serverTimeOffset,\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 useHistoryBack(isActive, onReset);\n\n const handleClick = useCallback((id: string) => {\n openChat({ id, shouldReplaceHistory: true });\n }, [openChat]);\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 sortUserIds(resultIds, usersById, undefined, serverTimeOffset);\n }, [contactIds, filter, usersById, serverTimeOffset]);\n\n const [viewportIds, getMore] = useInfiniteScroll(undefined, listIds, Boolean(filter));\n\n return (\n \n {viewportIds?.length ? (\n viewportIds.map((id) => (\n handleClick(id)}\n ripple={!IS_SINGLE_COLUMN_LAYOUT}\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 serverTimeOffset: global.serverTimeOffset,\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 { ApiChat, ApiUser } from '../../../api/types';\n\nimport { pick, unique } from '../../../util/iteratees';\nimport { throttle } from '../../../util/schedulers';\nimport searchWords from '../../../util/searchWords';\nimport { getUserFullName, isUserBot, sortChatIds } from '../../../modules/helpers';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport Picker from '../../common/Picker';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Button from '../../ui/Button';\n\nexport type OwnProps = {\n isChannel?: boolean;\n isActive: boolean;\n selectedMemberIds: string[];\n onSelectedMemberIdsChange: (ids: string[]) => void;\n onNextStep: () => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentUserId?: string;\n usersById: Record;\n chatsById: Record;\n localContactIds?: string[];\n searchQuery?: string;\n isSearching?: boolean;\n localUserIds?: string[];\n globalUserIds?: string[];\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst NewChatStep1: FC = ({\n isChannel,\n isActive,\n selectedMemberIds,\n onSelectedMemberIdsChange,\n onNextStep,\n onReset,\n currentUserId,\n usersById,\n chatsById,\n localContactIds,\n searchQuery,\n isSearching,\n localUserIds,\n globalUserIds,\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 lang = useLang();\n\n useHistoryBack(isActive, onReset);\n\n const handleFilterChange = useCallback((query: string) => {\n setGlobalSearchQuery({ query });\n }, [setGlobalSearchQuery]);\n\n const displayedIds = useMemo(() => {\n const contactIds = localContactIds\n ? sortChatIds(localContactIds.filter((id) => id !== currentUserId), chatsById)\n : [];\n\n if (!searchQuery) {\n return contactIds;\n }\n\n const foundContactIds = 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 sortChatIds(\n unique([\n ...foundContactIds,\n ...(localUserIds || []),\n ...(globalUserIds || []),\n ]).filter((contactId) => {\n const user = usersById[contactId];\n\n return !user || !isUserBot(user) || user.canBeInvitedToGroup;\n }),\n chatsById,\n false,\n selectedMemberIds,\n );\n }, [\n localContactIds, chatsById, searchQuery, localUserIds, globalUserIds, selectedMemberIds,\n currentUserId, usersById,\n ]);\n\n const handleNextStep = useCallback(() => {\n if (selectedMemberIds.length || isChannel) {\n setGlobalSearchQuery({ query: '' });\n onNextStep();\n }\n }, [selectedMemberIds.length, isChannel, setGlobalSearchQuery, onNextStep]);\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 { byId: chatsById } = global.chats;\n const { currentUserId } = global;\n\n const {\n query: searchQuery,\n fetchingStatus,\n globalResults,\n localResults,\n } = global.globalSearch;\n const { userIds: globalUserIds } = globalResults || {};\n const { userIds: localUserIds } = localResults || {};\n\n return {\n currentUserId,\n usersById,\n chatsById,\n localContactIds,\n searchQuery,\n isSearching: fetchingStatus?.chats,\n globalUserIds,\n localUserIds,\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';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\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 isActive: boolean;\n memberIds: string[];\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 isActive,\n memberIds,\n onReset,\n creationProgress,\n creationError,\n createGroupChat,\n createChannel,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset);\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 && lang(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 {memberIds.length > 0 && (\n <>\n

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

\n\n
\n {memberIds.map((id) => (\n \n \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 { LAYERS_ANIMATION_NAME } 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 isActive: boolean;\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 isActive,\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 {(isStepActive) => {\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';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Button from '../ui/Button';\nimport ChatList from './main/ChatList';\nimport { LeftColumnContent } from '../../types';\n\nimport './ArchivedChats.scss';\n\nexport type OwnProps = {\n isActive: boolean;\n onReset: () => void;\n onContentChange: (content: LeftColumnContent) => void;\n};\n\nconst ArchivedChats: FC = ({ isActive, onReset, onContentChange }) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onContentChange, LeftColumnContent.Archived);\n\n return (\n
\n
\n \n \n \n

{lang('ArchivedChats')}

\n
\n \n
\n );\n};\n\nexport default memo(ArchivedChats);\n","import React, {\n FC, useCallback, memo, useMemo, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChatFolder } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\nimport CheckboxGroup from '../ui/CheckboxGroup';\n\nexport type OwnProps = {\n isOpen: boolean;\n chatId: string;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n};\n\ntype StateProps = {\n foldersById?: Record;\n folderOrderedIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst ChatFolderModal: FC = ({\n isOpen,\n chatId,\n foldersById,\n folderOrderedIds,\n onClose,\n onCloseAnimationEnd,\n editChatFolders,\n}) => {\n const lang = useLang();\n\n const initialSelectedFolderIds = useMemo(() => {\n if (!foldersById) {\n return [];\n }\n\n return Object.keys(foldersById).reduce((result, folderId) => {\n const { includedChatIds, pinnedChatIds } = foldersById[Number(folderId)];\n if (includedChatIds.includes(chatId) || pinnedChatIds?.includes(chatId)) {\n result.push(folderId);\n }\n\n return result;\n }, [] as string[]);\n }, [chatId, foldersById]);\n\n const [selectedFolderIds, setSelectedFolderIds] = useState(initialSelectedFolderIds);\n\n const folders = useMemo(() => {\n return folderOrderedIds?.map((folderId) => ({\n label: foldersById ? foldersById[folderId].title : '',\n value: String(folderId),\n })) || [];\n }, [folderOrderedIds, foldersById]);\n\n const handleSubmit = useCallback(() => {\n const idsToRemove = initialSelectedFolderIds.filter((id) => !selectedFolderIds.includes(id));\n const idsToAdd = selectedFolderIds.filter((id) => !initialSelectedFolderIds.includes(id));\n\n editChatFolders({ chatId, idsToRemove, idsToAdd });\n onClose();\n }, [chatId, editChatFolders, initialSelectedFolderIds, onClose, selectedFolderIds]);\n\n if (!foldersById || !folderOrderedIds) {\n return undefined;\n }\n\n return (\n \n \n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { byId: foldersById, orderedIds: folderOrderedIds } = global.chatFolders;\n\n return {\n foldersById,\n folderOrderedIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['editChatFolders']),\n)(ChatFolderModal));\n","import { ApiMediaFormat, ApiMessage } from '../../../../api/types';\n\nimport * as mediaLoader from '../../../../util/mediaLoader';\nimport {\n getMessageMediaHash,\n getMessagePhoto,\n getMessageText,\n getMessageWebPagePhoto,\n getMessageWebPageVideo,\n hasMessageLocalBlobUrl,\n} 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 || (!getMessageWebPageVideo(message) ? getMessageWebPagePhoto(message) : undefined);\n const mediaHash = getMessageMediaHash(message, 'inline');\n const canImageBeCopied = photo && (mediaHash || hasMessageLocalBlobUrl(message)) && CLIPBOARD_ITEM_SUPPORTED;\n const selection = window.getSelection();\n\n if (canImageBeCopied) {\n options.push({\n label: 'lng_context_copy_image',\n handler: () => {\n Promise.resolve(mediaHash ? mediaLoader.fetch(mediaHash, ApiMediaFormat.BlobUrl) : photo!.blobUrl)\n .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?.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),\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: 'lng_context_copy_message_link',\n handler: () => {\n onCopyLink();\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n return options;\n}\n\nfunction getCopyLabel(hasSelection: boolean): string {\n if (hasSelection) {\n return 'lng_context_copy_selected';\n }\n return 'lng_context_copy_text';\n}\n","let scrollLockEl: HTMLElement | null | undefined;\n\nconst 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\nfunction isTextBox(target: EventTarget | null) {\n if (!target || !(target instanceof HTMLElement)) return false;\n const element = target;\n const tagName = element.tagName.toLowerCase();\n if (tagName === 'textarea') return true;\n if (tagName !== 'input') return false;\n const type = element.getAttribute('type');\n if (!type) return false;\n const inputTypes = [\n 'text', 'password', 'number', 'email', 'tel', 'url',\n 'search', 'date', 'datetime', 'datetime-local', 'time', 'month', 'week',\n ];\n return inputTypes.indexOf(type.toLowerCase()) > -1;\n}\n\nconst getTouchY = (e: WheelEvent | TouchEvent) => ('changedTouches' in e ? e.changedTouches[0].clientY : 0);\n\nconst preventDefault = (e: WheelEvent | TouchEvent) => {\n const deltaY = 'deltaY' in e ? e.deltaY : getTouchY(e);\n\n if (\n !scrollLockEl\n // Allow overlay scrolling\n || !scrollLockEl.contains(e.target as HTMLElement)\n // Prevent top overscroll\n || (scrollLockEl.scrollTop <= 0 && deltaY <= 0)\n // Prevent bottom overscroll\n || (scrollLockEl.scrollTop >= (scrollLockEl.scrollHeight - scrollLockEl.offsetHeight) && deltaY >= 0)\n ) {\n e.preventDefault();\n }\n};\n\nfunction preventDefaultForScrollKeys(e: KeyboardEvent) {\n if (IGNORED_KEYS[e.key] && !isTextBox(e.target)) {\n e.preventDefault();\n }\n}\n\nexport function disableScrolling(el?: HTMLElement | null) {\n scrollLockEl = el;\n // Disable scrolling in Chrome\n document.addEventListener('wheel', preventDefault, { passive: false });\n document.addEventListener('touchmove', preventDefault, { passive: false });\n document.onkeydown = preventDefaultForScrollKeys;\n}\n\nexport function enableScrolling() {\n scrollLockEl = undefined;\n document.removeEventListener('wheel', preventDefault); // Enable scrolling in Chrome\n document.removeEventListener('touchmove', preventDefault);\n // eslint-disable-next-line no-null/no-null\n document.onkeydown = null;\n}\n","import React, {\n FC, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { IAnchorPosition } from '../../../types';\n\nimport { getMessageCopyOptions } from './helpers/copyOptions';\nimport { disableScrolling, enableScrolling } from '../../../util/scrollLock';\nimport useContextMenuPosition from '../../../hooks/useContextMenuPosition';\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 canReport?: boolean;\n canEdit?: boolean;\n canForward?: boolean;\n canFaveSticker?: boolean;\n canUnfaveSticker?: boolean;\n canCopy?: boolean;\n canCopyLink?: boolean;\n canSelect?: boolean;\n canDownload?: boolean;\n isDownloading?: boolean;\n onReply: () => void;\n onEdit: () => void;\n onPin: () => void;\n onUnpin: () => void;\n onForward: () => void;\n onDelete: () => void;\n onReport: () => 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 onDownload?: () => void;\n};\n\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 canReport,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n canDownload,\n isDownloading,\n onReply,\n onEdit,\n onPin,\n onUnpin,\n onForward,\n onDelete,\n onReport,\n onFaveSticker,\n onUnfaveSticker,\n onSelect,\n onSend,\n onReschedule,\n onClose,\n onCloseAnimationEnd,\n onCopyLink,\n onDownload,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const menuRef = useRef(null);\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 {\n positionX, positionY, style, menuStyle, withScroll,\n } = useContextMenuPosition(\n anchor,\n getTriggerElement,\n getRootElement,\n getMenuElement,\n SCROLLBAR_WIDTH,\n (document.querySelector('.MiddleHeader') as HTMLElement).offsetHeight,\n );\n\n useEffect(() => {\n disableScrolling(withScroll ? menuRef.current : undefined);\n\n return enableScrolling;\n }, [withScroll]);\n\n const lang = useLang();\n\n return (\n \n {canSendNow && {lang('MessageScheduleSend')}}\n {canReschedule && (\n {lang('MessageScheduleEditTime')}\n )}\n {canReply && {lang('Reply')}}\n {canEdit && {lang('Edit')}}\n {canFaveSticker && (\n {lang('AddToFavorites')}\n )}\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 {canDownload && (\n \n {isDownloading ? lang('lng_context_cancel_download') : lang('lng_media_download')}\n \n )}\n {canForward && {lang('Forward')}}\n {canSelect && {lang('Common.Select')}}\n {canReport && {lang('lng_context_report_msg')}}\n {canDelete && {lang('Delete')}}\n \n );\n};\n\nexport default MessageContextMenu;\n","import React, {\n FC, memo, useCallback, useMemo, 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 {\n selectActiveDownloadIds,\n selectAllowedMessageActions,\n selectCurrentMessageList,\n} from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useFlag from '../../../hooks/useFlag';\n\nimport DeleteMessageModal from '../../common/DeleteMessageModal';\nimport ReportMessageModal from '../../common/ReportMessageModal';\nimport PinMessageModal from '../../common/PinMessageModal';\nimport MessageContextMenu from './MessageContextMenu';\nimport CalendarModal from '../../common/CalendarModal';\nimport { getDayStartAt } from '../../../util/dateFormat';\nimport { copyTextToClipboard } from '../../../util/clipboard';\n\nexport type OwnProps = {\n isOpen: boolean;\n chatUsername?: string;\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 canReport?: boolean;\n canEdit?: boolean;\n canForward?: boolean;\n canFaveSticker?: boolean;\n canUnfaveSticker?: boolean;\n canCopy?: boolean;\n canCopyLink?: boolean;\n canSelect?: boolean;\n canDownload?: boolean;\n activeDownloads: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst ContextMenuContainer: FC = ({\n isOpen,\n messageListType,\n chatUsername,\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 canReport,\n canEdit,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n canDownload,\n activeDownloads,\n setReplyingToId,\n setEditingId,\n pinMessage,\n openForwardMenu,\n faveSticker,\n unfaveSticker,\n toggleMessageSelection,\n sendScheduledMessages,\n rescheduleMessage,\n downloadMessageMedia,\n cancelMessageMediaDownload,\n}) => {\n const { transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd, undefined, false);\n const [isMenuOpen, setIsMenuOpen] = useState(true);\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);\n const [isReportModalOpen, setIsReportModalOpen] = useState(false);\n const [isPinModalOpen, setIsPinModalOpen] = useState(false);\n const [isCalendarOpen, openCalendar, closeCalendar] = useFlag();\n\n const isDownloading = album ? album.messages.some((msg) => activeDownloads.includes(msg.id))\n : activeDownloads.includes(message.id);\n\n const handleDelete = useCallback(() => {\n setIsMenuOpen(false);\n setIsDeleteModalOpen(true);\n }, []);\n\n const handleReport = useCallback(() => {\n setIsMenuOpen(false);\n setIsReportModalOpen(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 closeReportModal = useCallback(() => {\n setIsReportModalOpen(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?.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?.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 copyTextToClipboard(`https://t.me/${chatUsername || `c/${message.chatId.replace('-', '')}`}/${message.id}`);\n closeMenu();\n }, [chatUsername, closeMenu, message.chatId, message.id]);\n\n const handleDownloadClick = useCallback(() => {\n (album?.messages || [message]).forEach((msg) => {\n if (isDownloading) {\n cancelMessageMediaDownload({ message: msg });\n } else {\n downloadMessageMedia({ message: msg });\n }\n });\n closeMenu();\n }, [album, message, closeMenu, isDownloading, cancelMessageMediaDownload, downloadMessageMedia]);\n\n const reportMessageIds = useMemo(() => (album ? album.messages : [message]).map(({ id }) => id), [album, message]);\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};\n\nexport default memo(withGlobal(\n (global, { message, messageListType }): StateProps => {\n const { threadId } = selectCurrentMessageList(global) || {};\n const activeDownloads = selectActiveDownloadIds(global, message.chatId);\n const {\n noOptions,\n canReply,\n canPin,\n canUnpin,\n canDelete,\n canReport,\n canEdit,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n canDownload,\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 canReport,\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 canDownload,\n activeDownloads,\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 'downloadMessageMedia',\n 'cancelMessageMediaDownload',\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 {\n selectChat, selectCurrentMessageList, selectStickerSet, selectStickerSetByShortName,\n} from '../../modules/selectors';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useLang from '../../hooks/useLang';\nimport renderText from './helpers/renderText';\nimport { getAllowedAttachmentOptions, getCanPostInChat } from '../../modules/helpers';\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 stickerSetShortName?: string;\n onClose: () => void;\n};\n\ntype StateProps = {\n canSendStickers?: boolean;\n stickerSet?: ApiStickerSet;\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst StickerSetModal: FC = ({\n isOpen,\n fromSticker,\n stickerSetShortName,\n stickerSet,\n canSendStickers,\n onClose,\n loadStickers,\n toggleStickerSet,\n sendMessage,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const lang = useLang();\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE, isDisabled: !isOpen });\n\n useEffect(() => {\n if (isOpen) {\n if (fromSticker) {\n const { stickerSetId, stickerSetAccessHash } = fromSticker;\n loadStickers({\n stickerSetId,\n stickerSetAccessHash,\n });\n } else if (stickerSetShortName) {\n loadStickers({\n stickerSetShortName,\n });\n }\n }\n }, [isOpen, fromSticker, loadStickers, stickerSetShortName]);\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 if (stickerSet) {\n toggleStickerSet({ stickerSetId: stickerSet.id });\n onClose();\n }\n }, [onClose, stickerSet, toggleStickerSet]);\n\n return (\n \n {stickerSet?.stickers ? (\n <>\n
\n {stickerSet.stickers.map((sticker) => (\n \n ))}\n
\n
\n \n {lang(\n stickerSet.installedDate ? 'StickerPack.RemoveStickerCount' : 'StickerPack.AddStickerCount',\n stickerSet.count,\n 'i',\n )}\n \n
\n \n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { fromSticker, stickerSetShortName }): StateProps => {\n const currentMessageList = selectCurrentMessageList(global);\n const { chatId, threadId } = currentMessageList || {};\n const chat = chatId && selectChat(global, chatId);\n const sendOptions = chat ? getAllowedAttachmentOptions(chat) : undefined;\n const canSendStickers = Boolean(\n chat && threadId && getCanPostInChat(chat, threadId) && sendOptions?.canSendStickers,\n );\n\n return {\n canSendStickers,\n stickerSet: fromSticker\n ? selectStickerSet(global, fromSticker.stickerSetId)\n : stickerSetShortName\n ? selectStickerSetByShortName(global, stickerSetShortName)\n : undefined,\n };\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_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { disableScrolling, enableScrolling } from '../../util/scrollLock';\nimport {\n selectChat, selectNotifySettings, selectNotifyExceptions, selectUser,\n} from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport {\n isUserId, getCanDeleteChat, selectIsChatMuted, getCanAddContact,\n} 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: string;\n threadId: number;\n isOpen: boolean;\n withExtraActions: boolean;\n anchor: IAnchorPosition;\n isChannel?: boolean;\n canStartBot?: boolean;\n canRestartBot?: boolean;\n canSubscribe?: boolean;\n canSearch?: boolean;\n canMute?: boolean;\n canLeave?: boolean;\n canEnterVoiceChat?: boolean;\n canCreateVoiceChat?: 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 canAddContact?: boolean;\n canDeleteChat?: boolean;\n hasLinkedChat?: boolean;\n};\n\nconst HeaderMenuContainer: FC = ({\n chatId,\n isOpen,\n withExtraActions,\n anchor,\n isChannel,\n canStartBot,\n canRestartBot,\n canSubscribe,\n canSearch,\n canMute,\n canLeave,\n canEnterVoiceChat,\n canCreateVoiceChat,\n chat,\n isPrivate,\n isMuted,\n canDeleteChat,\n hasLinkedChat,\n canAddContact,\n onSubscribeChannel,\n onSearchClick,\n onClose,\n onCloseAnimationEnd,\n updateChatMutedState,\n enterMessageSelectMode,\n sendBotCommand,\n restartBot,\n joinGroupCall,\n createGroupCall,\n openLinkedChat,\n addContact,\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 handleStartBot = useCallback(() => {\n sendBotCommand({ command: '/start' });\n }, [sendBotCommand]);\n\n const handleRestartBot = useCallback(() => {\n restartBot({ chatId });\n }, [chatId, restartBot]);\n\n const handleToggleMuteClick = useCallback(() => {\n updateChatMutedState({ chatId, isMuted: !isMuted });\n closeMenu();\n }, [chatId, closeMenu, isMuted, updateChatMutedState]);\n\n const handleEnterVoiceChatClick = useCallback(() => {\n if (canCreateVoiceChat) {\n // TODO show popup to schedule\n createGroupCall({\n chatId,\n });\n } else {\n joinGroupCall({\n chatId,\n });\n }\n closeMenu();\n }, [closeMenu, canCreateVoiceChat, chatId, joinGroupCall, createGroupCall]);\n\n const handleLinkedChatClick = useCallback(() => {\n openLinkedChat({ id: chatId });\n closeMenu();\n }, [chatId, closeMenu, openLinkedChat]);\n\n const handleAddContactClick = useCallback(() => {\n addContact({ userId: chatId });\n closeMenu();\n }, [addContact, chatId, closeMenu]);\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 {withExtraActions && canStartBot && (\n \n {lang('BotStart')}\n \n )}\n {withExtraActions && canRestartBot && (\n \n {lang('BotRestart')}\n \n )}\n {withExtraActions && canSubscribe && (\n \n {lang(isChannel ? 'ProfileJoinChannel' : 'ProfileJoinGroup')}\n \n )}\n {canAddContact && (\n \n {lang('AddContact')}\n \n )}\n {IS_SINGLE_COLUMN_LAYOUT && canSearch && (\n \n {lang('Search')}\n \n )}\n {canMute && (\n \n {lang(isMuted ? 'ChatsUnmute' : 'ChatsMute')}\n \n )}\n {(canEnterVoiceChat || canCreateVoiceChat) && (\n \n {lang(canCreateVoiceChat ? 'StartVoipChat' : 'VoipGroupJoinCall')}\n \n )}\n {hasLinkedChat && (\n \n {lang(isChannel ? 'ViewDiscussion' : 'lng_profile_view_channel')}\n \n )}\n \n {lang('ReportSelectMessages')}\n \n {canLeave && (\n \n {lang(isPrivate\n ? 'DeleteChatUser'\n : (canDeleteChat ? 'GroupInfo.DeleteAndExit' : (isChannel ? 'LeaveChannel' : 'Group.LeaveGroup')))}\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 const isPrivate = isUserId(chat.id);\n const user = isPrivate ? selectUser(global, chatId) : undefined;\n const canAddContact = user && getCanAddContact(user);\n\n return {\n chat,\n isMuted: selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global)),\n isPrivate,\n canAddContact,\n canDeleteChat: getCanDeleteChat(chat),\n hasLinkedChat: Boolean(chat?.fullInfo?.linkedChatId),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'updateChatMutedState',\n 'enterMessageSelectMode',\n 'sendBotCommand',\n 'restartBot',\n 'joinGroupCall',\n 'createGroupCall',\n 'openLinkedChat',\n 'addContact',\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 { getDayStartAt } from '../../util/dateFormat';\n\nimport Button from '../ui/Button';\nimport SearchInput from '../ui/SearchInput';\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 isHistoryCalendarOpen?: boolean;\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 isHistoryCalendarOpen,\n setLocalTextSearchQuery,\n searchTextMessagesLocal,\n focusMessage,\n closeLocalTextSearch,\n openHistoryCalendar,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const [focusedIndex, setFocusedIndex] = useState(0);\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 }, [isHistoryCalendarOpen]);\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 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 return (\n
\n
\n \n \n \n \n
\n
\n
\n {query ? (\n foundIds?.length ? (\n `${focusedIndex + 1} of ${totalCount}`\n ) : foundIds && !foundIds.length ? (\n 'No results'\n ) : (\n ''\n )\n ) : (\n openHistoryCalendar({ selectedAt: getDayStartAt(Date.now()) })}\n ariaLabel=\"Search messages by date\"\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 isHistoryCalendarOpen: Boolean(global.historyCalendarSelectedAt),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalTextSearchQuery',\n 'searchTextMessagesLocal',\n 'focusMessage',\n 'closeLocalTextSearch',\n 'openHistoryCalendar',\n ]),\n)(MobileSearchFooter));\n","export default function findInViewport(\n container: HTMLElement,\n selectorOrElements: string | NodeListOf,\n margin = 0,\n isDense = false,\n shouldContainBottom = false,\n isHorizontal = false,\n) {\n const viewportY1 = container[isHorizontal ? 'scrollLeft' : 'scrollTop'];\n const viewportY2 = viewportY1 + container[isHorizontal ? 'offsetWidth' : '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[isHorizontal ? 'offsetLeft' : 'offsetTop'];\n const y2 = y1 + element[isHorizontal ? 'offsetWidth' : '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","function isFullyVisible(container: HTMLElement, element: HTMLElement, isHorizontal = false) {\n const viewportY1 = container[isHorizontal ? 'scrollLeft' : 'scrollTop'];\n const viewportY2 = viewportY1 + container[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n const y1 = element[isHorizontal ? 'offsetLeft' : 'offsetTop'];\n const y2 = y1 + element[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n return y1 > viewportY1 && y2 < viewportY2;\n}\n\nexport default isFullyVisible;\n","import findInViewport from './findInViewport';\nimport isFullyVisible from './isFullyVisible';\nimport fastSmoothScroll from './fastSmoothScroll';\n\nconst VIEWPORT_MARGIN = 8;\nconst SCROLL_MARGIN = 10;\n\nexport default function setTooltipItemVisible(selector: string, 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 selector,\n VIEWPORT_MARGIN,\n true,\n true,\n );\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","import { useCallback, useEffect, useState } from '../../../../lib/teact/teact';\nimport captureKeyboardListeners from '../../../../util/captureKeyboardListeners';\nimport cycleRestrict from '../../../../util/cycleRestrict';\n\nexport function useKeyboardNavigation({\n isActive,\n isHorizontal,\n shouldSaveSelectionOnUpdateItems,\n shouldRemoveSelectionOnReset,\n noArrowNavigation,\n items,\n shouldSelectOnTab,\n onSelect,\n onClose,\n}: {\n isActive: boolean;\n isHorizontal?: boolean;\n shouldSaveSelectionOnUpdateItems?: boolean;\n shouldRemoveSelectionOnReset?: boolean;\n noArrowNavigation?: boolean;\n items?: any[];\n shouldSelectOnTab?: boolean;\n onSelect: AnyToVoidFunction;\n onClose: NoneToVoidFunction;\n}) {\n const [selectedItemIndex, setSelectedItemIndex] = useState(-1);\n\n const getSelectedIndex = useCallback((newIndex: number) => {\n if (!items) {\n return -1;\n }\n\n return cycleRestrict(items.length, newIndex);\n }, [items]);\n\n const handleArrowKey = useCallback((value: number, e: KeyboardEvent) => {\n e.preventDefault();\n setSelectedItemIndex((index) => (getSelectedIndex(index + value)));\n }, [setSelectedItemIndex, getSelectedIndex]);\n\n const handleItemSelect = useCallback((e: KeyboardEvent) => {\n if (items && items.length && selectedItemIndex > -1) {\n const item = items[selectedItemIndex];\n if (item) {\n e.preventDefault();\n onSelect(item);\n }\n }\n }, [items, onSelect, selectedItemIndex]);\n\n const isSelectionOutOfRange = !items || selectedItemIndex > items.length - 1;\n useEffect(() => {\n if (!shouldSaveSelectionOnUpdateItems || isSelectionOutOfRange) {\n setSelectedItemIndex(shouldRemoveSelectionOnReset ? -1 : 0);\n }\n }, [isSelectionOutOfRange, shouldRemoveSelectionOnReset, shouldSaveSelectionOnUpdateItems]);\n\n useEffect(() => (isActive ? captureKeyboardListeners({\n onEsc: onClose,\n onUp: noArrowNavigation || isHorizontal ? undefined : (e: KeyboardEvent) => handleArrowKey(-1, e),\n onDown: noArrowNavigation || isHorizontal ? undefined : (e: KeyboardEvent) => handleArrowKey(1, e),\n onLeft: noArrowNavigation || !isHorizontal ? undefined : (e: KeyboardEvent) => handleArrowKey(-1, e),\n onRight: noArrowNavigation || !isHorizontal ? undefined : (e: KeyboardEvent) => handleArrowKey(1, e),\n onTab: shouldSelectOnTab ? handleItemSelect : undefined,\n onEnter: handleItemSelect,\n }) : undefined), [\n noArrowNavigation, handleArrowKey, handleItemSelect, isActive, isHorizontal, onClose, shouldSelectOnTab,\n ]);\n\n return selectedItemIndex;\n}\n","import React, {\n FC, useCallback, useEffect, useRef, memo,\n} from '../../../lib/teact/teact';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport { ApiUser } from '../../../api/types';\n\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport setTooltipItemVisible from '../../../util/setTooltipItemVisible';\nimport { useKeyboardNavigation } from './hooks/useKeyboardNavigation';\n\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\nimport './MentionTooltip.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n onInsertUserName: (user: ApiUser, forceFocus?: boolean) => void;\n filteredUsers?: ApiUser[];\n usersById?: Record;\n};\n\nconst MentionTooltip: FC = ({\n isOpen,\n onClose,\n onInsertUserName,\n usersById,\n filteredUsers,\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 handleUserSelect = useCallback((userId: string, forceFocus = false) => {\n const user = usersById?.[userId];\n if (!user) {\n return;\n }\n\n onInsertUserName(user, forceFocus);\n }, [usersById, onInsertUserName]);\n\n const handleSelectMention = useCallback((member: ApiUser) => {\n handleUserSelect(member.id, true);\n }, [handleUserSelect]);\n\n const selectedMentionIndex = useKeyboardNavigation({\n isActive: isOpen,\n items: filteredUsers,\n onSelect: handleSelectMention,\n shouldSelectOnTab: true,\n shouldSaveSelectionOnUpdateItems: true,\n onClose,\n });\n\n useEffect(() => {\n setTooltipItemVisible('.chat-item-clickable', selectedMentionIndex, containerRef);\n }, [selectedMentionIndex]);\n\n useEffect(() => {\n if (filteredUsers && !filteredUsers.length) {\n onClose();\n }\n }, [filteredUsers, onClose]);\n\n const prevChatMembers = usePrevious(\n filteredUsers?.length\n ? filteredUsers\n : undefined,\n shouldRender,\n );\n const renderedChatMembers = filteredUsers && !filteredUsers.length\n ? prevChatMembers\n : filteredUsers;\n\n if (!shouldRender || (renderedChatMembers && !renderedChatMembers.length)) {\n return undefined;\n }\n\n const className = buildClassName(\n 'MentionTooltip composer-tooltip custom-scroll',\n transitionClassNames,\n );\n\n return (\n
\n {renderedChatMembers?.map(({ id }, index) => (\n handleUserSelect(id)}\n focus={selectedMentionIndex === index}\n >\n \n \n ))}\n
\n );\n};\n\nexport default memo(MentionTooltip);\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { ApiAttachment, ApiChatMember, ApiUser } from '../../../api/types';\n\nimport {\n CONTENT_TYPES_WITH_PREVIEW,\n EDITABLE_INPUT_MODAL_ID,\n SUPPORTED_IMAGE_CONTENT_TYPES,\n SUPPORTED_VIDEO_CONTENT_TYPES,\n} from '../../../config';\nimport { getFileExtension } from '../../common/helpers/documentInfo';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useMentionTooltip from './hooks/useMentionTooltip';\nimport useEmojiTooltip from './hooks/useEmojiTooltip';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\n\nimport Button from '../../ui/Button';\nimport Modal from '../../ui/Modal';\nimport File from '../../common/File';\nimport MessageInput from './MessageInput';\nimport MentionTooltip from './MentionTooltip';\nimport EmojiTooltip from './EmojiTooltip.async';\n\nimport './AttachmentModal.scss';\n\nexport type OwnProps = {\n attachments: ApiAttachment[];\n caption: string;\n isReady?: boolean;\n currentUserId?: string;\n groupChatMembers?: ApiChatMember[];\n usersById?: Record;\n recentEmojis: string[];\n baseEmojiKeywords?: Record;\n emojiKeywords?: Record;\n addRecentEmoji: AnyToVoidFunction;\n onCaptionUpdate: (html: string) => void;\n onSend: () => void;\n onFileAppend: (files: File[], isQuick: boolean) => void;\n onClear: () => void;\n};\n\nconst DROP_LEAVE_TIMEOUT_MS = 150;\n\nconst AttachmentModal: FC = ({\n attachments,\n caption,\n isReady,\n currentUserId,\n groupChatMembers,\n usersById,\n recentEmojis,\n baseEmojiKeywords,\n emojiKeywords,\n addRecentEmoji,\n onCaptionUpdate,\n onSend,\n onFileAppend,\n onClear,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const hideTimeoutRef = useRef(null);\n const prevAttachments = usePrevious(attachments);\n const renderingAttachments = attachments.length ? attachments : prevAttachments;\n const isOpen = Boolean(attachments.length);\n const [isHovered, markHovered, unmarkHovered] = useFlag();\n const isQuick = Boolean(renderingAttachments && renderingAttachments.every((a) => a.quick));\n const lang = useLang();\n\n const {\n isMentionTooltipOpen, closeMentionTooltip, insertMention, mentionFilteredUsers,\n } = useMentionTooltip(\n isOpen,\n caption,\n onCaptionUpdate,\n EDITABLE_INPUT_MODAL_ID,\n groupChatMembers,\n undefined,\n currentUserId,\n usersById,\n );\n const {\n isEmojiTooltipOpen, closeEmojiTooltip, filteredEmojis, insertEmoji,\n } = useEmojiTooltip(\n isOpen,\n caption,\n recentEmojis,\n EDITABLE_INPUT_MODAL_ID,\n onCaptionUpdate,\n baseEmojiKeywords,\n emojiKeywords,\n !isReady,\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 handleDragLeave = (e: React.DragEvent) => {\n const { relatedTarget: toTarget, target: fromTarget } = e;\n\n // Esc button pressed during drag event\n if ((fromTarget as HTMLDivElement).matches('.drop-target') && !toTarget) {\n hideTimeoutRef.current = window.setTimeout(unmarkHovered, DROP_LEAVE_TIMEOUT_MS);\n }\n\n // Prevent DragLeave event from firing when the pointer moves inside the AttachmentModal drop target\n if (fromTarget && (fromTarget as HTMLElement).closest('.AttachmentModal.hovered')) {\n return;\n }\n\n if (toTarget) {\n e.stopPropagation();\n }\n\n unmarkHovered();\n };\n\n const handleFilesDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n unmarkHovered();\n\n const { dataTransfer: { files } } = e;\n\n if (files?.length) {\n const newFiles = isQuick\n ? Array.from(files).filter((file) => {\n return file.type && CONTENT_TYPES_WITH_PREVIEW.has(file.type);\n })\n : Array.from(files);\n\n onFileAppend(newFiles, isQuick);\n }\n }, [isQuick, onFileAppend, unmarkHovered]);\n\n function handleDragOver(e: React.MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n\n if (hideTimeoutRef.current) {\n window.clearTimeout(hideTimeoutRef.current);\n }\n }\n\n if (!renderingAttachments) {\n return undefined;\n }\n\n const areAllPhotos = renderingAttachments.every((a) => SUPPORTED_IMAGE_CONTENT_TYPES.has(a.mimeType));\n const areAllVideos = renderingAttachments.every((a) => SUPPORTED_VIDEO_CONTENT_TYPES.has(a.mimeType));\n const areAllAudios = renderingAttachments.every((a) => a.mimeType.startsWith('audio/'));\n\n let title = '';\n if (areAllPhotos) {\n title = lang('PreviewSender.SendPhoto', renderingAttachments.length, 'i');\n } else if (areAllVideos) {\n title = lang('PreviewSender.SendVideo', renderingAttachments.length, 'i');\n } else if (areAllAudios) {\n title = lang('PreviewSender.SendAudio', renderingAttachments.length, 'i');\n } else {\n title = lang('PreviewSender.SendFile', renderingAttachments.length, 'i');\n }\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 \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 );\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 '../../../util/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 lang = useLang();\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 lang('lng_polls_choose_question');\n }\n\n return undefined;\n }, [hasErrors, lang, 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 lang('lng_polls_choose_answers');\n }\n return undefined;\n }, [hasErrors, lang, options]);\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

{lang('lng_polls_choose_correct')}

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

{lang('PollOptions')}

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

{lang('lng_polls_solution_title')}

\n setSolution(e.currentTarget.innerHTML)}\n />\n
{lang('CreatePoll.ExplanationInfo')}
\n \n )}\n
\n \n );\n};\n\nexport default memo(PollModal);\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 focus?: boolean;\n onClick: (emoji: string, name: string) => void;\n};\n\nconst EmojiButton: FC = ({ emoji, focus, onClick }) => {\n const handleClick = useCallback((e: React.MouseEvent) => {\n // Preventing safari from losing focus on Composer MessageInput\n e.preventDefault();\n\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_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport windowSize from '../../../util/windowSize';\nimport { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver';\nimport useMediaTransition from '../../../hooks/useMediaTransition';\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 = useMediaTransition(shouldRender);\n\n const lang = useLang();\n\n const emojisPerRow = IS_SINGLE_COLUMN_LAYOUT\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

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

\n \n {shouldRender && category.emojis.map((name) => {\n const emoji = allEmojis[name];\n // Recent emojis may contain emoticons that are no longer in the list\n if (!emoji) {\n return undefined;\n }\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 } from '../../../global/types';\n\nimport { MENU_TRANSITION_DURATION } from '../../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../util/environment';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\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, name: string) => void;\n};\n\ntype StateProps = 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,\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.current, !IS_SINGLE_COLUMN_LAYOUT);\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?.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, name);\n }, [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)(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_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport windowSize from '../../../util/windowSize';\nimport StickerButton from '../../common/StickerButton';\nimport useMediaTransition from '../../../hooks/useMediaTransition';\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_SINGLE_COLUMN_LAYOUT ? 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 = useMediaTransition(shouldRender);\n\n const stickersPerRow = IS_SINGLE_COLUMN_LAYOUT\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 { IS_TOUCH_ENV } from '../../../util/environment';\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?.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?.length) {\n loadAddedStickers();\n }\n }, [addedSetIds, loadAddedStickers]);\n\n useHorizontalScroll(headerRef.current);\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?.[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
{lang('ErrorSendRestrictedStickersAll')}
\n ) : noPopulatedSets ? (\n
{lang('NoStickers')}
\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 useVideoCleanup from '../../hooks/useVideoCleanup';\nimport useBuffering from '../../hooks/useBuffering';\nimport useCanvasBlur from '../../hooks/useCanvasBlur';\nimport { preventMessageInputBlurWithBubbling } from '../middle/helpers/preventMessageInputBlur';\n\nimport Spinner from '../ui/Spinner';\n\nimport './GifButton.scss';\n\ntype OwnProps = {\n gif: ApiVideo;\n observeIntersection: ObserveFn;\n isDisabled?: boolean;\n className?: string;\n onClick: (gif: ApiVideo) => void;\n};\n\nconst GifButton: FC = ({\n gif, observeIntersection, isDisabled, className, 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 hasThumbnail = Boolean(gif.thumbnail?.dataUri);\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 thumbRef = useCanvasBlur(gif.thumbnail?.dataUri, Boolean(previewBlobUrl));\n const videoData = useMedia(localMediaHash, !loadAndPlay, ApiMediaFormat.BlobUrl);\n const shouldRenderVideo = Boolean(loadAndPlay && videoData);\n const { isBuffered, bufferingHandlers } = useBuffering(true);\n const shouldRenderSpinner = loadAndPlay && !isBuffered;\n const isVideoReady = 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 fullClassName = buildClassName(\n 'GifButton',\n gif.width && gif.height && gif.width < gif.height ? 'vertical' : 'horizontal',\n localMediaHash,\n className,\n );\n\n return (\n \n {hasThumbnail && (\n \n )}\n {previewBlobUrl && !isVideoReady && (\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 { IS_TOUCH_ENV } from '../../../util/environment';\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 useLang from '../../../hooks/useLang';\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 const lang = useLang();\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, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiSticker, ApiVideo } from '../../../api/types';\n\nimport { IAllowedAttachmentOptions } from '../../../modules/helpers';\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } 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, { SYMBOL_MENU_TAB_TITLES, SymbolMenuTabs } 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, shouldPreserveInput?: boolean) => void;\n onGifSelect: (gif: ApiVideo) => void;\n onRemoveSymbol: () => void;\n onSearchOpen: (type: 'stickers' | 'gifs') => void;\n addRecentEmoji: AnyToVoidFunction;\n};\n\ntype StateProps = {\n isLeftColumnShown: boolean;\n};\n\nlet isActivated = false;\n\nconst SymbolMenu: FC = ({\n isOpen, allowedAttachmentOptions, isLeftColumnShown,\n onLoad, onClose,\n onEmojiSelect, onStickerSelect, onGifSelect,\n onRemoveSymbol, onSearchOpen, addRecentEmoji,\n}) => {\n const [activeTab, setActiveTab] = useState(0);\n const [recentEmojis, setRecentEmojis] = useState([]);\n\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose, undefined, IS_SINGLE_COLUMN_LAYOUT);\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_SINGLE_COLUMN_LAYOUT) {\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 recentEmojisRef = useRef(recentEmojis);\n recentEmojisRef.current = recentEmojis;\n useEffect(() => {\n if (!recentEmojisRef.current.length) {\n return;\n }\n\n recentEmojisRef.current.forEach((name) => {\n addRecentEmoji({ emoji: name });\n });\n\n setRecentEmojis([]);\n }, [isOpen, activeTab, addRecentEmoji]);\n\n const handleEmojiSelect = useCallback((emoji: string, name: string) => {\n setRecentEmojis((emojis) => {\n return [...emojis, name];\n });\n\n onEmojiSelect(emoji);\n }, [onEmojiSelect]);\n\n const handleSearch = useCallback((type: 'stickers' | 'gifs') => {\n onClose();\n onSearchOpen(type);\n }, [onClose, onSearchOpen]);\n\n const handleStickerSelect = useCallback((sticker: ApiSticker) => {\n onStickerSelect(sticker, true);\n }, [onStickerSelect]);\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_SINGLE_COLUMN_LAYOUT && (\n \n \n \n )}\n \n \n );\n\n if (IS_SINGLE_COLUMN_LAYOUT) {\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'SymbolMenu mobile-menu',\n transitionClassNames,\n !isLeftColumnShown && 'middle-column-open',\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(withGlobal(\n (global): StateProps => {\n return {\n isLeftColumnShown: global.isLeftColumnShown,\n };\n },\n)(SymbolMenu));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { CONTENT_TYPES_WITH_PREVIEW } 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 Array.from(CONTENT_TYPES_WITH_PREVIEW).join(','),\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 \n {lang('AttachmentMenu.PhotoOrVideo')}\n \n {lang('AttachDocument')}\n \n )}\n {canAttachPolls && (\n {lang('Poll')}\n )}\n \n );\n};\n\nexport default memo(AttachMenu);\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { ApiBotCommand, ApiUser } from '../../../api/types';\n\nimport renderText from '../../common/helpers/renderText';\nimport buildClassName from '../../../util/buildClassName';\n\nimport ListItem from '../../ui/ListItem';\nimport Avatar from '../../common/Avatar';\n\nimport './BotCommand.scss';\n\ntype OwnProps = {\n botCommand: ApiBotCommand;\n bot?: ApiUser;\n withAvatar?: boolean;\n focus?: boolean;\n onClick: (botCommand: ApiBotCommand) => void;\n};\n\nconst BotCommand: FC = ({\n withAvatar,\n focus,\n botCommand,\n bot,\n onClick,\n}) => {\n return (\n onClick(botCommand)}\n focus={focus}\n >\n {withAvatar && (\n \n )}\n
\n /{botCommand.command}\n {renderText(botCommand.description)}\n
\n \n );\n};\n\nexport default memo(BotCommand);\n","import React, {\n FC, useCallback, useEffect, useRef, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiBotCommand, ApiUser } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\nimport setTooltipItemVisible from '../../../util/setTooltipItemVisible';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\nimport { useKeyboardNavigation } from './hooks/useKeyboardNavigation';\n\nimport BotCommand from './BotCommand';\n\nimport './BotCommandTooltip.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n withUsername?: boolean;\n botCommands?: ApiBotCommand[];\n onClick: NoneToVoidFunction;\n onClose: NoneToVoidFunction;\n};\n\ntype StateProps = {\n usersById: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst BotCommandTooltip: FC = ({\n usersById,\n isOpen,\n withUsername,\n botCommands,\n onClick,\n onClose,\n sendBotCommand,\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 handleSendCommand = useCallback(({ botId, command }: ApiBotCommand) => {\n const bot = usersById[botId];\n sendBotCommand({\n command: `/${command}${withUsername && bot ? `@${bot.username}` : ''}`,\n botId,\n });\n onClick();\n }, [onClick, sendBotCommand, usersById, withUsername]);\n\n const selectedCommandIndex = useKeyboardNavigation({\n isActive: isOpen,\n items: botCommands,\n onSelect: handleSendCommand,\n onClose,\n });\n\n useEffect(() => {\n if (botCommands && !botCommands.length) {\n onClose();\n }\n }, [botCommands, onClose]);\n\n useEffect(() => {\n setTooltipItemVisible('.chat-item-clickable', selectedCommandIndex, containerRef);\n }, [selectedCommandIndex]);\n\n const prevCommands = usePrevious(botCommands && botCommands.length ? botCommands : undefined, shouldRender);\n const renderedCommands = botCommands && !botCommands.length ? prevCommands : botCommands;\n\n if (!shouldRender || (renderedCommands && !renderedCommands.length)) {\n return undefined;\n }\n\n const className = buildClassName(\n 'BotCommandTooltip composer-tooltip custom-scroll',\n transitionClassNames,\n );\n\n return (\n
\n {renderedCommands && renderedCommands.map((chatBotCommand, index) => (\n \n ))}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => ({\n usersById: global.users.byId,\n }),\n (setGlobal, actions): DispatchProps => pick(actions, ['sendBotCommand']),\n)(BotCommandTooltip));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiBotCommand } from '../../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport useMouseInside from '../../../hooks/useMouseInside';\n\nimport Menu from '../../ui/Menu';\nimport BotCommand from './BotCommand';\n\nimport './BotCommandMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n botCommands: ApiBotCommand[];\n onClose: NoneToVoidFunction;\n};\n\ntype DispatchProps = Pick;\n\nconst BotCommandMenu: FC = ({\n isOpen, botCommands, onClose, sendBotCommand,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose, undefined, IS_SINGLE_COLUMN_LAYOUT);\n\n const handleClick = useCallback((botCommand: ApiBotCommand) => {\n sendBotCommand({\n command: `/${botCommand.command}`,\n botId: botCommand.botId,\n });\n onClose();\n }, [onClose, sendBotCommand]);\n\n return (\n \n {botCommands.map((botCommand) => (\n \n ))}\n \n );\n};\n\nexport default memo(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['sendBotCommand']),\n)(BotCommandMenu));\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 './StickerTooltip.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 StickerTooltip: 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 'StickerTooltip composer-tooltip custom-scroll',\n transitionClassNames,\n !(displayedStickers?.length) && 'hidden',\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)(StickerTooltip));\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, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport findInViewport from '../../../util/findInViewport';\nimport isFullyVisible from '../../../util/isFullyVisible';\nimport fastSmoothScrollHorizontal from '../../../util/fastSmoothScrollHorizontal';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevDuringAnimation from '../../../hooks/usePrevDuringAnimation';\nimport { useKeyboardNavigation } from './hooks/useKeyboardNavigation';\n\nimport Loading from '../../ui/Loading';\nimport EmojiButton from './EmojiButton';\n\nimport './EmojiTooltip.scss';\n\nconst VIEWPORT_MARGIN = 8;\nconst EMOJI_BUTTON_WIDTH = 44;\nconst CLOSE_DURATION = 350;\n\nfunction setItemVisible(index: number, containerRef: Record) {\n const container = containerRef.current!;\n if (!container) {\n return;\n }\n\n const { visibleIndexes, allElements } = findInViewport(\n container,\n '.EmojiButton',\n VIEWPORT_MARGIN,\n true,\n true,\n true,\n );\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], true))) {\n const position = index > visibleIndexes[visibleIndexes.length - 1] ? 'start' : 'end';\n const newLeft = position === 'start' ? index * EMOJI_BUTTON_WIDTH : 0;\n\n fastSmoothScrollHorizontal(container, newLeft);\n }\n}\n\nexport type OwnProps = {\n isOpen: boolean;\n onEmojiSelect: (text: string) => void;\n onClose: NoneToVoidFunction;\n addRecentEmoji: AnyToVoidFunction;\n emojis: Emoji[];\n};\n\nconst EmojiTooltip: FC = ({\n isOpen,\n emojis,\n onClose,\n onEmojiSelect,\n addRecentEmoji,\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 listEmojis: Emoji[] = usePrevDuringAnimation(emojis.length ? emojis : undefined, CLOSE_DURATION) || [];\n\n const handleSelectEmoji = useCallback((emoji: Emoji) => {\n onEmojiSelect(emoji.native);\n addRecentEmoji({ emoji: emoji.id });\n }, [addRecentEmoji, onEmojiSelect]);\n\n const handleClick = useCallback((native: string, id: string) => {\n onEmojiSelect(native);\n addRecentEmoji({ emoji: id });\n }, [addRecentEmoji, onEmojiSelect]);\n\n const selectedIndex = useKeyboardNavigation({\n isActive: isOpen,\n isHorizontal: true,\n items: emojis,\n onSelect: handleSelectEmoji,\n onClose,\n });\n\n useEffect(() => {\n setItemVisible(selectedIndex, containerRef);\n }, [selectedIndex]);\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 composer-tooltip custom-scroll-x',\n transitionClassNames,\n );\n\n return (\n \n {shouldRender && listEmojis ? (\n listEmojis.map((emoji, index) => (\n \n ))\n ) : shouldRender ? (\n \n ) : undefined}\n \n );\n};\n\nexport default memo(EmojiTooltip);\n","import React, { FC, memo } from '../../../../lib/teact/teact';\n\nimport { ApiWebDocument } from '../../../../api/types';\n\nimport { getFirstLetters } from '../../../../util/textFormat';\nimport renderText from '../../../common/helpers/renderText';\nimport useMedia from '../../../../hooks/useMedia';\n\nimport ListItem from '../../../ui/ListItem';\n\nimport './BaseResult.scss';\nimport { preventMessageInputBlurWithBubbling } from '../../helpers/preventMessageInputBlur';\n\nexport type OwnProps = {\n focus?: boolean;\n thumbnail?: ApiWebDocument;\n thumbUrl?: string;\n title?: string;\n description?: string;\n transitionClassNames?: string;\n onClick: NoneToVoidFunction;\n};\n\nconst BaseResult: FC = ({\n title,\n description,\n thumbnail,\n thumbUrl,\n focus,\n transitionClassNames = '',\n onClick,\n}) => {\n let content: string | undefined = '';\n\n const thumbnailDataUrl = useMedia(thumbnail ? `webDocument:${thumbnail.url}` : undefined);\n thumbUrl = thumbUrl || thumbnailDataUrl;\n\n if (thumbUrl) {\n content = (\n \"\"\n );\n } else if (title) {\n content = getFirstLetters(title, 1);\n }\n\n return (\n \n \n {typeof content === 'string' ? renderText(content) : content}\n \n
\n {title && (
{title}
)}\n {description && (
{description}
)}\n
\n \n );\n};\n\nexport default memo(BaseResult);\n","import React, { FC, memo, useCallback } from '../../../../lib/teact/teact';\n\nimport {\n ApiBotInlineMediaResult, ApiBotInlineResult, ApiPhoto, ApiThumbnail, ApiWebDocument,\n} from '../../../../api/types';\n\nimport buildClassName from '../../../../util/buildClassName';\nimport useMedia from '../../../../hooks/useMedia';\nimport useMediaTransition from '../../../../hooks/useMediaTransition';\n\nimport BaseResult from './BaseResult';\n\nimport './MediaResult.scss';\n\nexport type OwnProps = {\n focus?: boolean;\n isForGallery?: boolean;\n inlineResult: ApiBotInlineMediaResult | ApiBotInlineResult;\n onClick: (result: ApiBotInlineResult) => void;\n};\n\nconst MediaResult: FC = ({\n focus, isForGallery, inlineResult, onClick,\n}) => {\n let photo: ApiPhoto | undefined;\n let thumbnail: ApiThumbnail | undefined;\n let webThumbnail: ApiWebDocument | undefined;\n\n if ('photo' in inlineResult) {\n photo = inlineResult.photo;\n }\n // For results with type=video (for example @stikstokbot)\n if ('thumbnail' in inlineResult) {\n thumbnail = inlineResult.thumbnail;\n }\n if ('webThumbnail' in inlineResult && isForGallery) {\n webThumbnail = inlineResult.webThumbnail;\n }\n\n const thumbnailDataUrl = useMedia(webThumbnail ? `webDocument:${webThumbnail.url}` : undefined);\n const mediaBlobUrl = useMedia(photo && `photo${photo.id}?size=m`);\n const transitionClassNames = useMediaTransition(mediaBlobUrl);\n\n const handleClick = useCallback(() => {\n onClick(inlineResult);\n }, [inlineResult, onClick]);\n\n if (isForGallery) {\n return (\n
\n \"\"\n \"\"\n
\n );\n }\n\n const { title, description } = inlineResult;\n\n return (\n \n );\n};\n\nexport default memo(MediaResult);\n","import React, { FC, memo, useCallback } from '../../../../lib/teact/teact';\n\nimport { ApiBotInlineResult } from '../../../../api/types';\n\nimport BaseResult from './BaseResult';\n\nexport type OwnProps = {\n focus?: boolean;\n inlineResult: ApiBotInlineResult;\n onClick: (result: ApiBotInlineResult) => void;\n};\n\nconst ArticleResult: FC = ({ focus, inlineResult, onClick }) => {\n const {\n title, url, description, webThumbnail,\n } = inlineResult;\n\n const handleClick = useCallback(() => {\n onClick(inlineResult);\n }, [inlineResult, onClick]);\n\n return (\n \n );\n};\n\nexport default memo(ArticleResult);\n","import React, {\n FC, memo, useCallback,\n} from '../../../../lib/teact/teact';\n\nimport { ApiBotInlineMediaResult, ApiBotInlineResult } from '../../../../api/types';\n\nimport { ObserveFn } from '../../../../hooks/useIntersectionObserver';\n\nimport GifButton from '../../../common/GifButton';\n\ntype OwnProps = {\n inlineResult: ApiBotInlineMediaResult;\n observeIntersection: ObserveFn;\n onClick: (result: ApiBotInlineResult) => void;\n};\n\nconst GifResult: FC = ({\n inlineResult, observeIntersection, onClick,\n}) => {\n const { gif } = inlineResult;\n\n const handleClick = useCallback(() => {\n onClick(inlineResult);\n }, [inlineResult, onClick]);\n\n if (!gif) {\n return undefined;\n }\n\n return (\n \n );\n};\n\nexport default memo(GifResult);\n","import React, { FC, memo } from '../../../../lib/teact/teact';\n\nimport { ApiBotInlineMediaResult, ApiBotInlineResult } from '../../../../api/types';\n\nimport { STICKER_SIZE_INLINE_BOT_RESULT } from '../../../../config';\nimport { ObserveFn } from '../../../../hooks/useIntersectionObserver';\n\nimport StickerButton from '../../../common/StickerButton';\n\ntype OwnProps = {\n inlineResult: ApiBotInlineMediaResult;\n observeIntersection: ObserveFn;\n onClick: (result: ApiBotInlineResult) => void;\n};\n\nconst StickerResult: FC = ({ inlineResult, observeIntersection, onClick }) => {\n const { sticker } = inlineResult;\n\n if (!sticker) {\n return undefined;\n }\n\n return (\n \n );\n};\n\nexport default memo(StickerResult);\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiBotInlineMediaResult, ApiBotInlineResult, ApiBotInlineSwitchPm } from '../../../api/types';\nimport { IAllowedAttachmentOptions } from '../../../modules/helpers';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport setTooltipItemVisible from '../../../util/setTooltipItemVisible';\nimport buildClassName from '../../../util/buildClassName';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport { throttle } from '../../../util/schedulers';\nimport { pick } from '../../../util/iteratees';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport usePrevious from '../../../hooks/usePrevious';\nimport { useKeyboardNavigation } from './hooks/useKeyboardNavigation';\n\nimport MediaResult from './inlineResults/MediaResult';\nimport ArticleResult from './inlineResults/ArticleResult';\nimport GifResult from './inlineResults/GifResult';\nimport StickerResult from './inlineResults/StickerResult';\nimport ListItem from '../../ui/ListItem';\nimport InfiniteScroll from '../../ui/InfiniteScroll';\n\nimport './InlineBotTooltip.scss';\n\nconst INTERSECTION_DEBOUNCE_MS = 200;\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nexport type OwnProps = {\n isOpen: boolean;\n botId?: string;\n isGallery?: boolean;\n allowedAttachmentOptions: IAllowedAttachmentOptions;\n inlineBotResults?: (ApiBotInlineResult | ApiBotInlineMediaResult)[];\n switchPm?: ApiBotInlineSwitchPm;\n onSelectResult: (inlineResult: ApiBotInlineMediaResult | ApiBotInlineResult) => void;\n loadMore: NoneToVoidFunction;\n onClose: NoneToVoidFunction;\n};\n\ntype DispatchProps = Pick;\n\nconst InlineBotTooltip: FC = ({\n isOpen,\n botId,\n isGallery,\n inlineBotResults,\n switchPm,\n loadMore,\n onClose,\n openChat,\n startBot,\n onSelectResult,\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 {\n observe: observeIntersection,\n } = useIntersectionObserver({\n rootRef: containerRef,\n debounceMs: INTERSECTION_DEBOUNCE_MS,\n isDisabled: !isOpen,\n });\n\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (direction === LoadMoreDirection.Backwards) {\n runThrottled(loadMore);\n }\n }, [loadMore]);\n\n const selectedIndex = useKeyboardNavigation({\n isActive: isOpen,\n shouldRemoveSelectionOnReset: isGallery,\n noArrowNavigation: isGallery,\n items: inlineBotResults,\n onSelect: onSelectResult,\n onClose,\n });\n\n useEffect(() => {\n setTooltipItemVisible('.chat-item-clickable', selectedIndex, containerRef);\n }, [selectedIndex]);\n\n const handleSendPm = useCallback(() => {\n openChat({ id: botId });\n startBot({ botId, param: switchPm!.startParam });\n }, [botId, openChat, startBot, switchPm]);\n\n const prevInlineBotResults = usePrevious(\n inlineBotResults?.length\n ? inlineBotResults\n : undefined,\n shouldRender,\n );\n const renderedInlineBotResults = inlineBotResults && !inlineBotResults.length\n ? prevInlineBotResults\n : inlineBotResults;\n\n if (!shouldRender || !renderedInlineBotResults || (!renderedInlineBotResults.length && !switchPm)) {\n return undefined;\n }\n\n const className = buildClassName(\n 'InlineBotTooltip composer-tooltip',\n IS_TOUCH_ENV ? 'no-scrollbar' : 'custom-scroll',\n isGallery && 'gallery',\n transitionClassNames,\n );\n\n function renderSwitchPm() {\n return (\n \n {switchPm!.text}\n \n );\n }\n\n function renderContent() {\n return renderedInlineBotResults!.map((inlineBotResult, index) => {\n switch (inlineBotResult.type) {\n case 'gif':\n return (\n \n );\n\n case 'photo':\n return (\n \n );\n\n case 'sticker':\n return (\n \n );\n\n case 'video':\n case 'game':\n return (\n \n );\n case 'article':\n case 'audio':\n return (\n \n );\n\n default:\n return undefined;\n }\n });\n }\n\n return (\n \n {switchPm && renderSwitchPm()}\n {renderContent()}\n \n );\n};\n\nexport default memo(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'startBot', 'openChat', 'sendInlineBotResult',\n ]),\n)(InlineBotTooltip));\n","import React, {\n FC, useMemo, memo, useRef,\n} 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 useLang from '../../hooks/useLang';\nimport { orderBy, pick } from '../../util/iteratees';\nimport { MEMO_EMPTY_ARRAY } from '../../util/memo';\nimport useKeyboardListNavigation from '../../hooks/useKeyboardListNavigation';\nimport useHistoryBack from '../../hooks/useHistoryBack';\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: string;\n threadId: number;\n onClose: NoneToVoidFunction;\n isActive: boolean;\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 onClose,\n isActive,\n chat,\n messagesById,\n query,\n totalCount,\n foundIds,\n searchTextMessagesLocal,\n focusMessage,\n}) => {\n const lang = useLang();\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(lang, senderChat) : getUserFullName(senderUser);\n const text = getMessageSummaryText(lang, 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 useHistoryBack(isActive, onClose);\n\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const handleKeyDown = useKeyboardListNavigation(containerRef, true, (index) => {\n const foundResult = foundResults?.[index === -1 ? 0 : index];\n if (foundResult) {\n foundResult.onClick();\n }\n }, '.ListItem-button', true);\n\n return (\n \n

\n {!query ? (\n lang('lng_dlg_search_for_messages')\n ) : (totalCount === 0 || !foundResults.length) ? (\n lang('lng_search_no_results')\n ) : totalCount === 1 ? (\n '1 message found'\n ) : (\n `${(foundResults.length && (totalCount || foundResults.length))} 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';\nimport useLang from '../../hooks/useLang';\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,\n loadStickers, toggleStickerSet, isSomeModalOpen, onModalToggle,\n}) => {\n const lang = useLang();\n const isAdded = set && Boolean(set.installedDate);\n const areStickersLoaded = Boolean(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

{lang('Stickers', set.count, 'i')}

\n
\n \n {lang(isAdded ? 'Stickers.Installed' : 'Stickers.Install')}\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';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Loading from '../ui/Loading';\nimport StickerSetResult from './StickerSetResult';\n\nimport './StickerSearch.scss';\n\ntype OwnProps = {\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\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 onClose,\n isActive,\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 lang = useLang();\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 useHistoryBack(isActive, onClose);\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';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport GifButton from '../common/GifButton';\nimport Loading from '../ui/Loading';\n\nimport './GifSearch.scss';\n\ntype OwnProps = {\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\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 onClose,\n isActive,\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 useHistoryBack(isActive, onClose);\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\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, 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';\nimport useLang from '../../hooks/useLang';\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?: string[];\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 const lang = useLang();\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: string) => {\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 \n {getPercentage(answerVote.votersCount, totalVoters)}%\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 memo(withGlobal(\n (global, { answer }: OwnProps): StateProps => {\n const { voters, offsets } = global.pollResults;\n\n return {\n voters: voters?.[answer.option],\n offset: (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';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport PollAnswerResults from './PollAnswerResults';\nimport Loading from '../ui/Loading';\n\nimport './PollResults.scss';\n\ntype OwnProps = {\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n message?: ApiMessage;\n lastSyncTime?: number;\n};\n\nconst PollResults: FC = ({\n onClose,\n isActive,\n chat,\n message,\n lastSyncTime,\n}) => {\n const lang = useLang();\n useHistoryBack(isActive, onClose);\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

{renderText(summary.question, ['emoji', 'br'])}

\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 {\n selectChat, selectNotifyExceptions, selectNotifySettings, selectUser,\n} from '../../../modules/selectors';\nimport { selectIsChatMuted } from '../../../modules/helpers';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\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: string;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n user?: ApiUser;\n chat: ApiChat;\n progress?: ManagementProgress;\n isMuted?: boolean;\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 isMuted,\n updateContact,\n deleteUser,\n deleteHistory,\n closeManagement,\n openChat,\n onClose,\n isActive,\n}) => {\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [error, setError] = useState();\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n const currentFirstName = user ? (user.firstName || '') : '';\n const currentLastName = user ? (user.lastName || '') : '';\n\n const [firstName, setFirstName] = useState(currentFirstName);\n const [lastName, setLastName] = useState(currentLastName);\n const [isNotificationsEnabled, setIsNotificationsEnabled] = useState(!isMuted);\n\n useEffect(() => {\n setIsNotificationsEnabled(!isMuted);\n }, [isMuted]);\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 deleteHistory({\n chatId: chat.id,\n shouldDeleteForAll: false,\n });\n deleteUser({ userId });\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [chat.id, 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 const isMuted = selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global));\n\n return {\n user, chat, progress, isMuted,\n };\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';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\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: string;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\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 deleteChat,\n leaveChannel,\n deleteChannel,\n closeManagement,\n openChat,\n onClose,\n isActive,\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 useHistoryBack(isActive, onClose);\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?.adminMembers?.length) || 0;\n\n const handleDeleteGroup = useCallback(() => {\n if (isBasicGroup) {\n deleteChat({ chatId: chat.id });\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,\n closeDeleteDialog, closeManagement, leaveChannel, deleteChannel, deleteChat, 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 {lang('GroupType')}\n {chat.username ? lang('TypePublic') : lang('TypePrivate')}\n \n )}\n {hasLinkedChannel && (\n \n {lang('LinkedChannel')}\n {lang('DiscussionUnlink')}\n \n )}\n \n {lang('ChannelPermissions')}\n \n {enabledPermissionsCount}/{TOTAL_PERMISSIONS_COUNT}\n \n \n \n {lang('ChannelAdministrators')}\n {formatInteger(adminsCount)}\n \n
\n
\n \n {lang('GroupMembers')}\n {formatInteger(chat.membersCount ?? 0)}\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?.linkedChatId);\n const isBasicGroup = isChatBasicGroup(chat);\n\n return {\n chat,\n progress,\n isBasicGroup,\n hasLinkedChannel,\n canChangeInfo: isBasicGroup ? chat.isCreator : getHasAdminRight(chat, 'changeInfo'),\n canBanUsers: isBasicGroup ? chat.isCreator : getHasAdminRight(chat, 'banUsers'),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'togglePreHistoryHidden', 'updateChat', 'closeManagement',\n 'leaveChannel', 'deleteChannel', 'deleteChat', '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';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\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: string;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: string, isPromotedByCurrentUser?: boolean) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n currentUserId?: string;\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 onClose,\n isActive,\n}) => {\n const [permissions, setPermissions] = useState({});\n const [havePermissionChanged, setHavePermissionChanged] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\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?.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 Exclude]),\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?.[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 {lang('ChannelBlockedUsers')}\n {removedUsersCount}\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, useMemo, useState, memo, useRef, 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 { getUserFullName } from '../../../modules/helpers';\nimport searchWords from '../../../util/searchWords';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport ChatOrUserPicker from '../../common/ChatOrUserPicker';\n\nexport type OwnProps = {\n chat: ApiChat;\n isOpen: boolean;\n onClose: NoneToVoidFunction;\n};\n\ntype StateProps = {\n usersById: Record;\n currentUserId?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst RemoveGroupUserModal: FC = ({\n chat,\n usersById,\n currentUserId,\n isOpen,\n onClose,\n loadMoreMembers,\n deleteChatMember,\n}) => {\n const lang = useLang();\n const [filter, setFilter] = useState('');\n // eslint-disable-next-line no-null/no-null\n const filterRef = useRef(null);\n\n const usersId = useMemo(() => {\n const availableMembers = (chat.fullInfo?.members || []).filter((member) => {\n return !member.isAdmin && !member.isOwner && member.userId !== currentUserId;\n });\n\n return availableMembers.reduce((acc, member) => {\n if (\n !filter\n || !usersById[member.userId]\n || searchWords(getUserFullName(usersById[member.userId]) || '', filter)\n ) {\n acc.push(member.userId);\n }\n\n return acc;\n }, []);\n }, [chat.fullInfo?.members, currentUserId, filter, usersById]);\n\n const handleRemoveUser = useCallback((userId: string) => {\n deleteChatMember({ chatId: chat.id, userId });\n onClose();\n }, [chat.id, deleteChatMember, onClose]);\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n users: {\n byId: usersById,\n },\n currentUserId,\n } = global;\n\n return { usersById, currentUserId };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadMoreMembers', 'deleteChatMember']),\n)(RemoveGroupUserModal));\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 { getHasAdminRight, getUserFullName } from '../../../modules/helpers';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\nimport useFlag from '../../../hooks/useFlag';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport RemoveGroupUserModal from './RemoveGroupUserModal';\n\ntype OwnProps = {\n chatId: string;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n usersById: Record;\n canDeleteMembers?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupRemovedUsers: FC = ({\n chat,\n usersById,\n canDeleteMembers,\n updateChatMemberBannedRights,\n onClose,\n isActive,\n}) => {\n const lang = useLang();\n const [isRemoveUserModalOpen, openRemoveUserModal, closeRemoveUserModal] = useFlag();\n\n useHistoryBack(isActive, onClose);\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 {canDeleteMembers && (\n \n \n \n )}\n {chat && canDeleteMembers && (\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 canDeleteMembers = chat && (getHasAdminRight(chat, 'banUsers') || chat.isCreator);\n\n return { chat, usersById, canDeleteMembers };\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';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport './Management.scss';\n\ntype OwnProps = {\n chatId: string;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\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 onClose,\n isActive,\n}) => {\n const currentTitle = chat ? (chat.title || '') : '';\n const currentAbout = chat?.fullInfo ? (chat.fullInfo.about || '') : '';\n const hasLinkedChat = 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 useHistoryBack(isActive, onClose);\n\n useEffect(() => {\n if (progress === ManagementProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setError(undefined);\n }\n }, [progress]);\n\n const adminsCount = (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 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 {lang('ChannelType')}\n {chat.username ? lang('TypePublic') : lang('TypePrivate')}\n \n )}\n \n {lang('Discussion')}\n {hasLinkedChat ? lang('DiscussionUnlink') : lang('Add')}\n \n \n {lang('ChannelAdministrators')}\n {adminsCount}\n \n
\n \n
\n
\n
\n \n {lang('ChannelSubscribers')}\n {lang('Subscribers', chat.membersCount ?? 0, 'i')}\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?.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';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\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: string;\n onClose: NoneToVoidFunction;\n isActive: boolean;\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 onClose,\n isActive,\n isChannel,\n progress,\n isUsernameAvailable,\n checkPublicLink,\n updatePublicLink,\n updatePrivateLink,\n}) => {\n const isPublic = Boolean(chat.username);\n const privateLink = 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 = Boolean(\n (privacyType === 'public' && username && isUsernameAvailable)\n || (privacyType === 'private' && isPublic),\n );\n\n useHistoryBack(isActive, onClose);\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

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

\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';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\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: string;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n chatsByIds: Record;\n linkedChat?: ApiChat;\n forDiscussionIds?: string[];\n isChannel?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageDiscussion: FC = ({\n chat,\n onClose,\n isActive,\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?.id;\n\n useHistoryBack(isActive, onClose);\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: string) => {\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?.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';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\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: string;\n selectedChatMemberId?: string;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\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 onClose,\n isActive,\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 useHistoryBack(isActive, onClose);\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?.fullInfo && selectedChatMemberId && !selectedChatMember) {\n onScreenSelect(ManagementScreens.GroupPermissions);\n }\n }, [chat, onScreenSelect, selectedChatMember, selectedChatMemberId]);\n\n useEffect(() => {\n setPermissions((selectedChatMember?.bannedRights) || (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 Exclude]),\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: Exclude) => {\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\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';\n\nimport { getUserFullName, isChatChannel } from '../../../modules/helpers';\nimport { selectChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: string;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: string, isPromotedByCurrentUser?: boolean) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat: ApiChat;\n currentUserId?: string;\n isChannel: boolean;\n usersById: Record;\n};\n\nconst ManageChatAdministrators: FC = ({\n chat,\n isChannel,\n currentUserId,\n usersById,\n onScreenSelect,\n onChatMemberSelect,\n onClose,\n isActive,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\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 {lang('EventLog')}\n {lang(isChannel ? 'EventLogInfoDetailChannel' : 'EventLogInfoDetail')}\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';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: string;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n};\n\nconst ManageGroupRecentActions: FC = ({ chat, onClose, isActive }) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\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

{lang('Channel.Management.Title')}

\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';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\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: string;\n selectedChatMemberId?: string;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat: ApiChat;\n usersById: Record;\n currentUserId?: string;\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 onClose,\n isActive,\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 useHistoryBack(isActive, onClose);\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?.fullInfo && selectedChatMemberId && !selectedChatMember) {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }\n }, [chat, onScreenSelect, selectedChatMember, selectedChatMemberId]);\n\n useEffect(() => {\n setPermissions((selectedChatMember?.adminRights) || {});\n setCustomTitle(((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
\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\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 { sortUserIds, isChatChannel } from '../../../modules/helpers';\nimport { pick } from '../../../util/iteratees';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport NothingFound from '../../common/NothingFound';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: string;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n usersById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n serverTimeOffset: number;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupMembers: FC = ({\n members,\n usersById,\n isChannel,\n openUserInfo,\n onClose,\n isActive,\n serverTimeOffset,\n}) => {\n const memberIds = useMemo(() => {\n if (!members || !usersById) {\n return undefined;\n }\n\n return sortUserIds(members.map(({ userId }) => userId), usersById, undefined, serverTimeOffset);\n }, [members, serverTimeOffset, usersById]);\n\n const handleMemberClick = useCallback((id: string) => {\n openUserInfo({ id });\n }, [openUserInfo]);\n\n useHistoryBack(isActive, onClose);\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?.fullInfo?.members;\n const isChannel = chat && isChatChannel(chat);\n\n return {\n members,\n usersById,\n isChannel,\n serverTimeOffset: global.serverTimeOffset,\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 { sortUserIds, isChatChannel } from '../../../modules/helpers';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport NothingFound from '../../common/NothingFound';\n\ntype OwnProps = {\n chatId: string;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: string) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n usersById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n serverTimeOffset: number;\n};\n\nconst ManageGroupUserPermissionsCreate: FC = ({\n usersById,\n members,\n isChannel,\n onScreenSelect,\n onChatMemberSelect,\n onClose,\n isActive,\n serverTimeOffset,\n}) => {\n useHistoryBack(isActive, onClose);\n\n const memberIds = useMemo(() => {\n if (!members || !usersById) {\n return undefined;\n }\n\n return sortUserIds(\n members.filter((member) => !member.isOwner).map(({ userId }) => userId),\n usersById, undefined, serverTimeOffset,\n );\n }, [members, serverTimeOffset, usersById]);\n\n const handleExceptionMemberClick = useCallback((memberId: string) => {\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\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { byId: usersById } = global.users;\n const members = chat?.fullInfo?.members;\n const isChannel = chat && isChatChannel(chat);\n\n return {\n members,\n usersById,\n isChannel,\n serverTimeOffset: global.serverTimeOffset,\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: string;\n currentScreen: ManagementScreens;\n selectedChatMemberId?: string;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: string, isPromotedByCurrentUser?: boolean) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\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 onClose,\n isActive,\n managementType,\n}) => {\n switch (currentScreen) {\n case ManagementScreens.Initial: {\n switch (managementType) {\n case 'user':\n return (\n \n );\n case 'group':\n return (\n \n );\n case 'channel':\n return (\n \n );\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 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","// 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 Caledonia6\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 useReducer, { StateReducer, Dispatch } from '../useReducer';\nimport countryList from '../../util/countries';\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\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/countries';\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';\n\nimport { formatCurrency } from '../../util/formatCurrency';\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\nimport useLang from '../../hooks/useLang';\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 const lang = useLang();\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: formatCurrency(amount, currency, lang.code),\n value,\n }))), [shippingOptions, currency, lang.code]);\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 { LangCode, Price } from '../../types';\n\nimport { formatCurrency } from '../../util/formatCurrency';\nimport useLang from '../../hooks/useLang';\n\nimport './Checkout.scss';\n\nexport type OwnProps = {\n invoiceContent?: {\n title?: 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 const lang = useLang();\n\n const { photoUrl, title, text } = invoiceContent || {};\n const {\n paymentMethod,\n paymentProvider,\n shippingAddress,\n name,\n phone,\n shippingMethod,\n } = (checkoutInfo || {});\n\n return (\n
\n
\n {photoUrl && \"\"}\n
\n
{title}
\n

{text}

\n
\n
\n
\n { prices && prices.map((item) => (\n renderPaymentItem(lang.code, item.label, item.amount, currency)\n )) }\n { shippingPrices && shippingPrices.map((item) => (\n renderPaymentItem(lang.code, item.label, item.amount, currency)\n )) }\n { totalPrice !== undefined && (\n renderPaymentItem(lang.code, lang('Checkout.TotalAmount'), 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(\n langCode: LangCode | undefined, title: string, value: number, currency?: string, main = false,\n) {\n return (\n
\n
\n { title }\n
\n
\n {formatCurrency(value, currency, langCode)}\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?.[0] && Number(parts[0]) > 12) {\n parts[0] = '12';\n }\n if (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","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/countries';\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';\n\nimport { pick } from '../../util/iteratees';\nimport { formatCurrency } from '../../util/formatCurrency';\nimport { detectCardTypeText } from '../common/helpers/detectCardType';\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};\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 validateRequestedInfo,\n sendPaymentForm,\n setPaymentStep,\n sendCredentialsInfo,\n clearPaymentError,\n}) => {\n const [paymentState, paymentDispatch] = usePaymentReducer();\n const [isLoading, setIsLoading] = useState(false);\n const lang = useLang();\n\n useEffect(() => {\n if (step || error) {\n setIsLoading(false);\n }\n }, [step, error]);\n\n useEffect(() => {\n if (error?.field) {\n paymentDispatch({\n type: 'setFormErrors',\n payload: {\n [error.field]: error.message,\n },\n });\n }\n }, [error, 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 {lang('OK')}\n \n
\n );\n }\n\n function renderModalContent(currentStep: PaymentStep) {\n switch (currentStep) {\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 lang('Checkout.PayPrice', formatCurrency(totalPrice, currency, lang.code));\n default:\n return lang('Next');\n }\n }, [step, lang, currency, totalPrice]);\n\n if (isProviderError) {\n return (\n \n

\n Sorry, Telegram WebZ doesn't support payments with this provider yet.
\n Please use one of our mobile apps to do this.\n

\n \n {lang('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 };\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?.prices;\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?.title;\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';\n\nimport useLang from '../../hooks/useLang';\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 checkoutInfo = useMemo(() => {\n return getCheckoutInfo(credentialsTitle, info, shippingMethod);\n }, [info, shippingMethod, credentialsTitle]);\n\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,\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,\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?.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 { 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_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\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_SINGLE_COLUMN_LAYOUT ? 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 const lang = useLang();\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_SINGLE_COLUMN_LAYOUT } 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_SINGLE_COLUMN_LAYOUT ? 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 { 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// @ts-ignore\nimport CameraFlip from '../../../assets/animatedIcons/CameraFlip.tgs';\n// @ts-ignore\nimport HandFilled from '../../../assets/animatedIcons/HandFilled.tgs';\n// @ts-ignore\nimport HandOutline from '../../../assets/animatedIcons/HandOutline.tgs';\n// @ts-ignore\nimport Speaker from '../../../assets/animatedIcons/Speaker.tgs';\n// @ts-ignore\nimport VoiceAllowTalk from '../../../assets/animatedIcons/VoiceAllowTalk.tgs';\n// @ts-ignore\nimport VoiceMini from '../../../assets/animatedIcons/VoiceMini.tgs';\n// @ts-ignore\nimport VoiceMuted from '../../../assets/animatedIcons/VoiceMuted.tgs';\n// @ts-ignore\nimport VoiceOutlined from '../../../assets/animatedIcons/VoiceOutlined.tgs';\n\nexport const ANIMATED_STICKERS_PATHS = {\n MonkeyIdle,\n MonkeyTracking,\n MonkeyClose,\n MonkeyPeek,\n FoldersAll,\n FoldersNew,\n DiscussionGroups,\n CameraFlip,\n HandFilled,\n HandOutline,\n Speaker,\n VoiceAllowTalk,\n VoiceMini,\n VoiceMuted,\n VoiceOutlined,\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","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: 1,\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"],"names":["createGhost","source","origin","ghost","document","createElement","classList","add","img","Image","src","HTMLVideoElement","poster","appendChild","MediaViewerOrigin","profileInfo","querySelector","cloneNode","isMessageImageFullyVisible","container","imageEl","messageListElement","imgOffsetTop","offsetTop","closest","id","includes","parentElement","scrollTop","offsetHeight","applyStyles","element","styles","Object","assign","style","getNodes","message","containerSelector","mediaSelector","mediaEls","querySelectorAll","mediaEl","length","applyShape","firstChild","objectFit","withGlobal","global","chatId","messageId","isAvatar","sender","isUserId","selectUser","selectChat","selectChatMessage","selectSender","setGlobal","actions","pick","closeMediaViewer","focusMessage","handleFocusMessage","useCallback","lang","useLang","senderTitle","getSenderTitle","className","onClick","Avatar","key","size","user","chat","dir","renderText","formatMediaDateTime","date","memo","isDownloading","selectIsDownloading","mediaData","isVideo","isZoomed","fileName","onCloseMediaViewer","onForward","onZoomToggle","downloadMessageMedia","cancelMessageMediaDownload","loadProgress","downloadProgress","useMediaWithLoadProgress","getMessageMediaHash","handleDownloadClick","MenuButton","useMemo","onTrigger","isOpen","Button","round","color","undefined","ariaLabel","IS_SINGLE_COLUMN_LAYOUT","DropdownMenu","trigger","positionX","MenuItem","icon","Math","href","download","ProgressSpinner","progress","noCross","text","isHidden","isForVideo","isMultiline","setIsMultiline","useState","useEffect","footerContent","checkIsMultiline","height","clientHeight","REM","handleResize","throttle","window","addEventListener","removeEventListener","classNames","buildClassName","e","stopPropagation","prop","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","units","bytes","number","floor","log","toFixed","stopEvent","bufferedProgress","currentTime","duration","fileSize","isForceVisible","isForceMobileVersion","isPlayed","isFullscreenSupported","isFullscreen","onChangeFullscreen","onPlayPause","onSeek","isVisible","setVisibility","seekerRef","useRef","isSeeking","timeout","setTimeout","clearTimeout","body","remove","handleSeek","current","width","left","getBoundingClientRect","clientX","MouseEvent","targetTouches","max","min","handleStartSeek","handleStopSeek","loadedPercent","totalSize","captureEvents","onCapture","onRelease","onDrag","percentagePlayed","percentageBuffered","ref","renderSeekLine","ripple","formatMediaDuration","renderTime","formatFileSize","url","isGif","posterData","posterSize","isMediaViewerOpen","noPlay","onClose","videoRef","setIsPlayed","IS_TOUCH_ENV","IS_IOS","setCurrentTime","isControlsVisible","setIsControlsVisible","setFullscreen","exitFullscreen","elRef","setIsFullscreen","Boolean","useLayoutEffect","listener","listenerEnter","listenerExit","video","PLATFORM_ENV","requestFullscreen","webkitRequestFullscreen","webkitEnterFullscreen","mozRequestFullScreen","mozCancelFullScreen","webkitCancelFullScreen","webkitExitFullscreen","useFullscreenStatus","isBuffered","bufferingHandlers","useBuffering","shouldRender","shouldRenderSpinner","transitionClassNames","spinnerClassNames","useShowTransition","shouldRenderPlayButton","playButtonClassNames","pause","safePlay","togglePlayState","useVideoCleanup","handleMouseOver","handleMouseOut","handleTimeUpdate","currentTarget","handleEnded","handleFullscreenChange","position","toggleControls","togglePayingStateBySpace","preventDefault","wrapperStyle","videoStyle","onMouseOver","onMouseOut","autoPlay","playsInline","loop","muted","onPlay","onEnded","onDoubleClick","onTimeUpdate","join","square","isShown","onChangeZoom","prevIsShown","usePrevious","inputRef","zoomLevel","setZoomLevel","disabled","step","value","type","onChange","Number","target","onMouseDown","onMouseUp","INITIAL_MATRIX","SCALE_VALUES","ZOOM_SAFE_AREA","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","transform","toString","newDragData","pageX","pageY","onMouseMove","deltaX","deltaY","getNewMatrixData","ANIMATION_DURATION","renderPhoto","blobUrl","imageSize","canDrag","alt","draggable","Spinner","threadId","avatarOwnerId","profilePhotoIndex","mediaViewer","animationLevel","settings","byKey","senderId","avatarOwner","chatMessages","collectionIds","selectScheduledMessage","selectScheduledMessages","selectChatMessages","selectOutlyingIds","selectListedIds","currentSearch","selectCurrentMediaSearch","foundIds","resultsByType","media","openMediaViewer","openForwardMenu","isFromSharedMedia","isFromSearch","photo","getMessagePhoto","getMessageVideo","webPagePhoto","getMessageWebPagePhoto","webPageVideo","getMessageWebPageVideo","isDocumentPhoto","isMessageDocumentPhoto","isDocumentVideo","isMessageDocumentVideo","isPhoto","isSingleSlide","messageIds","getChatMediaMessageIds","selectedMediaMessageIndex","indexOf","isFirst","isLast","animationKey","prevSenderId","slideAnimation","headerAnimation","isGhostAnimation","isFooterHidden","setIsFooterHidden","canPanZoomWrap","setCanPanZoomWrap","setIsZoomed","panDelta","setPanDelta","getMediaHash","isFull","photos","getChatAvatarHash","pictogramBlobUrl","useMedia","ApiMediaFormat","previewMediaHash","previewBlobUrl","fullMediaBlobUrl","getMessageMediaFormat","localBlobUrl","bestImageData","thumbDataUri","useBlurSync","getMessageMediaThumbDataUri","videoSize","getMessageFileSize","getMessageFileName","dimensions","getMessageDocument","mediaSize","getPhotoFullDimensions","getVideoDimensions","AVATAR_FULL_DIMENSIONS","toggle","forceUpdate","useForceUpdate","mql","matchMedia","MEDIA_VIEWER_MEDIA_QUERY","addListener","removeListener","prevMessage","prevOrigin","prevAvatarOwner","prevBestImageData","dispatchHeavyAnimationEvent","ANIMATION_END_DELAY","textParts","renderMessageText","hasFooter","fromImage","windowWidth","windowSize","availableWidth","availableHeight","getMediaViewerAvailableDimensions","toWidth","toHeight","calculateDimensions","toLeft","toTop","topOffsetRem","matches","getTopOffset","top","fromTop","fromLeft","fromWidth","fromHeight","uncovered","realWidth","realHeight","srcWidth","srcHeight","uncover","fromTranslateX","fromTranslateY","fromScaleX","fromScaleY","requestAnimationFrame","clearShape","contains","removeChild","animateOpening","toImage","getElementById","targetTop","el","display","rect","windowHeight","isElementInViewport","shouldFadeOut","existingGhost","getElementsByClassName","transition","transformOrigin","opacity","animateClosing","timer","closeZoom","handleZoomToggle","handleZoomValue","level","canCloseZoom","close","handleFooterClick","handleForward","fromChatId","captureEscKeyListener","stopCurrentAudio","getMessageId","fromId","direction","index","selectPreviousMedia","selectNextMedia","handleKeyDown","shouldCloseOnVideo","excludedClosestSelector","onSwipe","SwipeDirection","handlePan","handleToggleFooterVisibility","renderSlide","isActive","calculateMediaViewerDimensions","renderSenderInfo","useHistoryBack","ShowTransition","isRtl","Transition","activeKey","name","currentUserId","chatOrUserIds","filterRef","filter","filterPlaceholder","onFilterChange","loadMore","onSelectChatOrUser","viewportIds","getMore","useInfiniteScroll","useInputFocusOnOpen","containerRef","handleFilterChange","useKeyboardListNavigation","modalHeader","InputText","onKeyDown","placeholder","Modal","header","InfiniteScroll","items","onLoadMore","noScrollRestore","map","ListItem","PrivateChatInfo","status","userId","GroupChatInfo","Loading","chats","byId","chatsById","listIds","orderedPinnedIds","pinnedIds","active","activeListIds","archivedListIds","archived","setForwardChatId","exitForwardMode","loadMoreChats","setFilter","chatIds","priorityIds","unique","sortChatIds","getCanPostInChat","MAIN_THREAD_ID","searchWords","getChatTitle","handleSelectUser","getErrorHeader","error","isSlowMode","hasErrorKey","dialogs","dismissDialog","acceptInviteConfirmation","dialog","invite","hash","title","participantsCount","isChannel","participantsText","joinText","isText","renderInvite","getReadableErrorText","notifications","dismissNotification","localId","Notification","onDismiss","toggleSafeLinkModal","handleOpen","open","ensureProtocol","handleDismiss","renderingUrl","useCurrentOrPrev","ConfirmDialog","confirmLabel","confirmHandler","WEEKDAY_LETTERS","isDisabledDay","year","month","day","minDate","maxDate","selectedDay","Date","fixedMinDate","getFullYear","getMonth","getDate","fixedMaxDate","formatInputTime","String","padStart","formatDay","selectedAt","maxAt","isFutureMode","isPastMode","withTimePicker","submitButtonLabel","secondButtonLabel","onSubmit","onSecondButtonClick","now","defaultSelectedDate","prevIsOpen","isTimeInputFocused","markTimeInputAsFocused","unmarkTimeInputAsFocused","useFlag","selectedDate","setSelectedDate","currentMonthAndYear","setCurrentMonthAndYear","selectedHours","setSelectedHours","getHours","selectedMinutes","setSelectedMinutes","getMinutes","currentYear","currentMonth","getTime","shouldDisableNextMonth","shouldDisablePrevMonth","prevMonthGrid","currentMonthGrid","nextMonthGrid","setDate","setMonth","setFullYear","firstDay","getDay","totalDaysInPrevMonth","i","push","gridDate","lastRowDaysCount","buildCalendarGrid","handleChangeHours","replace","hours","setHours","hoursStr","handleChangeMinutes","minutes","setMinutes","minutesStr","d","dateCopy","role","tabIndex","handleDateSelect","inputMode","onFocus","onBlur","formatDateToString","code","formatTime","formatSubmitLabel","historyCalendarSelectedAt","searchMessagesByDate","closeHistoryCalendar","handleJumpToDate","timestamp","valueOf","isSchedule","selectCurrentMessageList","canDeleteForAll","selectAllowedMessageActions","contactName","getUserFirstOrLastName","getPrivateChatUserId","willDeleteForCurrentUserOnly","isChatBasicGroup","willDeleteForAll","isChatSuperGroup","album","deleteMessages","deleteScheduledMessages","handleDeleteMessageForAll","messages","shouldDeleteForAll","handleDeleteMessageForSelf","onEnter","isPrivateChat","isChatWithSelf","selectIsChatWithSelf","isChatChannel","isGroup","isSuperGroup","canPinForAll","pinMessage","handlePinMessageForAll","isUnpin","handlePinMessage","isOneSide","isSilent","pinnedMessagesCount","onUnpin","selectedMessageIds","selectedMessages","selectCanDeleteSelectedMessages","selectCurrentChat","exitMessageSelectMode","reportMessages","selectedReason","setSelectedReason","description","setDescription","handleReport","reason","handleSelectReason","handleDescriptionChange","REPORT_OPTIONS","label","RadioGroup","options","selected","messageListType","canDelete","canReport","selectCanReportSelectedMessages","canDownload","selectCanDownloadSelectedMessages","selectedMessagesCount","selectSelectedMessagesCount","canDeleteMessages","canReportMessages","canDownloadMessages","canPost","openForwardMenuForSelectedMessages","downloadSelectedMessages","isDeleteModalOpen","openDeleteModal","closeDeleteModal","isReportModalOpen","openReportModal","closeReportModal","captureKeyboardListeners","onBackspace","onDelete","onEsc","handleDownload","prevSelectedMessagesCount","renderingSelectedMessagesCount","formattedMessagesCount","renderButton","destructive","onSelect","buttonRef","activeElement","privateChatUserId","privateChatUser","isPinned","selectIsChatPinned","isMuted","selectIsChatMuted","selectNotifySettings","selectNotifyExceptions","withUsername","isChatFolderModalOpen","openChatFolderModal","closeChatFolderModal","contextActions","useChatContextActions","handleDelete","handleChatFolderChange","handleClick","useSelectWithEnter","avatarSize","DeleteChatModal","runThrottled","cb","userIds","topUserIds","topPeers","usersById","users","recentlyFoundChatIds","globalSearch","onReset","loadTopUsers","loadContactList","openChat","addRecentlyFoundChatId","clearRecentlyFoundChats","topUsersRef","useHorizontalScroll","shouldReplaceHistory","lastSyncTime","searchQuery","mediaThumbnail","mediaBlobUrl","isRoundVideo","getMessageRoundVideo","withOnlineStatus","isSavedMessages","isSelf","isVerified","VerifiedIcon","Link","formatPastTimeShort","getMessageSummaryText","highlight","renderMessageSummary","searchDate","suggestions","match","suggestion","currentDate","latestYear","getSuggestionsFromDate","localContactIds","contactList","fetchingStatus","globalResults","localResults","globalChatIds","globalUserIds","localChatIds","localUserIds","byChatId","globalMessagesByChatId","dateSearchQuery","onSearchDateSelect","searchMessagesGlobal","setGlobalSearchChatId","shouldShowMoreLocal","setShouldShowMoreLocal","shouldShowMoreGlobal","setShouldShowMoreGlobal","handleLoadMore","LoadMoreDirection","query","handleChatClick","handlePickerItemClick","startsWith","MEMO_EMPTY_ARRAY","foundContactIds","fullName","getUserFullName","username","foundMessages","split","sort","a","b","handleClickShowMoreLocal","handleClickShowMoreGlobal","nothingFound","noScrollRestoreOnTop","noFastList","NothingFound","PickerSelectedItem","chatOrUserId","clickArg","createMapStateToProps","props","currentType","isVoice","activeDownloads","theme","selectTheme","isLoading","searchChatId","CURRENT_TYPE","handleSelectMedia","canRenderContents","useAsyncRendering","SLIDE_TRANSITION_DURATION","isMediaGrid","isMessageList","itemSelector","Media","idPrefix","handleMessageFocus","shouldDrawDateDivider","toYearMonth","formatMonthAndYear","WebLink","getSenderName","onMessageClick","Document","withDate","datetime","smaller","onDateClick","openAudioPlayer","handlePlayAudio","Audio","AudioOrigin","TABS","GlobalSearchContent","CHAT_TABS","slice","TRANSITION_RENDER_COUNT","keys","currentContent","setGlobalSearchContent","setGlobalSearchDate","activeTab","setActiveTab","parseDateString","handleSwitchTab","tab","content","handleSearchDateSelect","TabList","tabs","onSwitchTab","renderCount","INITIAL_STATE","currentPassword","password","hint","email","twoFaReducer","state","action","payload","currentScreen","editedFolderId","onSaveFilter","signOut","deleteChatFolder","onScreenSelect","isSignOutDialogOpen","setIsSignOutDialogOpen","isDeleteFolderDialogOpen","setIsDeleteFolderDialogOpen","openSignOutConfirmation","closeSignOutConfirmation","openDeleteFolderConfirmation","closeDeleteFolderConfirmation","handleSignOutMessage","handleDeleteFolderMessage","SettingsMenuButton","SettingsScreens","renderHeaderContent","confirmIsDestructive","currentUser","loadProfilePhotos","profileId","ProfileInfo","forceShowSelf","ChatExtra","LINK_PREFIX","LINK_PREFIX_REGEX","USERNAME_REGEX","runDebouncedForCheckUsername","debounce","currentUsername","asLink","isUsernameAvailable","checkUsername","setUsername","langPrefix","usernameSuccess","usernameError","test","handleUsernameChange","newUsername","trim","isValid","isUsernameValid","success","readOnly","ERROR_FIRST_NAME_MISSING","ERROR_BIO_TOO_LONG","profileEdit","firstName","currentFirstName","lastName","currentLastName","fullInfo","bio","currentBio","currentAvatarHash","loadCurrentUser","updateProfile","isUsernameTouched","setIsUsernameTouched","isProfileFieldsTouched","setIsProfileFieldsTouched","setError","setPhoto","setFirstName","setLastName","setBio","currentAvatarBlobUrl","ProfileEditProgress","isUsernameError","isSaveButtonShown","handlePhotoChange","newPhoto","handleFirstNameChange","handleLastNameChange","handleBioChange","handleProfileSave","trimmedFirstName","trimmedLastName","trimmedBio","AvatarEditable","UsernameInput","FloatingActionButton","canAutoLoadPhotoFromContacts","canAutoLoadPhotoInPrivateChats","canAutoLoadPhotoInGroups","canAutoLoadPhotoInChannels","canAutoLoadVideoFromContacts","canAutoLoadVideoInPrivateChats","canAutoLoadVideoInGroups","canAutoLoadVideoInChannels","canAutoLoadFileFromContacts","canAutoLoadFileInPrivateChats","canAutoLoadFileInGroups","canAutoLoadFileInChannels","canAutoPlayGifs","canAutoPlayVideos","autoLoadFileMaxSizeMb","setSettingOption","renderFileSizeCallback","AUTODOWNLOAD_FILESIZE_MB_LIMITS","handleFileSizeChange","renderAutoDownloadBlock","canAutoLoadFromContacts","canAutoLoadInPrivateChats","canAutoLoadInGroups","canAutoLoadInChannels","Checkbox","checked","onCheck","isChecked","RangeSlider","renderValue","renderContentSizeSlider","runThrottledForLoadRecommended","orderedIds","orderedFolderIds","foldersById","recommended","recommendedChatFolders","chatFolders","notifySettings","notifyExceptions","onCreateFolder","onEditFolder","loadRecommendedChatFolders","addChatFolder","showDialog","animationData","setAnimationData","isAnimationLoaded","setIsAnimationLoaded","handleAnimationLoad","getAnimationData","then","handleCreateFolder","data","userFolders","folder","subtitle","getFolderDescriptionText","handleCreateFolderFromRecommended","AnimatedSticker","STICKER_SIZE_FOLDER_SETTINGS","play","noLoop","onLoad","pill","fluid","narrow","multiline","count","itemName","itemPluralName","ERROR_NO_TITLE","ERROR_NO_CHATS","loadedActiveChatIds","loadedArchivedChatIds","dispatch","onAddIncludedChats","onAddExcludedChats","onBack","editChatFolder","isIncludedChatsListExpanded","setIsIncludedChatsListExpanded","isExcludedChatsListExpanded","setIsExcludedChatsListExpanded","selectedChatIds","includedChatIds","selectedChatTypes","includedChatTypes","selectChatFilters","excludedChatIds","excludedChatTypes","folderId","visibleIncludedChatIds","visibleExcludedChatIds","allLoadedChatsSet","Set","loadedIncludedChatIds","findIntersectionWithSet","loadedExcludedChatIds","listType","renderChats","mode","visibleChatIds","isExpanded","leftChatsCount","clickHandler","chatType","INCLUDED_CHAT_TYPES","typeKey","EXCLUDED_CHAT_TYPES","inactive","renderChatType","event","isTouched","folderUpdate","selectedIds","filterValue","onSelectedIdsChange","onSelectedChatTypesChange","chatTypes","shouldMinimize","hasMaxChats","focus","handleItemClick","newSelectedIds","splice","handleChatTypeClick","newSelectedChatTypes","selectedType","find","isMinimized","canClose","isSelected","withChatType","archivedPinnedIds","chatFilter","activeChatArrays","prepareChatList","archivedChatArrays","pinnedChats","otherChats","displayedIds","newFilter","handleSelectedIdsChange","ids","includeFilters","excludeFilters","handleSelectedChatTypesChange","newFilters","forEach","shownScreen","handleReset","handleEditFolder","handleAddIncludedChats","handleAddExcludedChats","STICKER_SIZE_PICKER_HEADER","stickerSet","observeIntersection","isIntersecting","useIsIntersecting","mediaHash","lottieData","useMediaTransition","firstLetters","getFirstLetters","hasThumbnail","stickers","firstSticker","isAnimated","STICKER_SIZE_GENERAL_SETTINGS","StickerButton","sticker","ANIMATION_LEVEL_OPTIONS","TIME_FORMAT_OPTIONS","stickerSetIds","added","setIds","stickerSetsById","setsById","messageTextSize","messageSendKeyCombo","shouldSuggestStickers","shouldLoopStickers","timeFormat","loadStickerSets","loadAddedStickers","stickerSettingsRef","observe","observeIntersectionForCovers","useIntersectionObserver","rootRef","isModalOpen","openModal","closeModal","setSticker","KEYBOARD_SEND_OPTIONS","subLabel","IS_MAC_OS","handleAnimationLevelChange","newLevel","_","handleMessageTextSizeChange","newSize","documentElement","setProperty","setAttribute","handleTimeFormatChange","newTimeFormat","wasTimeFormatSetManually","setTimeFormat","handleStickerSetClick","stickerSets","installedDate","fromSticker","fileSelector","openSystemFilesDialog","accept","callback","noMultiple","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","localMediaHash","thumbRef","useCanvasBlur","thumbnail","dataUri","isLoadAllowed","setIsLoadAllowed","fullMedia","wasLoadDisabled","UPLOADING_WALLPAPER_SLUG","cacheKeyRef","handleSelect","blob","fetchBlob","cacheApi","save","CUSTOM_BG_CACHE_NAME","isAllowed","background","isBlurred","themes","loadedWallpapers","loadWallpapers","uploadWallpaper","setThemeSettings","themeRef","handleFileSelect","files","handleUploadWallpaper","handleSetColor","handleResetToDefault","backgroundColor","patternColor","DARK_THEME_PATTERN_COLOR","DEFAULT_PATTERN_COLOR","handleWallPaperSelect","currentWallpaper","async","defaultRGB","rgb","canvas","context","getContext","preloadImage","naturalHeight","naturalWidth","offsetWidth","drawImage","getImageData","blockSize","getAverageColor","handleWallPaperBlurChange","isUploading","DEFAULT_HSB","PREDEFINED_COLORS","hsb2positions","hsb","rects","colorPosition","colorRect","huePosition","hueRect","positions2hsb","colorPickerRef","huePickerRef","isFirstRunRef","setHsb","getInitialHsb","hsbRef","markIsDragging","unmarkIsDragging","rgbInput","setRgbInput","hexInput","setHexInput","rectsRef","colorCtxRef","offsetLeft","handleColorDrag","handleHueDrag","selectorToPreventScroll","withCursor","hex","hueHex","w","ctx","imgData","createImageData","pixels","col","perY","st","ed","perX","putImageData","drawColor","drawHue","handleRgbChange","rgbValue","channel","handleHexChange","hexValue","handlePredefinedColorClick","dataset","hasPrivateChatsNotifications","hasPrivateChatsMessagePreview","hasGroupNotifications","hasGroupMessagePreview","hasBroadcastNotifications","hasBroadcastMessagePreview","hasContactJoinedNotifications","hasWebNotifications","hasPushNotifications","notificationSoundVolume","loadNotificationSettings","updateContactSignUpNotification","updateNotificationSettings","updateWebNotificationSettings","runDebounced","useDebounce","handleSettingsChange","peerType","setting","currentIsSilent","currentShouldShowPreviews","shouldShowPreviews","handleContactNotificationChange","volume","playNotifySound","hasPassword","isSensitiveEnabled","canChangeSensitive","privacy","blocked","activeSessions","blockedCount","totalCount","sessionsCount","visibilityPrivacyPhoneNumber","phoneNumber","visibility","visibilityPrivacyLastSeen","lastSeen","visibilityPrivacyProfilePhoto","profilePhoto","visibilityPrivacyForwarding","forwards","visibilityPrivacyGroupChats","chatInvite","loadPrivacySettings","loadBlockedContacts","loadAuthorizations","loadContentSettings","updateContentSettings","getVisibilityValue","languages","language","loadLanguages","selectedLanguage","setSelectedLanguage","markIsLoading","unmarkIsLoading","handleChange","langCode","setLanguage","currentLangCode","navigator","toLowerCase","shortLangCode","substr","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","handleTerminateAllSessions","currentSession","isCurrent","otherSessions","appName","ip","sessions","handler","dateActive","blockedIds","contactIds","userSearch","setUserSearchQuery","blockContact","filteredContactsId","availableContactsId","concat","contactId","acc","firstId","secondId","secondName","localeCompare","handleRemoveUser","accessHash","chatsByIds","usersByIds","countryList","phoneCodes","phoneCodeList","unblockContact","isBlockUserModalOpen","openBlockUserModal","closeBlockUserModal","handleUnblockClick","viewportOffset","isPrivate","CHAT_HEIGHT_PX","formatPhoneNumberWithCode","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","getCurrentPrivacySettings","isAllowList","setPrivacySettings","selectedContactIds","setSearchQuery","isSubmitShown","setIsSubmitShown","newSelectedContactIds","setNewSelectedContactIds","isChatGroup","handleSelectedContactIdsChange","contactsIds","Picker","itemIds","searchInputId","TWO_FA_SCREENS","FOLDERS_SCREENS","PRIVACY_SCREENS","PRIVACY_PHONE_NUMBER_SCREENS","PRIVACY_LAST_SEEN_PHONE_SCREENS","PRIVACY_PROFILE_PHOTO_SCREENS","PRIVACY_FORWARDING_SCREENS","PRIVACY_GROUP_CHATS_SCREENS","foldersState","foldersDispatch","shouldSkipTransition","twoFaState","twoFaDispatch","useReducer","handleSaveFilter","renderCurrentSection","isScreenActive","isFrom","currentKey","privacyAllowScreens","isTwoFaScreen","isFoldersScreen","isPrivacyScreen","values","SettingsGeneralBackgroundColor","renderCurrentSectionContent","LAYERS_ANIMATION_NAME","serverTimeOffset","resultIds","sortUserIds","isSearching","selectedMemberIds","onSelectedMemberIdsChange","onNextStep","setGlobalSearchQuery","isUserBot","canBeInvitedToGroup","handleNextStep","creationProgress","creationError","chatCreation","memberIds","createGroupChat","createChannel","setTitle","about","setAbout","chatTitleEmptyError","channelTitleEmptyError","chatTooManyUsersError","ChatCreationProgress","handleTitleChange","handleCreateGroup","handleCreateChannel","renderedError","RENDER_COUNT","LeftColumnContent","onContentChange","newChatMemberIds","setNewChatMemberIds","isStepActive","ChatList","folderType","folderOrderedIds","onCloseAnimationEnd","editChatFolders","initialSelectedFolderIds","pinnedChatIds","selectedFolderIds","setSelectedFolderIds","folders","idsToRemove","idsToAdd","CheckboxGroup","getCopyLabel","hasSelection","scrollLockEl","IGNORED_KEYS","Down","ArrowDown","Up","ArrowUp","Left","ArrowLeft","Right","ArrowRight","PageUp","PageDown","End","Home","Tab","changedTouches","clientY","getTouchY","scrollHeight","preventDefaultForScrollKeys","HTMLElement","tagName","getAttribute","isTextBox","disableScrolling","passive","onkeydown","enableScrolling","anchor","canSendNow","canReschedule","canReply","canEdit","canPin","canUnpin","canForward","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","onReply","onEdit","onPin","onReport","onFaveSticker","onUnfaveSticker","onSend","onReschedule","onCopyLink","onDownload","menuRef","copyOptions","afterEffect","getMessageText","canImageBeCopied","hasMessageLocalBlobUrl","CLIPBOARD_ITEM_SUPPORTED","selection","getSelection","Promise","resolve","mediaLoader","copyImageToClipboard","anchorNode","parentNode","clipboardText","copyTextToClipboard","getMessageCopyOptions","getTriggerElement","getRootElement","getMenuElement","positionY","menuStyle","withScroll","useContextMenuPosition","Menu","selectActiveDownloadIds","noOptions","isScheduled","chatUsername","setReplyingToId","setEditingId","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","isMenuOpen","setIsMenuOpen","setIsDeleteModalOpen","setIsReportModalOpen","isPinModalOpen","setIsPinModalOpen","isCalendarOpen","openCalendar","closeCalendar","some","msg","closeMenu","closePinModal","handleCloseCalendar","handleReply","handleEdit","handlePin","handleUnpin","handleFaveSticker","handleUnfaveSticker","handleSelectMessage","params","childMessageIds","withShift","handleScheduledMessageSend","handleOpenCalendar","handleRescheduleMessage","scheduledAt","handleCopyLink","reportMessageIds","scheduledMaxDate","getDayStartAt","stickerSetShortName","currentMessageList","sendOptions","getAllowedAttachmentOptions","canSendStickers","selectStickerSet","stickerSetId","selectStickerSetByShortName","loadStickers","toggleStickerSet","sendMessage","throttleMs","isDisabled","stickerSetAccessHash","isPreloadedGlobally","handleButtonClick","hasCloseButton","STICKER_SIZE_MODAL","isRestricted","canAddContact","getCanAddContact","canDeleteChat","getCanDeleteChat","hasLinkedChat","linkedChatId","withExtraActions","canStartBot","canRestartBot","canSubscribe","canSearch","canMute","canLeave","canEnterVoiceChat","canCreateVoiceChat","onSubscribeChannel","onSearchClick","updateChatMutedState","enterMessageSelectMode","sendBotCommand","restartBot","joinGroupCall","createGroupCall","openLinkedChat","addContact","handleStartBot","command","handleRestartBot","handleToggleMuteClick","handleEnterVoiceChatClick","handleLinkedChatClick","handleAddContactClick","handleSubscribe","handleSearch","handleSelectMessages","Portal","runDebouncedForSearch","results","selectCurrentTextSearch","isHistoryCalendarOpen","setLocalTextSearchQuery","searchTextMessagesLocal","closeLocalTextSearch","openHistoryCalendar","focusedIndex","setFocusedIndex","visualViewport","mainEl","pageTop","Array","from","input","div","contentEditable","blur","handleMessageSearchQueryChange","newQuery","handleUp","newFocusIndex","handleDown","SearchInput","findInViewport","selectorOrElements","margin","isDense","shouldContainBottom","isHorizontal","viewportY1","viewportY2","allElements","visibleIndexes","isFound","y1","y2","setTooltipItemVisible","selector","first","isFullyVisible","fastSmoothScroll","useKeyboardNavigation","shouldSaveSelectionOnUpdateItems","shouldRemoveSelectionOnReset","noArrowNavigation","shouldSelectOnTab","selectedItemIndex","setSelectedItemIndex","getSelectedIndex","newIndex","cycleRestrict","handleArrowKey","handleItemSelect","item","isSelectionOutOfRange","onUp","onDown","onLeft","onRight","onTab","onInsertUserName","filteredUsers","handleUserSelect","forceFocus","handleSelectMention","member","selectedMentionIndex","prevChatMembers","renderedChatMembers","attachments","caption","isReady","groupChatMembers","recentEmojis","baseEmojiKeywords","emojiKeywords","addRecentEmoji","onCaptionUpdate","onFileAppend","onClear","hideTimeoutRef","prevAttachments","renderingAttachments","isHovered","markHovered","unmarkHovered","isQuick","every","quick","isMentionTooltipOpen","closeMentionTooltip","insertMention","mentionFilteredUsers","useMentionTooltip","EDITABLE_INPUT_MODAL_ID","isEmojiTooltipOpen","closeEmojiTooltip","filteredEmojis","insertEmoji","useEmojiTooltip","sendAttachments","handleFilesDrop","dataTransfer","newFiles","file","CONTENT_TYPES_WITH_PREVIEW","areAllPhotos","SUPPORTED_IMAGE_CONTENT_TYPES","mimeType","areAllVideos","SUPPORTED_VIDEO_CONTENT_TYPES","areAllAudios","renderHeader","onDragEnter","onDrop","onDragOver","onDragLeave","relatedTarget","toTarget","fromTarget","attachment","File","filename","extension","getFileExtension","previewData","emojis","onEmojiSelect","MessageInput","isAttachmentModalInput","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","scrollTo","behavior","handleCreate","questionTrimmed","optionsTrimmed","o","summary","answers","option","correct","isPublic","multipleChoice","quiz","entities","parseMessageInput","correctAnswers","solutionEntities","updateOption","removeOption","handleCorrectOptionChange","handleIsAnonymousChange","handleMultipleAnswersChange","handleQuizModeChange","handleKeyPress","keyCode","getQuestionError","getOptionsError","renderOptions","onKeyPress","renderQuizNoOptionError","hidden","emoji","native","names","IS_EMOJI_SUPPORTED","loading","category","allEmojis","useOnIntersect","emojisPerRow","ceil","displayedEmoji","ICONS_BY_CATEGORY","recent","people","nature","foods","activity","places","objects","symbols","flags","categoryIntersections","emojiDataPromise","emojiRawData","emojiData","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","noAnimate","onUnfaveClick","stickerSetIntersections","favorite","recentStickers","favoriteStickers","addedSetIds","shouldPlay","loadRecentStickers","loadFavoriteStickers","addRecentSticker","activeSetIndex","setActiveSetIndex","areAddedLoaded","allSets","noPopulatedSets","set","stickerSetEl","handleStickerSelect","handleStickerUnfave","fullClassName","buttonClassName","gif","videoData","shouldRenderVideo","isVideoReady","preventMessageInputBlurWithBubbling","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","isLeftColumnShown","allowedAttachmentOptions","setRecentEmojis","handleMouseEnter","handleMouseLeave","useMouseInside","fastRaf","recentEmojisRef","renderContent","onMouseEnter","onMouseLeave","noCloseOnBackdrop","onFileSelect","onPollCreate","handleQuickSelect","handleDocumentSelect","canAttachMedia","canAttachPolls","autoClose","withAvatar","botCommand","bot","botCommands","handleSendCommand","botId","selectedCommandIndex","prevCommands","renderedCommands","chatBotCommand","forEmoji","clearStickersForEmoji","prevStickers","displayedStickers","onSilentSend","onScheduleSend","listEmojis","usePrevDuringAnimation","handleSelectEmoji","selectedIndex","setItemVisible","thumbUrl","thumbnailDataUrl","decoding","isForGallery","inlineResult","webThumbnail","STICKER_SIZE_INLINE_BOT_RESULT","isGallery","inlineBotResults","switchPm","startBot","onSelectResult","handleSendPm","startParam","prevInlineBotResults","renderedInlineBotResults","sensitiveArea","inlineBotResult","messagesById","foundResults","senderUser","getGlobal","senderChat","forwardInfo","isChannelPost","orderBy","foundResult","preloadBackwards","LastMessageMeta","selectShouldLoopStickers","isSomeModalOpen","onModalToggle","isAdded","areStickersLoaded","useOnChange","coverStickerIds","covers","otherStickers","handleAddClick","canRenderStickers","STICKER_SIZE_SEARCH","selectCurrentStickerSearch","featured","featuredIds","loadFeaturedStickers","setIsModalOpen","selectCurrentGifSearch","isChatWithBot","selectIsChatWithBot","searchMoreGifs","setGifSearchQuery","handleGifClick","hasResults","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","isNotificationsEnabled","setIsNotificationsEnabled","ManagementProgress","handleNotificationChange","handleDeleteContact","withFullInfo","GROUP_TITLE_EMPTY","hasLinkedChannel","isBasicGroup","canChangeInfo","isCreator","getHasAdminRight","canBanUsers","togglePreHistoryHidden","updateChat","deleteChat","leaveChannel","deleteChannel","currentTitle","currentAbout","imageHash","handleClickEditType","ManagementScreens","handleClickDiscussion","handleClickPermissions","handleClickAdministrators","handleSetPhoto","handleAboutChange","handleUpdateGroup","trimmedTitle","trimmedAbout","handleClickMembers","handleTogglePreHistory","isPreHistoryHidden","isEnabled","enabledPermissionsCount","defaultBannedRights","sendStickers","sendGifs","adminsCount","adminMembers","handleDeleteGroup","formatInteger","onChatMemberSelect","updateChatDefaultBannedRights","permissions","setPermissions","havePermissionChanged","setHavePermissionChanged","handleRemovedUsersClick","handleAddExceptionClick","handleExceptionMemberClick","promotedByUserId","handlePermissionChange","getUpdatedPermissionValue","handleSavePermissions","bannedRights","removedUsersCount","kickedMembers","exceptionMembers","members","getMemberExceptions","langKey","getLangKeyForBannedRightKey","translatedString","sendMessages","blocking","sendMedia","sendPolls","embedLinks","inviteUsers","pinMessages","changeInfo","loadMoreMembers","deleteChatMember","usersId","isAdmin","isOwner","canDeleteMembers","updateChatMemberBannedRights","isRemoveUserModalOpen","openRemoveUserModal","closeRemoveUserModal","removedMembers","getRemovedBy","kickedByUserId","kickedByUser","getContextActions","CHANNEL_TITLE_EMPTY","isSignaturesShown","toggleSignatures","handleUpdateChannel","handleToggleSignatures","handleClickSubscribers","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","handleLinkGroupSessions","STICKER_SIZE_DISCUSSION_GROUPS","teactFastList","teactOrderKey","linkedGroup","renderLinkGroupHeader","hasPrivateLink","renderLinkGroupConfirmText","isButtonsInOneRow","isPromotedByCurrentUser","isFormFullyDisabled","selectedChatMemberId","isBanConfirmationDialogOpen","openBanConfirmationDialog","closeBanConfirmationDialog","selectedChatMember","handleBanFromGroup","viewMessages","getControlIsDisabled","handleAdminMemberClick","getMemberStatus","promotedByUser","updateChatAdmin","setIsTouched","isDismissConfirmationDialogOpen","openDismissConfirmationDialog","closeDismissConfirmationDialog","customTitle","setCustomTitle","adminRights","handleDismissAdmin","memberStatus","handleCustomTitleChange","postMessages","editMessages","banUsers","addAdmins","manageCall","anonymous","maxLength","openUserInfo","memberId","managementType","selectCurrentManagementType","VISA","MASTERCARD1","MASTERCARD2","CardType","cards","Default","Visa","Mastercard","detectCardType","cardNumber","formatsCache","defaultPhoneNumberFormat","str","flag","phoneFormat","format","formatValue","phoneNumberFormat","phoneNumberGroups","RegExp","repeat","getPhoneNumberFormat","streetLine1","streetLine2","city","countryIso2","postCode","phone","shipping","cardholder","expiry","cvv","billingCountry","billingZip","saveInfo","saveCredentials","formErrors","reducer","getBillingCountry","countryCode","useFocusAfterAnimation","animationDuration","hasArrow","labelText","htmlFor","needEmail","needPhone","needName","needAddress","phoneRef","selectCountryRef","handleAddress1Change","handleAddress2Change","handleCityChange","handleStateChange","handleCountryChange","handlePostCodeChange","handleFullNameChange","handleEmailChange","handlePhoneChange","handleSaveInfoChange","shippingOptions","currency","handleShippingSelect","amount","formatCurrency","renderPaymentItem","main","renderCheckoutItem","invoiceContent","prices","shippingPrices","checkoutInfo","totalPrice","photoUrl","paymentMethod","paymentProvider","shippingAddress","shippingMethod","expiryInputRef","charAt","parts","formatCardExpiry","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","validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError","paymentState","paymentDispatch","field","handleErrorModalClose","PaymentStep","shippingOption","getShippingPrices","cur","getTotalPrice","detectCardTypeText","findShippingOption","getCheckoutInfo","validateRequest","requestInfo","getRequestInfo","sendCredentials","credentials","expiryMonth","expiryYear","zip","getCredentials","sendForm","shippingOptionId","setStep","nextStep","buttonText","currentStep","renderModalContent","renderError","optionId","receipt","info","totalAmount","credentialsTitle","fullAddress","onInputChange","setPassword","canSubmit","setCanSubmit","select","autoComplete","MIN_PASSWORD_LENGTH","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","ANIMATED_STICKERS_PATHS","MonkeyIdle","MonkeyTracking","MonkeyClose","MonkeyPeek","FoldersAll","FoldersNew","DiscussionGroups","CameraFlip","HandFilled","HandOutline","Speaker","VoiceAllowTalk","VoiceMini","VoiceMuted","VoiceOutlined","path","location","cropperResultOptions","quality","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"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/739.a56999dcc623ac81b6df.js b/dist/739.a56999dcc623ac81b6df.js new file mode 100644 index 000000000..5e3750042 --- /dev/null +++ b/dist/739.a56999dcc623ac81b6df.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunktelegram_t=self.webpackChunktelegram_t||[]).push([[739],{7799:(e,t,n)=>{n.d(t,{Z:()=>u});var r=n(4050),o=n(9118),c=n(6752),s=n(8674),a=n(5332);let l,i;async function d(){return l||(l=n.e(941).then(n.bind(n,7941)),i=(await l).default),l}setTimeout(d,5e3);const u=(0,r.X$)((({className:e,id:t,animationData:n,play:l,playSegment:u,speed:m,noLoop:f,size:p,quality:h,isLowPriority:v,onLoad:g,color:Z})=>{const[w,y]=(0,r.eJ)(),E=(0,r.sO)(null),C=(0,r.sO)(!1),b=(0,r.sO)(!1),I=(0,r.sO)();I.current=l;const P=(0,r.sO)();P.current=u,(0,r.d4)((()=>{if(w||!n)return;const e=()=>{if(!E.current)return;const e=new i(t,E.current,n,{noLoop:f,size:p,quality:h,isLowPriority:v},g,Z);m&&e.setSpeed(m),y(e)};i?e():d().then((()=>{(0,o.T2)((()=>{E.current&&e()}))}))}),[Z,w,n,t,v,f,g,h,p,m]),(0,r.d4)((()=>{w&&w.setColor(Z)}),[Z,w]),(0,r.d4)((()=>()=>{w&&w.destroy()}),[w]);const A=(0,r.I4)(((e=!1)=>{w&&(I.current||P.current)&&(P.current?w.playSegment(P.current):e?w.goToAndPlay(0):w.play())}),[w]),T=(0,r.I4)((()=>{w&&w.pause()}),[w]),N=(0,r.I4)((()=>{b.current=!0,w&&(C.current||(C.current=w.isPlaying()),T())}),[w,T]),S=(0,r.I4)((()=>{C.current&&A(),C.current=!1,b.current=!1}),[A]),k=(0,r.I4)((()=>{(0,o.T2)(S)}),[S]);(0,r.d4)((()=>{w&&(l||u?b.current?C.current=!0:A(f):b.current?C.current=!1:T())}),[w,l,u,f,A,T]),(0,r.d4)((()=>{w&&(w.changeData(n),A())}),[A,w,n]),(0,s.ZP)(N,S),(0,a.Z)(N,k);const L=(0,c.Z)("AnimatedSticker",e),B=p?`width: ${p}px; height: ${p}px;`:void 0;return r.ZP.createElement("div",{ref:E,className:L,style:B})}))},172:(e,t,n)=>{n.d(t,{Z:()=>f});var r=n(4050),o=n(6137),c=n(3716),s=n(2858),a=n(2155),l=n(6752),i=n(2340),d=n(6202),u=n(1212),m=n(9107);const f=(0,r.X$)((({className:e,size:t="large",chat:n,user:f,text:p,withOnlineStatus:h,isSavedMessages:v,lastSyncTime:g,onClick:Z})=>{const w=f&&(0,s.NB)(f),y=f&&(0,s.pK)(f.id);let E;v||w||(f?E=(0,s.RT)(f):n&&(E=(0,s.RT)(n)));const C=(0,d.Z)(E,!1,o.IU.BlobUrl,g),b=Boolean(C),{transitionClassNames:I}=(0,u.Z)(b,void 0,b,"slow"),P=(0,m.Z)();let A="";if(v)A=r.ZP.createElement("i",{className:"icon-avatar-saved-messages"});else if(w)A=r.ZP.createElement("i",{className:"icon-avatar-deleted-account"});else if(y)A=r.ZP.createElement("i",{className:"icon-reply-filled"});else if(C)A=r.ZP.createElement("img",{src:C,className:(0,l.Z)("avatar-media",I),alt:"",decoding:"async"});else if(f){const e=(0,s.Js)(f);A=e?(0,a.Xv)(e,2):void 0}else if(n){const e=(0,s.U)(P,n);A=e&&(0,a.Xv)(e,(0,s.YC)(n.id)?2:1)}else p&&(A=(0,a.Xv)(p,2));const T=!v&&f&&(0,s.kM)(f),N=(0,l.Z)(`Avatar size-${t}`,e,`color-bg-${(0,s.Rs)(f||n)}`,v&&"saved-messages",w&&"deleted-account",y&&"replies-bot-account",h&&T&&"online",Z&&"interactive",!v&&!C&&"no-photo"),S=Boolean(v||C),k=(0,r.I4)((e=>{Z&&Z(e,S)}),[Z,S]),L=(f||n)&&(f||n).id;return r.ZP.createElement("div",{className:N,onClick:k,"data-test-sender-id":c.Cg?L:void 0},"string"==typeof A?(0,i.Z)(A,["jumbo"===t?"hq_emoji":"emoji"]):A)}))},7551:(e,t,n)=>{n.d(t,{Z:()=>a});var r=n(4050),o=n(9107),c=n(3103),s=n(231);const a=(0,r.X$)((({isOpen:e,onClose:t,onCloseAnimationEnd:n,title:a,header:l,text:i,textParts:d,confirmLabel:u="Confirm",confirmHandler:m,confirmIsDestructive:f,isButtonsInOneRow:p,children:h})=>{const v=(0,o.Z)();return r.ZP.createElement(c.Z,{className:"confirm",title:a,header:l,isOpen:e,onClose:t,onCloseAnimationEnd:n,onEnter:m},i&&i.split("\\n").map((e=>r.ZP.createElement("p",null,e))),d||h,r.ZP.createElement("div",{className:p?"dialog-buttons mt-2":""},r.ZP.createElement(s.Z,{className:"confirm-dialog-button",isText:!0,onClick:m,color:f?"danger":"primary"},u),r.ZP.createElement(s.Z,{className:"confirm-dialog-button",isText:!0,onClick:t},v("Cancel"))))}))},1273:(e,t,n)=>{n.d(t,{Z:()=>a});var r=n(1713),o=n(4050),c=n(9118),s=n(7675);const a=({ref:e,className:t,onLoadMore:n,onScroll:a,onKeyDown:l,items:i,itemSelector:d=".ListItem",preloadBackwards:u=20,sensitiveArea:m=800,noScrollRestore:f=!1,noScrollRestoreOnTop:p=!1,noFastList:h,cacheBuster:v,children:g})=>{let Z=(0,o.sO)(null);e&&(Z=e);const w=(0,o.sO)({}),[y,E]=(0,o.Ye)((()=>n?[(0,c.Ds)(((e=!1)=>{n({direction:r.Uq.Backwards,noScroll:e})}),1e3,!0,!1),(0,c.Ds)((()=>{n({direction:r.Uq.Forwards})}),1e3,!0,!1)]:[]),[n,i]);(0,o.d4)((()=>{if(!y)return;if(u>0&&(!i||i.length{const e=Z.current,t=w.current;let n;if(t.listItemElements=e.querySelectorAll(d),t.currentAnchor&&Array.from(t.listItemElements).includes(t.currentAnchor)){const{scrollTop:r}=e;n=r+(t.currentAnchor.getBoundingClientRect().top-t.currentAnchorTop)}else{const e=t.listItemElements[0];e&&(t.currentAnchor=e,t.currentAnchorTop=e.getBoundingClientRect().top)}f||p&&0===e.scrollTop||((0,s.Z)(e,n),t.isScrollTopJustUpdated=!0)}),[i,d,f,p,v]);const C=(0,o.I4)((e=>{if(E&&y){const{isScrollTopJustUpdated:e,currentAnchor:t,currentAnchorTop:n}=w.current,r=w.current.listItemElements;if(e)return void(w.current.isScrollTopJustUpdated=!1);const o=r.length,c=Z.current,{scrollTop:a,scrollHeight:l,offsetHeight:i}=c,d=a<=(o?r[0].offsetTop:0)+m,u=(o?r[o-1].offsetTop+r[o-1].offsetHeight:l)-(a+i)<=m;let f=!1;if(d){const e=r[0];if(e){const r=e.getBoundingClientRect().top,o=null!=t&&t.offsetParent&&t!==e?t.getBoundingClientRect().top:r;t&&void 0!==n&&o>n&&(w.current.currentAnchor=e,w.current.currentAnchorTop=r,f=!0,(0,s.Z)(c),E())}}if(u){const e=r[o-1];if(e){const r=e.getBoundingClientRect().top,o=null!=t&&t.offsetParent&&t!==e?t.getBoundingClientRect().top:r;t&&void 0!==n&&o{n.d(t,{Z:()=>f});var r=n(4050),o=n(517),c=n(6752),s=n(8674),a=n(1212),l=n(274),i=n(9107),d=n(6590),u=n(231),m=n(2898);const f=({dialogRef:e,title:t,className:n,isOpen:f,header:p,hasCloseButton:h,noBackdrop:v,children:g,onClose:Z,onCloseAnimationEnd:w,onEnter:y,shouldSkipHistoryAnimations:E})=>{const{shouldRender:C,transitionClassNames:b}=(0,a.Z)(f,w,E,void 0,E),I=(0,r.sO)(null);(0,r.d4)((()=>f?(0,o.Z)({onEsc:Z,onEnter:y}):void 0),[f,Z,y]),(0,r.d4)((()=>f&&I.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 o=0;r>=0&&(o=t.shiftKey?r>0?r-1:n.length-1:r{document.removeEventListener("keydown",t,!1)}}(I.current):void 0),[f]);const{forceClose:P}=(0,d.ZP)(f,Z);(0,r.d4)((()=>()=>{f&&P()}),[]),(0,l.Z)((([e])=>(document.body.classList.toggle("has-open-dialog",f),(f||!f&&void 0!==e)&&(0,s.YW)(200),()=>{document.body.classList.remove("has-open-dialog")})),[f]);const A=(0,i.Z)();if(!C)return;const T=(0,c.Z)("Modal",n,b,v&&"transparent-backdrop");return r.ZP.createElement(m.Z,null,r.ZP.createElement("div",{ref:I,className:T,tabIndex:-1,role:"dialog"},r.ZP.createElement("div",{className:"modal-container"},r.ZP.createElement("div",{className:"modal-backdrop",onClick:Z}),r.ZP.createElement("div",{className:"modal-dialog",ref:e},p||(t?r.ZP.createElement("div",{className:"modal-header"},h&&r.ZP.createElement(u.Z,{round:!0,color:"translucent",size:"smaller",ariaLabel:A("Close"),onClick:Z},r.ZP.createElement("i",{className:"icon-close"})),r.ZP.createElement("div",{className:"modal-title"},t)):void 0),r.ZP.createElement("div",{className:"modal-content custom-scroll"},g)))))}},2898:(e,t,n)=>{n.d(t,{Z:()=>c});var r=n(4050),o=n(2916);const c=({containerId:e,className:t,children:n})=>{const c=(0,r.sO)();return c.current||(c.current=document.createElement("div")),(0,r.bt)((()=>{const n=document.querySelector(e||"#portals");if(!n)return;const r=c.current;return t&&r.classList.add(t),n.appendChild(r),()=>{o.Z.render(void 0,r),n.removeChild(r)}}),[t,e]),o.Z.render(n,c.current)}},5332:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(4050);function o(e,t){(0,r.d4)((()=>(e&&!document.hasFocus()&&e(),e&&window.addEventListener("blur",e),t&&window.addEventListener("focus",t),()=>{t&&window.removeEventListener("focus",t),e&&window.removeEventListener("blur",e)})),[e,t])}},8360:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(7204);function o(e,t=!1,n=!1){const o=(0,r.Z)(e,t);return n||null!=e?e:o}},7407:(e,t,n)=>{n.d(t,{Z:()=>l});var r=n(4050),o=n(1713),c=n(782),s=n(5326),a=n(7204);const l=(e,t,n=!1,l=30,d=!1)=>{const u=(0,r.sO)(),m=(0,r.sO)((()=>{if(!t||u.current)return;const{newViewportIds:e}=i(t,o.Uq.Forwards,l,t[0]);return e})()),f=(0,s.Z)(),p=(0,a.Z)(t),h=(0,a.Z)(n);if(t&&!n&&(t!==p||n!==h)){const{offsetId:e=t[0],direction:n=o.Uq.Forwards}=u.current||{},{newViewportIds:r}=i(t,n,l,e);m.current&&(0,c.et)(m.current,r)||(m.current=r)}(0,r.d4)((()=>{if(t&&!n&&e&&d){const t=m.current;e({offsetId:t[t.length-1]})}}),[t,n,e,d]);const v=(0,r.I4)((({direction:n,noScroll:r})=>{const s=m.current,a=s?n===o.Uq.Backwards?s[s.length-1]:s[0]:void 0;if(!t)return void(e&&e({offsetId:a}));r||(u.current={...u.current,direction:n,offsetId:a});const{newViewportIds:d,areSomeLocal:p,areAllLocal:h}=i(t,n,l,a);!p||s&&(0,c.et)(s,d)||(m.current=d,f()),!h&&e&&e({offsetId:a})}),[t,l,e,f]);return n?[t]:[m.current,v]};function i(e,t,n,r){const{length:c}=e,s=r?e.indexOf(r):0,a=t===o.Uq.Forwards?s:s+1||c,l=Math.max(0,a-n),i=a+n-1,d=e.slice(Math.max(0,l),i+1);let u,m;switch(t){case o.Uq.Forwards:u=a>0,m=l>=0;break;case o.Uq.Backwards:u=a{n.d(t,{Z:()=>a});var r=n(4050),o=n(6137),c=n(647),s=n(5326);const a=(e,t=!1,n=o.IU.BlobUrl,a,l)=>{const i=e?c.UV(e):void 0,d=(0,s.Z)();return(0,r.d4)((()=>{if(!t&&e&&!i){const t=Date.now();c.he(e,n).then((()=>{const e=Date.now()-t;!l||e>=l?d():setTimeout(d,l-e)}))}}),[t,e,i,n,a,d,l]),i}},4319:(e,t,n)=>{n.d(t,{yl:()=>o,TE:()=>s,VP:()=>a});var r=n(3716);const o=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)},a=e=>{if(!e)return;const t=document.createElement("canvas"),n=t.getContext("2d"),r=new Image;r.onload=e=>{if(n&&e.currentTarget){const r=e.currentTarget;t.width=r.width,t.height=r.height,n.drawImage(r,0,0,r.width,r.height),t.toBlob(l,"image/png",1)}},r.src=e};async function l(e){if(e&&o)try{await navigator.clipboard.write([new window.ClipboardItem({[e.type]:e})])}catch(e){r.eM&&console.error(e)}}},7675:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(7361);const o=(e,t)=>{r.cj&&(e.style.overflow="hidden"),void 0!==t&&(e.scrollTop=t),r.cj&&(e.style.overflow="")}},4753:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(3716);const o=e=>{e.play().catch((t=>{r.eM&&console.warn(t,e)}))}}}]); +//# sourceMappingURL=739.a56999dcc623ac81b6df.js.map \ No newline at end of file diff --git a/dist/739.a56999dcc623ac81b6df.js.map b/dist/739.a56999dcc623ac81b6df.js.map new file mode 100644 index 000000000..64b8a609c --- /dev/null +++ b/dist/739.a56999dcc623ac81b6df.js.map @@ -0,0 +1 @@ +{"version":3,"file":"739.a56999dcc623ac81b6df.js","mappings":"8KA0BA,IAAIA,EACAC,EAKJC,eAAeC,IAMb,OALKH,IACHA,EAAgB,8BAChBC,SAAiBD,GAAsBI,SAGlCJ,EAGTK,WAAWF,EAXe,KAa1B,MAkLA,GAAeG,EAAAA,EAAAA,KAlLuB,EACpCC,UAAAA,EACAC,GAAAA,EACAC,cAAAA,EACAC,KAAAA,EACAC,YAAAA,EACAC,MAAAA,EACAC,OAAAA,EACAC,KAAAA,EACAC,QAAAA,EACAC,cAAAA,EACAC,OAAAA,EACAC,MAAAA,MAEA,MAAOC,EAAWC,IAAgBC,EAAAA,EAAAA,MAE5BC,GAAYC,EAAAA,EAAAA,IAAuB,MACnCC,GAAaD,EAAAA,EAAAA,KAAO,GACpBE,GAAWF,EAAAA,EAAAA,KAAO,GAElBG,GAAUH,EAAAA,EAAAA,MAChBG,EAAQC,QAAUjB,EAClB,MAAMkB,GAAiBL,EAAAA,EAAAA,MACvBK,EAAeD,QAAUhB,GAEzBkB,EAAAA,EAAAA,KAAU,KACR,GAAIV,IAAcV,EAChB,OAGF,MAAMqB,EAAO,KACX,IAAKR,EAAUK,QACb,OAGF,MAAMI,EAAe,IAAI9B,EACvBO,EACAc,EAAUK,QACVlB,EACA,CACEI,OAAAA,EACAC,KAAAA,EACAC,QAAAA,EACAC,cAAAA,GAEFC,EACAC,GAGEN,GACFmB,EAAaC,SAASpB,GAGxBQ,EAAaW,IAGX9B,EACF6B,IAEA3B,IAAe8B,MAAK,MAClBC,EAAAA,EAAAA,KAAQ,KACFZ,EAAUK,SACZG,YAKP,CAACZ,EAAOC,EAAWV,EAAeD,EAAIQ,EAAeH,EAAQI,EAAQF,EAASD,EAAMF,KAEvFiB,EAAAA,EAAAA,KAAU,KACHV,GAELA,EAAUgB,SAASjB,KAClB,CAACA,EAAOC,KAEXU,EAAAA,EAAAA,KAAU,IACD,KACDV,GACFA,EAAUiB,YAGb,CAACjB,IAEJ,MAAMkB,GAAgBC,EAAAA,EAAAA,KAAY,CAACC,GAAgB,KAC7CpB,IAAcO,EAAQC,SAAWC,EAAeD,WAC9CC,EAAeD,QACjBR,EAAUR,YAAYiB,EAAeD,SAC5BY,EACTpB,EAAUqB,YAAY,GAEtBrB,EAAUT,UAGb,CAACS,IAEEsB,GAAiBH,EAAAA,EAAAA,KAAY,KAC5BnB,GAILA,EAAUuB,UACT,CAACvB,IAEEwB,GAAkBL,EAAAA,EAAAA,KAAY,KAClCb,EAASE,SAAU,EAEdR,IAIAK,EAAWG,UACdH,EAAWG,QAAUR,EAAUyB,aAGjCH,OACC,CAACtB,EAAWsB,IAETI,GAAoBP,EAAAA,EAAAA,KAAY,KAChCd,EAAWG,SACbU,IAGFb,EAAWG,SAAU,EACrBF,EAASE,SAAU,IAClB,CAACU,IAEES,GAAyBR,EAAAA,EAAAA,KAAY,MACzCJ,EAAAA,EAAAA,IAAQW,KACP,CAACA,KAEJhB,EAAAA,EAAAA,KAAU,KACHV,IAIDT,GAAQC,EACNc,EAASE,QACXH,EAAWG,SAAU,EAErBU,EAAcxB,GAIZY,EAASE,QACXH,EAAWG,SAAU,EAErBc,OAGH,CAACtB,EAAWT,EAAMC,EAAaE,EAAQwB,EAAeI,KAEzDZ,EAAAA,EAAAA,KAAU,KACJV,IACFA,EAAU4B,WAAWtC,GACrB4B,OAED,CAACA,EAAelB,EAAWV,KAE9BuC,EAAAA,EAAAA,IAAuBL,EAAiBE,IAIxCI,EAAAA,EAAAA,GAAkBN,EAAiBG,GAEnC,MAAMI,GAAgBC,EAAAA,EAAAA,GAAe,kBAAmB5C,GAElD6C,EAAQtC,EAAQ,UAASA,gBAAmBA,YAAYuC,EAE9D,OACE,0BACEC,IAAKhC,EACLf,UAAW2C,EAEXE,MAAOA,Q,uICnLb,MAgFA,GAAe9C,EAAAA,EAAAA,KAhFc,EAC3BC,UAAAA,EACAO,KAAAA,EAAO,QACPyC,KAAAA,EACAC,KAAAA,EACAC,KAAAA,EACAC,iBAAAA,EACAC,gBAAAA,EACAC,aAAAA,EACAC,QAAAA,MAEA,MAAMC,EAAYN,IAAQO,EAAAA,EAAAA,IAAcP,GAClCQ,EAAYR,IAAQS,EAAAA,EAAAA,IAAqBT,EAAKhD,IACpD,IAAI0D,EAECP,GAAoBG,IACnBN,EACFU,GAAYC,EAAAA,EAAAA,IAAkBX,GACrBD,IACTW,GAAYC,EAAAA,EAAAA,IAAkBZ,KAIlC,MAAMa,GAAUC,EAAAA,EAAAA,GAASH,GAAW,EAAOI,EAAAA,GAAAA,QAAwBV,GAC7DW,EAAaC,QAAQJ,IACrB,qBAAEK,IAAyBC,EAAAA,EAAAA,GAAkBH,OAAYlB,EAAWkB,EAAY,QAEhFI,GAAOC,EAAAA,EAAAA,KAEb,IAAIC,EAA8B,GAElC,GAAIlB,EACFkB,EAAU,wBAAGtE,UAAU,oCAClB,GAAIuD,EACTe,EAAU,wBAAGtE,UAAU,qCAClB,GAAIyD,EACTa,EAAU,wBAAGtE,UAAU,2BAClB,GAAI6D,EACTS,EACE,0BAAKC,IAAKV,EAAS7D,WAAW4C,EAAAA,EAAAA,GAAe,eAAgBsB,GAAuBM,IAAI,GAAGC,SAAS,eAEjG,GAAIxB,EAAM,CACf,MAAMyB,GAAeC,EAAAA,EAAAA,IAAgB1B,GACrCqB,EAAUI,GAAeE,EAAAA,EAAAA,IAAgBF,EAAc,QAAK5B,OACvD,GAAIE,EAAM,CACf,MAAM6B,GAAQC,EAAAA,EAAAA,GAAaV,EAAMpB,GACjCsB,EAAUO,IAASD,EAAAA,EAAAA,IAAgBC,GAAOE,EAAAA,EAAAA,IAAS/B,EAAK/C,IAAM,EAAI,QACzDiD,IACToB,GAAUM,EAAAA,EAAAA,IAAgB1B,EAAM,IAGlC,MAAM8B,GAAY5B,GAAmBH,IAAQgC,EAAAA,EAAAA,IAAahC,GACpDN,GAAgBC,EAAAA,EAAAA,GACnB,eAAcrC,IACfP,EACC,aAAWkF,EAAAA,EAAAA,IAAgBjC,GAAQD,KACpCI,GAAmB,iBACnBG,GAAa,kBACbE,GAAa,sBACbN,GAAoB6B,GAAY,SAChC1B,GAAW,eACTF,IAAoBS,GAAY,YAG9BsB,EAAWlB,QAAQb,GAAmBS,GACtCuB,GAAcrD,EAAAA,EAAAA,KAAasD,IAC3B/B,GACFA,EAAQ+B,EAAGF,KAEZ,CAAC7B,EAAS6B,IAEPG,GAAYrC,GAAQD,KAAUC,GAAQD,GAAO/C,GAEnD,OACE,0BAAKD,UAAW2C,EAAeW,QAAS8B,EAAa,sBAAqBG,EAAAA,GAAUD,OAAWxC,GACzE,iBAAZwB,GAAuBkB,EAAAA,EAAAA,GAAWlB,EAAS,CAAU,UAAT/D,EAAmB,WAAa,UAAY+D,O,2ECzFtG,MA6CA,GAAevE,EAAAA,EAAAA,KA7CqB,EAClC0F,OAAAA,EACAC,QAAAA,EACAC,oBAAAA,EACAd,MAAAA,EACAe,OAAAA,EACA1C,KAAAA,EACA2C,UAAAA,EACAC,aAAAA,EAAe,UACfC,eAAAA,EACAC,qBAAAA,EACAC,kBAAAA,EACAC,SAAAA,MAEA,MAAM9B,GAAOC,EAAAA,EAAAA,KAEb,OACE,mBAAC,IAAD,CACErE,UAAU,UACV6E,MAAOA,EACPe,OAAQA,EACRH,OAAQA,EACRC,QAASA,EACTC,oBAAqBA,EACrBQ,QAASJ,GAER7C,GAAQA,EAAKkD,MAAM,OAAOC,KAAKC,GAC9B,4BAAIA,KAELT,GAAaK,EACd,0BAAKlG,UAAWiG,EAAoB,sBAAwB,IAC1D,mBAAC,IAAD,CACEjG,UAAU,wBACVuG,QAAM,EACNjD,QAASyC,EACTpF,MAAOqF,EAAuB,SAAW,WAExCF,GAEH,mBAAC,IAAD,CAAQ9F,UAAU,wBAAwBuG,QAAM,EAACjD,QAASoC,GAAUtB,EAAK,iB,4ECnCjF,MAuMA,EAnMqC,EACnCrB,IAAAA,EACA/C,UAAAA,EACAwG,WAAAA,EACAC,SAAAA,EACAC,UAAAA,EACAC,MAAAA,EACAC,aAAAA,EAX4B,YAY5BC,iBAAAA,EAXgC,GAYhCC,cAAAA,EAX6B,IAa7BC,gBAAAA,GAAkB,EAClBC,qBAAAA,GAAuB,EACvBC,WAAAA,EAEAC,YAAAA,EACAhB,SAAAA,MAGA,IAAIiB,GAAenG,EAAAA,EAAAA,IAAuB,MACtC+B,IACFoE,EAAepE,GAGjB,MAAMqE,GAAWpG,EAAAA,EAAAA,IAKd,KAEIqG,EAAmBC,IAAoBC,EAAAA,EAAAA,KAAQ,IAC/Cf,EAIE,EACLgB,EAAAA,EAAAA,KAAS,CAACC,GAAW,KACnBjB,EAAW,CAAEkB,UAAWC,EAAAA,GAAAA,UAA6BF,SAAAA,MACpD,KAAM,GAAM,IACfD,EAAAA,EAAAA,KAAS,KACPhB,EAAW,CAAEkB,UAAWC,EAAAA,GAAAA,aACvB,KAAM,GAAM,IATR,IAYR,CAACnB,EAAYG,KAGhBrF,EAAAA,EAAAA,KAAU,KACR,IAAK+F,EACH,OAGF,GAAIR,EAAmB,KAAOF,GAASA,EAAMiB,OAASf,GAEpD,YADAQ,GAAkB,GAIpB,MAAM,aAAEQ,EAAF,aAAgBC,GAAiBX,EAAa/F,QAChD0G,GAAgBD,GAAgBC,GAClCT,MAED,CAACV,EAAOU,EAAmBR,KAG9BkB,EAAAA,EAAAA,KAAgB,KACd,MAAMhH,EAAYoG,EAAa/F,QACzB4G,EAAQZ,EAAShG,QAIvB,IAAI6G,EAEJ,GAJAD,EAAME,iBAAmBnH,EAAUoH,iBAAiCvB,GAIhEoB,EAAMI,eAAiBC,MAAMC,KAAKN,EAAME,kBAAkBK,SAASP,EAAMI,eAAgB,CAC3F,MAAM,UAAEI,GAAczH,EAEtBkH,EAAeO,GADMR,EAAMI,cAAcK,wBAAwBC,IACtBV,EAAMW,sBAC5C,CACL,MAAMC,EAAaZ,EAAME,iBAAiB,GACtCU,IACFZ,EAAMI,cAAgBQ,EACtBZ,EAAMW,iBAAmBC,EAAWH,wBAAwBC,KAI5D3B,GAIAC,GAAgD,IAAxBjG,EAAUyH,aAItCK,EAAAA,EAAAA,GAAY9H,EAAWkH,GAEvBD,EAAMc,wBAAyB,KAC9B,CAACnC,EAAOC,EAAcG,EAAiBC,EAAsBE,IAEhE,MAAM6B,GAAehH,EAAAA,EAAAA,KAAasD,IAChC,GAAIiC,GAAoBD,EAAmB,CACzC,MAAM,uBACJyB,EADI,cACoBV,EADpB,iBACmCO,GACrCvB,EAAShG,QACP8G,EAAmBd,EAAShG,QAAQ8G,iBAE1C,GAAIY,EAEF,YADA1B,EAAShG,QAAQ0H,wBAAyB,GAI5C,MAAME,EAAad,EAAiBN,OAC9B7G,EAAYoG,EAAa/F,SACzB,UAAEoH,EAAF,aAAaX,EAAb,aAA2BoB,GAAiBlI,EAE5CmI,EAAYV,IADNQ,EAAad,EAAiB,GAAGiB,UAAY,GACpBrC,EAI/BsC,GAHSJ,EACXd,EAAiBc,EAAa,GAAGG,UAAYjB,EAAiBc,EAAa,GAAGC,aAC9EpB,IAC2BW,EAAYS,IAAiBnC,EAC5D,IAAIuC,GAAY,EAEhB,GAAIH,EAAW,CACb,MAAMN,EAAaV,EAAiB,GACpC,GAAIU,EAAY,CACd,MAAMU,EAAgBV,EAAWH,wBAAwBC,IACnDa,EAAenB,MAAAA,GAAAA,EAAeoB,cAAgBpB,IAAkBQ,EAClER,EAAcK,wBAAwBC,IACtCY,EAEFlB,QAAsCtF,IAArB6F,GAAkCY,EAAeZ,IAIlEvB,EAAShG,QAAQgH,cAAgBQ,EACjCxB,EAAShG,QAAQuH,iBAAmBW,EACpCD,GAAY,GACZR,EAAAA,EAAAA,GAAY9H,GACZuG,MAKN,GAAI8B,EAAc,CAChB,MAAMR,EAAaV,EAAiBc,EAAa,GACjD,GAAIJ,EAAY,CACd,MAAMU,EAAgBV,EAAWH,wBAAwBC,IACnDa,EAAenB,MAAAA,GAAAA,EAAeoB,cAAgBpB,IAAkBQ,EAClER,EAAcK,wBAAwBC,IACtCY,EAEFlB,QAAsCtF,IAArB6F,GAAkCY,EAAeZ,IAIlEvB,EAAShG,QAAQgH,cAAgBQ,EACjCxB,EAAShG,QAAQuH,iBAAmBW,EACpCD,GAAY,GACZR,EAAAA,EAAAA,GAAY9H,GACZsG,MAKN,IAAKgC,EACH,GAAIjB,MAAAA,GAAAA,EAAeoB,aACjBpC,EAAShG,QAAQuH,iBAAmBP,EAAcK,wBAAwBC,QACrE,CACL,MAAME,EAAaV,EAAiB,GAEhCU,IACFxB,EAAShG,QAAQgH,cAAgBQ,EACjCxB,EAAShG,QAAQuH,iBAAmBC,EAAWH,wBAAwBC,MAM3EjC,GACFA,EAASpB,KAEV,CAACgC,EAAmBC,EAAkBb,EAAUK,IAEnD,OACE,0BACE/D,IAAKoE,EACLnH,UAAWA,EACXyG,SAAUsC,EACVU,eAAgBxC,EAChBP,UAAWA,GAEVR,K,qICxMP,MAqIA,EAjHyC,EACvCwD,UAAAA,EACA7E,MAAAA,EACA7E,UAAAA,EACAyF,OAAAA,EACAG,OAAAA,EACA+D,eAAAA,EACAC,WAAAA,EACA1D,SAAAA,EACAR,QAAAA,EACAC,oBAAAA,EACAQ,QAAAA,EACA0D,4BAAAA,MAEA,MAAM,aACJC,EADI,qBAEJ5F,IACEC,EAAAA,EAAAA,GACFsB,EAAQE,EAAqBkE,OAA6B/G,EAAW+G,GAGjEE,GAAW/I,EAAAA,EAAAA,IAAuB,OAExCM,EAAAA,EAAAA,KAAU,IAAOmE,GACbuE,EAAAA,EAAAA,GAAyB,CAAEC,MAAOvE,EAASS,QAAAA,SAC3CrD,GAAY,CAAC2C,EAAQC,EAASS,KAClC7E,EAAAA,EAAAA,KAAU,IAAOmE,GAAUsE,EAAS3I,QCnEvB,SAAmB8I,GAChC,SAASC,EAAc9E,GACrB,GAAc,QAAVA,EAAE+E,IACJ,OAGF/E,EAAEgF,iBACFhF,EAAEiF,kBAEF,MAAMC,EAAoBlC,MAAMC,KAC9B4B,EAAQ/B,iBAAiB,6EAE3B,IAAKoC,EAAkB3C,OACrB,OAGF,MAAM4C,EAAsBD,EAAkBE,WAAWC,GAAOA,EAAGC,WAAWC,SAASC,iBACvF,IAAIC,EAAkB,EAClBN,GAAuB,IAEvBM,EADEzF,EAAE0F,SACcP,EAAsB,EACpCA,EAAsB,EACtBD,EAAkB3C,OAAS,EAEb4C,EAAsBD,EAAkB3C,OAAS,EAC/D4C,EAAsB,EACtB,GAIRD,EAAkBO,GAAiBE,QAKrC,OAFAJ,SAASK,iBAAiB,UAAWd,GAAe,GAE7C,KACLS,SAASM,oBAAoB,UAAWf,GAAe,ID+BXgB,CAAUpB,EAAS3I,cAAW0B,GAAY,CAAC2C,IAEzF,MAAM,WAAE2F,IAAeC,EAAAA,EAAAA,IAAe5F,EAAQC,IAG9CpE,EAAAA,EAAAA,KAAU,IACD,KACDmE,GACF2F,MAIH,KAEHE,EAAAA,EAAAA,IAAsB,EAAEC,MACtBX,SAASY,KAAKC,UAAUC,OAAO,kBAAmBjG,IAC9CA,IAAYA,QAAyB3C,IAAfyI,KACxBI,EAAAA,EAAAA,IA/DqB,KAkEhB,KACLf,SAASY,KAAKC,UAAUG,OAAO,sBAEhC,CAACnG,IAEJ,MAAMrB,GAAOC,EAAAA,EAAAA,KAEb,IAAKyF,EACH,OA8BF,MAAMnH,GAAgBC,EAAAA,EAAAA,GACpB,QACA5C,EACAkE,EACA0F,GAAc,wBAGhB,OACE,mBAACiC,EAAA,EAAD,KACE,0BACE9I,IAAKgH,EACL/J,UAAW2C,EACXmJ,UAAW,EACXC,KAAK,UAEL,0BAAK/L,UAAU,mBACb,0BAAKA,UAAU,iBAAiBsD,QAASoC,IACzC,0BAAK1F,UAAU,eAAe+C,IAAK2G,GA3CrC9D,IAICf,EAKH,0BAAK7E,UAAU,gBACZ2J,GACC,mBAACqC,EAAA,EAAD,CACEC,OAAK,EACLtL,MAAM,cACNJ,KAAK,UACL2L,UAAW9H,EAAK,SAChBd,QAASoC,GAET,wBAAG1F,UAAU,gBAGjB,0BAAKA,UAAU,eAAe6E,SAjBlC,GAyCQ,0BAAK7E,UAAU,+BACZkG,S,wDExIf,MA4BA,EA5B6B,EAAGiG,YAAAA,EAAanM,UAAAA,EAAWkG,SAAAA,MACtD,MAAMkG,GAAapL,EAAAA,EAAAA,MAwBnB,OAvBKoL,EAAWhL,UACdgL,EAAWhL,QAAUwJ,SAASyB,cAAc,SAG9CtE,EAAAA,EAAAA,KAAgB,KACd,MAAMhH,EAAY6J,SAAS0B,cAA8BH,GAAe,YACxE,IAAKpL,EACH,OAGF,MAAMmJ,EAAUkC,EAAWhL,QAO3B,OANIpB,GACFkK,EAAQuB,UAAUc,IAAIvM,GAGxBe,EAAUyL,YAAYtC,GAEf,KACLuC,EAAAA,EAAAA,YAAgB3J,EAAWoH,GAC3BnJ,EAAU2L,YAAYxC,MAEvB,CAAClK,EAAWmM,IAERM,EAAAA,EAAAA,OAAgBvG,EAAUkG,EAAWhL,W,8CChC/B,SAASsB,EACtBiK,EACAC,IAEAtL,EAAAA,EAAAA,KAAU,KACJqL,IAAW/B,SAASiC,YACtBF,IAGEA,GACFG,OAAO7B,iBAAiB,OAAQ0B,GAG9BC,GACFE,OAAO7B,iBAAiB,QAAS2B,GAG5B,KACDA,GACFE,OAAO5B,oBAAoB,QAAS0B,GAGlCD,GACFG,OAAO5B,oBAAoB,OAAQyB,MAGtC,CAACA,EAAQC,M,8CC1BC,SAASG,EACtB3L,EAAY4L,GAAsB,EAAOC,GAAqB,GAE9D,MAAMC,GAAOC,EAAAA,EAAAA,GAAY/L,EAAS4L,GAGlC,OAAOC,GAAuB7L,MAAAA,EAA6CA,EAAU8L,I,qFCEvF,MAEA,GACE7F,EACA+F,EACAC,GAAa,EACbC,EANyB,GAOzBC,GAAmB,KAEnB,MAAMC,GAAgBxM,EAAAA,EAAAA,MAKhByM,GAAiBzM,EAAAA,EAAAA,IAA6B,MAElD,IAAKoM,GAAWI,EAAcpM,QAC5B,OAGF,MAAM,eAAEsM,GAAmBC,EAAiBP,EAASzF,EAAAA,GAAAA,SAA4B2F,EAAWF,EAAQ,IACpG,OAAOM,GAP2C,IAU9CE,GAAcC,EAAAA,EAAAA,KAEdC,GAAcX,EAAAA,EAAAA,GAAYC,GAC1BW,GAAiBZ,EAAAA,EAAAA,GAAYE,GACnC,GAAID,IAAYC,IAAeD,IAAYU,GAAeT,IAAeU,GAAiB,CACxF,MAAM,SAAEC,EAAWZ,EAAQ,GAArB,UAAyB1F,EAAYC,EAAAA,GAAAA,UAA+B6F,EAAcpM,SAAW,IAC7F,eAAEsM,GAAmBC,EAAiBP,EAAS1F,EAAW4F,EAAWU,GAEtEP,EAAerM,UAAY6M,EAAAA,EAAAA,IAAqBR,EAAerM,QAASsM,KAC3ED,EAAerM,QAAUsM,IAI7BpM,EAAAA,EAAAA,KAAU,KACR,GAAI8L,IAAYC,GAAchG,GAAqBkG,EAAkB,CACnE,MAAMW,EAAcT,EAAerM,QACnCiG,EAAkB,CAAE2G,SAAUE,EAAYA,EAAYtG,OAAS,QAEhE,CAACwF,EAASC,EAAYhG,EAAmBkG,IAE5C,MAAMY,GAAmBpM,EAAAA,EAAAA,KAAY,EACnC2F,UAAAA,EACAD,SAAAA,MAEA,MAAMyG,EAAcT,EAAerM,QAE7B4M,EAAWE,EACbxG,IAAcC,EAAAA,GAAAA,UAA8BuG,EAAYA,EAAYtG,OAAS,GAAKsG,EAAY,QAC9FpL,EAEJ,IAAKsK,EAKH,YAJI/F,GACFA,EAAkB,CAAE2G,SAAAA,KAMnBvG,IACH+F,EAAcpM,QAAU,IAAKoM,EAAcpM,QAASsG,UAAAA,EAAWsG,SAAAA,IAGjE,MAAM,eACJN,EADI,aACYU,EADZ,YAC0BC,GAC5BV,EAAiBP,EAAS1F,EAAW4F,EAAWU,IAEhDI,GAAkBF,IAAeD,EAAAA,EAAAA,IAAqBC,EAAaR,KACrED,EAAerM,QAAUsM,EACzBE,MAGGS,GAAehH,GAClBA,EAAkB,CAAE2G,SAAAA,MAErB,CAACZ,EAASE,EAAWjG,EAAmBuG,IAE3C,OAAOP,EAAa,CAACD,GAAW,CAACK,EAAerM,QAAS+M,IAG3D,SAASR,EACPW,EACA5G,EACA4F,EACAU,GAEA,MAAM,OAAEpG,GAAW0G,EACbC,EAAQP,EAAWM,EAAUE,QAAQR,GAAY,EAEjDS,EADa/G,IAAcC,EAAAA,GAAAA,SACM4G,EAASA,EAAQ,GAAM3G,EACxDU,EAAOoG,KAAKC,IAAI,EAAGF,EAAoBnB,GACvCsB,EAAKH,EAAoBnB,EAAY,EACrCI,EAAiBY,EAAUO,MAAMH,KAAKC,IAAI,EAAGrG,GAAOsG,EAAK,GAE/D,IAAIR,EACAC,EACJ,OAAQ3G,GACN,KAAKC,EAAAA,GAAAA,SACHyG,EAAeK,EAAoB,EACnCJ,EAAc/F,GAAQ,EACtB,MACF,KAAKX,EAAAA,GAAAA,UACHyG,EAAeK,EAAoB7G,EACnCyG,EAAcO,GAAMhH,EAAS,EAIjC,MAAO,CAAE8F,eAAAA,EAAgBU,aAAAA,EAAcC,YAAAA,K,2ECjHzC,SACES,EACAC,GAAS,EAETC,EAAiBjL,EAAAA,GAAAA,QACjBmD,EACA+H,KAEA,MAAMC,EAAYJ,EAAYK,EAAAA,GAA6BL,QAAahM,EAClE8K,GAAcC,EAAAA,EAAAA,KAiBpB,OAfAvM,EAAAA,EAAAA,KAAU,KACR,IAAKyN,GAAUD,IAAcI,EAAW,CACtC,MAAME,EAAYC,KAAKC,MAEvBH,EAAAA,GAAkBL,EAAWE,GAAatN,MAAK,KAC7C,MAAM6N,EAAYF,KAAKC,MAAQF,GAC1BH,GAASM,GAAaN,EACzBrB,IAEA9N,WAAW8N,EAAaqB,EAAQM,SAIrC,CAACR,EAAQD,EAAWI,EAAWF,EAAa9H,EAAa0G,EAAaqB,IAElEC,I,iEC/BF,MAAMM,EAA2BC,UAAUC,WAAa5C,OAAO6C,cAEhEC,EAAahF,SAASyB,cAAc,YAC1CuD,EAAWC,aAAa,WAAY,IACpCD,EAAW9D,UAAY,EACvB8D,EAAW5P,UAAY,kBAEhB,MAAM8P,EAAuBC,IAClCH,EAAWI,MAAQD,EACnBnF,SAASY,KAAKgB,YAAYoD,GAC1B,MAAMK,EAAYrF,SAASsF,eAE3B,GAAID,EAAW,CAEb,MAAME,EAAiBF,EAAUG,WAAa,GAAKH,EAAUI,WAAW,GACxET,EAAWU,SACX1F,SAAS2F,YAAY,QAEjBJ,IACFF,EAAUO,kBACVP,EAAUQ,SAASN,IAIvBvF,SAASY,KAAKkB,YAAYkD,IAGfc,EAAwBC,IACnC,IAAKA,EAAU,OACf,MAAMC,EAAShG,SAASyB,cAAc,UAChCwE,EAAMD,EAAOE,WAAW,MACxBC,EAAU,IAAIC,MACpBD,EAAQE,OAAU5L,IAChB,GAAIwL,GAAOxL,EAAE6L,cAAe,CAC1B,MAAMC,EAAM9L,EAAE6L,cACdN,EAAOQ,MAAQD,EAAIC,MACnBR,EAAOS,OAASF,EAAIE,OACpBR,EAAIS,UAAUH,EAAK,EAAG,EAAGA,EAAIC,MAAOD,EAAIE,QACxCT,EAAOW,OAAOC,EAAqB,YAAa,KAIpDT,EAAQxM,IAAMoM,GAGhBhR,eAAe6R,EAAoBC,GACjC,GAAKA,GAAYjC,EAIjB,UACQC,UAAUC,UAAUgC,MAAM,CAC9B,IAAI5E,OAAO6C,cAAc,CACvB,CAAC8B,EAAQE,MAAOF,MAGpB,MAAOG,GACHC,EAAAA,IAEFC,QAAQF,MAAMA,M,8CC3DpB,SAAgB7Q,EAA2ByH,KACrCuJ,EAAAA,KACFhR,EAAU8B,MAAMmP,SAAW,eAGXlP,IAAd0F,IACFzH,EAAUyH,UAAYA,GAGpBuJ,EAAAA,KACFhR,EAAU8B,MAAMmP,SAAW,M,8CCV/B,QAAgBC,IACdA,EAAQ9R,OAAO+R,OAAOC,IAChBN,EAAAA,IAEFC,QAAQM,KAAKD,EAAKF","sources":["webpack://telegram-t/./src/components/common/AnimatedSticker.tsx","webpack://telegram-t/./src/components/common/Avatar.tsx","webpack://telegram-t/./src/components/ui/ConfirmDialog.tsx","webpack://telegram-t/./src/components/ui/InfiniteScroll.tsx","webpack://telegram-t/./src/components/ui/Modal.tsx","webpack://telegram-t/./src/util/trapFocus.ts","webpack://telegram-t/./src/components/ui/Portal.ts","webpack://telegram-t/./src/hooks/useBackgroundMode.ts","webpack://telegram-t/./src/hooks/useCurrentOrPrev.ts","webpack://telegram-t/./src/hooks/useInfiniteScroll.ts","webpack://telegram-t/./src/hooks/useMedia.ts","webpack://telegram-t/./src/util/clipboard.ts","webpack://telegram-t/./src/util/resetScroll.ts","webpack://telegram-t/./src/util/safePlay.ts"],"sourcesContent":["import React, {\n FC, useEffect, useRef, memo, useCallback, useState,\n} from '../../lib/teact/teact';\n\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 color?: [number, number, number];\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 color,\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 color,\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 }, [color, animation, animationData, id, isLowPriority, noLoop, onLoad, quality, size, speed]);\n\n useEffect(() => {\n if (!animation) return;\n\n animation.setColor(color);\n }, [color, animation]);\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 useEffect(() => {\n if (animation) {\n animation.changeData(animationData);\n playAnimation();\n }\n }, [playAnimation, animation, animationData]);\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('AnimatedSticker', className);\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 { MouseEvent as ReactMouseEvent } from 'react';\nimport React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport { ApiChat, ApiMediaFormat, ApiUser } from '../../api/types';\n\nimport { IS_TEST } from '../../config';\nimport {\n getChatAvatarHash,\n getChatTitle,\n getUserColorKey,\n getUserFullName,\n isUserId,\n isChatWithRepliesBot,\n isDeletedUser,\n isUserOnline,\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 useShowTransition from '../../hooks/useShowTransition';\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 const isReplies = user && isChatWithRepliesBot(user.id);\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 blobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl, lastSyncTime);\n const hasBlobUrl = Boolean(blobUrl);\n const { transitionClassNames } = useShowTransition(hasBlobUrl, undefined, hasBlobUrl, 'slow');\n\n const lang = useLang();\n\n let content: string | undefined = '';\n\n if (isSavedMessages) {\n content = ;\n } else if (isDeleted) {\n content = ;\n } else if (isReplies) {\n content = ;\n } else if (blobUrl) {\n content = (\n \"\"\n );\n } else if (user) {\n const userFullName = getUserFullName(user);\n content = userFullName ? getFirstLetters(userFullName, 2) : undefined;\n } else if (chat) {\n const title = getChatTitle(lang, chat);\n content = title && getFirstLetters(title, isUserId(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 isReplies && 'replies-bot-account',\n withOnlineStatus && isOnline && 'online',\n onClick && 'interactive',\n (!isSavedMessages && !blobUrl) && 'no-photo',\n );\n\n const hasImage = Boolean(isSavedMessages || blobUrl);\n const handleClick = useCallback((e: ReactMouseEvent) => {\n if (onClick) {\n onClick(e, hasImage);\n }\n }, [onClick, hasImage]);\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 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 title?: string;\n header?: FC;\n textParts?: TextPart[];\n text?: string;\n confirmLabel?: string;\n confirmHandler: () => void;\n confirmIsDestructive?: boolean;\n isButtonsInOneRow?: boolean;\n children?: any;\n};\n\nconst ConfirmDialog: FC = ({\n isOpen,\n onClose,\n onCloseAnimationEnd,\n title,\n header,\n text,\n textParts,\n confirmLabel = 'Confirm',\n confirmHandler,\n confirmIsDestructive,\n isButtonsInOneRow,\n children,\n}) => {\n const lang = useLang();\n\n return (\n \n {text && text.split('\\\\n').map((textPart) => (\n

{textPart}

\n ))}\n {textParts || children}\n
\n \n {confirmLabel}\n \n \n
\n \n );\n};\n\nexport default memo(ConfirmDialog);\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; noScroll?: boolean }) => void;\n onScroll?: (e: UIEvent) => void;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n items?: any[];\n itemSelector?: string;\n preloadBackwards?: number;\n sensitiveArea?: number;\n noScrollRestore?: boolean;\n noScrollRestoreOnTop?: 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 onKeyDown,\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 noScrollRestore = false,\n noScrollRestoreOnTop = 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 }>({});\n\n const [loadMoreBackwards, loadMoreForwards] = useMemo(() => {\n if (!onLoadMore) {\n return [];\n }\n\n return [\n debounce((noScroll = false) => {\n onLoadMore({ direction: LoadMoreDirection.Backwards, noScroll });\n }, 1000, true, false),\n debounce(() => {\n onLoadMore({ direction: LoadMoreDirection.Forwards });\n }, 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 (preloadBackwards > 0 && (!items || items.length < preloadBackwards)) {\n loadMoreBackwards(true);\n return;\n }\n\n const { scrollHeight, clientHeight } = containerRef.current!;\n if (clientHeight && scrollHeight <= clientHeight) {\n loadMoreBackwards();\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 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) {\n state.currentAnchor = nextAnchor;\n state.currentAnchorTop = nextAnchor.getBoundingClientRect().top;\n }\n }\n\n if (noScrollRestore) {\n return;\n }\n\n if (noScrollRestoreOnTop && container.scrollTop === 0) {\n return;\n }\n\n resetScroll(container, newScrollTop);\n\n state.isScrollTopJustUpdated = true;\n }, [items, itemSelector, noScrollRestore, noScrollRestoreOnTop, cacheBuster]);\n\n const handleScroll = useCallback((e: UIEvent) => {\n if (loadMoreForwards && loadMoreBackwards) {\n const {\n isScrollTopJustUpdated, currentAnchor, currentAnchorTop,\n } = stateRef.current;\n const listItemElements = stateRef.current.listItemElements!;\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?.offsetParent && 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?.offsetParent && 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?.offsetParent) {\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 { RefObject } from 'react';\nimport React, {\n FC, useEffect, useRef,\n} from '../../lib/teact/teact';\n\nimport { TextPart } from '../common/helpers/renderMessageText';\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';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Button from './Button';\nimport Portal from './Portal';\n\nimport './Modal.scss';\n\nconst ANIMATION_DURATION = 200;\n\ntype OwnProps = {\n title?: string | TextPart[];\n className?: string;\n isOpen?: boolean;\n header?: any;\n hasCloseButton?: boolean;\n noBackdrop?: boolean;\n children: any;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onEnter?: () => void;\n dialogRef?: RefObject;\n};\n\ntype StateProps = {\n shouldSkipHistoryAnimations?: boolean;\n};\n\nconst Modal: FC = ({\n dialogRef,\n title,\n className,\n isOpen,\n header,\n hasCloseButton,\n noBackdrop,\n children,\n onClose,\n onCloseAnimationEnd,\n onEnter,\n shouldSkipHistoryAnimations,\n}) => {\n const {\n shouldRender,\n transitionClassNames,\n } = useShowTransition(\n isOpen, onCloseAnimationEnd, shouldSkipHistoryAnimations, undefined, shouldSkipHistoryAnimations,\n );\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 const { forceClose } = useHistoryBack(isOpen, onClose);\n\n // For modals that are closed by unmounting without changing `isOpen` to `false`\n useEffect(() => {\n return () => {\n if (isOpen) {\n forceClose();\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffectWithPrevDeps(([prevIsOpen]) => {\n document.body.classList.toggle('has-open-dialog', isOpen);\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 { 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();\n if (!elementRef.current) {\n elementRef.current = document.createElement('div');\n }\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 { useEffect } from '../lib/teact/teact';\n\nexport default function useBackgroundMode(\n onBlur?: AnyToVoidFunction,\n onFocus?: AnyToVoidFunction,\n) {\n useEffect(() => {\n if (onBlur && !document.hasFocus()) {\n onBlur();\n }\n\n if (onBlur) {\n window.addEventListener('blur', onBlur);\n }\n\n if (onFocus) {\n window.addEventListener('focus', onFocus);\n }\n\n return () => {\n if (onFocus) {\n window.removeEventListener('focus', onFocus);\n }\n\n if (onBlur) {\n window.removeEventListener('blur', onBlur);\n }\n };\n }, [onBlur, onFocus]);\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 { 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?: string | number }) => void;\n\nconst DEFAULT_LIST_SLICE = 30;\n\nexport default (\n loadMoreBackwards?: LoadMoreBackwards,\n listIds?: ListId[],\n isDisabled = false,\n listSlice = DEFAULT_LIST_SLICE,\n forceFullPreload = false,\n): [ListId[]?, GetMore?] => {\n const lastParamsRef = useRef<{\n direction?: LoadMoreDirection;\n offsetId?: ListId;\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, LoadMoreDirection.Forwards, listSlice, listIds[0]);\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, direction, listSlice, offsetId);\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(({\n direction,\n noScroll,\n }: { direction: LoadMoreDirection; noScroll?: boolean }) => {\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 if (!noScroll) {\n lastParamsRef.current = { ...lastParamsRef.current, direction, offsetId };\n }\n\n const {\n newViewportIds, areSomeLocal, areAllLocal,\n } = getViewportSlice(listIds, direction, listSlice, offsetId);\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: ListId[],\n direction: LoadMoreDirection,\n listSlice: number,\n offsetId?: ListId,\n) {\n const { length } = sourceIds;\n const index = offsetId ? sourceIds.indexOf(offsetId) : 0;\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 { 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 { 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 if (!imageUrl) return;\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 { 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","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, mediaEl);\n }\n });\n};\n"],"names":["lottiePromise","RLottie","async","ensureLottie","default","setTimeout","memo","className","id","animationData","play","playSegment","speed","noLoop","size","quality","isLowPriority","onLoad","color","animation","setAnimation","useState","container","useRef","wasPlaying","isFrozen","playRef","current","playSegmentRef","useEffect","exec","newAnimation","setSpeed","then","fastRaf","setColor","destroy","playAnimation","useCallback","shouldRestart","goToAndPlay","pauseAnimation","pause","freezeAnimation","isPlaying","unfreezeAnimation","unfreezeAnimationOnRaf","changeData","useHeavyAnimationCheck","useBackgroundMode","fullClassName","buildClassName","style","undefined","ref","chat","user","text","withOnlineStatus","isSavedMessages","lastSyncTime","onClick","isDeleted","isDeletedUser","isReplies","isChatWithRepliesBot","imageHash","getChatAvatarHash","blobUrl","useMedia","ApiMediaFormat","hasBlobUrl","Boolean","transitionClassNames","useShowTransition","lang","useLang","content","src","alt","decoding","userFullName","getUserFullName","getFirstLetters","title","getChatTitle","isUserId","isOnline","isUserOnline","getUserColorKey","hasImage","handleClick","e","senderId","IS_TEST","renderText","isOpen","onClose","onCloseAnimationEnd","header","textParts","confirmLabel","confirmHandler","confirmIsDestructive","isButtonsInOneRow","children","onEnter","split","map","textPart","isText","onLoadMore","onScroll","onKeyDown","items","itemSelector","preloadBackwards","sensitiveArea","noScrollRestore","noScrollRestoreOnTop","noFastList","cacheBuster","containerRef","stateRef","loadMoreBackwards","loadMoreForwards","useMemo","debounce","noScroll","direction","LoadMoreDirection","length","scrollHeight","clientHeight","useLayoutEffect","state","newScrollTop","listItemElements","querySelectorAll","currentAnchor","Array","from","includes","scrollTop","getBoundingClientRect","top","currentAnchorTop","nextAnchor","resetScroll","isScrollTopJustUpdated","handleScroll","listLength","offsetHeight","isNearTop","offsetTop","isNearBottom","isUpdated","nextAnchorTop","newAnchorTop","offsetParent","teactFastList","dialogRef","hasCloseButton","noBackdrop","shouldSkipHistoryAnimations","shouldRender","modalRef","captureKeyboardListeners","onEsc","element","handleKeyDown","key","preventDefault","stopPropagation","focusableElements","currentFocusedIndex","findIndex","em","isSameNode","document","activeElement","newFocusedIndex","shiftKey","focus","addEventListener","removeEventListener","trapFocus","forceClose","useHistoryBack","useEffectWithPrevDeps","prevIsOpen","body","classList","toggle","dispatchHeavyAnimationEvent","remove","Portal","tabIndex","role","Button","round","ariaLabel","containerId","elementRef","createElement","querySelector","add","appendChild","TeactDOM","removeChild","onBlur","onFocus","hasFocus","window","useCurrentOrPrev","shouldSkipUndefined","shouldForceCurrent","prev","usePrevious","listIds","isDisabled","listSlice","forceFullPreload","lastParamsRef","viewportIdsRef","newViewportIds","getViewportSlice","forceUpdate","useForceUpdate","prevListIds","prevIsDisabled","offsetId","areSortedArraysEqual","viewportIds","getMore","areSomeLocal","areAllLocal","sourceIds","index","indexOf","indexForDirection","Math","max","to","slice","mediaHash","noLoad","mediaFormat","delay","mediaData","mediaLoader","startedAt","Date","now","spentTime","CLIPBOARD_ITEM_SUPPORTED","navigator","clipboard","ClipboardItem","textCopyEl","setAttribute","copyTextToClipboard","str","value","selection","getSelection","rangeToRestore","rangeCount","getRangeAt","select","execCommand","removeAllRanges","addRange","copyImageToClipboard","imageUrl","canvas","ctx","getContext","imageEl","Image","onload","currentTarget","img","width","height","drawImage","toBlob","copyBlobToClipboard","pngBlob","write","type","error","DEBUG","console","IS_IOS","overflow","mediaEl","catch","err","warn"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/757.e669f135f9dce66de020.css.map b/dist/757.e669f135f9dce66de020.css.map deleted file mode 100644 index 04c94bf8f..000000000 --- a/dist/757.e669f135f9dce66de020.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"757.e669f135f9dce66de020.css","mappings":"AAAA,OACE,kBACA,uBAGE,4IACE,gBAKF,gCACE,gBAKF,4BACE,gBAKF,4BACE,gBAIJ,wBACE,eACA,MACA,SACA,OACA,QACA,aACA,uBACA,mBAGF,uBACE,eACA,MACA,QACA,SACA,OACA,WACA,iCAGF,4CACE,6BAGF,qBACE,kBACA,oBACA,sBACA,WACA,gBACA,kBACA,iBACA,yCACA,8DACA,2CACA,mCAEA,+CAEA,4CACE,gBACA,0BAGF,yBApBF,qBAqBI,yCAIJ,0BACE,+BAGF,6BACE,kCAGF,oDACE,oBACA,aACA,mBACA,cAGF,oBACE,kBACA,gBACA,cACA,gBACA,uBAEA,qCACE,mBAIJ,+BAEE,4CAEA,oDACE,kBACA,eACA,WACA,qBACA,iBACA,qBACA,sBACA,eAIJ,sBACE,WACA,YACA,aACA,gBAEA,qDAEE,sBAIJ,kEAGE,uBACA,mBAGF,uBACE,aACA,qBAEA,qEACE,iBAIJ,8BACE,WACA,YACA,iBACA,iBACA,gBACA,qB;AC3JJ,kBACE,aACA,uBACA,mBACA,wBACA,kBACA,WACA,YACA,SACA,wFACA,kBACA,eACA,WACA,gCAEA,0BACE,WACA,cACA,kBACA,WACA,YACA,mBACA,kBACA,kBACA,WACA,oBAEA,sCACE,aAIJ,wBACE,uBAGF,0BACE,wFAEA,kCACE,mBAIJ,iCACE,mFACA,yCACE,mBAIJ,sEACE,mBACA,sFACE,uB;ACpDN,kBACE,kBACA,0BACE,gBACA,gBACA,UACA,uBACA,2BACA,iBACA,WAEA,iCACE,oDACA,gBACA,mCACA,2CACA,oBAIJ,kCACE,YAiCA,kBACA,gBACA,eAjCA,wCACE,oBACA,kBACA,UACA,YACA,aACA,mBACA,mBACA,oBAEA,yDACE,kBAIJ,uCACE,uBAGF,yCACE,uBAGF,yCACE,uBAGF,sCACE,uBCpCJ,oDACE,wBACA,cACA,WACA,cACA,oBACA,uBAEA,0DACE,aAGF,+DACE,WACA,eAEA,uBACA,yBACA,kBAGF,0EACE,wBAGF,uEACE,qBAGF,mFACE,eAGF,+IACE,eDsBF,oDACE,YACA,kBACA,aACA,MACA,wBACA,SACA,UAIA,0EAvBA,YACA,YACA,aACA,8BACA,2CACA,oDACA,0JAqBA,sEA3BA,YACA,YACA,aACA,8BACA,2CACA,oDACA,uJAyBA,+DA/BA,YACA,YACA,aACA,8BACA,2CACA,oDACA,sJ;AEnEN,QACE,mCACA,UACA,mBACA,uBACA,eACA,gBACA,kBACA,wEACA,WACA,iBACA,aACA,mBACA,gEAEA,wBACE,kBAGF,eACE,WACA,YAGF,UACE,iBAEA,4BACE,qBAIJ,mBACE,WACA,YACA,mBAEA,0BACE,eACA,gBAIJ,kBACE,WACA,YACA,kBAEA,yBACE,cACA,eAIJ,mBACE,eACA,gBACA,kBAEA,0BACE,cACA,eAIJ,oBACE,cACA,eACA,oBAEA,2BACE,WACA,YAIJ,mBACE,oBAEA,qBACE,iBAGF,0BACE,gBACA,iBAIJ,mBACE,aACA,cACA,iBAEA,qBACE,eAGF,0BACE,aACA,cAIJ,eACE,kBAEA,sBACE,WACA,cACA,kBACA,cACA,aACA,cACA,eACA,kBACA,yCACA,yBACA,cAIJ,oBACE,eAGF,wBACE,WACA,Y;AChIJ,sBACE,kBACA,aACA,mBACA,mBACA,WACA,qBACA,qBACA,0CACA,eAEA,4BACE,mBAGF,4BACE,aAGF,8BACE,kBAGF,4BACE,YACA,aACA,sBAEA,kCACE,uBACA,mBACA,gBAGF,mCACE,uBACA,mBACA,gBACA,cACA,iBAEA,wCACE,cAGF,yCACE,cAGF,uCACE,cAKN,kCACE,cACA,aACA,mBACA,uBACA,cACA,eACA,iBACA,iBACA,cAIA,kDACE,cAIJ,+BACE,eACA,a;AC3EJ,2BACE,qBACA,gBACA,kBACA,qBACA,0BACA,+BACA,eAEA,6CACE,kBACA,gBACA,WACA,YACA,qBAEA,iDACE,kBACA,gBACA,iBAIJ,qDACE,WAGF,mCACE,uCACA,WACA,YACA,kBACA,cACA,WACA,UACA,qBACA,oCAGF,0CACE,yCAGF,wCACE,kBACA,UACA,WACA,YACA,0BACA,SACA,WACA,mBACA,sBACA,aACA,mBACA,WACA,gEACA,UACA,eACA,wBAEA,8CACE,0BAIJ,iCACE,cACA,WAGF,kCACE,mBACA,eACA,kBAGF,8CACE,kBACA,QACA,SACA,UACA,WACA,2CACA,gBAGF,sCACE,kCACA,iBAGF,iCACE,kBACA,SACA,WACA,aACA,mBACA,uBACA,WACA,YACA,oDACA,iCACA,UAEA,uCACE,kBAGF,4CACE,iBAOJ,+CACE,UAGF,sDACE,U;ACzHF,0BACE,aACA,sBACA,mBACA,eAGF,yBACE,6BACA,mBAGF,yBACE,4BACA,4BACA,6BACA,mBACA,oDAIF,qBACE,+BAGF,yBACE,qBAEA,uCACE,0BACA,4BACA,6BACA,gBACA,gBACA,kCACA,+CAGF,yCACE,UACA,4BAIA,8CACE,UAGF,4CACE,+BAKN,mBACE,WACA,aACA,mBACA,WACA,oBAEA,sBACE,kBACA,gBACA,sBAIJ,mBACE,aACA,eACA,UAGF,yBACE,kBACA,mBACA,qBAEA,kCACE,eAGF,qCACE,sBACA,aACA,mBACA,qBACA,0CACA,eACA,kCAEA,2CACE,mBAGF,2CACE,uBACA,mBACA,gBAGF,2CACE,aACA,uBACA,mBACA,cACA,eACA,iBACA,kBAKN,uBACE,cACA,oBACA,kBACA,WAGF,oBACE,kBACA,gBACA,aACA,mBACA,6BACA,WACA,kBACA,eAEA,2BACE,eAGF,4BACE,kBACA,WACA,WACA,YACA,+DACA,UACA,UAGF,oCACE,WACA,aACA,sBACA,mBAEA,iDACE,mBACA,iBACA,iBACA,WAGF,uDACE,WAEA,oEACE,kBACA,eAKN,6BACE,kBACA,kCAEA,sCACE,uBAIJ,mCACE,aACA,sBACA,mBAGF,sEACE,aACA,SACA,mBACA,kBACA,WACA,YACA,WACA,mBACA,aACA,mBACA,uBACA,0CAEA,kFACE,mBAIJ,gDACE,mBAEA,sDACE,mBAIJ,0CACE,mBAEA,iDACE,mBAIJ,wCACE,mBAEA,8CACE,mBAIJ,oCACE,aACA,cACA,oBACA,UAKJ,iCACE,aACA,mBACA,YACA,SACA,uBACA,eACA,gBAGF,gDACE,mBAEA,sDACE,YAIJ,8BACE,kBACA,+BACA,2BACA,WACA,SACA,YACA,0BACA,8DACA,mBACA,UACA,oBACA,YAEA,2CACE,aAGF,6CACE,mBACA,SAEA,6DACE,gBAIJ,uCACE,eACA,gDACE,wBAKF,uDACE,sBACA,uBAIJ,kGACE,WACA,YAEA,oIACE,aACA,mBACA,uBAIJ,sCACE,aAIJ,yCACE,eAGF,8BACE,WACA,YAGF,6BACE,WACA,YAEA,aACA,kBACA,uDACA,mBAEA,wDACE,gBACA,WAEA,2EACE,YAIJ,mFACE,qCAIJ,mCACE,gBACA,a;ACzVJ,kBACE,kBACA,MACA,OACA,YACA,WACA,UAEA,aACA,uBACA,gBACA,kBACA,WACA,mBACA,eACA,oDACA,4BAEA,uBACE,wB","sources":["webpack://telegram-t/./src/components/ui/Modal.scss","webpack://telegram-t/./src/components/calls/group/MicrophoneButton.scss","webpack://telegram-t/./src/components/calls/group/GroupCallParticipantMenu.scss","webpack://telegram-t/./src/styles/_mixins.scss","webpack://telegram-t/./src/components/common/Avatar.scss","webpack://telegram-t/./src/components/calls/group/GroupCallParticipant.scss","webpack://telegram-t/./src/components/calls/group/GroupCallParticipantVideo.scss","webpack://telegram-t/./src/components/calls/group/GroupCall.scss","webpack://telegram-t/./src/components/calls/ActiveCallHeader.scss"],"sourcesContent":[".Modal {\n position: relative;\n z-index: var(--z-modal);\n\n &.delete, &.error, &.confirm, &.pin, &.unpin-all {\n .modal-dialog {\n max-width: 23rem;\n }\n }\n\n &.error {\n .modal-content > div {\n margin-top: 1rem;\n }\n }\n\n &.narrow {\n .modal-dialog {\n max-width: 20rem;\n }\n }\n\n &.report {\n .modal-dialog {\n max-width: 15rem;\n }\n }\n\n .modal-container {\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n .modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n background-color: rgba(0, 0, 0, .25);\n }\n\n &.transparent-backdrop .modal-backdrop {\n background-color: transparent;\n }\n\n .modal-dialog {\n position: relative;\n display: inline-flex;\n flex-direction: column;\n width: 100%;\n max-width: 35rem;\n min-width: 17.5rem;\n margin: 2rem auto;\n background-color: var(--color-background);\n box-shadow: 0 .25rem .5rem .125rem var(--color-default-shadow);\n border-radius: var(--border-radius-default);\n transform: translate3d(0, -1rem, 0);\n\n transition: transform .2s ease, opacity .2s ease;\n\n body.animation-level-0 & {\n transition: none;\n transform: none !important;\n }\n\n @media (max-width: 450px) {\n max-width: calc(100vw - 3rem) !important;\n }\n }\n\n &.open .modal-dialog {\n transform: translate3d(0, 0, 0);\n }\n\n &.closing .modal-dialog {\n transform: translate3d(0, 1rem, 0);\n }\n\n .modal-header {\n padding: 1rem 1rem 0;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n }\n\n .modal-title {\n font-size: 1.25rem;\n font-weight: 500;\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:not(:only-child) {\n margin: 0 1.3125rem;\n }\n }\n\n .modal-header-condensed {\n @extend .modal-header;\n padding: .5rem 1.25rem 0 .9375rem !important;\n\n .modal-action-button {\n font-size: 0.875rem;\n height: 2.25rem;\n width: auto;\n line-height: 1.625rem;\n margin-left: auto;\n padding-left: 1.25rem;\n padding-right: 1.25rem;\n min-width: 5rem;\n }\n }\n\n .modal-content {\n width: 100%;\n flex-grow: 1;\n padding: 1rem;\n overflow-y: auto;\n\n b,\n strong {\n word-break: break-word;\n }\n }\n\n .modal-title,\n .modal-content,\n .modal-content > p {\n unicode-bidi: plaintext;\n text-align: initial;\n }\n\n .dialog-buttons {\n display: flex;\n align-items: flex-end;\n\n .confirm-dialog-button + .confirm-dialog-button {\n margin-left: 1rem;\n }\n }\n\n .confirm-dialog-button {\n width: auto;\n height: auto;\n margin-left: auto;\n text-align: right;\n font-weight: 500;\n white-space: pre-wrap;\n }\n}\n",".MicrophoneButton {\n display: flex;\n justify-content: center;\n align-items: center;\n outline: none !important;\n position: relative;\n width: 6rem;\n height: 6rem;\n border: 0;\n background: radial-gradient(100% 100% at 100% 0%, #00a0b9 0%, #33c659 55%, #33c659 100%);\n border-radius: 50%;\n font-size: 2rem;\n color: #fff;\n transition: 0.25s ease-out filter;\n\n &::before {\n content: \"\";\n display: block;\n position: absolute;\n width: 8rem;\n height: 8rem;\n background: #64C166;\n border-radius: 50%;\n filter: blur(10px);\n opacity: 0.2;\n pointer-events: none;\n\n body.is-ios & {\n display: none;\n }\n }\n\n &:hover {\n filter: brightness(0.9);\n }\n\n &.crossed {\n background: radial-gradient(100% 100% at 100% 0%, #00AFFE 0%, #00AFFE 55%, #007FFF 100%);\n\n &::before {\n background: #00AFFE;\n }\n }\n\n &.muted-by-admin {\n background: radial-gradient(85.5% 103.5% at 87.5% 20.65%, #CE4D74 0%, #3D52DF 100%);\n &::before {\n background: #3D52DF;\n }\n }\n\n &.is-connecting, &.is-connecting:hover {\n background: #222B34;\n &::before {\n background: transparent;\n }\n }\n}\n","@import '../../../styles/mixins';\n\n.participant-menu {\n position: absolute;\n .bubble {\n background: none;\n border-radius: 0;\n padding: 0;\n border: none !important;\n box-shadow: none !important;\n overflow: visible;\n color: #ffffff;\n\n .group {\n box-shadow: 0 0.25rem 0.5rem 0.125rem rgba(16, 16, 16, 0.3);\n overflow: hidden;\n background: var(--color-background);\n border-radius: var(--border-radius-default);\n margin-bottom: 0.5rem;\n }\n }\n\n .volume-control {\n height: 3rem;\n\n .info {\n pointer-events: none;\n position: relative;\n z-index: 1;\n height: 100%;\n display: flex;\n flex-direction: row;\n align-items: center;\n padding: 0.75rem 1rem;\n\n .AnimatedSticker {\n margin-right: 2rem;\n }\n }\n\n &.high {\n --range-color: #4DA6E0;\n }\n\n &.normal {\n --range-color: #57BC6C;\n }\n\n &.medium {\n --range-color: #CAA53B;\n }\n\n &.low {\n --range-color: #CB5757;\n }\n\n position: relative;\n overflow: hidden;\n cursor: pointer;\n\n @mixin thumb-styles() {\n border: none;\n height: 3rem;\n width: 1.5rem;\n background: var(--range-color);\n border-radius: var(--border-radius-default);\n box-shadow: -13.5rem 0 0 12.75rem var(--range-color);\n transition: 0.25s ease-in-out background-color, 0.25s ease-in-out box-shadow;\n }\n\n @include reset-range();\n\n // Apply custom styles\n input[type=\"range\"] {\n height: 3rem;\n position: absolute;\n left: -1.5rem;\n top: 0;\n width: calc(100% + 3rem);\n margin: 0;\n z-index: 0;\n\n // Note that while we're repeating code here, that's necessary as you can't comma-separate these type of selectors.\n // Browsers will drop the entire selector if it doesn't understand a part of it.\n &::-webkit-slider-thumb {\n @include thumb-styles();\n }\n\n &::-moz-range-thumb {\n @include thumb-styles();\n }\n\n &::-ms-thumb {\n @include thumb-styles();\n }\n }\n }\n}\n","// @optimization\n@mixin while-transition() {\n .Transition > div:not(.active) &, body.animating-right-column & {\n @content;\n }\n}\n\n@mixin overflow-y-overlay() {\n @supports (overflow-y: overlay) {\n overflow-y: overlay;\n\n //Workaround for Android <= 9\n overflow-x: hidden;\n }\n}\n\n@mixin reset-range() {\n input[type=\"range\"] {\n -webkit-appearance: none;\n display: block;\n width: 100%;\n height: 0.75rem;\n margin-bottom: 0.5rem;\n background: transparent;\n\n &:focus {\n outline: none;\n }\n\n &::-ms-track {\n width: 100%;\n cursor: pointer;\n\n background: transparent;\n border-color: transparent;\n color: transparent;\n }\n\n &::-webkit-slider-thumb {\n -webkit-appearance: none;\n }\n\n &::-moz-slider-thumb {\n -moz-appearance: none;\n }\n\n &::-webkit-slider-runnable-track {\n cursor: pointer;\n }\n\n &::-moz-range-track, &::-moz-range-progress {\n cursor: pointer;\n }\n }\n}\n",".Avatar {\n --color-user: var(--color-primary);\n flex: none;\n align-items: center;\n justify-content: center;\n width: 3.375rem;\n height: 3.375rem;\n border-radius: 50%;\n background: linear-gradient(var(--color-white) -125%, var(--color-user));\n color: white;\n font-weight: bold;\n display: flex;\n white-space: nowrap;\n user-select: none;\n\n img:not(.emoji) {\n border-radius: 50%;\n }\n\n .emoji {\n width: 1rem;\n height: 1rem;\n }\n\n i {\n font-size: 2.5rem;\n\n &.icon-reply-filled {\n transform: scale(.7);\n }\n }\n\n &.size-micro {\n width: 1rem;\n height: 1rem;\n font-size: 0.5125rem;\n\n .emoji {\n width: .5625rem;\n height: .5625rem;\n }\n }\n\n &.size-tiny {\n width: 2rem;\n height: 2rem;\n font-size: .875rem;\n\n .emoji {\n width: .875rem;\n height: .875rem;\n }\n }\n\n &.size-small {\n width: 2.125rem;\n height: 2.125rem;\n font-size: 0.875rem;\n\n .emoji {\n width: .875rem;\n height: .875rem;\n }\n }\n\n &.size-medium {\n width: 2.75rem;\n height: 2.75rem;\n font-size: 1.1875rem;\n\n .emoji {\n width: 1rem;\n height: 1rem;\n }\n }\n\n &.size-large {\n font-size: 1.3125rem;\n\n i {\n font-size: 3.5rem;\n }\n\n .emoji {\n width: 1.3125rem;\n height: 1.3125rem;\n }\n }\n\n &.size-jumbo {\n width: 7.5rem;\n height: 7.5rem;\n font-size: 3.5rem;\n\n i {\n font-size: 6rem;\n }\n\n .emoji {\n width: 3.5rem;\n height: 3.5rem;\n }\n }\n\n &.online {\n position: relative;\n\n &::after {\n content: '';\n display: block;\n position: absolute;\n bottom: 0.05rem;\n right: 0.05rem;\n width: 0.875rem;\n height: 0.875rem;\n border-radius: 50%;\n border: 2px solid var(--color-background);\n background-color: #0ac630;\n flex-shrink: 0;\n }\n }\n\n &.interactive {\n cursor: pointer;\n }\n\n img:not(.emoji) {\n width: 100%;\n height: 100%;\n }\n}\n",".GroupCallParticipant {\n position: relative;\n display: flex;\n flex-direction: row;\n align-items: center;\n color: #fff;\n padding: 0.5rem 0.75rem;\n border-radius: 0.75rem;\n transition: .15s ease-out background-color;\n cursor: pointer;\n\n &:hover {\n background: #2F363E;\n }\n\n audio {\n display: none;\n }\n\n .Avatar {\n margin-right: 1rem;\n }\n\n .info {\n min-width: 0;\n display: flex;\n flex-direction: column;\n\n .name {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n }\n\n .about {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n color: #848D94;\n font-size: 0.75rem;\n\n &.blue {\n color: #4DA6E0;\n }\n\n &.green {\n color: #57BC6C;\n }\n\n &.red {\n color: #FF706F;\n }\n }\n }\n\n .microphone {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2.75rem;\n height: 2.75rem;\n margin-left: auto;\n font-size: 1.5rem;\n color: #FF706F;\n }\n\n &.can-self-unmute {\n .microphone {\n color: #848D94;\n }\n }\n\n .streams {\n cursor: pointer;\n display: flex;\n }\n}\n",".GroupCallParticipantVideo {\n border-radius: 0.75rem;\n overflow: hidden;\n position: relative;\n max-height: 12.875rem;\n width: calc(50% - 0.25rem);\n transition: 0.25s ease-out width;\n cursor: pointer;\n\n .thumbnail-avatar {\n position: absolute;\n border-radius: 0;\n width: 100%;\n height: 100%;\n transform: scale(1.1);\n\n img {\n filter: blur(10px);\n border-radius: 0;\n object-fit: cover;\n }\n }\n\n &:last-child:nth-child(odd) {\n width: 100%;\n }\n\n &::before {\n box-shadow: 0 0 0 3px transparent inset;\n width: 100%;\n height: 100%;\n position: absolute;\n display: block;\n content: \"\";\n z-index: 5;\n border-radius: 0.75rem;\n transition: 0.25s ease-out box-shadow;\n }\n\n &.active::before {\n box-shadow: 0px 0px 0px 3px #78ee7e inset;\n }\n\n .back-button {\n position: absolute;\n z-index: 5;\n top: 0.75rem;\n left: 0.75rem;\n background: rgba(0, 0, 0, 0.3);\n border: 0;\n color: white;\n border-radius: 1rem;\n padding: 0.25rem 0.75rem;\n display: flex;\n align-items: center;\n gap: 0.25rem;\n transition: 0.25s ease-out opacity, 0.25s ease-out background-color;\n opacity: 0;\n cursor: pointer;\n outline: none !important;\n\n &:hover {\n background: rgba(0, 0, 0, 0.4);\n }\n }\n\n video {\n display: block;\n width: 100%;\n }\n\n .video {\n object-fit: contain;\n height: 12.5rem;\n position: relative;\n }\n\n .thumbnail-wrapper {\n position: absolute;\n top: 50%;\n left: 50%;\n z-index: 0;\n width: 100%;\n transform: translate(-50%, -50%) scale(1.5);\n background: black;\n }\n\n .thumbnail {\n filter: blur(10px) brightness(0.5);\n object-fit: cover;\n }\n\n .info {\n position: absolute;\n bottom: 0;\n color: #fff;\n display: flex;\n align-items: center;\n padding: 0 0.5rem 0.25rem;\n width: 100%;\n height: 2rem;\n background: linear-gradient(0deg, #000, transparent);\n transition: 0.25s ease-out opacity;\n opacity: 0;\n\n .name {\n margin-left: 0.5rem;\n }\n\n .last-icon {\n margin-left: auto;\n }\n }\n}\n\n.videos:hover .GroupCallParticipantVideo {\n\n .info {\n opacity: 1;\n }\n\n .back-button {\n opacity: 1;\n }\n}\n",".GroupCall {\n .modal-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 37.5rem;\n }\n\n .modal-dialog {\n max-height: calc(100% - 4rem);\n background: #181F27;\n }\n\n .Menu .bubble {\n --color-background: #232A34;\n --color-chat-hover: #2F363E;\n --color-item-active: #2F363E;\n --color-text: #fff;\n box-shadow: 0 0.25rem 0.5rem 0.125rem rgba(16, 16, 16, 0.3);\n }\n\n // Compact menu items\n .MenuItem {\n padding: 0.75rem 1rem !important;\n }\n\n &.single-column {\n opacity: 1 !important;\n\n .modal-dialog {\n max-width: 100% !important;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n margin-top: auto;\n margin-bottom: 0;\n transform: translate3d(0, 100%, 0);\n transition: transform .3s ease, opacity .3s ease;\n }\n\n .modal-backdrop {\n opacity: 0;\n transition: opacity 0.2s ease;\n }\n\n &.open {\n .modal-backdrop {\n opacity: 1;\n }\n\n .modal-dialog {\n transform: translate3d(0, 0, 0);\n }\n }\n }\n\n .header {\n width: 100%;\n display: flex;\n align-items: center;\n color: #fff;\n margin-bottom: 0.5rem;\n\n h3 {\n font-size: 1.25rem;\n font-weight: 500;\n margin: 0 auto 0 0.5rem;\n }\n }\n\n .videos {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n }\n\n .participants {\n margin-top: 0.75rem;\n background: #222B34;\n border-radius: 0.75rem;\n\n .Loading {\n padding: 2rem 0;\n }\n\n .invite-btn {\n padding: 0.25rem 0.75rem;\n display: flex;\n align-items: center;\n border-radius: 0.75rem;\n transition: .15s ease-out background-color;\n cursor: pointer;\n color: var(--color-text-secondary);\n\n &:hover {\n background: #2F363E;\n }\n\n .text {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n }\n\n .icon {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 2.75rem;\n height: 2.75rem;\n font-size: 1.5rem;\n margin-right: 1rem;\n }\n }\n }\n\n .scrollable {\n overflow: auto;\n padding-bottom: 2rem;\n max-width: 37.5rem;\n width: 100%;\n }\n\n .buttons {\n max-width: 37.5rem;\n margin-top: auto;\n display: flex;\n align-items: center;\n justify-content: space-around;\n width: 100%;\n position: relative;\n height: 8.75rem;\n\n button {\n cursor: pointer;\n }\n\n &::before {\n position: absolute;\n content: \"\";\n width: 100%;\n height: 2rem;\n background: linear-gradient(0deg, #181F27, rgba(24, 31, 39, 0));\n z-index: 0;\n top: -2rem;\n }\n\n .button-wrapper {\n width: 4rem;\n display: flex;\n flex-direction: column;\n align-items: center;\n\n .button-text {\n white-space: nowrap;\n font-size: 0.75rem;\n margin-top: 0.5rem;\n color: #fff;\n }\n\n &.microphone-wrapper {\n width: 6rem;\n\n .button-text {\n margin-top: 0.75rem;\n font-size: 1rem;\n }\n }\n }\n\n .Loading {\n position: absolute;\n transform: translate(0, -1.125rem);\n\n .Spinner {\n --spinner-size: 6.5rem;\n }\n }\n\n .video-buttons {\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n\n .small-button, .smaller-button {\n outline: none;\n border: 0;\n background: #15415b;\n border-radius: 50%;\n width: 3rem;\n height: 3rem;\n color: #fff;\n font-size: 1.375rem;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: 0.25s ease-out background-color;\n\n &:hover {\n background: #11364b;\n }\n }\n\n .small-button.camera.active {\n background: #15415b;\n\n &:hover {\n background: #11364b;\n }\n }\n\n .small-button.speaker {\n background: #2B3A51;\n\n &.active {\n background: #496092;\n }\n }\n\n .small-button.leave {\n background: #5A2824;\n\n &:hover {\n background: #49201d;\n }\n }\n\n .smaller-button {\n width: 2.5rem;\n height: 2.5rem;\n margin-bottom: 0.5rem;\n padding: 0;\n }\n }\n\n\n &.landscape .scrollable {\n display: flex;\n flex-direction: row;\n flex-grow: 1;\n gap: 1rem;\n align-items: flex-start;\n max-width: 100%;\n max-height: 100%;\n }\n\n &.landscape .GroupCallParticipantVideo {\n max-height: initial;\n\n video {\n height: 100%;\n }\n }\n\n &.landscape .buttons {\n position: absolute;\n left: calc(50% - 15.625rem / 2);\n transform: translateX(-50%);\n width: auto;\n gap: 1rem;\n bottom: 4rem;\n background: rgba(0, 0, 0, 0.6);\n backdrop-filter: blur(10px);\n border-radius: 1rem;\n z-index: 5;\n padding: 0.75rem 1rem;\n height: auto;\n\n .button-text {\n display: none;\n }\n\n .video-buttons {\n flex-direction: row;\n gap: 1rem;\n\n .smaller-button {\n margin-bottom: 0;\n }\n }\n\n .Loading {\n transform: none;\n .Spinner {\n --spinner-size: 3.25rem;\n }\n }\n\n .MicrophoneButton {\n canvas {\n width: 2rem !important;\n height: 2rem !important;\n }\n }\n\n .MicrophoneButton, .microphone-wrapper {\n width: 3rem;\n height: 3rem;\n\n .AnimatedSticker {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n }\n\n &::before {\n display: none;\n }\n }\n\n &.landscape.no-sidebar .buttons {\n left: calc(50%);\n }\n\n &.landscape .streams {\n width: 100%;\n height: 100%;\n }\n\n &.landscape .videos {\n width: 100%;\n height: 100%;\n\n display: grid;\n --column-count: 1;\n grid-template-columns: repeat(var(--column-count), 1fr);\n grid-auto-rows: 1fr;\n\n .GroupCallParticipantVideo {\n max-height: 100%;\n width: 100%;\n\n .thumbnail-wrapper {\n height: 100%;\n }\n }\n\n &.span-last-video .GroupCallParticipantVideo:last-child {\n grid-column: span var(--column-count);\n }\n }\n\n &.landscape .participants {\n width: 15.625rem;\n margin-top: 0;\n }\n}\n",".ActiveCallHeader {\n position: absolute;\n top: 0;\n left: 0;\n height: 2rem;\n width: 100%;\n z-index: 1;\n\n display: flex;\n justify-content: center;\n font-weight: 500;\n font-size: 0.875rem;\n color: #fff;\n align-items: center;\n padding: 0 1rem;\n background: linear-gradient(90deg, rgb(82, 206, 93), rgb(0, 177, 192));\n transform: translateY(-100%);\n\n &.open {\n transform: translateY(0);\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/dist/757.e669f135f9dce66de020.js b/dist/757.e669f135f9dce66de020.js deleted file mode 100644 index 1fa39dc57..000000000 --- a/dist/757.e669f135f9dce66de020.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! For license information please see 757.e669f135f9dce66de020.js.LICENSE.txt */ -(self.webpackChunktelegram_t=self.webpackChunktelegram_t||[]).push([[757],{3535:(e,t,a)=>{"use strict";a.r(t),a.d(t,{ActiveCallHeader:()=>z,GroupCall:()=>B});var n=a(3794),i=a(4050),o=a(5116),r=a(1226),s=a(1638),l=a(2607),c=a(4446),d=a(3716),u=a(782),p=a(1689),m=a(6204);(0,o.Q6)("apiUpdate",((e,t,a)=>{const{activeGroupCallId:i}=e.groupCalls;switch(a["@type"]){case"updateGroupCallLeavePresentation":t.toggleGroupCallPresentation({value:!1});break;case"updateGroupCallStreams":if(!a.userId||!i)break;if(!(0,l.GU)(e,i,a.userId))break;return(0,c.B6)(e,i,a.userId,(0,u.CE)(a,["@type","userId"]));case"updateGroupCallConnectionState":if(!i)break;if("disconnected"===a.connectionState){t.leaveGroupCall({isFromLibrary:!0});break}return(0,c.AH)(e,i,{connectionState:a.connectionState,isSpeakerDisabled:a.isSpeakerDisabled});case"updateGroupCallParticipants":{const{groupCallId:e,participants:t}=a;i===e&&(0,n.handleUpdateGroupCallParticipants)(t);break}case"updateGroupCallConnection":{if(a.data.stream){t.showNotification({message:"Big live streams are not yet supported"}),t.leaveGroupCall();break}(0,n.handleUpdateGroupCallConnection)(a.data,a.presentation);const i=(0,l.mU)(e);null!=i&&i.participants&&Object.keys(i.participants).length>0&&(0,n.handleUpdateGroupCallParticipants)(Object.values(i.participants));break}}})),(0,o.Q6)("leaveGroupCall",((e,t,a)=>{const{isFromLibrary:i,shouldDiscard:s,shouldRemove:d,rejoin:u}=a||{},m=(0,l.mU)(e);m&&(e=(0,c.Ic)(e,{connectionState:"disconnected"},m.participantsCount-1),(async()=>{await(0,r.t9)("leaveGroupCall",{call:m}),s&&await(0,r.t9)("discardGroupCall",{call:m}),e=(0,o.Rd)(),d&&(e=(0,c.dc)(e,m.id)),(0,p.Mt)(),(0,o.R3)({...e,groupCalls:{...e.groupCalls,isGroupCallPanelHidden:!0,activeGroupCallId:void 0}}),i||(0,n.leaveGroupCall)(),u&&t.joinGroupCall(u)})())})),(0,o.Q6)("toggleGroupCallVideo",(e=>{const t=(0,l.mU)(e),a=(0,s.dy)(e,e.currentUserId);a&&t&&(async()=>{await(0,n.toggleStream)("video"),await(0,r.t9)("editGroupCallParticipant",{call:t,videoStopped:!(0,n.isStreamEnabled)("video"),participant:a})})()})),(0,o.Q6)("requestToSpeak",((e,t,a)=>{const{value:n}=a||{value:!0},i=(0,l.mU)(e),o=(0,s.dy)(e,e.currentUserId);o&&i&&(0,r.t9)("editGroupCallParticipant",{call:i,raiseHand:n,participant:o})})),(0,o.Q6)("setGroupCallParticipantVolume",((e,t,a)=>{const{participantId:i,volume:o}=a,c=(0,l.mU)(e),u=(0,s.dy)(e,i);u&&c&&((0,n.setVolume)(i,Math.floor(o/d.Ro)/100),(0,r.t9)("editGroupCallParticipant",{call:c,volume:Number(o),participant:u}))})),(0,o.Q6)("toggleGroupCallMute",((e,t,a)=>{const{participantId:i,value:o}=a||{},c=(0,l.mU)(e),d=(0,s.dy)(e,i||e.currentUserId);d&&c&&(async()=>{const e=void 0===o?(0,n.isStreamEnabled)("audio",d.id):o;i?(0,n.setVolume)(i,e?0:1):await(0,n.toggleStream)("audio"),await(0,r.t9)("editGroupCallParticipant",{call:c,muted:e,participant:d})})()})),(0,o.Q6)("toggleGroupCallPresentation",((e,t,a)=>{const i=(0,l.mU)(e),o=(0,s.dy)(e,e.currentUserId);o&&i&&(async()=>{if(void 0!==(null==a?void 0:a.value)?null==a?void 0:a.value:!(0,n.isStreamEnabled)("presentation")){const e=await(0,n.startSharingScreen)();if(!e)return;await(0,r.t9)("joinGroupCallPresentation",{call:i,params:e})}else await(0,n.toggleStream)("presentation",!1),await(0,r.t9)("leaveGroupCallPresentation",{call:i});await(0,r.t9)("editGroupCallParticipant",{call:i,presentationPaused:!(0,n.isStreamEnabled)("presentation"),participant:o})})()})),(0,o.Q6)("connectToActiveGroupCall",((e,t)=>{const a=(0,l.mU)(e);if(!a)return;if("discarded"===a.connectionState)return void t.showNotification({message:"This voice chat is not active"});const i=(0,p.FF)(),c=(0,p.NH)();if(!i||!c)return;const{currentUserId:d}=e;d&&(async()=>{const e=await(0,n.joinGroupCall)(d,c,i,t.apiUpdate);if(await(0,r.t9)("joinGroupCall",{call:a,params:e,inviteHash:a.inviteHash})&&(t.loadMoreGroupCallParticipants(),a.chatId)){const e=(0,s.Z1)((0,o.Rd)(),a.chatId);if(!e)return;await(0,m.f)(e)}})()}));var v=a(7361),g=a(6752),f=a(706),C=a(9107),S=a(4288),P=a(231),h=a(3106),E=a(8964),b=a(3103);const y=()=>{var e,t;null===(e=(t=navigator).vibrate)||void 0===e||e.call(t,50)};var k=a(7204),Z=a(7324),G=a(7799);const I=(0,i.X$)((({size:e,name:t,playSegment:a,color:n})=>{const[o,r]=(0,i.eJ)();return(0,i.d4)((()=>{(0,Z.Z)(t).then(r)}),[t]),i.ZP.createElement(G.Z,{id:t,play:!0,noLoop:!0,playSegment:a,size:e,speed:1,animationData:o,color:n})})),w=(0,i.X$)((0,o.c$)((e=>{const t=(0,l.mU)(e),{connectionState:a}=t||{},n=t&&(0,l.GU)(e,t.id,e.currentUserId),{raiseHandRating:i,hasAudioStream:o,canSelfUnmute:r,isMuted:s}=n||{};return{connectionState:a||"discarded",hasRequestedToSpeak:Boolean(i),noAudioStream:!o,canSelfUnmute:r,isMuted:s}}),((e,t)=>(0,u.ei)(t,["toggleGroupCallMute","requestToSpeak","playGroupCallSound"])))((({noAudioStream:e,canSelfUnmute:t,isMuted:a,hasRequestedToSpeak:n,connectionState:o,toggleGroupCallMute:r,requestToSpeak:s,playGroupCallSound:l})=>{const c=(0,C.Z)(),d=(0,i.sO)("up"),[u,p]=(0,i.eJ)(!1),m="connected"!==o,v=!t&&a,f=(0,k.Z)(v);(0,i.d4)((()=>{f&&!v&&l("allowTalk")}),[l,f,v]);const S=(0,i.Ye)((()=>{if(u){const e=Math.floor(100*Math.random());return e<32?[0,120]:e<64?[120,240]:e<97?[240,420]:[420,540]}return!f&&v?e?[99,135]:[136,172]:f&&!v?[0,36]:v?[0,0]:e?[69,99]:[36,69]}),[f,u,e,v]),P=u?"HandFilled":"VoiceMini",h=()=>{y(),r()},E=(0,i.Ye)((()=>c(n?"VoipMutedTapedForSpeak":v?"VoipMutedByAdmin":e?"VoipUnmute":"VoipTapToMute")),[n,e,c,v]);return i.ZP.createElement("div",{className:"button-wrapper microphone-wrapper"},i.ZP.createElement("button",{className:(0,g.Z)("MicrophoneButton",e&&"crossed",t&&"can-self-unmute",m&&"is-connecting",v&&"muted-by-admin"),onMouseDown:()=>{if(v){if(u)return;return y(),s(),p(!0),void setTimeout((()=>{p(!1)}),3e3)}d.current="down",e&&setTimeout((()=>{"down"===d.current&&(d.current="hold",h())}),200)},onMouseUp:()=>{v||(h(),d.current="up")}},i.ZP.createElement(I,{name:P,size:48,playSegment:S})),i.ZP.createElement("div",{className:"button-text"},E))})));var M=a(4605),T=a(6071),N=a(2328),D=a(2275);const O=[0,17],U=[17,34],$=(0,i.X$)((0,o.c$)((e=>({isAdmin:(0,l.Ht)(e)})),((e,t)=>(0,u.ei)(t,["setGroupCallParticipantVolume","toggleGroupCallMute","openChat","toggleGroupCallPanel","requestToSpeak"])))((({participant:e,closeDropdown:t,isDropdownOpen:a,anchor:n,isAdmin:o,toggleGroupCallMute:r,setGroupCallParticipantVolume:s,toggleGroupCallPanel:l,openChat:c,requestToSpeak:u})=>{const p=(0,C.Z)(),[m,v,S]=(0,f.Z)(),P=null==e?void 0:e.id,{isMutedByMe:h,isMuted:b,isSelf:y,canSelfUnmute:k}=e||{},Z=Boolean(null==e?void 0:e.raiseHandRating),G=!k&&b,[w,M]=(0,i.eJ)(h?0:((null==e?void 0:e.volume)||d.aC)/d.Ro);(0,i.d4)((()=>{M(h?0:((null==e?void 0:e.volume)||d.aC)/d.Ro)}),[P]);const $=(0,T.Z)(500),V=(0,i.I4)((e=>{e.stopPropagation(),v(),t()}),[v,t]),R=(0,i.I4)((e=>{e.stopPropagation(),u({value:!1}),t()}),[u,t]),A=(0,i.I4)((e=>{e.stopPropagation(),t(),o||M(h?d.aC/d.Ro:0),r({participantId:P,value:o?!G:!h})}),[t,r,P,o,G,h]),H=(0,i.I4)((e=>{e.stopPropagation(),l(),c({id:P}),t()}),[l,t,c,P]),x=0===w?O:U;return i.ZP.createElement("div",null,i.ZP.createElement(N.Z,{isOpen:a,positionX:"right",autoClose:!0,style:n?`right: 1rem; top: ${n.y}px;`:void 0,onClose:t,className:"participant-menu"},!y&&!G&&i.ZP.createElement("div",{className:"group"},i.ZP.createElement("div",{className:(0,g.Z)("volume-control",w<50&&"low",w>=50&&w<100&&"medium",w>=100&&w<150&&"normal",w>=150&&"high")},i.ZP.createElement("input",{type:"range",min:"0",max:"200",value:w,onChange:e=>{const t=Number(e.target.value);M(t),$((()=>{0===t?r({participantId:P,value:!0}):s({participantId:P,volume:Math.floor(t*d.Ro)})}))}}),i.ZP.createElement("div",{className:"info"},i.ZP.createElement(I,{name:"Speaker",playSegment:x,size:24}),i.ZP.createElement("span",null,w,"%")))),i.ZP.createElement("div",{className:"group"},Z&&y&&i.ZP.createElement(E.Z,{icon:"stop-raising-hand",onClick:R},p("VoipGroupCancelRaiseHand")),!y&&i.ZP.createElement(E.Z,{icon:"user",onClick:H},p("VoipGroupOpenProfile")),!y&&i.ZP.createElement(E.Z,{icon:b&&o?"allow-speak":"microphone-alt",onClick:A},p(o?G?"VoipGroupAllowToSpeak":"VoipMute":h?"VoipGroupUnmuteForMe":"VoipGroupMuteForMe")),!y&&o&&i.ZP.createElement(E.Z,{icon:"delete-user",destructive:!0,onClick:V},p("VoipGroupUserRemove")))),!y&&o&&i.ZP.createElement(D.Z,{isOpen:m,userId:P,onClose:S}))})));var V=a(7407),R=a(172);const A=(0,i.X$)((({participant:e,noColor:t})=>{const{isMuted:a,isMutedByMe:o}=e,r=(e.amplitude||0)>n.THRESHOLD,s=Boolean(e.raiseHandRating),l=(0,k.Z)(s),c=!(null!=e&&e.canSelfUnmute)&&a,d=(0,k.Z)(a),u=(0,i.Ye)((()=>a&&!d?[43,64]:!a&&d?[22,42]:s&&!l?[65,84]:!c&&l?[0,21]:a?[22,23]:[43,44]),[a,c,s]),p=(0,i.Ye)((()=>t?[255,255,255]:s?[77,166,224]:c||o?[255,112,111]:r?[87,188,108]:[132,141,148]),[t,s,c,o,r]);return i.ZP.createElement(I,{name:"VoiceOutlined",playSegment:u,size:28,color:p})})),H=(0,i.X$)((0,o.c$)(((e,{participant:t})=>({user:t.isUser?(0,s.dy)(e,t.id):void 0,chat:t.isUser?void 0:(0,s.Z1)(e,t.id)})))((({openParticipantMenu:e,participant:t,user:a,chat:o})=>{const r=(0,i.sO)(null),s=(0,C.Z)(),{isSelf:l,isMutedByMe:c,isMuted:u}=t,p=(t.amplitude||0)>n.THRESHOLD,m=Boolean(t.raiseHandRating),[v,f]=(0,i.Ye)((()=>l?[s("ThisIsYou"),"blue"]:c?[s("VoipGroupMutedForMe"),"red"]:m?[s("WantsToSpeak"),"blue"]:!u&&p?[t.volume&&t.volume!==d.aC?s("SpeakingWithVolume",(t.volume/d.Ro).toString()).replace("%%","%"):s("Speaking"),"green"]:t.about?[t.about,""]:[s("Listening"),"blue"]),[p,t.volume,s,l,c,m,u,t.about]);if(!a&&!o)return;const S=a?`${a.firstName||""} ${a.lastName||""}`:null==o?void 0:o.title;return i.ZP.createElement("div",{className:(0,g.Z)("GroupCallParticipant",t.canSelfUnmute&&"can-self-unmute"),onClick:()=>{l||e(r.current,t)},ref:r},i.ZP.createElement(R.Z,{user:a,chat:o,size:"medium"}),i.ZP.createElement("div",{className:"info"},i.ZP.createElement("span",{className:"name"},S),i.ZP.createElement("span",{className:(0,g.Z)("about",f)},v)),i.ZP.createElement("div",{className:"microphone"},i.ZP.createElement(A,{participant:t})))})));var x=a(1273);const F=(0,i.X$)((0,o.c$)((e=>{const{participantsCount:t,participants:a,chatId:n}=(0,l.mU)(e)||{},i=n&&(0,s.Z1)(e,n);return{participants:a,participantsCount:t||0,canInvite:!!i&&!!i.username}}),((e,t)=>(0,u.ei)(t,["createGroupCallInviteLink","loadMoreGroupCallParticipants"])))((({createGroupCallInviteLink:e,loadMoreGroupCallParticipants:t,participants:a,participantsCount:n,openParticipantMenu:o,canInvite:r})=>{const s=(0,C.Z)(),l=(0,i.Ye)((()=>Object.keys(a||{})),[a]),[c,d]=(0,V.Z)(t,l,l.length>=n);return i.ZP.createElement("div",{className:"participants"},r&&i.ZP.createElement("div",{className:"invite-btn",onClick:e},i.ZP.createElement("div",{className:"icon"},i.ZP.createElement("i",{className:"icon-add-user"})),i.ZP.createElement("div",{className:"text"},s("VoipGroupInviteMember"))),i.ZP.createElement(x.Z,{items:c,onLoadMore:d},null==c?void 0:c.map((e=>a[e]&&i.ZP.createElement(H,{key:e,openParticipantMenu:o,participant:a[e]})))))}))),L=(0,i.X$)((0,o.c$)(((e,{participant:t})=>({currentUserId:e.currentUserId,user:t.isUser?(0,s.dy)(e,t.id):void 0,chat:t.isUser?void 0:(0,s.Z1)(e,t.id),isActive:(t.amplitude||0)>n.THRESHOLD})))((({type:e,onClick:t,user:a,chat:o,isActive:r,isFullscreen:s})=>{const l=(0,C.Z)(),c=(0,i.I4)((()=>{t&&t((null==a?void 0:a.id)||o.id,e)}),[o,t,e,null==a?void 0:a.id]);if(!a&&!o)return;const u=(0,n.getUserStreams)((null==a?void 0:a.id)||o.id);return i.ZP.createElement("div",{className:(0,g.Z)("GroupCallParticipantVideo",r&&"active"),onClick:c},s&&i.ZP.createElement("button",{className:"back-button"},i.ZP.createElement("i",{className:"icon-arrow-left"}),l("Back")),i.ZP.createElement(R.Z,{user:a,chat:o,className:"thumbnail-avatar"}),d.LH&&i.ZP.createElement("div",{className:"thumbnail-wrapper"},i.ZP.createElement("video",{className:"thumbnail",muted:!0,autoPlay:!0,playsInline:!0,srcObject:null==u?void 0:u[e]})),i.ZP.createElement("video",{className:"video",muted:!0,autoPlay:!0,playsInline:!0,srcObject:null==u?void 0:u[e]}),i.ZP.createElement("div",{className:"info"},i.ZP.createElement("i",{className:"icon-microphone-alt"}),i.ZP.createElement("span",{className:"name"},(null==a?void 0:a.firstName)||(null==o?void 0:o.title)),"presentation"===e&&i.ZP.createElement("i",{className:"last-icon icon-active-sessions"})))}))),j=(0,i.X$)((0,o.c$)((e=>{const{participants:t}=(0,l.mU)(e)||{};return{participants:t}}))((({participants:e,onDoubleClick:t})=>{const[a,n]=(0,i.eJ)(void 0),o=(0,i.Ye)((()=>Object.values(e||{}).filter((e=>e.hasPresentationStream))),[e]),r=(0,i.Ye)((()=>Object.values(e||{}).filter((e=>e.hasVideoStream))),[e]),s=r.length+o.length,l=s<=2?1:s<=6?2:s<=9?3:4,c=3===s||2===l&&s%2!=0,d=(0,i.I4)(((e,t)=>{a&&e===a.id&&t===a.type?n(void 0):n({id:e,type:t})}),[a]);return i.ZP.createElement("div",{className:"streams",onDoubleClick:t},i.ZP.createElement("div",{className:(0,g.Z)("videos",c&&"span-last-video"),style:`--column-count: ${a?1:l}`},a&&i.ZP.createElement(L,{key:a.id,isFullscreen:!0,onClick:d,participant:e[a.id],type:a.type}),a?void 0:o.map((e=>i.ZP.createElement(L,{key:e.id,onClick:d,participant:e,type:"presentation"}))),a?void 0:r.map((e=>i.ZP.createElement(L,{key:e.id,onClick:d,participant:e,type:"video"})))))}))),_=[0,10],B=(0,i.X$)((0,o.c$)(((e,{groupCallId:t})=>{const{connectionState:a,title:n,isSpeakerDisabled:i,participants:o,participantsCount:r}=(0,l.$5)(e,t)||{};return{connectionState:a,title:n,isSpeakerEnabled:!i,participantsCount:r,meParticipant:(0,l.GU)(e,t,e.currentUserId),isGroupCallPanelHidden:!!e.groupCalls.isGroupCallPanelHidden,isAdmin:(0,l.Ht)(e),participants:o}}),((e,t)=>(0,u.ei)(t,["toggleGroupCallVideo","leaveGroupCall","toggleGroupCallPresentation","toggleGroupCallPanel","connectToActiveGroupCall","playGroupCallSound"])))((({groupCallId:e,isGroupCallPanelHidden:t,connectionState:a,isSpeakerEnabled:o,title:r,meParticipant:s,isAdmin:l,participants:c,toggleGroupCallVideo:d,toggleGroupCallPresentation:u,leaveGroupCall:p,toggleGroupCallPanel:m,connectToActiveGroupCall:y,playGroupCallSound:k})=>{const Z=(0,C.Z)(),G=(0,i.sO)(null),[T,N]=(0,i.eJ)(!1),[D,O,U]=(0,f.Z)(),[V,R,A]=(0,f.Z)(!0),H=c&&Object.values(c).some((e=>e.video||e.presentation)),x=D&&!v.wB&&H,[L,B]=(0,i.eJ)(),[z,Q,q]=(0,f.Z)(),[X,J,Y]=(0,f.Z)(),[W,K]=(0,i.eJ)(!1),[ee,te]=(0,i.eJ)(!1),ae=null==s?void 0:s.hasVideoStream,ne=null==s?void 0:s.hasPresentationStream,ie="connected"!==a,oe=!(null==s?void 0:s.canSelfUnmute)&&(null==s?void 0:s.isMuted),re=(0,i.I4)(((e,t)=>{const a=e.getBoundingClientRect(),n=G.current;B({anchor:{x:a.left,y:a.top-n.offsetTop+60},participant:t}),Q()}),[Q]);(0,i.d4)((()=>{"connected"===a?k({sound:"join"}):"reconnecting"===a&&k({sound:"connecting"})}),[a,k]);const se=(0,i.I4)((()=>{te(!ee)}),[ee]),le=()=>{Y(),K(!1)},ce=(0,i.Ye)((()=>({onTrigger:e,isOpen:t})=>i.ZP.createElement(P.Z,{round:!0,size:"smaller",color:"translucent",className:t?"active":void 0,onClick:e,ariaLabel:Z("AccDescrMoreOptions")},i.ZP.createElement("i",{className:"icon-more"}))),[Z]),de=(0,i.I4)((()=>{G.current&&(D?document.exitFullscreen().then(U):G.current.requestFullscreen().then(O))}),[U,D,O]),ue=(0,i.I4)((()=>{v.t0&&(D||A(),de())}),[A,de,D]),pe=(0,i.I4)((()=>{D?U():O()}),[U,D,O]);(0,i.d4)((()=>{if(!v.t0)return;const e=G.current;return e?(e.addEventListener("fullscreenchange",pe),()=>{e.removeEventListener("fullscreenchange",pe)}):void 0}),[pe]),(0,i.d4)((()=>{y()}),[y,e]);const me=()=>{if(l&&!X)return J(),void(D&&de());k({sound:"leave"}),N(!0),Y()};return i.ZP.createElement(b.Z,{isOpen:!t&&!T,onClose:m,className:(0,g.Z)("GroupCall",v.wB&&"single-column",x&&"landscape",!V&&"no-sidebar"),dialogRef:G,onCloseAnimationEnd:()=>{T&&p({shouldDiscard:ee})}},i.ZP.createElement("div",{className:"header"},i.ZP.createElement("h3",null,r||Z("VoipGroupVoiceChat")),v.t0&&i.ZP.createElement(P.Z,{round:!0,size:"smaller",color:"translucent",onClick:de,ariaLabel:Z(D?"AccExitFullscreen":"AccSwitchToFullscreen")},i.ZP.createElement("i",{className:D?"icon-smallscreen":"icon-fullscreen"})),x&&i.ZP.createElement(P.Z,{round:!0,size:"smaller",color:"translucent",onClick:()=>{V?A():R()}},i.ZP.createElement("i",{className:"icon-sidebar"})),(n.IS_SCREENSHARE_SUPPORTED&&!oe||l)&&i.ZP.createElement(h.Z,{positionX:"right",trigger:ce},n.IS_SCREENSHARE_SUPPORTED&&!oe&&i.ZP.createElement(E.Z,{icon:"share-screen",onClick:u},Z(ne?"VoipChatStopScreenCapture":"VoipChatStartScreenCapture")),l&&i.ZP.createElement(E.Z,{icon:"phone-discard-outline",onClick:()=>{K(!0),te(!0),J(),D&&de()},destructive:!0},Z("VoipGroupLeaveAlertEndChat")))),i.ZP.createElement("div",{className:"scrollable custom-scroll"},i.ZP.createElement(j,{onDoubleClick:ue}),(!x||V)&&i.ZP.createElement(F,{openParticipantMenu:re})),i.ZP.createElement($,{participant:null==L?void 0:L.participant,anchor:null==L?void 0:L.anchor,isDropdownOpen:z,closeDropdown:q}),i.ZP.createElement("div",{className:"buttons"},ie&&i.ZP.createElement(S.Z,null),i.ZP.createElement("div",{className:"button-wrapper"},i.ZP.createElement("div",{className:"video-buttons"},ae&&(v.wZ||v.cj)&&i.ZP.createElement("button",{className:"smaller-button",onClick:n.switchCameraInput},i.ZP.createElement(I,{name:"CameraFlip",playSegment:_,size:24})),i.ZP.createElement("button",{className:(0,g.Z)("small-button",oe?"speaker":"camera",(ae||oe&&o)&&"active"),onClick:()=>{oe?(0,n.toggleSpeaker)():d()}},i.ZP.createElement("i",{className:oe?"icon-speaker":ae?"icon-video-stop":"icon-video"}))),i.ZP.createElement("div",{className:"button-text"},Z(oe?"VoipSpeaker":"VoipCamera"))),i.ZP.createElement(w,null),i.ZP.createElement("div",{className:"button-wrapper"},i.ZP.createElement("button",{className:"small-button leave",onClick:me},i.ZP.createElement("i",{className:"icon-phone-discard"})),i.ZP.createElement("div",{className:"button-text"},Z("VoipGroupLeave")))),i.ZP.createElement(b.Z,{isOpen:X,onClose:le,className:"error",title:Z(W?"VoipGroupEndAlertTitle":"VoipGroupLeaveAlertTitle")},i.ZP.createElement("p",null,Z(W?"VoipGroupEndAlertText":"VoipGroupLeaveAlertText")),!W&&i.ZP.createElement(M.Z,{label:Z("VoipGroupEndChat"),checked:ee,onChange:se}),i.ZP.createElement(P.Z,{isText:!0,className:"confirm-dialog-button",onClick:me},Z(W?"VoipGroupEnd":"VoipGroupLeave")),i.ZP.createElement(P.Z,{isText:!0,className:"confirm-dialog-button",onClick:le},Z("Cancel"))))}))),z=(0,i.X$)((0,o.c$)((e=>({groupCall:(0,l.mU)(e),isGroupCallPanelHidden:e.groupCalls.isGroupCallPanelHidden,meParticipant:(0,l.GU)(e,e.groupCalls.activeGroupCallId,e.currentUserId)})),((e,t)=>(0,u.ei)(t,["toggleGroupCallPanel"])))((({groupCall:e,meParticipant:t,isGroupCallPanelHidden:a,toggleGroupCallPanel:n})=>{const o=(0,C.Z)();if((0,i.d4)((()=>{document.body.classList.toggle("has-group-call-header",a)}),[a]),e&&t)return i.ZP.createElement("div",{className:(0,g.Z)("ActiveCallHeader",a&&"open"),onClick:n},i.ZP.createElement("span",{className:"title"},e.title||o("VoipGroupVoiceChat")))})))},7324:(e,t,a)=>{"use strict";a.d(t,{Z:()=>r});var n=a(6137),i=a(647);const o={MonkeyIdle:a(1679),MonkeyTracking:a(4889),MonkeyClose:a(4185),MonkeyPeek:a(8431),FoldersAll:a(6041),FoldersNew:a(7196),DiscussionGroups:a(4349),CameraFlip:a(6280),HandFilled:a(9129),HandOutline:a(1039),Speaker:a(9261),VoiceAllowTalk:a(2873),VoiceMini:a(7242),VoiceMuted:a(1274),VoiceOutlined:a(973)};function r(e){const t=o[e].replace(window.location.origin,"");return i.he(`file${t}`,n.IU.Lottie)}},3794:(e,t)=>{(()=>{"use strict";var e={"./src/blacksilence.ts":(e,t,a)=>{a.r(t),a.d(t,{silence:()=>n,black:()=>i});const n=e=>{const t=e.createOscillator(),a=t.connect(e.createMediaStreamDestination());return t.start(),new MediaStream([Object.assign(a.stream.getAudioTracks()[0],{enabled:!1})])},i=({width:e=640,height:t=480}={})=>{const a=Object.assign(document.createElement("canvas"),{width:e,height:t}),n=a.getContext("2d");if(!n)throw Error("Cannot create canvas ctx");n.fillRect(0,0,e,t);const i=a.captureStream();return new MediaStream([Object.assign(i.getVideoTracks()[0],{enabled:!1})])}},"./src/buildSdp.ts":(e,t,a)=>{a.r(t),a.d(t,{default:()=>i});var n=a("./src/utils.ts");const i=(e,t=!1,a=!1)=>{const i=[],o=e=>{i.push(e)},{sessionId:r,ssrcs:s,audioExtensions:l,videoExtensions:c,audioPayloadTypes:d,videoPayloadTypes:u,transport:{ufrag:p,pwd:m,fingerprints:v,candidates:g}}=e;o("v=0"),o(`o=- ${r} 2 IN IP4 0.0.0.0`),o("s=-"),o("t=0 0"),o(`a=group:BUNDLE ${s.map((e=>e.endpoint)).join(" ")}${a?"":" 2"}`),o("a=ice-lite");const f=e=>{let t="";t+="a=candidate:",t+=`${e.foundation} ${e.component} ${e.protocol} ${e.priority} ${e.ip} ${e.port} typ ${e.type}`,"rel-addr"in e&&(t+=` raddr ${e["rel-addr"]} rport ${e["rel-port"]}`),t+=` generation ${e.generation}`,o(t)},C=()=>{o(`a=ice-ufrag:${p}`),o(`a=ice-pwd:${m}`),v.forEach((e=>{o(`a=fingerprint:${e.hash} ${e.fingerprint}`),o("a=setup:passive")})),g.forEach(f)},S=e=>{var t;const{channels:a,id:n,name:i,clockrate:r,parameters:s}=e;var l=a?`/${a}`:"";o(`a=rtpmap:${n} ${i}/${r}${l}`),s&&(l=Object.keys(s).map((e=>`${e}=${s[e]};`)).join(" "),o(`a=fmtp:${n} ${l}`)),null===(t=e["rtcp-fbs"])||void 0===t||t.forEach((e=>{o(`a=rtcp-fb:${n} ${e.type}${e.subtype?` ${e.subtype}`:""}`)}))};return e=e=>{const a=e.isVideo?u:d;var i=e.isVideo?"video":"audio";o(`m=${i} ${e.isMain?1:0} RTP/SAVPF ${a.map((e=>e.id)).join(" ")}`),o("c=IN IP4 0.0.0.0"),o("b=AS:1300"),o(`a=mid:${e.endpoint}`),o("a=rtcp-mux"),a.forEach(S),o("a=rtcp:1 IN IP4 0.0.0.0"),e.isVideo&&o("a=rtcp-rsize"),(e.isVideo?c:l).forEach((({id:e,uri:t})=>{o(`a=extmap:${e} ${t}`)})),e.isRemoved?o("a=inactive"):(C(),t?o("a=recvonly"):(e.isMain?o("a=sendrecv"):(o("a=sendonly"),o("a=bundle-only")),e.sourceGroups.forEach((t=>{o(`a=ssrc-group:${t.semantics} ${t.sources.map(n.fromTelegramSource).join(" ")}`),t.sources.forEach((t=>{t=(0,n.fromTelegramSource)(t),o(`a=ssrc:${t} cname:${e.endpoint}`),o(`a=ssrc:${t} msid:${e.endpoint} ${e.endpoint}`),o(`a=ssrc:${t} mslabel:${e.endpoint}`),o(`a=ssrc:${t} label:${e.endpoint}`)}))}))))},s.filter((e=>"0"===e.endpoint||"1"===e.endpoint)).map(e),a||(o("m=application 1 UDP/DTLS/SCTP webrtc-datachannel"),o("c=IN IP4 0.0.0.0"),C(),o("a=ice-options:trickle"),o("a=mid:"+(a?"1":"2")),o("a=sctp-port:5000"),o("a=max-message-size:262144")),s.filter((e=>"0"!==e.endpoint&&"1"!==e.endpoint)).map(e),`${i.join("\n")}\n`}},"./src/parseSdp.ts":(e,t,a)=>{a.r(t),a.d(t,{default:()=>i});var n=a("./src/utils.ts");const i=e=>{var t,a;if(!e||!e.sdp)throw Error("Failed parsing SDP: session description is null");const i=e.sdp.split("\r\nm=").map(((e,t)=>0===t?e:`m=${e}`)).reduce(((e,t)=>{var a;return e[(null===(a=t.match(/^m=(.+?)\s/))||void 0===a?void 0:a[1])||"header"]=t.split("\r\n").filter(Boolean),e}),{});var o=(e,t)=>{var a,n;return t?null===(a=i[t])||void 0===a||null===(n=a.find((t=>t.startsWith(e))))||void 0===n?void 0:n.substr(e.length):Object.values(i).map((t=>{var a;return null===(a=t.find((t=>t.startsWith(e))))||void 0===a?void 0:a.substr(e.length)})).filter(Boolean)[0]};const r=o("a=ssrc:","audio");var s=r&&Number(r.split(" ")[0]);const l=(null===(t=o("a=ssrc-group:","video"))||void 0===t?void 0:t.split(" "))||void 0;if(!l)throw Error("Failed parsing SDP: no video ssrc");var[c,d]=(null===(a=o("a=fingerprint:"))||void 0===a?void 0:a.split(" "))||[];if(!c||!d)throw Error("Failed parsing SDP: no fingerprint");if(e=o("a=ice-ufrag:"),o=o("a=ice-pwd:"),!e||!o)throw Error("Failed parsing SDP: no ICE ufrag or pwd");return{fingerprints:[{fingerprint:d,hash:c,setup:"active"}],pwd:o,ufrag:e,...s&&{ssrc:(0,n.toTelegramSource)(s)},...l&&{"ssrc-groups":[{semantics:l[0],sources:l.slice(1,l.length).map(Number).map(n.toTelegramSource)}]}}}},"./src/secretsauce.ts":(e,t,a)=>{a.r(t),a.d(t,{getDevices:()=>async function(e,t=!0){return(await navigator.mediaDevices.enumerateDevices()).filter((a=>a.kind===`${e}${t?"input":"output"}`))},toggleSpeaker:()=>function(){var e,t;s&&(s.isSpeakerDisabled=!s.isSpeakerDisabled,null!==(e=s)&&void 0!==e&&null!==(t=e.onUpdate)&&void 0!==t&&t.call(e,{"@type":"updateGroupCallConnectionState",connectionState:"connected",isSpeakerDisabled:s.isSpeakerDisabled}),s.participantFunctions&&Object.values(s.participantFunctions).forEach((e=>{var t,a;null===(t=e.toggleMute)||void 0===t||t.call(e,!(null===(a=s)||void 0===a||!a.isSpeakerDisabled))})))},toggleNoiseSuppression:()=>function(){if(s&&s.myId&&s.streams){const a=s.streams[s.myId].audio;if(a){const n=a.getTracks()[0];var e,t;n&&(({echoCancellation:e,noiseSuppression:t}=n.getConstraints()),n.applyConstraints({echoCancellation:!e,noiseSuppression:!t}))}}},getUserStreams:()=>c,setVolume:()=>function(e,t){var a,n,i;const o=null===(a=s)||void 0===a||null===(n=a.participantFunctions)||void 0===n?void 0:n[e];o&&(null===(i=o.setVolume)||void 0===i||i.call(o,t))},isStreamEnabled:()=>d,switchCameraInput:()=>async function(){var e;if(null!==(e=s)&&void 0!==e&&e.myId&&s.connection&&s.streams&&s.facingMode){var t;const e=null===(t=c(s.myId))||void 0===t?void 0:t.video;if(e){const t=e.getTracks()[0];if(t){const e=s.connection.getSenders().find((e=>{var a;return t.id===(null===(a=e.track)||void 0===a?void 0:a.id)}));if(e){s.facingMode="environment"===s.facingMode?"user":"environment";try{const t=await p("video",s.facingMode);await e.replaceTrack(t.getTracks()[0]),s.streams[s.myId].video=t}catch(e){}}}}}},toggleStream:()=>m,leaveGroupCall:()=>g,handleUpdateGroupCallParticipants:()=>async function(e){if(s){const{participants:n,conference:o,connection:r,myId:l}=s;if(n&&o&&r&&o.ssrcs&&o.transport&&l)if(e.find((e=>{var t,a,n,i;return e.isSelf&&e.source!==(null===(t=s)||void 0===t||null===(a=t.conference)||void 0===a||null===(n=a.ssrcs)||void 0===n||null===(i=n.find((e=>e.isMain&&!e.isVideo)))||void 0===i?void 0:i.sourceGroups[0].sources[0])})))g();else{const n=[];if(e.forEach((e=>{if(e.isSelf)e.isMuted&&!e.canSelfUnmute&&(m("audio",!1),m("video",!1),m("presentation",!1));else{var t=e.isLeft;const a=e.isMuted||e.isMutedByMe,i=!e.isVideoJoined||!e.video||t,r=!e.presentation||t;let s=!1,l=!1,c=!1;o.ssrcs.filter((t=>t.userId===e.id)).forEach((t=>{t.isVideo||(t.sourceGroups[0].sources[0]===e.source&&(l=!0),t.isRemoved=a),t.isVideo&&(t.isPresentation||(e.video&&t.endpoint===e.video.endpoint&&(s=!0),t.isRemoved=i),t.isPresentation&&(e.presentation&&t.endpoint===e.presentation.endpoint&&(c=!0),t.isRemoved=r))})),a||l||o.ssrcs.push({userId:e.id,isMain:!1,endpoint:`audio${e.source}`,isVideo:!1,sourceGroups:[{semantics:"FID",sources:[e.source]}]}),i||s||!e.video||(n.push(e.video.endpoint),o.ssrcs.push({userId:e.id,isMain:!1,endpoint:e.video.endpoint,isVideo:!0,sourceGroups:e.video.sourceGroups})),r||c||!e.presentation||o.ssrcs.push({isPresentation:!0,userId:e.id,isMain:!1,endpoint:e.presentation.endpoint,isVideo:!0,sourceGroups:e.presentation.sourceGroups})}})),s.updatingParticipantsQueue)s.updatingParticipantsQueue.push(o);else{s.updatingParticipantsQueue=[],e=(0,i.default)(o),await r.setRemoteDescription({type:"offer",sdp:e});try{var t=await r.createAnswer();if(await r.setLocalDescription(t),u(l),0async function(e,t){if(s){var a=t?s.screenshareConference:s.conference;const d=t?s.screenshareConnection:s.connection;if(a&&d&&a.ssrcs){var n,o,r,l,c=Date.now();e={...a,transport:e.transport,sessionId:c,audioExtensions:null===(n=e.audio)||void 0===n?void 0:n["rtp-hdrexts"],audioPayloadTypes:null===(o=e.audio)||void 0===o?void 0:o["payload-types"],videoExtensions:null===(r=e.video)||void 0===r?void 0:r["rtp-hdrexts"],videoPayloadTypes:null===(l=e.video)||void 0===l?void 0:l["payload-types"]},s={...s,...t?{screenshareConference:e}:{conference:e}};try{await d.setRemoteDescription({type:"answer",sdp:(0,i.default)(e,!0,t)})}catch(e){console.error(e)}}}},startSharingScreen:()=>async function(){if(s)try{const e=await p("presentation");return e?(e.getTracks()[0].onended=()=>{var e;s&&s.myId&&(null!==(e=s.streams)&&void 0!==e&&e[s.myId].presentation,u(s.myId),l())},new Promise((t=>{var{connection:a,dataChannel:t}=S([e],t,!0);s={...s,screenshareConnection:a,screenshareDataChannel:t}}))):void 0}catch(e){return}},joinGroupCall:()=>function(e,t,a,n){if(s)throw Error("Already in call");v("connecting");var i=t.createMediaStreamDestination();return a.srcObject=i.stream,a.play().catch((e=>console.warn(e))),s={onUpdate:n,participants:[],myId:e,speaking:{},silence:(0,o.silence)(t),black:(0,o.black)({width:640,height:480}),analyserInterval:setInterval(f,1e3),audioElement:a,destination:i,audioContext:t},new Promise((e=>{s={...s,...S([s.silence,s.black],e)}}))}});var n=a("./src/parseSdp.ts"),i=a("./src/buildSdp.ts"),o=a("./src/blacksilence.ts"),r=a("./src/utils.ts");let s;function l(e){var t,a,n,i;s&&(null!==(t=s.screenshareDataChannel)&&void 0!==t&&t.close(),null!==(a=s.screenshareConnection)&&void 0!==a&&a.close(),e||null===(n=(i=s).onUpdate)||void 0===n||n.call(i,{"@type":"updateGroupCallLeavePresentation"}))}function c(e){var t,a;return null===(t=s)||void 0===t||null===(a=t.streams)||void 0===a?void 0:a[e]}function d(e,t){var a,n,i;const o=(t=t||(null===(a=s)||void 0===a?void 0:a.myId))&&(null===(n=c(t))||void 0===n?void 0:n[e]);return!!o&&(null===(i=o.getTracks()[0])||void 0===i?void 0:i.enabled)}function u(e){var t,a,n;null===(t=s)||void 0===t||null===(a=t.onUpdate)||void 0===a||a.call(t,{"@type":"updateGroupCallStreams",userId:e,hasAudioStream:d("audio",e),hasVideoStream:d("video",e),hasPresentationStream:d("presentation",e),amplitude:null===(n=s.speaking)||void 0===n?void 0:n[e]})}function p(e,t="user"){return"presentation"===e?navigator.mediaDevices.getDisplayMedia({audio:!1,video:!0}):navigator.mediaDevices.getUserMedia({audio:"audio"===e&&{...r.IS_ECHO_CANCELLATION_SUPPORTED&&{echoCancellation:!0},...r.IS_NOISE_SUPPRESSION_SUPPORTED&&{noiseSuppression:!0}},video:"video"===e&&{facingMode:t}})}async function m(e,t){if(s&&s.myId&&s.connection&&s.streams){var a;const o=null===(a=c(s.myId))||void 0===a?void 0:a[e];if(o){const a=o.getTracks()[0];if(a){var n;const o=[...s.connection.getSenders(),...(null===(n=s.screenshareConnection)||void 0===n?void 0:n.getSenders())||[]].find((e=>{var t;return a.id===(null===(t=e.track)||void 0===t?void 0:t.id)}));if(o){t=void 0===t?!a.enabled:t;try{if(t&&!a.enabled){const t=await p(e);if(await o.replaceTrack(t.getTracks()[0]),s.streams[s.myId][e]=t,"video"===e)s.facingMode="user";else if("audio"===e){var i;const e=s.audioContext;if(!e)return;const a=e.createMediaStreamSource(t),n=e.createAnalyser();n.minDecibels=-100,n.maxDecibels=-30,n.smoothingTimeConstant=.05,n.fftSize=1024,a.connect(n),s={...s,participantFunctions:{...s.participantFunctions,[s.myId]:{...null===(i=s.participantFunctions)||void 0===i?void 0:i[s.myId],getCurrentAmplitude:()=>{var e=new Uint8Array(n.frequencyBinCount);return n.getByteFrequencyData(e),(0,r.getAmplitude)(e,1.5)}}}}}}else if(!t&&a.enabled){a.stop();const t="audio"===e?s.silence:s.black;if(!t)return;await o.replaceTrack(t.getTracks()[0]),s.streams[s.myId][e]=t,"video"===e&&(s.facingMode=void 0)}u(s.myId),"presentation"!==e||t||l(!0)}catch(e){}}}}}}function v(e){var t,a;null===(t=s)||void 0===t||null===(a=t.onUpdate)||void 0===a||a.call(t,{"@type":"updateGroupCallConnectionState",connectionState:e})}function g(){var e,t,a;s&&(s.myId&&null!==(e=s.streams)&&void 0!==e&&e[s.myId]&&Object.values(s.streams[s.myId]||{}).forEach((e=>{null==e||e.getTracks().forEach((e=>{e.stop()}))})),l(!0),null!==(t=s.dataChannel)&&void 0!==t&&t.close(),null!==(a=s.connection)&&void 0!==a&&a.close(),v("disconnected"),s.analyserInterval&&clearInterval(s.analyserInterval),s=void 0)}function f(){s&&s.participantFunctions&&Object.keys(s.participantFunctions).forEach((e=>{const t=s.participantFunctions[Number(e)].getCurrentAmplitude;var a,n;t&&(a=t(),n=s.speaking[e]||0,((s.speaking[e]=a)>r.THRESHOLD&&n<=r.THRESHOLD||a<=r.THRESHOLD&&n>r.THRESHOLD)&&u(e))}))}function C(e){if(s&&s.audioElement&&s.destination&&s.audioContext){var t,a,n=null===(t=s.conference)||void 0===t||null===(a=t.ssrcs)||void 0===a?void 0:a.find((t=>t.endpoint===e.track.id));if(n&&n.userId){var i,o;const{userId:t,isPresentation:a}=n;var l=null===(i=s.participants)||void 0===i?void 0:i.find((e=>e.id===t));const d="video"===e.track.kind?a?"presentation":"video":"audio";if(e.track.onended=()=>{var e,a;null!==(e=s)&&void 0!==e&&null!==(a=e.streams)&&void 0!==a&&a[t][d],u(t)},n=e.streams[0],"audio"===e.track.kind){var c;const e=s.audioContext,a=e.createMediaStreamSource(n),i=e.createGain();i.gain.value=((null==l?void 0:l.volume)||1e4)/1e4;const o=e.createGain();i.gain.value=1;const d=e.createAnalyser();d.minDecibels=-100,d.maxDecibels=-30,d.smoothingTimeConstant=.05,d.fftSize=1024,a.connect(d).connect(o).connect(i).connect(s.destination);const u=new Audio;u.srcObject=a.mediaStream,u.muted=!0,u.remove(),s={...s,participantFunctions:{...s.participantFunctions,[t]:{...null===(c=s.participantFunctions)||void 0===c?void 0:c[t],setVolume:e=>{i.gain.value=1{o.gain.value=e?0:1},getCurrentAmplitude:()=>{var e=new Uint8Array(d.frequencyBinCount);return d.getByteFrequencyData(e),(0,r.getAmplitude)(e,1.5)}}}}}s={...s,streams:{...s.streams,[t]:{...null===(o=s.streams)||void 0===o?void 0:o[t],[d]:n}}},u(t)}}}function S(e,t,a=!1){const i=new RTCPeerConnection;var o=a?void 0:function(e){const t=e.createDataChannel("data",{id:0});return t.onopen=()=>{},t.onmessage=e=>{JSON.parse(e.data).colibriClass},t.onerror=e=>{console.log("%conerror","background: green; font-size: 5em"),console.error(e)},t}(i);return e.forEach((e=>e.getTracks().forEach((t=>{i.addTrack(t,e)})))),a||(i.oniceconnectionstatechange=()=>{var e=i.iceConnectionState;"connected"===e||"completed"===e?v("connected"):"checking"===e||"new"===e?v("connecting"):"disconnected"===i.iceConnectionState&&v("reconnecting")}),i.ontrack=C,i.onnegotiationneeded=async()=>{if(s){var o=s.myId;if(o){var r=await i.createOffer({offerToReceiveVideo:!0,offerToReceiveAudio:!a});if(await i.setLocalDescription(r),r.sdp){var l,c=(0,n.default)(r),d=a?void 0:{userId:"",sourceGroups:[{semantics:"FID",sources:[c.ssrc||0]}],isRemoved:a,isMain:!0,isVideo:!1,isPresentation:a,endpoint:a?"1":"0"},p=c["ssrc-groups"]&&{isPresentation:a,userId:"",sourceGroups:c["ssrc-groups"],isMain:!0,isVideo:!0,endpoint:a?"0":"1"};r=a?s.screenshareConference:s.conference;const i=[];a?(p&&i.push(p),d&&i.push(d)):(d&&i.push(d),p&&i.push(p)),d=e.find((e=>"audio"===e.getTracks()[0].kind)),p=e.find((e=>"video"===e.getTracks()[0].kind)),s={...s,...a?{screenshareConference:{...r,ssrcs:i}}:{conference:{...r,ssrcs:i}},streams:{...s.streams,[o]:{...null===(l=s.streams)||void 0===l?void 0:l[o],...d&&{audio:d},...!a&&p?{video:p}:{presentation:p}}}},u(o),t(c)}}}},{connection:i,dataChannel:o}}},"./src/types.ts":(e,t,a)=>{a.r(t)},"./src/utils.ts":(e,t,a)=>{var n,i,o,r,s;function l(){var{userAgent:e,platform:t}=window.navigator;let a;return-1!==["Macintosh","MacIntel","MacPPC","Mac68K"].indexOf(t)?a="macOS":-1!==["iPhone","iPad","iPod"].indexOf(t)?a="iOS":-1!==["Win32","Win64","Windows","WinCE"].indexOf(t)?a="Windows":/Android/.test(e)?a="Android":/Linux/.test(t)&&(a="Linux"),a}a.r(t),a.d(t,{toTelegramSource:()=>function(e){return e<<0},fromTelegramSource:()=>function(e){return e>>>0},getAmplitude:()=>function(e,t=3){if(!e)return 0;var a=e.length;let n=0;for(let t=0;tl,THRESHOLD:()=>c,PLATFORM_ENV:()=>d,IS_MAC_OS:()=>u,IS_IOS:()=>p,IS_SCREENSHARE_SUPPORTED:()=>m,IS_ECHO_CANCELLATION_SUPPORTED:()=>v,IS_NOISE_SUPPRESSION_SUPPORTED:()=>g});const c=.1,d=l(),u="macOS"===d,p="iOS"===d,m="getDisplayMedia"in((null===(n=navigator)||void 0===n?void 0:n.mediaDevices)||{}),v=null===(i=navigator)||void 0===i||null===(o=i.mediaDevices)||void 0===o?void 0:o.getSupportedConstraints().echoCancellation,g=null===(r=navigator)||void 0===r||null===(s=r.mediaDevices)||void 0===s?void 0:s.getSupportedConstraints().noiseSuppression}},a={};function n(t){var i=a[t];return void 0!==i||(i=a[t]={exports:{}},e[t](i,i.exports,n)),i.exports}n.d=(e,t)=>{for(var a in t)n.o(t,a)&&!n.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var i={};(()=>{n.r(i),n.d(i,{handleUpdateGroupCallConnection:()=>e.handleUpdateGroupCallConnection,startSharingScreen:()=>e.startSharingScreen,joinGroupCall:()=>e.joinGroupCall,getDevices:()=>e.getDevices,getUserStreams:()=>e.getUserStreams,setVolume:()=>e.setVolume,isStreamEnabled:()=>e.isStreamEnabled,toggleStream:()=>e.toggleStream,leaveGroupCall:()=>e.leaveGroupCall,handleUpdateGroupCallParticipants:()=>e.handleUpdateGroupCallParticipants,switchCameraInput:()=>e.switchCameraInput,toggleSpeaker:()=>e.toggleSpeaker,toggleNoiseSuppression:()=>e.toggleNoiseSuppression,IS_SCREENSHARE_SUPPORTED:()=>t.IS_SCREENSHARE_SUPPORTED,THRESHOLD:()=>t.THRESHOLD});var e=n("./src/secretsauce.ts"),t=n("./src/utils.ts");n("./src/types.ts")})();var o,r=t;for(o in i)r[o]=i[o];i.__esModule&&Object.defineProperty(r,"__esModule",{value:!0})})()},4349:(e,t,a)=>{"use strict";e.exports=a.p+"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a..tgs"},6041:(e,t,a)=>{"use strict";e.exports=a.p+"FoldersAll.3f9f9e243d19f0fbf9aa..tgs"},7196:(e,t,a)=>{"use strict";e.exports=a.p+"FoldersNew.9a40d71c0c8be70f5bd1..tgs"},4185:(e,t,a)=>{"use strict";e.exports=a.p+"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3e..tgs"},1679:(e,t,a)=>{"use strict";e.exports=a.p+"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab..tgs"},8431:(e,t,a)=>{"use strict";e.exports=a.p+"TwoFactorSetupMonkeyPeek.1905436b042520363d7e..tgs"},4889:(e,t,a)=>{"use strict";e.exports=a.p+"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12..tgs"},6280:(e,t,a)=>{"use strict";e.exports=a.p+"CameraFlip.1a9fe44cf01fcb22347d..tgs"},9129:(e,t,a)=>{"use strict";e.exports=a.p+"HandFilled.f87939d160f1dc288586..tgs"},1039:(e,t,a)=>{"use strict";e.exports=a.p+"HandOutline.f9831751ba60df30c484..tgs"},9261:(e,t,a)=>{"use strict";e.exports=a.p+"Speaker.04bb3743412b41ff83c5..tgs"},2873:(e,t,a)=>{"use strict";e.exports=a.p+"VoiceAllowTalk.a9cc7c39ec438973ddc9..tgs"},7242:(e,t,a)=>{"use strict";e.exports=a.p+"VoiceMini.bf00ffdf69625c579569..tgs"},1274:(e,t,a)=>{"use strict";e.exports=a.p+"VoiceMuted.a4b4ec6bfd7c6c5fb275..tgs"},973:(e,t,a)=>{"use strict";e.exports=a.p+"VoiceOutlined.91b394ab3562cdfad6bc..tgs"}}]); -//# sourceMappingURL=757.e669f135f9dce66de020.js.map \ No newline at end of file diff --git a/dist/757.e669f135f9dce66de020.js.map b/dist/757.e669f135f9dce66de020.js.map deleted file mode 100644 index f64af5c52..000000000 --- a/dist/757.e669f135f9dce66de020.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"757.e669f135f9dce66de020.js","mappings":"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","sources":["webpack://telegram-t/./src/modules/actions/api/calls.async.ts","webpack://telegram-t/./src/util/vibrate.ts","webpack://telegram-t/./src/components/common/AnimatedIcon.tsx","webpack://telegram-t/./src/components/calls/group/MicrophoneButton.tsx","webpack://telegram-t/./src/components/calls/group/GroupCallParticipantMenu.tsx","webpack://telegram-t/./src/components/calls/group/OutlinedMicrophoneIcon.tsx","webpack://telegram-t/./src/components/calls/group/GroupCallParticipant.tsx","webpack://telegram-t/./src/components/calls/group/GroupCallParticipantList.tsx","webpack://telegram-t/./src/components/calls/group/GroupCallParticipantVideo.tsx","webpack://telegram-t/./src/components/calls/group/GroupCallParticipantStreams.tsx","webpack://telegram-t/./src/components/calls/group/GroupCall.tsx","webpack://telegram-t/./src/components/calls/ActiveCallHeader.tsx","webpack://telegram-t/./src/components/common/helpers/animatedAssets.ts","webpack://telegram-t/./src/lib/secret-sauce/index.js"],"sourcesContent":["import {\n joinGroupCall,\n startSharingScreen,\n leaveGroupCall,\n toggleStream,\n isStreamEnabled,\n setVolume,\n handleUpdateGroupCallParticipants, handleUpdateGroupCallConnection,\n} from '../../../lib/secret-sauce';\nimport { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\nimport { callApi } from '../../../api/gramjs';\nimport { selectChat, selectUser } from '../../selectors';\nimport {\n selectActiveGroupCall,\n selectGroupCallParticipant,\n} from '../../selectors/calls';\nimport {\n removeGroupCall,\n updateActiveGroupCall,\n updateGroupCall,\n updateGroupCallParticipant,\n} from '../../reducers/calls';\nimport { ApiUpdate } from '../../../api/types';\nimport { GROUP_CALL_VOLUME_MULTIPLIER } from '../../../config';\nimport { omit } from '../../../util/iteratees';\nimport { getGroupCallAudioContext, getGroupCallAudioElement, removeGroupCallAudioElement } from '../ui/calls';\nimport { loadFullChat } from './chats';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n const { activeGroupCallId } = global.groupCalls;\n\n switch (update['@type']) {\n case 'updateGroupCallLeavePresentation': {\n actions.toggleGroupCallPresentation({ value: false });\n break;\n }\n case 'updateGroupCallStreams': {\n if (!update.userId || !activeGroupCallId) break;\n if (!selectGroupCallParticipant(global, activeGroupCallId, update.userId)) break;\n\n return updateGroupCallParticipant(global, activeGroupCallId, update.userId, omit(update, ['@type', 'userId']));\n }\n case 'updateGroupCallConnectionState': {\n if (!activeGroupCallId) break;\n\n if (update.connectionState === 'disconnected') {\n actions.leaveGroupCall({ isFromLibrary: true });\n break;\n }\n\n return updateGroupCall(global, activeGroupCallId, {\n connectionState: update.connectionState,\n isSpeakerDisabled: update.isSpeakerDisabled,\n });\n }\n case 'updateGroupCallParticipants': {\n const { groupCallId, participants } = update;\n if (activeGroupCallId === groupCallId) {\n void handleUpdateGroupCallParticipants(participants);\n }\n break;\n }\n case 'updateGroupCallConnection': {\n if (update.data.stream) {\n actions.showNotification({ message: 'Big live streams are not yet supported' });\n actions.leaveGroupCall();\n break;\n }\n void handleUpdateGroupCallConnection(update.data, update.presentation);\n\n const groupCall = selectActiveGroupCall(global);\n if (groupCall?.participants && Object.keys(groupCall.participants).length > 0) {\n void handleUpdateGroupCallParticipants(Object.values(groupCall.participants));\n }\n break;\n }\n }\n\n return undefined;\n});\n\naddReducer('leaveGroupCall', (global, actions, payload) => {\n const {\n isFromLibrary, shouldDiscard, shouldRemove, rejoin,\n } = payload || {};\n const groupCall = selectActiveGroupCall(global);\n if (!groupCall) {\n return;\n }\n\n global = updateActiveGroupCall(global, {\n connectionState: 'disconnected',\n }, groupCall.participantsCount - 1);\n\n (async () => {\n await callApi('leaveGroupCall', {\n call: groupCall,\n });\n\n if (shouldDiscard) {\n await callApi('discardGroupCall', {\n call: groupCall,\n });\n }\n\n global = getGlobal();\n if (shouldRemove) {\n global = removeGroupCall(global, groupCall.id);\n }\n\n removeGroupCallAudioElement();\n\n setGlobal({\n ...global,\n groupCalls: {\n ...global.groupCalls,\n isGroupCallPanelHidden: true,\n activeGroupCallId: undefined,\n },\n });\n\n if (!isFromLibrary) {\n leaveGroupCall();\n }\n\n if (rejoin) {\n actions.joinGroupCall(rejoin);\n }\n })();\n});\n\naddReducer('toggleGroupCallVideo', (global) => {\n const groupCall = selectActiveGroupCall(global);\n const user = selectUser(global, global.currentUserId!);\n if (!user || !groupCall) {\n return;\n }\n\n (async () => {\n await toggleStream('video');\n\n await callApi('editGroupCallParticipant', {\n call: groupCall,\n videoStopped: !isStreamEnabled('video'),\n participant: user,\n });\n })();\n});\n\naddReducer('requestToSpeak', (global, actions, payload) => {\n const { value } = payload || { value: true };\n const groupCall = selectActiveGroupCall(global);\n const user = selectUser(global, global.currentUserId!);\n if (!user || !groupCall) {\n return;\n }\n\n void callApi('editGroupCallParticipant', {\n call: groupCall,\n raiseHand: value,\n participant: user,\n });\n});\n\naddReducer('setGroupCallParticipantVolume', (global, actions, payload) => {\n const { participantId, volume } = payload!;\n\n const groupCall = selectActiveGroupCall(global);\n const user = selectUser(global, participantId);\n if (!user || !groupCall) {\n return;\n }\n\n setVolume(participantId, Math.floor(volume / GROUP_CALL_VOLUME_MULTIPLIER) / 100);\n\n void callApi('editGroupCallParticipant', {\n call: groupCall,\n volume: Number(volume),\n participant: user,\n });\n});\n\naddReducer('toggleGroupCallMute', (global, actions, payload) => {\n const { participantId, value } = payload || {};\n const groupCall = selectActiveGroupCall(global);\n const user = selectUser(global, participantId || global.currentUserId!);\n if (!user || !groupCall) {\n return;\n }\n\n (async () => {\n const muted = value === undefined ? isStreamEnabled('audio', user.id) : value;\n\n if (!participantId) {\n await toggleStream('audio');\n } else {\n setVolume(participantId, muted ? 0 : 1);\n }\n\n await callApi('editGroupCallParticipant', {\n call: groupCall,\n muted,\n participant: user,\n });\n })();\n});\n\naddReducer('toggleGroupCallPresentation', (global, actions, payload) => {\n const groupCall = selectActiveGroupCall(global);\n const user = selectUser(global, global.currentUserId!);\n if (!user || !groupCall) {\n return;\n }\n\n (async () => {\n const value = payload?.value !== undefined ? payload?.value : !isStreamEnabled('presentation');\n if (value) {\n const params = await startSharingScreen();\n if (!params) {\n return;\n }\n\n await callApi('joinGroupCallPresentation', {\n call: groupCall,\n params,\n });\n } else {\n await toggleStream('presentation', false);\n await callApi('leaveGroupCallPresentation', {\n call: groupCall,\n });\n }\n\n await callApi('editGroupCallParticipant', {\n call: groupCall,\n presentationPaused: !isStreamEnabled('presentation'),\n participant: user,\n });\n })();\n});\n\naddReducer('connectToActiveGroupCall', (global, actions) => {\n const groupCall = selectActiveGroupCall(global);\n if (!groupCall) return;\n\n if (groupCall.connectionState === 'discarded') {\n actions.showNotification({ message: 'This voice chat is not active' });\n return;\n }\n\n const audioElement = getGroupCallAudioElement();\n const audioContext = getGroupCallAudioContext();\n\n if (!audioElement || !audioContext) {\n return;\n }\n\n const {\n currentUserId,\n } = global;\n\n if (!currentUserId) return;\n\n (async () => {\n const params = await joinGroupCall(currentUserId, audioContext, audioElement, actions.apiUpdate);\n\n const result = await callApi('joinGroupCall', {\n call: groupCall,\n params,\n inviteHash: groupCall.inviteHash,\n });\n\n if (!result) return;\n\n actions.loadMoreGroupCallParticipants();\n\n if (groupCall.chatId) {\n const chat = selectChat(getGlobal(), groupCall.chatId);\n if (!chat) return;\n await loadFullChat(chat);\n }\n })();\n});\n","export const vibrateShort = () => {\n navigator.vibrate?.(50);\n};\n","import React, {\n FC, memo, useEffect, useState,\n} from '../../lib/teact/teact';\n\nimport getAnimationData, { ANIMATED_STICKERS_PATHS } from './helpers/animatedAssets';\n\nimport AnimatedSticker from './AnimatedSticker';\n\ntype OwnProps = {\n name: keyof typeof ANIMATED_STICKERS_PATHS;\n size: number;\n playSegment?: [number, number];\n color?: [number, number, number];\n};\n\nconst AnimatedIcon: FC = ({\n size,\n name,\n playSegment,\n color,\n}) => {\n const [iconData, setIconData] = useState>();\n\n useEffect(() => {\n getAnimationData(name).then(setIconData);\n }, [name]);\n\n return (\n \n );\n};\n\nexport default memo(AnimatedIcon);\n","import { GroupCallConnectionState } from '../../../lib/secret-sauce';\nimport React, {\n FC, memo, useEffect, useMemo, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\n\nimport buildClassName from '../../../util/buildClassName';\nimport { vibrateShort } from '../../../util/vibrate';\nimport { pick } from '../../../util/iteratees';\nimport usePrevious from '../../../hooks/usePrevious';\nimport { selectActiveGroupCall, selectGroupCallParticipant } from '../../../modules/selectors/calls';\nimport useLang from '../../../hooks/useLang';\n\nimport AnimatedIcon from '../../common/AnimatedIcon';\n\nimport './MicrophoneButton.scss';\n\nconst CONNECTION_STATE_DEFAULT = 'discarded';\n\ntype StateProps = {\n connectionState?: GroupCallConnectionState;\n hasRequestedToSpeak: boolean;\n isMuted?: boolean;\n canSelfUnmute?: boolean;\n noAudioStream: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst REQUEST_TO_SPEAK_THROTTLE = 3000;\nconst HOLD_TO_SPEAK_TIME = 200;\nconst ICON_SIZE = 48;\n\nconst MicrophoneButton: FC = ({\n noAudioStream,\n canSelfUnmute,\n isMuted,\n hasRequestedToSpeak,\n connectionState,\n toggleGroupCallMute,\n requestToSpeak,\n playGroupCallSound,\n}) => {\n const lang = useLang();\n const muteMouseDownState = useRef('up');\n\n const [isRequestingToSpeak, setIsRequestingToSpeak] = useState(false);\n const isConnecting = connectionState !== 'connected';\n const shouldRaiseHand = !canSelfUnmute && isMuted;\n const prevShouldRaiseHand = usePrevious(shouldRaiseHand);\n\n useEffect(() => {\n if (prevShouldRaiseHand && !shouldRaiseHand) {\n playGroupCallSound('allowTalk');\n }\n }, [playGroupCallSound, prevShouldRaiseHand, shouldRaiseHand]);\n\n // Voice mini\n // unmuted -> muted [69, 99]\n // muted -> unmuted [36, 69]\n // raise -> muted [0, 36]\n // muted -> raise [99, 136]\n // unmuted -> raise [136, 172]\n // TODO should probably move to other component\n const playSegment: [number, number] = useMemo(() => {\n if (isRequestingToSpeak) {\n const r = Math.floor(Math.random() * 100);\n return (r < 32 ? [0, 120]\n : (r < 64 ? [120, 240]\n : (r < 97 ? [240, 420]\n : [420, 540]\n )\n )\n );\n }\n if (!prevShouldRaiseHand && shouldRaiseHand) {\n return noAudioStream ? [99, 135] : [136, 172];\n }\n if (prevShouldRaiseHand && !shouldRaiseHand) {\n return [0, 36];\n }\n if (!shouldRaiseHand) {\n return noAudioStream ? [69, 99] : [36, 69];\n }\n return [0, 0];\n }, [prevShouldRaiseHand, isRequestingToSpeak, noAudioStream, shouldRaiseHand]);\n\n const animatedIconName = isRequestingToSpeak ? 'HandFilled' : 'VoiceMini';\n\n const toggleMute = () => {\n vibrateShort();\n toggleGroupCallMute();\n };\n\n const handleMouseDownMute = () => {\n if (shouldRaiseHand) {\n if (isRequestingToSpeak) return;\n vibrateShort();\n requestToSpeak();\n setIsRequestingToSpeak(true);\n setTimeout(() => {\n setIsRequestingToSpeak(false);\n }, REQUEST_TO_SPEAK_THROTTLE);\n return;\n }\n muteMouseDownState.current = 'down';\n if (noAudioStream) {\n setTimeout(() => {\n if (muteMouseDownState.current === 'down') {\n muteMouseDownState.current = 'hold';\n toggleMute();\n }\n }, HOLD_TO_SPEAK_TIME);\n }\n };\n\n const handleMouseUpMute = () => {\n if (shouldRaiseHand) {\n return;\n }\n toggleMute();\n muteMouseDownState.current = 'up';\n };\n\n const buttonText = useMemo(() => {\n return lang(\n hasRequestedToSpeak ? 'VoipMutedTapedForSpeak' : (\n shouldRaiseHand ? 'VoipMutedByAdmin' : (\n noAudioStream ? 'VoipUnmute' : 'VoipTapToMute'\n )\n ),\n );\n }, [hasRequestedToSpeak, noAudioStream, lang, shouldRaiseHand]);\n\n return (\n
\n \n \n \n
\n {buttonText}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const groupCall = selectActiveGroupCall(global);\n\n const { connectionState } = groupCall || {};\n const meParticipant = groupCall && selectGroupCallParticipant(global, groupCall.id, global.currentUserId!);\n\n const {\n raiseHandRating, hasAudioStream, canSelfUnmute, isMuted,\n } = meParticipant || {};\n\n return {\n connectionState: connectionState || CONNECTION_STATE_DEFAULT,\n hasRequestedToSpeak: Boolean(raiseHandRating),\n noAudioStream: !hasAudioStream,\n canSelfUnmute,\n isMuted,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'toggleGroupCallMute',\n 'requestToSpeak',\n 'playGroupCallSound',\n ]),\n)(MicrophoneButton));\n","import { GroupCallParticipant } from '../../../lib/secret-sauce';\nimport React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { IAnchorPosition } from '../../../types';\nimport { GlobalActions } from '../../../global/types';\n\nimport buildClassName from '../../../util/buildClassName';\nimport useThrottle from '../../../hooks/useThrottle';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\nimport { selectIsAdminInActiveGroupCall } from '../../../modules/selectors/calls';\nimport { pick } from '../../../util/iteratees';\nimport { GROUP_CALL_DEFAULT_VOLUME, GROUP_CALL_VOLUME_MULTIPLIER } from '../../../config';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\nimport AnimatedIcon from '../../common/AnimatedIcon';\nimport DeleteMemberModal from '../../right/DeleteMemberModal';\n\nimport './GroupCallParticipantMenu.scss';\n\nconst SPEAKER_ICON_DISABLED_SEGMENT: [number, number] = [0, 17];\nconst SPEAKER_ICON_ENABLED_SEGMENT: [number, number] = [17, 34];\n\ntype OwnProps = {\n participant?: GroupCallParticipant;\n closeDropdown: VoidFunction;\n isDropdownOpen: boolean;\n anchor?: IAnchorPosition;\n};\n\ntype StateProps = {\n isAdmin: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst VOLUME_ZERO = 0;\nconst VOLUME_LOW = 50;\nconst VOLUME_MEDIUM = 100;\nconst VOLUME_NORMAL = 150;\n\nconst VOLUME_CHANGE_THROTTLE = 500;\n\nconst SPEAKER_ICON_SIZE = 24;\n\nconst GroupCallParticipantMenu: FC = ({\n participant,\n closeDropdown,\n isDropdownOpen,\n anchor,\n\n isAdmin,\n toggleGroupCallMute,\n setGroupCallParticipantVolume,\n toggleGroupCallPanel,\n openChat,\n requestToSpeak,\n}) => {\n const lang = useLang();\n const [isDeleteUserModalOpen, openDeleteUserModal, closeDeleteUserModal] = useFlag();\n\n const id = participant?.id;\n const {\n isMutedByMe, isMuted, isSelf, canSelfUnmute,\n } = participant || {};\n const isRaiseHand = Boolean(participant?.raiseHandRating);\n const shouldRaiseHand = !canSelfUnmute && isMuted;\n\n const [localVolume, setLocalVolume] = useState(\n isMutedByMe ? VOLUME_ZERO : ((participant?.volume || GROUP_CALL_DEFAULT_VOLUME) / GROUP_CALL_VOLUME_MULTIPLIER),\n );\n\n useEffect(() => {\n setLocalVolume(isMutedByMe\n ? VOLUME_ZERO\n : ((participant?.volume || GROUP_CALL_DEFAULT_VOLUME) / GROUP_CALL_VOLUME_MULTIPLIER));\n // We only want to initialize local volume when switching participants and ignore following updates from server\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id]);\n\n const runThrottled = useThrottle(VOLUME_CHANGE_THROTTLE);\n\n const handleRemove = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n openDeleteUserModal();\n closeDropdown();\n }, [openDeleteUserModal, closeDropdown]);\n\n const handleCancelRequestToSpeak = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n requestToSpeak({\n value: false,\n });\n closeDropdown();\n }, [requestToSpeak, closeDropdown]);\n\n const handleMute = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n closeDropdown();\n\n if (!isAdmin) {\n setLocalVolume(isMutedByMe ? GROUP_CALL_DEFAULT_VOLUME / GROUP_CALL_VOLUME_MULTIPLIER : VOLUME_ZERO);\n }\n\n toggleGroupCallMute({\n participantId: id,\n value: isAdmin ? !shouldRaiseHand : !isMutedByMe,\n });\n }, [closeDropdown, toggleGroupCallMute, id, isAdmin, shouldRaiseHand, isMutedByMe]);\n\n const handleOpenProfile = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n toggleGroupCallPanel();\n openChat({\n id,\n });\n closeDropdown();\n }, [toggleGroupCallPanel, closeDropdown, openChat, id]);\n\n const isLocalVolumeZero = localVolume === VOLUME_ZERO;\n const speakerIconPlaySegment = isLocalVolumeZero ? SPEAKER_ICON_DISABLED_SEGMENT : SPEAKER_ICON_ENABLED_SEGMENT;\n\n const handleChangeVolume = (e: React.ChangeEvent) => {\n const value = Number(e.target.value);\n setLocalVolume(value);\n runThrottled(() => {\n if (value === VOLUME_ZERO) {\n toggleGroupCallMute({\n participantId: id,\n value: true,\n });\n } else {\n setGroupCallParticipantVolume({\n participantId: id,\n volume: Math.floor(value * GROUP_CALL_VOLUME_MULTIPLIER),\n });\n }\n });\n };\n\n return (\n
\n \n {!isSelf && !shouldRaiseHand && (\n
\n
= VOLUME_LOW && localVolume < VOLUME_MEDIUM && 'medium',\n localVolume >= VOLUME_MEDIUM && localVolume < VOLUME_NORMAL && 'normal',\n localVolume >= VOLUME_NORMAL && 'high',\n )}\n >\n \n
\n \n {localVolume}%\n
\n
\n
\n )}\n
\n {(isRaiseHand && isSelf) && (\n \n {lang('VoipGroupCancelRaiseHand')}\n \n )}\n {!isSelf && {lang('VoipGroupOpenProfile')}}\n {!isSelf && (\n // TODO cross mic\n \n {isAdmin\n ? lang(shouldRaiseHand ? 'VoipGroupAllowToSpeak' : 'VoipMute')\n : lang(isMutedByMe ? 'VoipGroupUnmuteForMe' : 'VoipGroupMuteForMe')}\n \n )}\n {!isSelf && isAdmin && (\n // TODO replace with hand\n \n {lang('VoipGroupUserRemove')}\n \n )}\n
\n \n\n {!isSelf && isAdmin && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n isAdmin: selectIsAdminInActiveGroupCall(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setGroupCallParticipantVolume',\n 'toggleGroupCallMute',\n 'openChat',\n 'toggleGroupCallPanel',\n 'requestToSpeak',\n ]),\n)(GroupCallParticipantMenu));\n","import { GroupCallParticipant, THRESHOLD } from '../../../lib/secret-sauce';\nimport React, { FC, memo, useMemo } from '../../../lib/teact/teact';\nimport AnimatedIcon from '../../common/AnimatedIcon';\nimport usePrevious from '../../../hooks/usePrevious';\n\ntype OwnProps = {\n participant: GroupCallParticipant;\n noColor?: boolean;\n};\n\nconst OutlinedMicrophoneIcon: FC = ({\n participant,\n noColor,\n}) => {\n const { isMuted, isMutedByMe } = participant;\n const isSpeaking = (participant.amplitude || 0) > THRESHOLD;\n const isRaiseHand = Boolean(participant.raiseHandRating);\n const prevIsRaiseHand = usePrevious(isRaiseHand);\n const canSelfUnmute = !!participant?.canSelfUnmute;\n const shouldRaiseHand = !canSelfUnmute && isMuted;\n const prevIsMuted = usePrevious(isMuted);\n\n const playSegment: [number, number] = useMemo(() => {\n if (isMuted && !prevIsMuted) {\n return [43, 64];\n }\n\n if (!isMuted && prevIsMuted) {\n return [22, 42];\n }\n\n if (isRaiseHand && !prevIsRaiseHand) {\n return [65, 84];\n }\n\n if (!shouldRaiseHand && prevIsRaiseHand) {\n return [0, 21];\n }\n\n // TODO cancel request to speak should play in reverse\n // if (!isRaiseHand && prevIsRaiseHand) {\n // return [84, 65];\n // }\n\n return isMuted ? [22, 23] : [43, 44];\n // eslint-disable-next-line\n }, [isMuted, shouldRaiseHand, isRaiseHand]);\n\n const microphoneColor: [number, number, number] | undefined = useMemo(() => {\n return noColor ? [0xff, 0xff, 0xff] : (\n isRaiseHand ? [0x4d, 0xa6, 0xe0]\n : (shouldRaiseHand || isMutedByMe ? [0xFF, 0x70, 0x6F] : (\n isSpeaking ? [0x57, 0xBC, 0x6C] : [0x84, 0x8D, 0x94]\n ))\n );\n }, [noColor, isRaiseHand, shouldRaiseHand, isMutedByMe, isSpeaking]);\n\n return (\n \n );\n};\n\nexport default memo(OutlinedMicrophoneIcon);\n","import { GroupCallParticipant as TypeGroupCallParticipant, THRESHOLD } from '../../../lib/secret-sauce';\nimport React, {\n FC, memo, useMemo, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport buildClassName from '../../../util/buildClassName';\nimport { selectChat, selectUser } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\nimport { GROUP_CALL_DEFAULT_VOLUME, GROUP_CALL_VOLUME_MULTIPLIER } from '../../../config';\n\nimport Avatar from '../../common/Avatar';\nimport OutlinedMicrophoneIcon from './OutlinedMicrophoneIcon';\n\nimport './GroupCallParticipant.scss';\n\ntype OwnProps = {\n participant: TypeGroupCallParticipant;\n openParticipantMenu: (anchor: HTMLDivElement, participant: TypeGroupCallParticipant) => void;\n};\n\ntype StateProps = {\n user?: ApiUser;\n chat?: ApiChat;\n};\n\nconst GroupCallParticipant: FC = ({\n openParticipantMenu,\n participant,\n user,\n chat,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const anchorRef = useRef(null);\n const lang = useLang();\n\n const { isSelf, isMutedByMe, isMuted } = participant;\n const isSpeaking = (participant.amplitude || 0) > THRESHOLD;\n const isRaiseHand = Boolean(participant.raiseHandRating);\n\n const handleOnClick = () => {\n if (isSelf) return;\n openParticipantMenu(anchorRef.current!, participant);\n };\n\n const [aboutText, aboutColor] = useMemo(() => {\n if (isSelf) {\n return [lang('ThisIsYou'), 'blue'];\n }\n if (isMutedByMe) {\n return [lang('VoipGroupMutedForMe'), 'red'];\n }\n return isRaiseHand\n ? [lang('WantsToSpeak'), 'blue']\n : (!isMuted && isSpeaking ? [\n participant.volume && participant.volume !== GROUP_CALL_DEFAULT_VOLUME\n ? lang('SpeakingWithVolume',\n (participant.volume / GROUP_CALL_VOLUME_MULTIPLIER).toString())\n .replace('%%', '%') : lang('Speaking'),\n 'green',\n ]\n : (participant.about ? [participant.about, ''] : [lang('Listening'), 'blue']));\n }, [isSpeaking, participant.volume, lang, isSelf, isMutedByMe, isRaiseHand, isMuted, participant.about]);\n\n if (!user && !chat) {\n return undefined;\n }\n\n const name = user ? `${user.firstName || ''} ${user.lastName || ''}` : chat?.title;\n\n return (\n \n \n
\n {name}\n {aboutText}\n
\n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { participant }): StateProps => {\n return {\n user: participant.isUser ? selectUser(global, participant.id) : undefined,\n chat: !participant.isUser ? selectChat(global, participant.id) : undefined,\n };\n },\n)(GroupCallParticipant));\n","import { GroupCallParticipant as TypeGroupCallParticipant } from '../../../lib/secret-sauce';\nimport React, { FC, memo, useMemo } 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';\nimport { selectActiveGroupCall } from '../../../modules/selectors/calls';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\nimport { selectChat } from '../../../modules/selectors';\n\nimport GroupCallParticipant from './GroupCallParticipant';\nimport InfiniteScroll from '../../ui/InfiniteScroll';\n\ntype OwnProps = {\n openParticipantMenu: (anchor: HTMLDivElement, participant: TypeGroupCallParticipant) => void;\n};\n\ntype StateProps = {\n participantsCount: number;\n participants?: Record;\n canInvite?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst GroupCallParticipantList: FC = ({\n createGroupCallInviteLink,\n loadMoreGroupCallParticipants,\n participants,\n participantsCount,\n openParticipantMenu,\n canInvite,\n}) => {\n const lang = useLang();\n\n const participantsIds = useMemo(() => {\n return Object.keys(participants || {});\n }, [participants]);\n\n const [viewportIds, getMore] = useInfiniteScroll(\n loadMoreGroupCallParticipants,\n participantsIds,\n participantsIds.length >= participantsCount,\n );\n\n return (\n
\n {canInvite && (\n
\n
\n \n
\n
{lang('VoipGroupInviteMember')}
\n
\n )}\n\n \n {viewportIds?.map(\n (participantId) => (\n participants![participantId] && (\n \n )\n ),\n )}\n \n\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { participantsCount, participants, chatId } = selectActiveGroupCall(global) || {};\n const chat = chatId && selectChat(global, chatId);\n\n return {\n participants,\n participantsCount: participantsCount || 0,\n canInvite: !!chat && !!chat.username,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'createGroupCallInviteLink',\n 'loadMoreGroupCallParticipants',\n ]),\n)(GroupCallParticipantList));\n","import { getUserStreams, GroupCallParticipant as TypeGroupCallParticipant, THRESHOLD } from '../../../lib/secret-sauce';\nimport React, { FC, memo, useCallback } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport buildClassName from '../../../util/buildClassName';\nimport { selectChat, selectUser } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\nimport { ENABLE_THUMBNAIL_VIDEO } from '../../../config';\n\nimport Avatar from '../../common/Avatar';\n\nimport './GroupCallParticipantVideo.scss';\n\ntype OwnProps = {\n participant: TypeGroupCallParticipant;\n type: 'video' | 'presentation';\n onClick?: (id: string, type: 'video' | 'presentation') => void;\n isFullscreen?: boolean;\n};\n\ntype StateProps = {\n user?: ApiUser;\n chat?: ApiChat;\n currentUserId?: string;\n isActive?: boolean;\n};\n\nconst GroupCallParticipantVideo: FC = ({\n type,\n onClick,\n user,\n chat,\n isActive,\n isFullscreen,\n}) => {\n const lang = useLang();\n\n const handleClick = useCallback(() => {\n if (onClick) {\n onClick(user?.id || chat!.id, type);\n }\n }, [chat, onClick, type, user?.id]);\n\n if (!user && !chat) return undefined;\n\n const streams = getUserStreams(user?.id || chat!.id);\n\n return (\n \n {isFullscreen && (\n \n )}\n \n {ENABLE_THUMBNAIL_VIDEO && (\n
\n
\n )}\n \n )}\n {shouldRenderPlayButton && }\n {shouldRenderSpinner && (\n
\n \n
\n )}\n {!isLoadAllowed && (\n \n )}\n {isTransferring ? (\n \n {(isUploading || isDownloading) ? `${Math.round(transferProgress * 100)}%` : '...'}\n \n ) : (\n
\n {video.isGif ? 'GIF' : formatMediaDuration(Math.max(duration - playProgress, 0))}\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, ApiCountryCode } 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 phoneCodeList: ApiCountryCode[];\n};\n\ntype DispatchProps = Pick;\n\nconst Contact: FC = ({\n contact, user, openUserInfo, phoneCodeList,\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(phoneCodeList, phoneNumber)}
\n
\n \n );\n};\n\nexport default withGlobal(\n (global, { contact }): StateProps => {\n const { countryList: { phoneCodes: phoneCodeList } } = global;\n return {\n user: selectUser(global, contact.userId),\n phoneCodeList,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openUserInfo',\n ]),\n)(Contact);\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?.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, { LangFn } 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 serverTimeOffset: number;\n};\n\ntype DispatchProps = Pick;\n\nconst SOLUTION_CONTAINER_ID = '#middle-column-portals';\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 serverTimeOffset,\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) + serverTimeOffset, 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, ['emoji', 'br'])}
\n
\n {lang(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(lang, 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 ? 'QuizPoll' : 'AnonymousQuizPoll';\n }\n\n if (summary.closed) {\n return 'FinalResults';\n }\n\n return summary.isPublic ? 'PublicPoll' : 'AnonymousPoll';\n}\n\nfunction getReadableVotersCount(lang: LangFn, isQuiz: true | undefined, count?: number) {\n if (!count) {\n return lang(isQuiz ? 'Chat.Quiz.TotalVotesEmpty' : 'Chat.Poll.TotalVotesResultEmpty');\n }\n\n return lang(isQuiz ? 'Answer' : 'Vote', count, 'i');\n}\n\nexport default memo(withGlobal(\n (global, { poll }) => {\n const { recentVoterIds } = poll.results;\n const { serverTimeOffset, users: { byId: usersById } } = global;\n if (!recentVoterIds || recentVoterIds.length === 0) {\n return {};\n }\n\n return {\n recentVoterIds,\n usersById,\n serverTimeOffset,\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';\nimport { ObserveFn } from '../../../hooks/useIntersectionObserver';\nimport { ISettings } from '../../../types';\n\nimport { getMessageWebPage } from '../../../modules/helpers';\nimport { calculateMediaDimensions } from './helpers/mediaDimensions';\nimport renderText from '../../common/helpers/renderText';\nimport trimText from '../../../util/trimText';\nimport buildClassName from '../../../util/buildClassName';\n\nimport SafeLink from '../../common/SafeLink';\nimport Photo from './Photo';\nimport Video from './Video';\n\nimport './WebPage.scss';\n\nconst MAX_TEXT_LENGTH = 170; // symbols\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n noAvatars?: boolean;\n canAutoLoad?: boolean;\n canAutoPlay?: boolean;\n inPreview?: boolean;\n lastSyncTime?: number;\n isDownloading?: boolean;\n theme: ISettings['theme'];\n onMediaClick?: () => void;\n onCancelMediaTransfer?: () => void;\n};\n\nconst WebPage: FC = ({\n message,\n observeIntersection,\n noAvatars,\n canAutoLoad,\n canAutoPlay,\n inPreview,\n lastSyncTime,\n isDownloading = false,\n theme,\n onMediaClick,\n onCancelMediaTransfer,\n}) => {\n const webPage = getMessageWebPage(message);\n\n let isSquarePhoto = false;\n if (webPage?.photo && !webPage.video) {\n const { width, height } = calculateMediaDimensions(message);\n isSquarePhoto = width === height;\n }\n\n const handleMediaClick = useCallback(() => {\n onMediaClick!();\n }, [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 video,\n } = webPage;\n const isMediaInteractive = (photo || video) && onMediaClick && !isSquarePhoto;\n const truncatedDescription = trimText(description, MAX_TEXT_LENGTH);\n\n const className = buildClassName(\n 'WebPage',\n isSquarePhoto && 'with-square-photo',\n !photo && !video && !inPreview && 'without-media',\n video && 'with-video',\n );\n\n return (\n \n {photo && !video && (\n \n )}\n
\n \n {!inPreview && title && (\n

{renderText(title)}

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

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

\n )}\n
\n {!inPreview && video && (\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 { formatCurrency } from '../../../util/formatCurrency';\nimport renderText from '../../common/helpers/renderText';\nimport useLang from '../../../hooks/useLang';\n\nimport './Invoice.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n};\n\nconst Invoice: FC = ({\n message,\n}) => {\n const lang = useLang();\n const invoice = getMessageInvoice(message);\n\n const {\n title,\n text,\n amount,\n currency,\n isTest,\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

\n {formatCurrency(amount, currency, lang.code)}\n {isTest && {lang('PaymentTestInvoice')}}\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(WrappedComponent: FC) {\n const ComponentWithSelectControl: 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?.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 )(ComponentWithSelectControl));\n}\n","import React, { FC, useCallback } from '../../../lib/teact/teact';\n\nimport { GlobalActions, GlobalState } from '../../../global/types';\nimport { ApiMessage } from '../../../api/types';\nimport { IAlbum, ISettings } from '../../../types';\nimport { AlbumRectPart, IAlbumLayout } from './helpers/calculateAlbumLayout';\n\nimport { getMessageContent } from '../../../modules/helpers';\nimport { getGlobal, withGlobal } from '../../../lib/teact/teactn';\nimport { pick } from '../../../util/iteratees';\nimport withSelectControl from './hocs/withSelectControl';\nimport { ObserveFn } from '../../../hooks/useIntersectionObserver';\nimport {\n selectActiveDownloadIds,\n selectCanAutoLoadMedia,\n selectCanAutoPlayMedia,\n selectTheme,\n} from '../../../modules/selectors';\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 hasCustomAppendix?: boolean;\n lastSyncTime?: number;\n isOwn: boolean;\n albumLayout: IAlbumLayout;\n onMediaClick: (messageId: number) => void;\n};\n\ntype StateProps = {\n theme: ISettings['theme'];\n uploadsById: GlobalState['fileUploads']['byMessageLocalId'];\n activeDownloadIds: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst Album: FC = ({\n album,\n observeIntersection,\n hasCustomAppendix,\n lastSyncTime,\n isOwn,\n albumLayout,\n onMediaClick,\n uploadsById,\n activeDownloadIds,\n theme,\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?.progress;\n const { dimensions, sides } = albumLayout.layout[index];\n\n // Ignoring global updates is a known drawback here\n const canAutoLoad = selectCanAutoLoadMedia(getGlobal(), message);\n const canAutoPlay = selectCanAutoPlayMedia(getGlobal(), message);\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, { album }): StateProps => {\n const { chatId } = album.mainMessage;\n const theme = selectTheme(global);\n const activeDownloadIds = selectActiveDownloadIds(global, chatId);\n return {\n theme,\n uploadsById: global.fileUploads.byMessageLocalId,\n activeDownloadIds,\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';\nimport { getDispatch } from '../../../lib/teact/teactn';\n\nimport { ApiMediaFormat, ApiMessage } from '../../../api/types';\n\nimport { ROUND_VIDEO_DIMENSIONS_PX } from '../../common/helpers/mediaDimensions';\nimport { getMessageMediaFormat, getMessageMediaHash } from '../../../modules/helpers';\nimport { formatMediaDuration } from '../../../util/dateFormat';\nimport buildClassName from '../../../util/buildClassName';\nimport { stopCurrentAudio } from '../../../util/audioPlayer';\nimport safePlay from '../../../util/safePlay';\nimport { fastRaf } from '../../../util/schedulers';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMediaWithLoadProgress from '../../../hooks/useMediaWithLoadProgress';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useMediaTransition from '../../../hooks/useMediaTransition';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useBuffering from '../../../hooks/useBuffering';\nimport useVideoCleanup from '../../../hooks/useVideoCleanup';\nimport useVideoAutoPause from './hooks/useVideoAutoPause';\nimport useBlurredMediaThumbRef from './hooks/useBlurredMediaThumbRef';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nimport './RoundVideo.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection: ObserveFn;\n canAutoLoad?: boolean;\n lastSyncTime?: number;\n isDownloading?: boolean;\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 canAutoLoad,\n lastSyncTime,\n isDownloading,\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 [isLoadAllowed, setIsLoadAllowed] = useState(canAutoLoad);\n const shouldLoad = Boolean(isLoadAllowed && isIntersecting && lastSyncTime);\n const { mediaData, loadProgress } = useMediaWithLoadProgress(\n getMessageMediaHash(message, 'inline'),\n !shouldLoad,\n getMessageMediaFormat(message, 'inline'),\n lastSyncTime,\n );\n\n const { loadProgress: downloadProgress } = useMediaWithLoadProgress(\n getMessageMediaHash(message, 'download'),\n !isDownloading,\n ApiMediaFormat.BlobUrl,\n lastSyncTime,\n );\n const thumbRef = useBlurredMediaThumbRef(message, mediaData);\n\n const { isBuffered, bufferingHandlers } = useBuffering();\n const isTransferring = (isLoadAllowed && !isBuffered) || isDownloading;\n const wasLoadDisabled = usePrevious(isLoadAllowed) === false;\n\n const transitionClassNames = useMediaTransition(mediaData);\n const {\n shouldRender: shouldSpinnerRender,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring || !isBuffered, undefined, wasLoadDisabled);\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 svgCenter = ROUND_VIDEO_DIMENSIONS_PX / 2;\n const svgMargin = 6;\n const circumference = (svgCenter - svgMargin) * 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 `;\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 fastRaf(() => {\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 useVideoAutoPause(playerRef, shouldPlay);\n useVideoCleanup(playerRef, [mediaData]);\n\n const handleClick = useCallback(() => {\n if (!mediaData) {\n setIsLoadAllowed((isAllowed) => !isAllowed);\n\n return;\n }\n\n if (isDownloading) {\n getDispatch().cancelMessageMediaDownload({ message });\n return;\n }\n\n const playerEl = playerRef.current!;\n if (isActivated) {\n if (playerEl.paused) {\n safePlay(playerEl);\n stopCurrentAudio();\n } else {\n playerEl.pause();\n }\n } else {\n capturePlaying();\n // Pause is a workaround for iOS Safari – otherwise it stops video after several frames\n playerEl.pause();\n playerEl.currentTime = 0;\n safePlay(playerEl);\n stopCurrentAudio();\n\n setIsActivated(true);\n }\n }, [capturePlaying, isActivated, isDownloading, mediaData, message]);\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
\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 && !isLoadAllowed && (\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 { RE_TME_LINK } from '../../../config';\nimport renderText from '../../common/helpers/renderText';\nimport useLang from '../../../hooks/useLang';\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 const lang = useLang();\n\n return (\n
\n {message.inlineButtons!.map((row) => (\n
\n {row.map((button) => (\n onClick({ button })}\n >\n {renderText(lang(button.text))}\n {button.type === 'buy' && }\n {button.type === 'url' && !button.value!.match(RE_TME_LINK) && }\n \n ))}\n
\n ))}\n
\n );\n};\n\nexport default InlineButtons;\n","import React, {\n FC, memo, useCallback,\n} 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 { isUserId } from '../../../modules/helpers';\nimport { formatIntegerCompact } from '../../../util/textFormat';\nimport buildClassName from '../../../util/buildClassName';\nimport { selectThreadInfo } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\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,\n threadInfo,\n usersById,\n chatsById,\n openChat,\n}) => {\n const lang = useLang();\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 isUserId(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
\n {messagesCount ? lang('Comments', messagesCount, 'i') : lang('LeaveAComment')}\n
\n \n \n );\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 React, {\n FC,\n memo,\n useCallback,\n useEffect,\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} from '../../../api/types';\nimport {\n AudioOrigin, FocusDirection, IAlbum, ISettings,\n} from '../../../types';\n\nimport { IS_ANDROID, IS_TOUCH_ENV } from '../../../util/environment';\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 selectCanAutoLoadMedia,\n selectCanAutoPlayMedia,\n selectShouldLoopStickers,\n selectTheme,\n selectAllowedMessageActions,\n selectIsDownloading,\n} from '../../../modules/selectors';\nimport {\n getMessageContent,\n isOwnMessage,\n isReplyMessage,\n isAnonymousOwnMessage,\n isMessageLocal,\n isUserId,\n isChatWithRepliesBot,\n getMessageCustomShape,\n isChatChannel,\n getMessageSingleEmoji,\n getSenderTitle,\n 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_PX } 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 useLang from '../../../hooks/useLang';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useFlag from '../../../hooks/useFlag';\nimport useFocusMessage from './hooks/useFocusMessage';\nimport useOuterHandlers from './hooks/useOuterHandlers';\nimport useInnerHandlers from './hooks/useInnerHandlers';\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 CommentButton 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 {\n message: ApiMessage;\n observeIntersectionForBottom: ObserveFn;\n observeIntersectionForMedia: ObserveFn;\n observeIntersectionForAnimatedStickers: ObserveFn;\n album?: IAlbum;\n noAvatars?: boolean;\n withAvatar?: boolean;\n withSenderName?: boolean;\n threadId: number;\n messageListType: MessageListType;\n noComments: boolean;\n appearanceOrder: number;\n }\n & MessagePositionProperties;\n\ntype StateProps = {\n theme: ISettings['theme'];\n forceSenderName?: boolean;\n chatUsername?: string;\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 isResizingContainer?: boolean;\n isForwarding?: boolean;\n isChatWithSelf?: boolean;\n isRepliesChat?: boolean;\n isChannel?: boolean;\n canReply?: boolean;\n lastSyncTime?: number;\n highlight?: string;\n isSingleEmoji?: boolean;\n animatedEmoji?: ApiSticker;\n isInSelectMode?: boolean;\n isSelected?: boolean;\n isGroupSelected?: boolean;\n isDownloading: boolean;\n threadId?: number;\n isPinnedList?: boolean;\n canAutoLoadMedia?: boolean;\n canAutoPlayMedia?: boolean;\n shouldLoopStickers?: boolean;\n autoLoadFileMaxSizeMb: number;\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 = { __html: '' };\n// eslint-disable-next-line max-len\nconst APPENDIX_NOT_OWN = { __html: '' };\nconst APPEARANCE_DELAY = 10;\nconst NO_MEDIA_CORNERS_THRESHOLD = 18;\n\nconst Message: FC = ({\n message,\n chatUsername,\n observeIntersectionForBottom,\n observeIntersectionForMedia,\n observeIntersectionForAnimatedStickers,\n album,\n noAvatars,\n withAvatar,\n withSenderName,\n noComments,\n appearanceOrder,\n isFirstInGroup,\n isLastInGroup,\n isFirstInDocumentGroup,\n isLastInDocumentGroup,\n isLastInList,\n theme,\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 isResizingContainer,\n isForwarding,\n isChatWithSelf,\n isRepliesChat,\n isChannel,\n canReply,\n lastSyncTime,\n highlight,\n animatedEmoji,\n isInSelectMode,\n isSelected,\n isGroupSelected,\n threadId,\n messageListType,\n isPinnedList,\n isDownloading,\n canAutoLoadMedia,\n canAutoPlayMedia,\n shouldLoopStickers,\n autoLoadFileMaxSizeMb,\n toggleMessageSelection,\n clickInlineButton,\n disableContextMenuHint,\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\n const lang = useLang();\n\n useOnIntersect(bottomMarkerRef, observeIntersectionForBottom);\n\n const {\n isContextMenuOpen, contextMenuPosition,\n handleBeforeContextMenu, handleContextMenu: onContextMenu,\n handleContextMenuClose, handleContextMenuHide,\n } = useContextMenuHandlers(ref, IS_TOUCH_ENV && isInSelectMode, true, IS_ANDROID);\n\n useEffect(() => {\n if (isContextMenuOpen) {\n disableContextMenuHint();\n }\n }, [isContextMenuOpen, disableContextMenuHint]);\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 { id: messageId, chatId, threadInfo } = message;\n\n const isLocal = isMessageLocal(message);\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 = (\n forwardInfo && (!isChatWithSelf || isScheduled) && !isRepliesChat && !forwardInfo.isLinkedChannelPost\n );\n const isInDocumentGroup = Boolean(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 signature = (\n (isChannel && message.adminTitle) || (forwardInfo && !asForwarded && forwardInfo.adminTitle) || undefined\n );\n const metaSafeAuthorWidth = useMemo(() => {\n return signature ? calculateAuthorWidth(signature) : undefined;\n }, [signature]);\n const canShowActionButton = (\n !(isContextMenuShown || isInSelectMode || isForwarding)\n && (!isInDocumentGroup || isLastInDocumentGroup)\n );\n const canForward = isChannel && !isScheduled;\n const canFocus = Boolean(isPinnedList\n || (forwardInfo\n && (forwardInfo.isChannelPost || (isChatWithSelf && !isOwn) || isRepliesChat)\n && forwardInfo.fromMessageId\n ));\n const avatarPeer = forwardInfo && (isChatWithSelf || isRepliesChat || !sender) ? originSender : sender;\n const senderPeer = forwardInfo ? originSender : sender;\n\n const selectMessage = useCallback((e?: React.MouseEvent, groupedId?: string) => {\n toggleMessageSelection({\n messageId,\n groupedId,\n ...(e?.shiftKey && { withShift: true }),\n ...(isAlbum && { childMessageIds: album!.messages.map(({ id }) => id) }),\n });\n }, [toggleMessageSelection, messageId, isAlbum, album]);\n\n const {\n handleMouseDown,\n handleClick,\n handleContextMenu,\n handleDoubleClick,\n handleContentDoubleClick,\n isSwiped,\n } = useOuterHandlers(\n selectMessage,\n ref,\n messageId,\n isAlbum,\n Boolean(isInSelectMode),\n Boolean(canReply),\n onContextMenu,\n handleBeforeContextMenu,\n );\n\n const {\n handleAvatarClick,\n handleSenderClick,\n handleViaBotClick,\n handleReplyClick,\n handleMediaClick,\n handleAudioPlay,\n handleAlbumMediaClick,\n handleMetaClick,\n handleReadMedia,\n handleCancelUpload,\n handleVoteSend,\n handleGroupForward,\n handleForward,\n handleFocus,\n handleFocusForwarded,\n handleDocumentGroupSelectAll,\n } = useInnerHandlers(\n lang,\n selectMessage,\n message,\n chatId,\n threadId,\n isInDocumentGroup,\n Boolean(isScheduled),\n isRepliesChat,\n album,\n avatarPeer,\n senderPeer,\n botSender,\n );\n\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 isSwiped && 'is-swiped',\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 hasActionButton: canForward || canFocus,\n });\n const withCommentButton = message.threadInfo && (!isInDocumentGroup || isLastInDocumentGroup)\n && messageListType === 'thread' && !noComments;\n const withAppendix = contentClassName.includes('has-appendix');\n\n useEnsureMessage(\n isRepliesChat && message.replyToChatId ? message.replyToChatId : chatId,\n hasReply ? message.replyToMessageId : undefined,\n replyMessage,\n message.id,\n );\n useFocusMessage(ref, chatId, isFocused, focusDirection, noFocusHighlight, isResizingContainer);\n\n let style = '';\n let calculatedWidth;\n let noMediaCorners = false;\n const albumLayout = useMemo(() => {\n return isAlbum ? calculateAlbumLayout(isOwn, Boolean(asForwarded), Boolean(noAvatars), album!) : undefined;\n }, [isAlbum, isOwn, asForwarded, noAvatars, 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, noAvatars).width;\n } else if (video) {\n if (video.isRound) {\n width = ROUND_VIDEO_DIMENSIONS_PX;\n } else {\n width = calculateMediaDimensions(message, noAvatars).width;\n }\n }\n\n if (width) {\n calculatedWidth = Math.max(getMinMediaWidth(Boolean(text), withCommentButton), width);\n if (calculatedWidth - width > NO_MEDIA_CORNERS_THRESHOLD) {\n noMediaCorners = true;\n }\n }\n } else if (albumLayout) {\n calculatedWidth = Math.max(getMinMediaWidth(Boolean(text), withCommentButton), albumLayout.containerStyle.width);\n if (calculatedWidth - albumLayout.containerStyle.width > NO_MEDIA_CORNERS_THRESHOLD) {\n noMediaCorners = true;\n }\n }\n\n if (calculatedWidth) {\n style = `width: ${calculatedWidth + extraPadding}px`;\n }\n\n function renderAvatar() {\n const isAvatarPeerUser = avatarPeer && isUserId(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 noMediaCorners && 'no-media-corners',\n );\n const hasCustomAppendix = isLastInGroup && !textParts && !asForwarded && !hasThread;\n const shouldInlineMeta = !webPage && !animatedEmoji && textParts;\n const textContentClass = buildClassName(\n 'text-content',\n shouldInlineMeta && 'with-meta',\n outgoingStatus && 'with-outgoing-icon',\n );\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 && (\n

\n {textParts}\n {shouldInlineMeta && (\n \n )}\n

\n )}\n {webPage && (\n \n )}\n {invoice && }\n
\n );\n }\n\n function renderSenderName() {\n const shouldRender = !(customShape && !viaBotId) && (\n (withSenderName && !photo && !video) || asForwarded || viaBotId || forceSenderName\n ) && (!isInDocumentGroup || isFirstInDocumentGroup) && !(hasReply && customShape);\n\n if (!shouldRender) {\n return undefined;\n }\n\n let senderTitle;\n let senderColor;\n if (senderPeer && !(customShape && viaBotId)) {\n senderTitle = getSenderTitle(lang, senderPeer);\n\n if (!asForwarded) {\n senderColor = `color-${getUserColorKey(senderPeer)}`;\n }\n } else if (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?.isLinkedChannelPost ? (\n {lang('DiscussChannel')}\n ) : message.adminTitle && !isChannel ? (\n {message.adminTitle}\n ) : undefined}\n
\n );\n }\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 {asForwarded && !customShape && (!isInDocumentGroup || isFirstInDocumentGroup) && (\n
{lang('ForwardedMessage')}
\n )}\n {renderContent()}\n {(!isInDocumentGroup || isLastInDocumentGroup) && !(!webPage && !animatedEmoji && textParts) && (\n \n )}\n {canShowActionButton && canForward ? (\n \n \n \n ) : canShowActionButton && canFocus ? (\n \n \n \n ) : undefined}\n {withCommentButton && }\n {withAppendix && (\n
\n )}\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, replyToChatId, replyToMessageId, isOutgoing,\n } = message;\n\n const chat = selectChat(global, chatId);\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const isRepliesChat = isChatWithRepliesBot(chatId);\n const isChannel = chat && isChatChannel(chat);\n const chatUsername = chat?.username;\n\n const forceSenderName = !isChatWithSelf && isAnonymousOwnMessage(message);\n const canShowSender = withSenderName || withAvatar || forceSenderName;\n const sender = selectSender(global, message);\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, isRepliesChat && replyToChatId ? replyToChatId : 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 {\n direction: focusDirection, noHighlight: noFocusHighlight, isResizingContainer,\n } = (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?.messages) {\n isSelected = album.messages.every(({ id: messageId }) => selectIsMessageSelected(global, messageId));\n } else {\n isSelected = selectIsMessageSelected(global, id);\n }\n\n const { canReply } = (messageListType === 'thread' && selectAllowedMessageActions(global, message, threadId)) || {};\n const isDownloading = selectIsDownloading(global, message);\n\n return {\n theme: selectTheme(global),\n chatUsername,\n forceSenderName,\n sender: canShowSender ? sender : undefined,\n originSender,\n botSender,\n shouldHideReply,\n isThreadTop,\n replyMessage,\n replyMessageSender,\n isFocused,\n isForwarding,\n isChatWithSelf,\n isRepliesChat,\n isChannel,\n canReply,\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 isDownloading,\n isPinnedList: messageListType === 'pinned',\n canAutoLoadMedia: selectCanAutoLoadMedia(global, message),\n canAutoPlayMedia: selectCanAutoPlayMedia(global, message),\n autoLoadFileMaxSizeMb: global.settings.byKey.autoLoadFileMaxSizeMb,\n shouldLoopStickers: selectShouldLoopStickers(global),\n ...(isOutgoing && { outgoingStatus: selectOutgoingStatus(global, message, messageListType === 'scheduled') }),\n ...(typeof uploadProgress === 'number' && { uploadProgress }),\n ...(isFocused && { focusDirection, noFocusHighlight, isResizingContainer }),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'toggleMessageSelection',\n 'clickInlineButton',\n 'disableContextMenuHint',\n ]),\n)(Message));\n","import { RefObject } from 'react';\nimport React, { useEffect } from '../../../../lib/teact/teact';\nimport { getDispatch } from '../../../../lib/teact/teactn';\n\nimport { IS_ANDROID, IS_TOUCH_ENV } from '../../../../util/environment';\nimport windowSize from '../../../../util/windowSize';\nimport { captureEvents, SwipeDirection } from '../../../../util/captureEvents';\nimport useFlag from '../../../../hooks/useFlag';\nimport { preventMessageInputBlur } from '../../helpers/preventMessageInputBlur';\n\nconst ANDROID_KEYBOARD_HIDE_DELAY_MS = 350;\nconst SWIPE_ANIMATION_DURATION = 150;\n\nexport default function useOuterHandlers(\n selectMessage: (e?: React.MouseEvent, groupedId?: string) => void,\n containerRef: RefObject,\n messageId: number,\n isAlbum: boolean,\n isInSelectMode: boolean,\n canReply: boolean,\n onContextMenu: (e: React.MouseEvent) => void,\n handleBeforeContextMenu: (e: React.MouseEvent) => void,\n) {\n const { setReplyingToId } = getDispatch();\n\n const [isSwiped, markSwiped, unmarkSwiped] = useFlag();\n\n function handleMouseDown(e: React.MouseEvent) {\n preventMessageInputBlur(e);\n handleBeforeContextMenu(e);\n }\n\n function handleClick(e: React.MouseEvent) {\n if (isInSelectMode) {\n selectMessage(e);\n } else if (IS_ANDROID) {\n const target = e.target as HTMLDivElement;\n if (!target.classList.contains('text-content') && !target.classList.contains('Message')) {\n return;\n }\n\n if (windowSize.getIsKeyboardVisible()) {\n setTimeout(() => {\n onContextMenu(e);\n }, ANDROID_KEYBOARD_HIDE_DELAY_MS);\n } else {\n onContextMenu(e);\n }\n }\n }\n\n function handleContextMenu(e: React.MouseEvent) {\n if (IS_ANDROID) {\n if ((e.target as HTMLElement).matches('a[href]')) {\n return;\n }\n\n e.preventDefault();\n selectMessage();\n } else {\n onContextMenu(e);\n }\n }\n\n function handleContainerDoubleClick() {\n setReplyingToId({ messageId });\n }\n\n function stopPropagation(e: React.MouseEvent) {\n e.stopPropagation();\n }\n\n useEffect(() => {\n if (!IS_TOUCH_ENV || isInSelectMode || !canReply) {\n return undefined;\n }\n\n let startedAt: number | undefined;\n return captureEvents(containerRef.current!, {\n selectorToPreventScroll: '.MessageList',\n onSwipe: ((e, direction) => {\n if (direction === SwipeDirection.Left) {\n if (!startedAt) {\n startedAt = Date.now();\n }\n\n markSwiped();\n\n return true;\n }\n\n return false;\n }),\n onRelease: () => {\n if (!startedAt) {\n return;\n }\n\n setReplyingToId({ messageId });\n\n setTimeout(unmarkSwiped, Math.max(0, SWIPE_ANIMATION_DURATION - (Date.now() - startedAt)));\n startedAt = undefined;\n },\n });\n }, [containerRef, isInSelectMode, messageId, setReplyingToId, markSwiped, unmarkSwiped, canReply]);\n\n return {\n handleMouseDown: !isInSelectMode ? handleMouseDown : undefined,\n handleClick,\n handleContextMenu: !isInSelectMode ? handleContextMenu : undefined,\n handleDoubleClick: !isInSelectMode ? handleContainerDoubleClick : undefined,\n handleContentDoubleClick: !IS_TOUCH_ENV ? stopPropagation : undefined,\n isSwiped,\n };\n}\n","import React, { useCallback } from '../../../../lib/teact/teact';\nimport { getDispatch } from '../../../../lib/teact/teactn';\n\nimport { isUserId } from '../../../../modules/helpers';\nimport { IAlbum, MediaViewerOrigin } from '../../../../types';\nimport {\n ApiChat, ApiMessage, ApiUser, MAIN_THREAD_ID,\n} from '../../../../api/types';\nimport { LangFn } from '../../../../hooks/useLang';\n\nexport default function useInnerHandlers(\n lang: LangFn,\n selectMessage: (e: React.MouseEvent, groupedId?: string) => void,\n message: ApiMessage,\n chatId: string,\n threadId: number,\n isInDocumentGroup: boolean,\n isScheduled?: boolean,\n isChatWithRepliesBot?: boolean,\n album?: IAlbum,\n avatarPeer?: ApiUser | ApiChat,\n senderPeer?: ApiUser | ApiChat,\n botSender?: ApiUser,\n) {\n const {\n openUserInfo, openChat, showNotification, focusMessage, openMediaViewer, openAudioPlayer,\n markMessagesRead, cancelSendingMessage, sendPollVote, openForwardMenu, focusMessageInComments,\n } = getDispatch();\n\n const {\n id: messageId, forwardInfo, replyToMessageId, replyToChatId, replyToTopMessageId, groupedId,\n } = message;\n\n const handleAvatarClick = useCallback(() => {\n if (!avatarPeer) {\n return;\n }\n\n if (isUserId(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 showNotification({ message: lang('HidAccount') });\n\n return;\n }\n\n if (isUserId(senderPeer.id)) {\n openUserInfo({ id: senderPeer.id });\n } else {\n openChat({ id: senderPeer.id });\n }\n }, [senderPeer, showNotification, lang, 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({\n chatId: isChatWithRepliesBot && replyToChatId ? replyToChatId : chatId,\n threadId,\n messageId: replyToMessageId,\n replyMessageId: isChatWithRepliesBot && replyToChatId ? undefined : messageId,\n });\n }, [focusMessage, isChatWithRepliesBot, replyToChatId, chatId, threadId, replyToMessageId, messageId]);\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 });\n }, [openForwardMenu, chatId, 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, groupedChatId: chatId,\n });\n return;\n }\n\n if (isChatWithRepliesBot && replyToChatId) {\n focusMessageInComments({\n chatId: replyToChatId,\n threadId: replyToTopMessageId,\n messageId: forwardInfo!.fromMessageId,\n });\n } else {\n focusMessage({\n chatId: forwardInfo!.fromChatId, messageId: forwardInfo!.fromMessageId,\n });\n }\n }, [\n isInDocumentGroup, isChatWithRepliesBot, replyToChatId, focusMessage, forwardInfo, groupedId, chatId,\n focusMessageInComments, replyToTopMessageId,\n ]);\n\n const selectWithGroupedId = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n\n selectMessage(e, groupedId);\n }, [selectMessage, groupedId]);\n\n return {\n handleAvatarClick,\n handleSenderClick,\n handleViaBotClick,\n handleReplyClick,\n handleMediaClick,\n handleAudioPlay,\n handleAlbumMediaClick,\n handleMetaClick: selectWithGroupedId,\n handleReadMedia,\n handleCancelUpload,\n handleVoteSend,\n handleGroupForward,\n handleForward,\n handleFocus,\n handleFocusForwarded,\n handleDocumentGroupSelectAll: selectWithGroupedId,\n };\n}\n","import { RefObject } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\nimport { MessageListType } from '../../global/types';\n\nimport { SCHEDULED_WHEN_ONLINE } from '../../config';\nimport buildClassName from '../../util/buildClassName';\nimport { compact, flatten } from '../../util/iteratees';\nimport { formatHumanDate } from '../../util/dateFormat';\nimport { getMessageOriginalId, isActionMessage, isOwnMessage } from '../../modules/helpers';\nimport useLang from '../../hooks/useLang';\nimport { isAlbum, MessageDateGroup } from './helpers/groupMessages';\nimport { preventMessageInputBlur } from './helpers/preventMessageInputBlur';\nimport useScrollHooks from './hooks/useScrollHooks';\nimport useMessageObservers from './hooks/useMessageObservers';\n\nimport Message from './message/Message';\nimport ActionMessage from './ActionMessage';\n\ninterface OwnProps {\n messageIds: number[];\n messageGroups: MessageDateGroup[];\n isViewportNewest: boolean;\n isUnread: boolean;\n withUsers: boolean;\n noAvatars: boolean;\n containerRef: RefObject;\n anchorIdRef: { current: string | undefined };\n memoUnreadDividerBeforeIdRef: { current: number | undefined };\n memoFirstUnreadIdRef: { current: number | undefined };\n threadId: number;\n type: MessageListType;\n isActive: boolean;\n threadTopMessageId: number | undefined;\n hasLinkedChat: boolean | undefined;\n isSchedule: boolean;\n noAppearanceAnimation: boolean;\n onFabToggle: AnyToVoidFunction;\n onNotchToggle: AnyToVoidFunction;\n openHistoryCalendar: Function;\n}\n\nconst UNREAD_DIVIDER_CLASS = 'unread-divider';\n\nconst MessageListContent: FC = ({\n messageIds,\n messageGroups,\n isViewportNewest,\n isUnread,\n withUsers,\n noAvatars,\n containerRef,\n anchorIdRef,\n memoUnreadDividerBeforeIdRef,\n memoFirstUnreadIdRef,\n threadId,\n type,\n isActive,\n threadTopMessageId,\n hasLinkedChat,\n isSchedule,\n noAppearanceAnimation,\n onFabToggle,\n onNotchToggle,\n openHistoryCalendar,\n}) => {\n const {\n observeIntersectionForMedia,\n observeIntersectionForReading,\n observeIntersectionForAnimatedStickers,\n } = useMessageObservers(type, containerRef, memoFirstUnreadIdRef);\n\n const {\n backwardsTriggerRef,\n forwardsTriggerRef,\n fabTriggerRef,\n } = useScrollHooks(\n type,\n containerRef,\n messageIds,\n isViewportNewest,\n isUnread,\n onFabToggle,\n onNotchToggle,\n isActive,\n );\n\n const lang = useLang();\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 const isLastInList = (\n senderGroupIndex === senderGroupsArray.length - 1\n && dateGroupIndex === dateGroupsArray.length - 1\n );\n\n return compact([\n message.id === memoUnreadDividerBeforeIdRef.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 && anchorIdRef.current === `message${message.previousLocalId}`) {\n anchorIdRef.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 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 message.id === memoUnreadDividerBeforeIdRef.current && unreadDivider,\n ,\n message.id === threadTopMessageId && (\n
\n {lang('DiscussionStarted')}\n
\n ),\n ]);\n }));\n });\n\n return (\n \n openHistoryCalendar({ selectedAt: dateGroup.datetime }) : undefined}\n >\n \n {isSchedule && dateGroup.originalDate === SCHEDULED_WHEN_ONLINE && (\n lang('MessageScheduledUntilOnline')\n )}\n {isSchedule && dateGroup.originalDate !== SCHEDULED_WHEN_ONLINE && (\n lang('MessageScheduledOn', formatHumanDate(lang, dateGroup.datetime, undefined, true))\n )}\n {!isSchedule && formatHumanDate(lang, dateGroup.datetime)}\n \n \n {flatten(senderGroups)}\n \n );\n });\n\n return (\n
\n
\n {flatten(dateGroups)}\n \n \n
\n );\n};\n\nexport default memo(MessageListContent);\n","import { RefObject } from 'react';\nimport { getDispatch } from '../../../lib/teact/teactn';\nimport { useMemo, useRef } from '../../../lib/teact/teact';\n\nimport { LoadMoreDirection } from '../../../types';\nimport { MessageListType } from '../../../global/types';\n\nimport { debounce } from '../../../util/schedulers';\nimport { useIntersectionObserver, useOnIntersect } from '../../../hooks/useIntersectionObserver';\nimport { LOCAL_MESSAGE_ID_BASE, MESSAGE_LIST_SENSITIVE_AREA } from '../../../config';\nimport resetScroll from '../../../util/resetScroll';\nimport useOnChange from '../../../hooks/useOnChange';\n\nconst FAB_THRESHOLD = 50;\nconst NOTCH_THRESHOLD = 1; // Notch has zero height so we at least need a 1px margin to intersect\nconst TOOLS_FREEZE_TIMEOUT = 250; // Approximate message sending animation duration\n\nexport default function useScrollHooks(\n type: MessageListType,\n containerRef: RefObject,\n messageIds: number[],\n isViewportNewest: boolean,\n isUnread: boolean,\n onFabToggle: AnyToVoidFunction,\n onNotchToggle: AnyToVoidFunction,\n isActive: boolean,\n) {\n const { loadViewportMessages } = getDispatch();\n\n const [loadMoreBackwards, loadMoreForwards] = useMemo(\n () => (type === 'thread' ? [\n debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Backwards }), 1000, true, false),\n debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Forwards }), 1000, true, false),\n ] : []),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [loadViewportMessages, messageIds],\n );\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 function toggleScrollTools() {\n if (!isActive) return;\n\n if (!messageIds || !messageIds.length) {\n onFabToggle(false);\n onNotchToggle(false);\n return;\n }\n\n if (!isViewportNewest) {\n onFabToggle(true);\n onNotchToggle(true);\n return;\n }\n\n const { offsetHeight, scrollHeight, scrollTop } = containerRef.current!;\n const scrollBottom = Math.round(scrollHeight - scrollTop - offsetHeight);\n const isNearBottom = scrollBottom <= FAB_THRESHOLD;\n const isAtBottom = scrollBottom <= NOTCH_THRESHOLD;\n\n onFabToggle(isUnread ? !isAtBottom : !isNearBottom);\n onNotchToggle(!isAtBottom);\n }\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({\n rootRef: containerRef,\n margin: MESSAGE_LIST_SENSITIVE_AREA,\n }, (entries) => {\n if (!loadMoreForwards || !loadMoreBackwards) {\n return;\n }\n\n // Loading history while sending a message can return the same message and cause ambiguity\n const isFirstMessageLocal = messageIds[0] >= LOCAL_MESSAGE_ID_BASE;\n if (isFirstMessageLocal) {\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') {\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 * 2,\n }, toggleScrollTools);\n\n useOnIntersect(fabTriggerRef, observeIntersectionForFab);\n\n const {\n observe: observeIntersectionForNotch,\n freeze: freezeForNotch,\n unfreeze: unfreezeForNotch,\n } = useIntersectionObserver({\n rootRef: containerRef,\n margin: NOTCH_THRESHOLD,\n }, toggleScrollTools);\n\n useOnIntersect(fabTriggerRef, observeIntersectionForNotch);\n\n // Workaround for FAB and notch flickering with tall incoming message\n useOnChange(() => {\n freezeForFab();\n freezeForNotch();\n\n setTimeout(() => {\n unfreezeForNotch();\n unfreezeForFab();\n }, TOOLS_FREEZE_TIMEOUT);\n }, [messageIds]);\n\n return { backwardsTriggerRef, forwardsTriggerRef, fabTriggerRef };\n}\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiSticker, ApiUpdateConnectionStateType } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport { selectChat } from '../../modules/selectors';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useLang from '../../hooks/useLang';\nimport { getUserIdDividend } from '../../modules/helpers';\n\nimport StickerButton from '../common/StickerButton';\n\nimport './ContactGreeting.scss';\n\ntype OwnProps = {\n userId: string;\n};\n\ntype StateProps = {\n sticker?: ApiSticker;\n lastUnreadMessageId?: number;\n connectionState?: ApiUpdateConnectionStateType;\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_DEBOUNCE_MS = 200;\n\nconst ContactGreeting: FC = ({\n sticker,\n connectionState,\n lastUnreadMessageId,\n loadGreetingStickers,\n sendMessage,\n markMessageListRead,\n}) => {\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({\n rootRef: containerRef,\n debounceMs: INTERSECTION_DEBOUNCE_MS,\n });\n useEffect(() => {\n if (sticker || connectionState !== 'connectionStateReady') {\n return;\n }\n\n loadGreetingStickers();\n }, [connectionState, loadGreetingStickers, sticker]);\n\n useEffect(() => {\n if (connectionState === 'connectionStateReady' && lastUnreadMessageId) {\n markMessageListRead({ maxId: lastUnreadMessageId });\n }\n }, [connectionState, markMessageListRead, lastUnreadMessageId]);\n\n const handleStickerSelect = useCallback((selectedSticker: ApiSticker) => {\n selectedSticker = {\n ...selectedSticker,\n isPreloadedGlobally: true,\n };\n sendMessage({ sticker: selectedSticker });\n }, [sendMessage]);\n\n return (\n
\n
\n

{lang('Conversation.EmptyPlaceholder')}

\n

{lang('Conversation.GreetingText')}

\n\n
\n {sticker && (\n \n )}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { userId }): StateProps => {\n const { stickers } = global.stickers.greeting;\n const dividend = getUserIdDividend(userId) + getUserIdDividend(global.currentUserId!);\n const sticker = stickers?.length ? stickers[dividend % stickers.length] : undefined;\n const chat = selectChat(global, userId);\n if (!chat) {\n return {};\n }\n\n return {\n sticker,\n lastUnreadMessageId: chat.lastMessage && chat.lastMessage.id !== chat.lastReadInboxMessageId\n ? chat.lastMessage.id\n : undefined,\n connectionState: global.connectionState,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadGreetingStickers', 'sendMessage', 'markMessageListRead',\n ]),\n)(ContactGreeting));\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport { MessageListType } from '../../global/types';\n\nimport useLang, { LangFn } from '../../hooks/useLang';\n\nimport './NoMessages.scss';\n\ntype OwnProps = {\n chatId: string;\n isChatWithSelf?: boolean;\n type: MessageListType;\n isGroupChatJustCreated?: boolean;\n};\n\nconst NoMessages: FC = ({\n isChatWithSelf, type, isGroupChatJustCreated,\n}) => {\n const lang = useLang();\n\n if (type === 'scheduled') {\n return renderScheduled(lang);\n }\n\n if (isChatWithSelf) {\n return renderSavedMessages(lang);\n }\n\n if (isGroupChatJustCreated) {\n return renderGroup(lang);\n }\n\n return (\n
{lang('NoMessages')}
\n );\n};\n\nfunction renderScheduled(lang: LangFn) {\n return (\n
{lang('ScheduledMessages.EmptyPlaceholder')}
\n );\n}\n\nfunction renderSavedMessages(lang: LangFn) {\n return (\n
\n
\n \n

{lang('Conversation.CloudStorageInfo.Title')}

\n
    \n
  • {lang('Conversation.ClousStorageInfo.Description1')}
  • \n
  • {lang('Conversation.ClousStorageInfo.Description2')}
  • \n
  • {lang('Conversation.ClousStorageInfo.Description3')}
  • \n
  • {lang('Conversation.ClousStorageInfo.Description4')}
  • \n
\n
\n
\n );\n}\n\nfunction renderGroup(lang: LangFn) {\n return (\n
\n
\n

{lang('EmptyGroupInfo.Title')}

\n

{lang('EmptyGroupInfo.Subtitle')}

\n
    \n
  • {lang('EmptyGroupInfo.Line1')}
  • \n
  • {lang('EmptyGroupInfo.Line2')}
  • \n
  • {lang('EmptyGroupInfo.Line3')}
  • \n
  • {lang('EmptyGroupInfo.Line4')}
  • \n
\n
\n
\n );\n}\n\nexport default memo(NoMessages);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef, useState,\n} from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiMessage, ApiRestrictionReason, MAIN_THREAD_ID,\n} from '../../api/types';\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport { LoadMoreDirection } from '../../types';\n\nimport { ANIMATION_END_DELAY, LOCAL_MESSAGE_ID_BASE, MESSAGE_LIST_SLICE } from '../../config';\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,\n selectCurrentMessageIds,\n} from '../../modules/selectors';\nimport {\n isChatChannel,\n isUserId,\n isChatWithRepliesBot,\n isChatGroup,\n} from '../../modules/helpers';\nimport { orderBy, pick } from '../../util/iteratees';\nimport { fastRaf, debounce, onTickEnd } from '../../util/schedulers';\nimport useLayoutEffectWithPrevDeps from '../../hooks/useLayoutEffectWithPrevDeps';\nimport useEffectWithPrevDeps from '../../hooks/useEffectWithPrevDeps';\nimport buildClassName from '../../util/buildClassName';\nimport { groupMessages } from './helpers/groupMessages';\nimport { preventMessageInputBlur } from './helpers/preventMessageInputBlur';\nimport useOnChange from '../../hooks/useOnChange';\nimport useStickyDates from './hooks/useStickyDates';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport resetScroll from '../../util/resetScroll';\nimport fastSmoothScroll, { isAnimatingScroll } from '../../util/fastSmoothScroll';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport useWindowSize from '../../hooks/useWindowSize';\n\nimport Loading from '../ui/Loading';\nimport MessageListContent from './MessageListContent';\nimport ContactGreeting from './ContactGreeting';\nimport NoMessages from './NoMessages';\n\nimport './MessageList.scss';\n\ntype OwnProps = {\n chatId: string;\n threadId: number;\n type: MessageListType;\n canPost: boolean;\n isReady: boolean;\n isActive: boolean;\n onFabToggle: (shouldShow: boolean) => void;\n onNotchToggle: (shouldShow: boolean) => void;\n hasTools?: boolean;\n};\n\ntype StateProps = {\n isChatLoaded?: boolean;\n isChannelChat?: boolean;\n isGroupChat?: boolean;\n isChatWithSelf?: boolean;\n isRepliesChat?: boolean;\n isCreator?: boolean;\n isBot?: 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 = 20;\nconst UNREAD_DIVIDER_TOP = 10;\nconst UNREAD_DIVIDER_TOP_WITH_TOOLS = 60;\nconst SCROLL_DEBOUNCE = 200;\nconst FOCUSING_DURATION = 1000;\nconst BOTTOM_FOCUS_MARGIN = 20;\nconst SELECT_MODE_ANIMATION_DURATION = 200;\nconst UNREAD_DIVIDER_CLASS = 'unread-divider';\n\nconst runDebouncedForScroll = debounce((cb) => cb(), SCROLL_DEBOUNCE, false);\n\nconst MessageList: FC = ({\n chatId,\n threadId,\n type,\n hasTools,\n onFabToggle,\n onNotchToggle,\n isChatLoaded,\n isChannelChat,\n isGroupChat,\n canPost,\n isReady,\n isActive,\n isChatWithSelf,\n isRepliesChat,\n isCreator,\n isBot,\n messageIds,\n messagesById,\n firstUnreadId,\n isViewportNewest,\n threadFirstMessageId,\n isRestricted,\n restrictionReason,\n focusingId,\n isSelectModeActive,\n loadViewportMessages,\n setScrollOffset,\n lastMessage,\n botDescription,\n threadTopMessageId,\n hasLinkedChat,\n openHistoryCalendar,\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 const memoFirstUnreadIdRef = useRef();\n const memoUnreadDividerBeforeIdRef = useRef();\n const memoFocusingIdRef = useRef();\n const isScrollTopJustUpdatedRef = useRef(false);\n const shouldAnimateAppearanceRef = useRef(Boolean(lastMessage));\n\n const [containerHeight, setContainerHeight] = useState();\n\n const areMessagesLoaded = Boolean(messageIds);\n\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 // Updated every time (to be used from intersection callback closure)\n useOnChange(() => {\n memoFirstUnreadIdRef.current = firstUnreadId;\n }, [firstUnreadId]);\n\n // Updated only once when messages are loaded (as we want the unread divider to keep its position)\n useOnChange(() => {\n if (areMessagesLoaded) {\n memoUnreadDividerBeforeIdRef.current = memoFirstUnreadIdRef.current;\n }\n }, [areMessagesLoaded]);\n\n useOnChange(() => {\n memoFocusingIdRef.current = focusingId;\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]).filter(Boolean);\n return groupMessages(orderBy(listedMessages, ['date', 'id']), memoUnreadDividerBeforeIdRef.current);\n }, [messageIds, messagesById, threadFirstMessageId, threadTopMessageId]);\n\n const loadMoreAround = useMemo(() => {\n if (type !== 'thread') {\n return undefined;\n }\n\n return debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Around }), 1000, true, false);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [loadViewportMessages, messageIds]);\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 // Memorize height for scroll animation\n const { height: windowHeight } = useWindowSize();\n\n useEffect(() => {\n if (isReady) {\n containerRef.current!.dataset.normalHeight = String(containerRef.current!.offsetHeight);\n }\n }, [windowHeight, isReady, canPost]);\n\n // Initial message loading\n useEffect(() => {\n if (!loadMoreAround || !isChatLoaded || isRestricted || focusingId) {\n return;\n }\n\n // Loading history while sending a message can return the same message and cause ambiguity\n const isLastMessageLocal = messageIds && messageIds[messageIds.length - 1] >= LOCAL_MESSAGE_ID_BASE;\n if (isLastMessageLocal) {\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 // Remember scroll position before repositioning it\n useOnChange(() => {\n if (!messageIds || !listItemElementsRef.current || !isReady) {\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 // This should match deps for `useLayoutEffectWithPrevDeps` below\n }, [messageIds, isViewportNewest, containerHeight, hasTools, isReady]);\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 hasLastMessageChanged = (\n messageIds && prevMessageIds && messageIds[messageIds.length - 1] !== prevMessageIds[prevMessageIds.length - 1]\n );\n const hasViewportShifted = (\n messageIds?.[0] !== prevMessageIds?.[0] && messageIds?.length === (MESSAGE_LIST_SLICE / 2 + 1)\n );\n const wasMessageAdded = hasLastMessageChanged && !hasViewportShifted;\n const isAlreadyFocusing = messageIds && memoFocusingIdRef.current === messageIds[messageIds.length - 1];\n\n const { scrollTop, scrollHeight, offsetHeight } = container;\n const scrollOffset = scrollOffsetRef.current!;\n const lastItemElement = listItemElementsRef.current[listItemElementsRef.current.length - 1];\n\n let bottomOffset = scrollOffset - (prevContainerHeight || offsetHeight);\n if (wasMessageAdded) {\n // If two new messages come at once (e.g. when bot responds) then the first message will update `scrollOffset`\n // right away (before animation) which creates inconsistency until the animation completes. To workaround that,\n // we calculate `isAtBottom` with a \"buffer\" of the latest message height (this is approximate).\n const lastItemHeight = lastItemElement ? lastItemElement.offsetHeight : 0;\n bottomOffset -= lastItemHeight;\n }\n const isAtBottom = isViewportNewest && prevIsViewportNewest && bottomOffset <= BOTTOM_THRESHOLD;\n\n let newScrollTop!: number;\n\n if (wasMessageAdded && isAtBottom && !isAlreadyFocusing) {\n if (lastItemElement) {\n fastRaf(() => {\n fastSmoothScroll(\n container,\n lastItemElement,\n 'end',\n BOTTOM_FOCUS_MARGIN,\n );\n });\n }\n\n newScrollTop = scrollHeight - offsetHeight;\n scrollOffsetRef.current = Math.max(Math.ceil(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 && document.getElementById(anchorIdRef.current);\n const unreadDivider = (\n !anchor\n && memoUnreadDividerBeforeIdRef.current\n && container.querySelector(`.${UNREAD_DIVIDER_CLASS}`)\n );\n\n if (isAtBottom && isResized) {\n if (isAnimatingScroll()) {\n return;\n }\n\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 = Math.min(\n unreadDivider.offsetTop - (hasTools ? UNREAD_DIVIDER_TOP_WITH_TOOLS : UNREAD_DIVIDER_TOP),\n scrollHeight - scrollOffset,\n );\n } else {\n newScrollTop = scrollHeight - scrollOffset;\n }\n\n resetScroll(container, Math.ceil(newScrollTop));\n\n if (!memoFocusingIdRef.current) {\n isScrollTopJustUpdatedRef.current = true;\n fastRaf(() => {\n isScrollTopJustUpdatedRef.current = false;\n });\n }\n\n scrollOffsetRef.current = Math.max(Math.ceil(scrollHeight - newScrollTop), offsetHeight);\n\n if (process.env.APP_ENV === 'perf') {\n // eslint-disable-next-line no-console\n console.timeEnd('scrollTop');\n }\n // This should match deps for `useOnChange` above\n }, [messageIds, isViewportNewest, containerHeight, hasTools]);\n\n useEffectWithPrevDeps(([prevIsSelectModeActive]) => {\n if (prevIsSelectModeActive !== undefined) {\n dispatchHeavyAnimationEvent(SELECT_MODE_ANIMATION_DURATION + ANIMATION_END_DELAY);\n }\n }, [isSelectModeActive]);\n\n const lang = useLang();\n\n const isPrivate = Boolean(chatId && isUserId(chatId));\n const withUsers = Boolean((!isPrivate && !isChannelChat) || isChatWithSelf || isRepliesChat);\n const noAvatars = Boolean(!withUsers || isChannelChat);\n const shouldRenderGreeting = isUserId(chatId) && !isChatWithSelf && !isBot\n && (\n (\n !messageGroups && !lastMessage && messageIds\n // Used to avoid flickering when deleting a greeting that has just been sent\n && (!listItemElementsRef.current || listItemElementsRef.current.length === 0)\n )\n || (messageIds?.length === 1 && messagesById?.[messageIds[0]]?.content.action?.type === 'contactSignUp')\n || (lastMessage?.content?.action?.type === 'contactSignUp')\n );\n\n const isGroupChatJustCreated = isGroupChat && isCreator\n && messageIds?.length === 1 && messagesById?.[messageIds[0]]?.content.action?.type === 'chatCreate';\n\n const className = buildClassName(\n 'MessageList custom-scroll',\n noAvatars && 'no-avatars',\n !canPost && 'no-composer',\n type === 'pinned' && 'type-pinned',\n isSelectModeActive && 'select-mode-active',\n isScrolled && 'scrolled',\n !isReady && 'is-animating',\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 ) : shouldRenderGreeting ? (\n \n ) : messageIds && (!messageGroups || isGroupChatJustCreated) ? (\n \n ) : ((messageIds && messageGroups) || lastMessage) ? (\n \n ) : (\n \n )}\n
\n );\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 const chatBot = selectChatBot(global, chatId)!;\n let botDescription: string | undefined;\n if (selectIsChatBotNotStarted(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 isGroupChat: isChatGroup(chat),\n isCreator: chat.isCreator,\n isChatWithSelf: selectIsChatWithSelf(global, chatId),\n isRepliesChat: isChatWithRepliesBot(chatId),\n isBot: Boolean(chatBot),\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 botDescription,\n threadTopMessageId,\n hasLinkedChat: chat.fullInfo && ('linkedChatId' in chat.fullInfo)\n ? Boolean(chat.fullInfo.linkedChatId)\n : undefined,\n ...(withLastMessageWhenPreloading && { lastMessage }),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadViewportMessages',\n 'setScrollOffset',\n 'openHistoryCalendar',\n ]),\n)(MessageList));\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 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 { formatIntegerCompact } from '../../util/textFormat';\nimport buildClassName from '../../util/buildClassName';\nimport { pick } from '../../util/iteratees';\nimport fastSmoothScroll from '../../util/fastSmoothScroll';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\nimport './ScrollDownButton.scss';\n\ntype OwnProps = {\n isShown: boolean;\n canPost?: boolean;\n withExtraShift?: boolean;\n};\n\ntype StateProps = {\n messageListType?: MessageListType;\n unreadCount?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst FOCUS_MARGIN = 20;\n\nconst ScrollDownButton: FC = ({\n isShown,\n canPost,\n messageListType,\n unreadCount,\n withExtraShift,\n focusNextReply,\n}) => {\n const lang = useLang();\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 focusNextReply();\n } else {\n const messagesContainer = elementRef.current!.parentElement!.querySelector('.MessageList')!;\n const messageElements = messagesContainer.querySelectorAll('.message-list-item');\n const lastMessageElement = messageElements[messageElements.length - 1];\n if (!lastMessageElement) {\n return;\n }\n\n fastSmoothScroll(messagesContainer, lastMessageElement, 'end', FOCUS_MARGIN);\n }\n }, [isShown, messageListType, focusNextReply]);\n\n const fabClassName = buildClassName(\n 'ScrollDownButton',\n isShown && 'revealed',\n !canPost && 'no-composer',\n withExtraShift && 'with-extra-shift',\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\n return {\n messageListType,\n unreadCount: chat && threadId === MAIN_THREAD_ID && messageListType === 'thread' ? chat.unreadCount : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['focusNextReply']),\n)(ScrollDownButton));\n","import { ApiAttachment } from '../../../../api/types';\nimport { SUPPORTED_IMAGE_CONTENT_TYPES, SUPPORTED_VIDEO_CONTENT_TYPES } from '../../../../config';\nimport {\n preloadImage,\n preloadVideo,\n createPosterForVideo,\n fetchBlob,\n} from '../../../../util/files';\nimport { scaleImage } from '../../../../util/imageResize';\n\nconst MAX_QUICK_IMG_SIZE = 1280; // px\nconst FILE_EXT_REGEX = /\\.[^/.]+$/;\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 (SUPPORTED_IMAGE_CONTENT_TYPES.has(mimeType)) {\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 resizedUrl = await scaleImage(blobUrl, MAX_QUICK_IMG_SIZE / Math.max(width, height), 'image/jpeg');\n URL.revokeObjectURL(blobUrl);\n const newBlob = await fetchBlob(resizedUrl);\n return buildAttachment(filename, newBlob, true, options);\n }\n\n if (mimeType === 'image/jpeg') {\n filename = filename.replace(FILE_EXT_REGEX, '.jpg');\n }\n\n quick = { width, height };\n } else {\n previewBlobUrl = blobUrl;\n }\n } else if (SUPPORTED_VIDEO_CONTENT_TYPES.has(mimeType)) {\n const { videoWidth: width, videoHeight: height, duration } = await preloadVideo(blobUrl);\n quick = { width, height, duration };\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","import { IS_IOS } from '../../../../util/environment';\n\nlet resetInput: HTMLInputElement;\n\nif (IS_IOS) {\n resetInput = document.createElement('input');\n resetInput.classList.add('for-ios-autocapitalization-fix');\n document.body.appendChild(resetInput);\n}\n\n// https://stackoverflow.com/a/55652503\nexport default function applyIosAutoCapitalizationFix(inputEl: HTMLElement) {\n resetInput.focus();\n inputEl.focus();\n}\n","export default __webpack_public_path__ + \"c0155344d336103c2b6a0b28cc510750.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 IOpusRecorder extends Omit {\n new(options: AnyLiteral): IOpusRecorder;\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: IOpusRecorder }>;\nlet OpusRecorder: IOpusRecorder;\nlet mediaRecorder: IOpusRecorder;\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: IOpusRecorder, 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 {\n useCallback, useEffect, useRef, useState,\n} from '../../../../lib/teact/teact';\n\nimport { IS_SAFARI, IS_VOICE_RECORDING_SUPPORTED } 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_SAFARI && IS_VOICE_RECORDING_SUPPORTED) {\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 { 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, inputId?: 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 && ![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)\n .find((item) => CLIPBOARD_ACCEPTED_TYPES.includes(item.type) && item.kind === 'file');\n const file = media && media.getAsFile();\n const pastedText = e.clipboardData.getData('text').substring(0, MAX_MESSAGE_LENGTH);\n\n e.preventDefault();\n\n if (!file && !pastedText) {\n return;\n }\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, input?.id);\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 '../../../../util/parseMessageInput';\nimport getMessageTextAsHtml from '../helpers/getMessageTextAsHtml';\nimport useBackgroundMode from '../../../../hooks/useBackgroundMode';\nimport useBeforeUnload from '../../../../hooks/useBeforeUnload';\nimport { IS_TOUCH_ENV } from '../../../../util/environment';\n\n// Used to avoid running debounced callbacks when chat changes.\nlet currentChatId: string | undefined;\nlet currentThreadId: number | undefined;\n\nexport default (\n draft: ApiFormattedText | undefined,\n chatId: string,\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: string, 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 if (!IS_TOUCH_ENV) {\n requestAnimationFrame(() => {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n focusEditableElement(messageInput, true);\n });\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 const handleBlur = useCallback(() => {\n if (chatId && threadId) {\n updateDraft(chatId, threadId);\n }\n }, [chatId, threadId, updateDraft]);\n\n useBackgroundMode(handleBlur);\n useBeforeUnload(handleBlur);\n};\n","import { useCallback, useEffect } from '../../../../lib/teact/teact';\nimport { getDispatch } from '../../../../lib/teact/teactn';\nimport { InlineBotSettings } from '../../../../types';\nimport useFlag from '../../../../hooks/useFlag';\nimport usePrevious from '../../../../hooks/usePrevious';\n\nconst tempEl = document.createElement('div');\nconst INLINE_BOT_QUERY_REGEXP = /^@([a-z0-9_]{1,32})[\\u00A0\\u0020]+(.*)/i;\nconst HAS_NEW_LINE = /^@([a-z0-9_]{1,32})[\\u00A0\\u0020]+\\n{2,}/i;\n\nexport default function useInlineBotTooltip(\n isAllowed: boolean,\n chatId: string,\n html: string,\n inlineBots?: Record,\n) {\n const [isOpen, markIsOpen, unmarkIsOpen] = useFlag();\n const text = getPlainText(html);\n const { queryInlineBot, resetInlineBot } = getDispatch();\n const { username, query, canShowHelp } = parseStartWithUsernameString(text);\n const usernameLowered = username.toLowerCase();\n const prevQuery = usePrevious(query);\n const prevUsername = usePrevious(username);\n const inlineBotData = inlineBots?.[usernameLowered];\n const {\n id: botId,\n switchPm,\n offset,\n results,\n isGallery,\n help,\n } = inlineBotData || {};\n\n useEffect(() => {\n if (prevQuery !== query) {\n unmarkIsOpen();\n }\n }, [prevQuery, query, unmarkIsOpen]);\n\n useEffect(() => {\n if (isAllowed && usernameLowered && chatId) {\n queryInlineBot({ chatId, username: usernameLowered, query });\n }\n }, [query, isAllowed, queryInlineBot, chatId, usernameLowered]);\n\n const loadMore = useCallback(() => {\n queryInlineBot({\n chatId, username: usernameLowered, query, offset,\n });\n }, [offset, chatId, query, queryInlineBot, usernameLowered]);\n\n useEffect(() => {\n if (isAllowed && botId && (switchPm || (results?.length))) {\n markIsOpen();\n } else {\n unmarkIsOpen();\n }\n }, [botId, isAllowed, markIsOpen, results, switchPm, unmarkIsOpen]);\n\n if (prevUsername !== username) {\n resetInlineBot({ username: prevUsername });\n }\n\n return {\n isOpen,\n closeTooltip: unmarkIsOpen,\n loadMore,\n username,\n id: botId,\n isGallery,\n switchPm,\n results,\n help: canShowHelp && help ? `@${username} ${help}` : undefined,\n };\n}\n\nfunction getPlainText(html: string) {\n tempEl.innerHTML = html.replace(/
/g, '\\n');\n\n return tempEl.innerText;\n}\n\nfunction parseStartWithUsernameString(text: string) {\n const result = text.match(INLINE_BOT_QUERY_REGEXP);\n if (!result) {\n return { username: '', query: '', canShowHelp: false };\n }\n\n return {\n username: result[1],\n query: result[2],\n canShowHelp: result[2] === '' && !text.match(HAS_NEW_LINE),\n };\n}\n","import {\n useCallback, useEffect, useState,\n} from '../../../../lib/teact/teact';\n\nimport { ApiBotCommand } from '../../../../api/types';\n\nimport { prepareForRegExp } from '../helpers/prepareForRegExp';\nimport { throttle } from '../../../../util/schedulers';\nimport useFlag from '../../../../hooks/useFlag';\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\nconst RE_COMMAND = /^[\\w@]{1,32}\\s?/i;\n\nexport default function useBotCommandTooltip(\n isAllowed: boolean,\n html: string,\n botCommands?: ApiBotCommand[] | false,\n chatBotCommands?: ApiBotCommand[],\n) {\n const [isOpen, markIsOpen, unmarkIsOpen] = useFlag();\n const [filteredBotCommands, setFilteredBotCommands] = useState();\n\n const getFilteredCommands = useCallback((filter) => {\n if (!botCommands && !chatBotCommands) {\n setFilteredBotCommands(undefined);\n\n return;\n }\n\n runThrottled(() => {\n const nextFilteredBotCommands = (botCommands || chatBotCommands || [])\n .filter(({ command }) => !filter || command.includes(filter));\n setFilteredBotCommands(\n nextFilteredBotCommands && nextFilteredBotCommands.length ? nextFilteredBotCommands : undefined,\n );\n });\n }, [botCommands, chatBotCommands]);\n\n useEffect(() => {\n if (!isAllowed || !html.length) {\n unmarkIsOpen();\n return;\n }\n\n const shouldShowCommands = html.startsWith('/');\n\n if (shouldShowCommands) {\n const filter = prepareForRegExp(html.substr(1)).match(RE_COMMAND);\n getFilteredCommands(filter ? filter[0] : '');\n } else {\n unmarkIsOpen();\n }\n }, [getFilteredCommands, html, isAllowed, unmarkIsOpen]);\n\n useEffect(() => {\n if (filteredBotCommands && filteredBotCommands.length) {\n markIsOpen();\n } else {\n unmarkIsOpen();\n }\n }, [filteredBotCommands, markIsOpen, unmarkIsOpen]);\n\n return {\n isOpen,\n close: unmarkIsOpen,\n filteredBotCommands,\n };\n}\n","import React, { FC, memo } 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 memo(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, memo } 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 memo(AttachMenuAsync);\n","import React, { FC, memo } 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 memo(SymbolMenuAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './InlineBotTooltip';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst InlineBotTooltipAsync: FC = (props) => {\n const { isOpen } = props;\n const InlineBotTooltip = useModuleLoader(Bundles.Extra, 'InlineBotTooltip', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return InlineBotTooltip ? : undefined;\n};\n\nexport default memo(InlineBotTooltipAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './MentionTooltip';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst MentionTooltipAsync: FC = (props) => {\n const { isOpen } = props;\n const MentionTooltip = useModuleLoader(Bundles.Extra, 'MentionTooltip', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return MentionTooltip ? : undefined;\n};\n\nexport default memo(MentionTooltipAsync);\n","import React, { FC, memo } 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 memo(CustomSendMenuAsync);\n","import React, { FC } from '../../../lib/teact/teact';\nimport { OwnProps } from './StickerTooltip';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst StickerTooltipAsync: FC = (props) => {\n const { isOpen } = props;\n const StickerTooltip = useModuleLoader(Bundles.Extra, 'StickerTooltip', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return StickerTooltip ? : undefined;\n};\n\nexport default StickerTooltipAsync;\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './BotCommandTooltip';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst BotCommandTooltipAsync: FC = (props) => {\n const { isOpen } = props;\n const BotCommandTooltip = useModuleLoader(Bundles.Extra, 'BotCommandTooltip', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return BotCommandTooltip ? : undefined;\n};\n\nexport default memo(BotCommandTooltipAsync);\n","import React, { FC, memo, useEffect } 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';\nimport useFlag from '../../../hooks/useFlag';\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 const { isKeyboardSingleUse } = message || {};\n const [forceOpen, markForceOpen, unmarkForceOpen] = useFlag(true);\n\n const handleClose = () => {\n unmarkForceOpen();\n onClose();\n };\n\n useEffect(() => {\n markForceOpen();\n }, [markForceOpen, message]);\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, {\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 { isUserId } 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 = isUserId(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, memo } 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 memo(AttachmentModalAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './BotCommandMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst BotCommandMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const BotCommandMenu = useModuleLoader(Bundles.Extra, 'BotCommandMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return BotCommandMenu ? : undefined;\n};\n\nexport default memo(BotCommandMenuAsync);\n","import React, { FC, memo } 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 memo(PollModalAsync);\n","import React, { FC, memo } 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 memo(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';\nimport { ISettings } from '../../../types';\n\nimport { RE_LINK_TEMPLATE } from '../../../config';\nimport { selectNoWebPage, selectTheme } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport parseMessageInput from '../../../util/parseMessageInput';\nimport useOnChange from '../../../hooks/useOnChange';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useCurrentOrPrev from '../../../hooks/useCurrentOrPrev';\nimport buildClassName from '../../../util/buildClassName';\n\nimport WebPage from '../message/WebPage';\nimport Button from '../../ui/Button';\n\nimport './WebPagePreview.scss';\n\ntype OwnProps = {\n chatId: string;\n threadId: number;\n messageText: string;\n disabled?: boolean;\n};\n\ntype StateProps = {\n webPagePreview?: ApiWebPage;\n noWebPage?: boolean;\n theme: ISettings['theme'];\n};\ntype DispatchProps = Pick;\n\nconst RE_LINK = new RegExp(RE_LINK_TEMPLATE, 'i');\n\nconst WebPagePreview: FC = ({\n chatId,\n threadId,\n messageText,\n disabled,\n webPagePreview,\n noWebPage,\n theme,\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 isShown = Boolean(webPagePreview && messageText.length && !noWebPage && !disabled);\n const { shouldRender, transitionClassNames } = useShowTransition(isShown);\n\n const renderingWebPage = useCurrentOrPrev(webPagePreview, true);\n\n if (!shouldRender || !renderingWebPage) {\n return undefined;\n }\n\n const handleClearWebpagePreview = () => {\n toggleMessageWebPage({ chatId, threadId, noWebPage: true });\n };\n\n // TODO Refactor so `WebPage` can be used without message\n const { photo, ...webPageWithoutPhoto } = renderingWebPage;\n const messageStub = {\n content: {\n webPage: webPageWithoutPhoto,\n },\n } as ApiMessage;\n\n return (\n
\n
\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 theme: selectTheme(global),\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, memo } 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 memo(CalendarModalAsync);\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 ApiBotInlineResult,\n ApiBotInlineMediaResult,\n ApiSticker,\n ApiVideo,\n ApiNewPoll,\n ApiMessage,\n ApiFormattedText,\n ApiChat,\n ApiChatMember,\n ApiUser,\n MAIN_THREAD_ID,\n ApiBotCommand,\n} from '../../../api/types';\nimport { InlineBotSettings } from '../../../types';\n\nimport {\n BASE_EMOJI_KEYWORD_LANG, EDITABLE_INPUT_ID, REPLIES_USER_ID, SCHEDULED_WHEN_ONLINE,\n} from '../../../config';\nimport { IS_VOICE_RECORDING_SUPPORTED, IS_SINGLE_COLUMN_LAYOUT, IS_IOS } from '../../../util/environment';\nimport {\n selectChat,\n selectIsRightColumnShown,\n selectIsInSelectMode,\n selectNewestMessageWithBotKeyboardButtons,\n selectDraft,\n selectScheduledIds,\n selectEditingMessage,\n selectIsChatWithSelf,\n selectChatBot,\n selectChatUser,\n selectChatMessage,\n} from '../../../modules/selectors';\nimport {\n getAllowedAttachmentOptions,\n getChatSlowModeOptions,\n isUserId,\n isChatAdmin,\n} from '../../../modules/helpers';\nimport { formatMediaDuration, formatVoiceRecordDuration, getDayStartAt } from '../../../util/dateFormat';\nimport focusEditableElement from '../../../util/focusEditableElement';\nimport parseMessageInput from '../../../util/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 windowSize from '../../../util/windowSize';\nimport { isSelectionInsideInput } from './helpers/selection';\nimport applyIosAutoCapitalizationFix from './helpers/applyIosAutoCapitalizationFix';\nimport { getServerTime } from '../../../util/serverTime';\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 useStickerTooltip from './hooks/useStickerTooltip';\nimport useEmojiTooltip from './hooks/useEmojiTooltip';\nimport useMentionTooltip from './hooks/useMentionTooltip';\nimport useContextMenuHandlers from '../../../hooks/useContextMenuHandlers';\nimport useLang from '../../../hooks/useLang';\nimport useInlineBotTooltip from './hooks/useInlineBotTooltip';\nimport useBotCommandTooltip from './hooks/useBotCommandTooltip';\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 InlineBotTooltip from './InlineBotTooltip.async';\nimport MentionTooltip from './MentionTooltip.async';\nimport CustomSendMenu from './CustomSendMenu.async';\nimport StickerTooltip from './StickerTooltip.async';\nimport EmojiTooltip from './EmojiTooltip.async';\nimport BotCommandTooltip from './BotCommandTooltip.async';\nimport BotKeyboardMenu from './BotKeyboardMenu';\nimport MessageInput from './MessageInput';\nimport ComposerEmbeddedMessage from './ComposerEmbeddedMessage';\nimport AttachmentModal from './AttachmentModal.async';\nimport BotCommandMenu from './BotCommandMenu.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';\n\nimport './Composer.scss';\n\ntype OwnProps = {\n chatId: string;\n threadId: number;\n messageListType: MessageListType;\n dropAreaState: string;\n isReady: boolean;\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 isPollModalOpen?: boolean;\n botKeyboardMessageId?: number;\n botKeyboardPlaceholder?: string;\n withScheduledButton?: boolean;\n shouldSchedule?: boolean;\n canScheduleUntilOnline?: boolean;\n stickersForEmoji?: ApiSticker[];\n groupChatMembers?: ApiChatMember[];\n currentUserId?: string;\n usersById?: Record;\n recentEmojis: string[];\n lastSyncTime?: number;\n contentToBeScheduled?: GlobalState['messages']['contentToBeScheduled'];\n shouldSuggestStickers?: boolean;\n baseEmojiKeywords?: Record;\n emojiKeywords?: Record;\n serverTimeOffset: number;\n topInlineBotIds?: string[];\n isInlineBotLoading: boolean;\n inlineBots?: Record;\n botCommands?: ApiBotCommand[] | false;\n chatBotCommands?: ApiBotCommand[];\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 MESSAGE_MAX_LENGTH = 4096;\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 isReady,\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 isPollModalOpen,\n botKeyboardMessageId,\n botKeyboardPlaceholder,\n withScheduledButton,\n stickersForEmoji,\n groupChatMembers,\n topInlineBotIds,\n currentUserId,\n usersById,\n lastSyncTime,\n contentToBeScheduled,\n shouldSuggestStickers,\n baseEmojiKeywords,\n emojiKeywords,\n serverTimeOffset,\n recentEmojis,\n inlineBots,\n isInlineBotLoading,\n botCommands,\n chatBotCommands,\n sendMessage,\n editMessage,\n saveDraft,\n clearDraft,\n showDialog,\n setStickerSearchQuery,\n setGifSearchQuery,\n forwardMessages,\n openPollModal,\n closePollModal,\n loadScheduledHistory,\n openChat,\n addRecentEmoji,\n sendInlineBotResult,\n}) => {\n const lang = useLang();\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 const { width: windowWidth } = windowSize.get();\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 && isReady) {\n loadScheduledHistory({ chatId });\n }\n }, [isReady, chatId, loadScheduledHistory, lastSyncTime, threadId]);\n\n useLayoutEffect(() => {\n if (!appendixRef.current) return;\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 [isBotCommandMenuOpen, openBotCommandMenu, closeBotCommandMenu] = 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 isMentionTooltipOpen, closeMentionTooltip, insertMention, mentionFilteredUsers,\n } = useMentionTooltip(\n !attachments.length,\n html,\n setHtml,\n undefined,\n groupChatMembers,\n topInlineBotIds,\n currentUserId,\n usersById,\n );\n\n const {\n isOpen: isInlineBotTooltipOpen,\n id: inlineBotId,\n isGallery: isInlineBotTooltipGallery,\n switchPm: inlineBotSwitchPm,\n results: inlineBotResults,\n closeTooltip: closeInlineBotTooltip,\n help: inlineBotHelp,\n loadMore: loadMoreForInlineBot,\n } = useInlineBotTooltip(\n Boolean(!attachments.length && lastSyncTime),\n chatId,\n html,\n inlineBots,\n );\n\n const {\n isOpen: isBotCommandTooltipOpen,\n close: closeBotCommandTooltip,\n filteredBotCommands: botTooltipCommands,\n } = useBotCommandTooltip(\n Boolean((botCommands && botCommands.length) || (chatBotCommands && chatBotCommands.length)),\n html,\n botCommands,\n chatBotCommands,\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 { isStickerTooltipOpen, closeStickerTooltip } = useStickerTooltip(\n Boolean(shouldSuggestStickers && allowedAttachmentOptions.canSendStickers && !attachments.length),\n html,\n stickersForEmoji,\n !isReady,\n );\n const {\n isEmojiTooltipOpen, closeEmojiTooltip, filteredEmojis, insertEmoji,\n } = useEmojiTooltip(\n Boolean(shouldSuggestStickers && allowedAttachmentOptions.canSendStickers && !attachments.length),\n html,\n recentEmojis,\n undefined,\n setHtml,\n baseEmojiKeywords,\n emojiKeywords,\n !isReady,\n );\n\n const insertTextAndUpdateCursor = useCallback((text: string, inputId: string = EDITABLE_INPUT_ID) => {\n const selection = window.getSelection()!;\n const messageInput = document.getElementById(inputId)!;\n const newHtml = renderText(text, ['escape_html', 'emoji_html', 'br_html'])\n .join('')\n .replace(/\\u200b+/g, '\\u200b');\n\n if (selection.rangeCount) {\n const selectionRange = selection.getRangeAt(0);\n if (isSelectionInsideInput(selectionRange, inputId)) {\n insertHtmlInSelection(newHtml);\n messageInput.dispatchEvent(new Event('input', { bubbles: true }));\n return;\n }\n }\n\n setHtml(`${htmlRef.current!}${newHtml}`);\n\n // If selection is outside of input, set cursor at the end of input\n requestAnimationFrame(() => {\n focusEditableElement(messageInput);\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, EDITABLE_INPUT_ID)) {\n document.execCommand('delete', false);\n return;\n }\n }\n\n setHtml(deleteLastCharacterOutsideSelection(htmlRef.current!));\n }, []);\n\n const resetComposer = useCallback((shouldPreserveInput = false) => {\n if (!shouldPreserveInput) {\n setHtml('');\n }\n setAttachments([]);\n closeStickerTooltip();\n closeCalendar();\n setScheduledMessageArgs(undefined);\n closeMentionTooltip();\n closeEmojiTooltip();\n\n if (IS_SINGLE_COLUMN_LAYOUT) {\n // @optimization\n setTimeout(() => closeSymbolMenu(), SENDING_ANIMATION_DURATION);\n } else {\n closeSymbolMenu();\n }\n }, [closeStickerTooltip, closeCalendar, closeMentionTooltip, closeEmojiTooltip, closeSymbolMenu]);\n\n // Handle chat change (ref is used to avoid redundant effect calls)\n const stopRecordingVoiceRef = useRef();\n stopRecordingVoiceRef.current = stopRecordingVoice;\n useEffect(() => {\n return () => {\n stopRecordingVoiceRef.current!();\n resetComposer();\n };\n }, [chatId, resetComposer, stopRecordingVoiceRef]);\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 handleAppendFiles = useCallback(async (files: File[], isQuick: boolean) => {\n setAttachments([\n ...attachments,\n ...await Promise.all(files.map((file) => buildAttachment(file.name, file, isQuick))),\n ]);\n }, [attachments]);\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\n if (!currentAttachments.length && !text && !isForwarding) {\n return;\n }\n\n const maxLength = currentAttachments.length ? CAPTION_MAX_LENGTH : MESSAGE_MAX_LENGTH;\n if (text?.length > maxLength) {\n const extraLength = text.length - maxLength;\n showDialog({\n data: {\n message: 'MESSAGE_TOO_LONG_PLEASE_REMOVE_CHARACTERS',\n textParams: {\n '{EXTRA_CHARS_COUNT}': extraLength,\n '{PLURAL_S}': extraLength > 1 ? 's' : '',\n },\n hasErrorKey: true,\n },\n });\n\n return;\n }\n\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n\n if (currentAttachments.length || text) {\n if (slowMode && !isAdmin) {\n const nowSeconds = getServerTime(serverTimeOffset);\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 showDialog({\n data: {\n message: lang('SlowModeHint', formatMediaDuration(secondsRemaining)),\n isSlowMode: true,\n hasErrorKey: false,\n },\n });\n\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\n if (isForwarding) {\n forwardMessages({\n scheduledAt,\n isSilent,\n });\n }\n\n lastMessageSendTimeSeconds.current = getServerTime(serverTimeOffset);\n\n clearDraft({ chatId, localOnly: true });\n\n if (IS_IOS && messageInput === document.activeElement) {\n applyIosAutoCapitalizationFix(messageInput);\n }\n\n // Wait until message animation starts\n requestAnimationFrame(() => {\n resetComposer();\n });\n }, [\n connectionState, attachments, activeVoiceRecording, isForwarding, clearDraft, chatId, serverTimeOffset,\n resetComposer, stopRecordingVoice, showDialog, slowMode, isAdmin, sendMessage, forwardMessages, lang,\n ]);\n\n const handleActivateBotCommandMenu = useCallback(() => {\n closeSymbolMenu();\n openBotCommandMenu();\n }, [closeSymbolMenu, openBotCommandMenu]);\n\n const handleActivateSymbolMenu = useCallback(() => {\n closeBotCommandMenu();\n openSymbolMenu();\n }, [closeBotCommandMenu, openSymbolMenu]);\n\n const handleStickerSelect = useCallback((sticker: ApiSticker, shouldPreserveInput = false) => {\n sticker = {\n ...sticker,\n isPreloadedGlobally: true,\n };\n\n if (shouldSchedule) {\n setScheduledMessageArgs({ sticker });\n openCalendar();\n } else {\n sendMessage({ sticker });\n requestAnimationFrame(() => {\n resetComposer(shouldPreserveInput);\n });\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(() => {\n resetComposer(true);\n });\n }\n }, [shouldSchedule, openCalendar, sendMessage, resetComposer]);\n\n const handleInlineBotSelect = useCallback((inlineResult: ApiBotInlineResult | ApiBotInlineMediaResult) => {\n if (connectionState !== 'connectionStateReady') {\n return;\n }\n\n sendInlineBotResult({\n id: inlineResult.id,\n queryId: inlineResult.queryId,\n });\n\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n if (IS_IOS && messageInput === document.activeElement) {\n applyIosAutoCapitalizationFix(messageInput);\n }\n\n clearDraft({ chatId, localOnly: true });\n requestAnimationFrame(() => {\n resetComposer();\n });\n }, [chatId, clearDraft, connectionState, resetComposer, sendInlineBotResult]);\n\n const handleBotCommandSelect = useCallback(() => {\n clearDraft({ chatId, localOnly: true });\n requestAnimationFrame(() => {\n resetComposer();\n });\n }, [chatId, clearDraft, 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 void handleSend(true);\n }\n }, [handleSend, openCalendar, shouldSchedule]);\n\n const handleMessageSchedule = useCallback((date: Date, isWhenOnline = false) => {\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 + (isWhenOnline ? 0 : serverTimeOffset);\n\n if (!scheduledMessageArgs || Object.keys(restArgs).length === 0) {\n void handleSend(!!isSilent, scheduledAt);\n } else {\n sendMessage({\n ...scheduledMessageArgs,\n scheduledAt,\n });\n requestAnimationFrame(() => {\n resetComposer();\n });\n }\n closeCalendar();\n }, [closeCalendar, handleSend, resetComposer, scheduledMessageArgs, sendMessage, serverTimeOffset]);\n\n const handleMessageScheduleUntilOnline = useCallback(() => {\n handleMessageSchedule(new Date(SCHEDULED_WHEN_ONLINE * 1000), true);\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_SINGLE_COLUMN_LAYOUT || messageInput !== document.activeElement) {\n openSymbolMenu();\n return;\n }\n\n messageInput.blur();\n setTimeout(() => {\n closeBotCommandMenu();\n openSymbolMenu();\n }, MOBILE_KEYBOARD_HIDE_DELAY_MS);\n }, [openSymbolMenu, closeBotCommandMenu]);\n\n const handleAllScheduledClick = useCallback(() => {\n openChat({ id: chatId, threadId, type: 'scheduled' });\n }, [openChat, chatId, threadId]);\n\n useEffect(() => {\n if (isRightColumnShown && IS_SINGLE_COLUMN_LAYOUT) {\n closeSymbolMenu();\n }\n }, [isRightColumnShown, closeSymbolMenu]);\n\n useEffect(() => {\n if (!isReady) return;\n\n if (isSelectModeActive) {\n disableHover();\n } else {\n setTimeout(() => {\n enableHover();\n }, SELECT_MODE_TRANSITION_MS);\n }\n }, [isSelectModeActive, enableHover, disableHover, isReady]);\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 void handleSend();\n }\n break;\n case MainButtonState.Record:\n void startRecordingVoice();\n break;\n case MainButtonState.Edit:\n handleEditComplete();\n break;\n default:\n break;\n }\n }, [\n mainButtonState, shouldSchedule, startRecordingVoice, handleEditComplete,\n activeVoiceRecording, openCalendar, pauseRecordingVoice, handleSend,\n ]);\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 = 'SendMessage';\n switch (mainButtonState) {\n case MainButtonState.Edit:\n sendButtonAriaLabel = 'Save edited message';\n break;\n case MainButtonState.Record:\n sendButtonAriaLabel = areVoiceMessagesNotAllowed\n ? 'Conversation.DefaultRestrictedMedia'\n : 'AccDescrVoiceMessage';\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 !isReady && 'not-ready',\n isSymbolMenuLoaded\n ? (isSymbolMenuOpen && 'menu-opened')\n : (isSymbolMenuOpen && 'is-loading'),\n );\n\n const onSend = mainButtonState === MainButtonState.Edit\n ? handleEditComplete\n : (shouldSchedule ? openCalendar : handleSend);\n\n return (\n
\n {allowedAttachmentOptions.canAttachMedia && isReady && (\n \n \n \n )}\n \n \n {renderedEditedMessage && (\n \n )}\n \n \n \n
\n
\n \n \n
\n {isChatWithBot && botCommands !== false && !activeVoiceRecording && !editingMessage && (\n \n \n \n )}\n {IS_SINGLE_COLUMN_LAYOUT ? (\n \n \n \n {isSymbolMenuOpen && !isSymbolMenuLoaded && }\n \n ) : (\n \n \n \n )}\n \n {isInlineBotLoading && Boolean(inlineBotId) && (\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 \n {botKeyboardMessageId && (\n \n )}\n {botCommands && (\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 chatBot = chatId !== REPLIES_USER_ID ? selectChatBot(global, chatId) : undefined;\n const isChatWithBot = Boolean(chatBot);\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const messageWithActualBotKeyboard = isChatWithBot && selectNewestMessageWithBotKeyboardButtons(global, chatId);\n const scheduledIds = selectScheduledIds(global, chatId);\n const { language, shouldSuggestStickers } = global.settings.byKey;\n const baseEmojiKeywords = global.emojiKeywords[BASE_EMOJI_KEYWORD_LANG];\n const emojiKeywords = language !== BASE_EMOJI_KEYWORD_LANG ? global.emojiKeywords[language] : undefined;\n const botKeyboardMessageId = messageWithActualBotKeyboard ? messageWithActualBotKeyboard.id : undefined;\n const keyboardMessage = botKeyboardMessageId ? selectChatMessage(global, chatId, botKeyboardMessageId) : undefined;\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 && isUserId(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?.length)\n ),\n shouldSchedule: messageListType === 'scheduled',\n botKeyboardMessageId,\n botKeyboardPlaceholder: keyboardMessage?.keyboardPlaceholder,\n isForwarding: chatId === global.forwardMessages.toChatId,\n isPollModalOpen: global.isPollModalOpen,\n stickersForEmoji: global.stickers.forEmoji.stickers,\n groupChatMembers: chat?.fullInfo?.members,\n topInlineBotIds: global.topInlineBots?.userIds,\n currentUserId: global.currentUserId,\n usersById: global.users.byId,\n lastSyncTime: global.lastSyncTime,\n contentToBeScheduled: global.messages.contentToBeScheduled,\n shouldSuggestStickers,\n recentEmojis: global.recentEmojis,\n baseEmojiKeywords: baseEmojiKeywords?.keywords,\n emojiKeywords: emojiKeywords?.keywords,\n serverTimeOffset: global.serverTimeOffset,\n inlineBots: global.inlineBots.byUsername,\n isInlineBotLoading: global.inlineBots.isLoading,\n chatBotCommands: chat && chat.fullInfo && chat.fullInfo.botCommands,\n botCommands: chatBot && chatBot.fullInfo ? (chatBot.fullInfo.botCommands || false) : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'sendMessage',\n 'editMessage',\n 'saveDraft',\n 'clearDraft',\n 'showDialog',\n 'setStickerSearchQuery',\n 'setGifSearchQuery',\n 'forwardMessages',\n 'openPollModal',\n 'closePollModal',\n 'loadScheduledHistory',\n 'openChat',\n 'addRecentEmoji',\n 'sendInlineBotResult',\n ]),\n)(Composer));\n","import { useEffect, useMemo } 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';\nimport { prepareForRegExp } from '../helpers/prepareForRegExp';\n\nexport default function useStickerTooltip(\n isAllowed: boolean,\n html: string,\n stickers?: ApiSticker[],\n isDisabled = false,\n) {\n const cleanHtml = useMemo(() => prepareForRegExp(html).trim(), [html]);\n const { loadStickersForEmoji, clearStickersForEmoji } = getDispatch();\n const isSingleEmoji = (\n (IS_EMOJI_SUPPORTED && parseEmojiOnlyString(cleanHtml) === 1)\n || (!IS_EMOJI_SUPPORTED && Boolean(html.match(/^]*?>$/g)))\n );\n const hasStickers = Boolean(stickers) && isSingleEmoji;\n\n useEffect(() => {\n if (isDisabled) return;\n\n if (isAllowed && isSingleEmoji) {\n loadStickersForEmoji({ emoji: cleanHtml });\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, isDisabled]);\n\n return {\n isStickerTooltipOpen: hasStickers,\n closeStickerTooltip: clearStickersForEmoji,\n };\n}\n","export default function insertHtmlInSelection(html: string) {\n const selection = window.getSelection();\n\n if (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 } else {\n range.collapse(false);\n }\n selection.removeAllRanges();\n selection.addRange(range);\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 '../../../../util/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, memo } 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 memo(MobileSearchAsync);\n","import React, { FC, memo } 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 memo(MessageSelectToolbarAsync);\n","import React, { FC, memo } 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 memo(UnpinAllMessagesModalAsync);\n","import React, { FC, memo } 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 memo(PaymentModalAsync);\n","import React, { FC, memo } 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 memo(ReceiptModalAsync);\n","import React, {\n FC, useEffect, useState, memo, useMemo, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChatBannedRights, MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalActions, MessageListType, MessageList as GlobalMessageList } from '../../global/types';\nimport { ThemeKey } from '../../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 ANIMATION_LEVEL_MAX,\n ANIMATION_END_DELAY,\n DARK_THEME_BG_COLOR,\n LIGHT_THEME_BG_COLOR,\n ANIMATION_LEVEL_MIN,\n SUPPORTED_IMAGE_CONTENT_TYPES,\n} from '../../config';\nimport {\n IS_SINGLE_COLUMN_LAYOUT,\n IS_TABLET_COLUMN_LAYOUT,\n IS_TOUCH_ENV,\n MASK_IMAGE_DISABLED,\n} from '../../util/environment';\nimport { DropAreaState } from './composer/DropArea';\nimport {\n selectChat,\n selectCurrentMessageList,\n selectCurrentTextSearch,\n selectIsChatBotNotStarted,\n selectIsInSelectMode,\n selectIsRightColumnShown,\n selectPinnedIds,\n selectTheme,\n} from '../../modules/selectors';\nimport { getCanPostInChat, getMessageSendingRestrictionReason, isUserId } 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 usePrevDuringAnimation from '../../hooks/usePrevDuringAnimation';\nimport calculateMiddleFooterTransforms from './helpers/calculateMiddleFooterTransforms';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\nimport { createMessageHash } from '../../util/routing';\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';\nimport PaymentModal from '../payment/PaymentModal.async';\nimport ReceiptModal from '../payment/ReceiptModal.async';\n\nimport './MiddleColumn.scss';\n\ntype StateProps = {\n chatId?: string;\n threadId?: number;\n messageListType?: MessageListType;\n isPrivate?: boolean;\n isPinnedMessageList?: boolean;\n isScheduledMessageList?: boolean;\n canPost?: boolean;\n currentUserBannedRights?: ApiChatBannedRights;\n defaultBannedRights?: ApiChatBannedRights;\n hasPinnedOrAudioMessage?: boolean;\n pinnedMessagesCount?: number;\n theme: ThemeKey;\n customBackground?: string;\n backgroundColor?: string;\n patternColor?: string;\n isLeftColumnShown?: boolean;\n isRightColumnShown?: boolean;\n isBackgroundBlurred?: boolean;\n isMobileSearchActive?: boolean;\n isSelectModeActive?: boolean;\n isPaymentModalOpen?: boolean;\n isReceiptModalOpen?: boolean;\n animationLevel?: number;\n shouldSkipHistoryAnimations?: boolean;\n currentTransitionKey: number;\n messageLists?: GlobalMessageList[];\n};\n\ntype DispatchProps = Pick;\n\nconst CLOSE_ANIMATION_DURATION = IS_SINGLE_COLUMN_LAYOUT ? 450 + ANIMATION_END_DELAY : undefined;\n\nfunction isImage(item: DataTransferItem) {\n return item.kind === 'file' && item.type && SUPPORTED_IMAGE_CONTENT_TYPES.has(item.type);\n}\n\nconst MiddleColumn: FC = ({\n chatId,\n threadId,\n messageListType,\n isPrivate,\n isPinnedMessageList,\n messageLists,\n canPost,\n currentUserBannedRights,\n defaultBannedRights,\n hasPinnedOrAudioMessage,\n pinnedMessagesCount,\n customBackground,\n theme,\n backgroundColor,\n patternColor,\n isLeftColumnShown,\n isRightColumnShown,\n isBackgroundBlurred,\n isMobileSearchActive,\n isSelectModeActive,\n isPaymentModalOpen,\n isReceiptModalOpen,\n animationLevel,\n shouldSkipHistoryAnimations,\n currentTransitionKey,\n openChat,\n unpinAllMessages,\n loadUser,\n closeLocalTextSearch,\n exitMessageSelectMode,\n closePaymentModal,\n clearReceipt,\n}) => {\n const { width: windowWidth } = useWindowSize();\n\n const lang = useLang();\n const [dropAreaState, setDropAreaState] = useState(DropAreaState.None);\n const [isFabShown, setIsFabShown] = useState();\n const [isNotchShown, setIsNotchShown] = useState();\n const [isUnpinModalOpen, setIsUnpinModalOpen] = useState(false);\n const [isReady, setIsReady] = useState(!IS_SINGLE_COLUMN_LAYOUT || animationLevel === ANIMATION_LEVEL_MIN);\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 renderingChatId = usePrevDuringAnimation(chatId, CLOSE_ANIMATION_DURATION);\n const renderingThreadId = usePrevDuringAnimation(threadId, CLOSE_ANIMATION_DURATION);\n const renderingMessageListType = usePrevDuringAnimation(messageListType, CLOSE_ANIMATION_DURATION);\n const renderingCanPost = usePrevDuringAnimation(canPost, CLOSE_ANIMATION_DURATION);\n const renderingHasTools = usePrevDuringAnimation(hasTools, CLOSE_ANIMATION_DURATION);\n const renderingIsFabShown = usePrevDuringAnimation(isFabShown, 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 setIsFabShown(undefined);\n setIsNotchShown(undefined);\n }, [chatId]);\n\n useEffect(() => {\n if (animationLevel === ANIMATION_LEVEL_MIN) {\n setIsReady(true);\n }\n }, [animationLevel]);\n\n // Fix for mobile virtual keyboard\n useEffect(() => {\n const { visualViewport } = window as any;\n if (!visualViewport) {\n return undefined;\n }\n\n const handleResize = () => {\n if (window.visualViewport.height !== document.documentElement.clientHeight) {\n document.body.classList.add('keyboard-visible');\n } else {\n document.body.classList.remove('keyboard-visible');\n }\n };\n\n visualViewport.addEventListener('resize', handleResize);\n\n return () => {\n visualViewport.removeEventListener('resize', handleResize);\n };\n }, []);\n\n const handleTransitionEnd = (e: React.TransitionEvent) => {\n if (e.propertyName === 'transform' && e.target === e.currentTarget) {\n setIsReady(Boolean(chatId));\n }\n };\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)\n // Filter unnecessary element for drag and drop images in Firefox (https://github.com/Ajaxy/telegram-tt/issues/49)\n // https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Recommended_drag_types#image\n .filter((item) => item.type !== 'text/uri-list')\n // As of September 2021, native clients suggest \"send quick, but compressed\" only for images\n .every(isImage);\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 handleTabletFocus = useCallback(() => {\n openChat({ id: chatId });\n }, [openChat, chatId]);\n\n const customBackgroundValue = useCustomBackground(theme, customBackground);\n\n const className = buildClassName(\n renderingHasTools && 'has-header-tools',\n customBackground && 'custom-bg-image',\n backgroundColor && 'custom-bg-color',\n customBackground && isBackgroundBlurred && 'blurred',\n MASK_IMAGE_DISABLED ? 'mask-image-disabled' : 'mask-image-enabled',\n );\n\n const messagingDisabledClassName = buildClassName(\n 'messaging-disabled',\n !isSelectModeActive && 'shown',\n );\n\n const messageSendingRestrictionReason = getMessageSendingRestrictionReason(\n lang, currentUserBannedRights, defaultBannedRights,\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 footerClassName = buildClassName(\n 'middle-column-footer',\n !renderingCanPost && 'no-composer',\n renderingCanPost && isNotchShown && !isSelectModeActive && 'with-notch',\n );\n\n const closeChat = () => {\n openChat({ id: undefined }, true);\n };\n\n useHistoryBack(renderingChatId && renderingThreadId,\n closeChat, undefined, undefined, undefined,\n messageLists ? messageLists.map(createMessageHash) : []);\n\n useHistoryBack(isMobileSearchActive, closeLocalTextSearch);\n useHistoryBack(isSelectModeActive, exitMessageSelectMode);\n\n const isMessagingDisabled = Boolean(!isPinnedMessageList && !renderingCanPost && messageSendingRestrictionReason);\n\n return (\n \n \n
\n {renderingChatId && renderingThreadId && (\n <>\n
\n \n \n {(isActive) => (\n <>\n \n
\n {renderingCanPost && (\n \n )}\n {isPinnedMessageList && (\n
\n \n \n {lang('Chat.Pinned.UnpinAll', pinnedMessagesCount, 'i')}\n \n
\n )}\n {isMessagingDisabled && (\n
\n
\n \n {messageSendingRestrictionReason}\n \n
\n
\n )}\n \n \n \n
\n \n )}\n \n\n \n
\n {IS_SINGLE_COLUMN_LAYOUT && }\n \n )}\n {chatId && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const theme = selectTheme(global);\n const {\n isBlurred: isBackgroundBlurred, background: customBackground, backgroundColor, patternColor,\n } = global.settings.themes[theme] || {};\n\n const { messageLists } = global.messages;\n const currentMessageList = selectCurrentMessageList(global);\n const { isLeftColumnShown, chats: { listIds } } = global;\n\n const state: StateProps = {\n theme,\n customBackground,\n backgroundColor,\n patternColor,\n isLeftColumnShown,\n isRightColumnShown: selectIsRightColumnShown(global),\n isBackgroundBlurred,\n isMobileSearchActive: Boolean(IS_SINGLE_COLUMN_LAYOUT && selectCurrentTextSearch(global)),\n isSelectModeActive: selectIsInSelectMode(global),\n isPaymentModalOpen: global.payment.isPaymentModalOpen,\n isReceiptModalOpen: Boolean(global.payment.receipt),\n animationLevel: global.settings.byKey.animationLevel,\n currentTransitionKey: Math.max(0, global.messages.messageLists.length - 1),\n };\n\n if (!currentMessageList || !listIds.active) {\n return state;\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 const isScheduledMessageList = messageListType === 'scheduled';\n\n return {\n ...state,\n chatId,\n threadId,\n messageListType,\n isPrivate: isUserId(chatId),\n canPost: !isPinnedMessageList && (!chat || canPost) && !isBotNotStarted,\n isPinnedMessageList,\n isScheduledMessageList,\n currentUserBannedRights: chat?.currentUserBannedRights,\n defaultBannedRights: chat?.defaultBannedRights,\n hasPinnedOrAudioMessage: (\n threadId !== MAIN_THREAD_ID\n || Boolean(pinnedIds?.length)\n || Boolean(audioChatId && audioMessageId)\n ),\n pinnedMessagesCount: pinnedIds ? pinnedIds.length : 0,\n shouldSkipHistoryAnimations: global.shouldSkipHistoryAnimations,\n messageLists,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat', 'unpinAllMessages', 'loadUser', 'closeLocalTextSearch', 'exitMessageSelectMode',\n 'closePaymentModal', 'clearReceipt',\n ]),\n)(MiddleColumn));\n","import { useEffect, useState } from '../lib/teact/teact';\n\nimport { ThemeKey } from '../types';\n\nimport { CUSTOM_BG_CACHE_NAME } from '../config';\nimport * as cacheApi from '../util/cacheApi';\nimport { preloadImage } from '../util/files';\n\nexport default (theme: ThemeKey, 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, theme, cacheApi.Type.Blob)\n .then((blob) => {\n const url = URL.createObjectURL(blob);\n preloadImage(url)\n .then(() => {\n setValue(`url(${url})`);\n });\n });\n }\n }, [settingValue, theme]);\n\n return settingValue ? value : undefined;\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_SINGLE_COLUMN_LAYOUT } 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 selectUser,\n} from '../../modules/selectors';\nimport {\n getCanAddContact,\n isChatAdmin,\n isChatChannel,\n isUserId,\n} from '../../modules/helpers';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\nimport useLang from '../../hooks/useLang';\n\nimport SearchInput from '../ui/SearchInput';\nimport Button from '../ui/Button';\nimport Transition from '../ui/Transition';\nimport './RightHeader.scss';\nimport { getDayStartAt } from '../../util/dateFormat';\n\ntype OwnProps = {\n chatId?: string;\n isColumnOpen?: boolean;\n isProfile?: boolean;\n isSearch?: boolean;\n isManagement?: boolean;\n isStickerSearch?: boolean;\n isGifSearch?: boolean;\n isPollResults?: boolean;\n isAddingChatMembers?: boolean;\n shouldSkipAnimation?: boolean;\n profileState?: ProfileState;\n managementScreen?: ManagementScreens;\n onClose: () => void;\n};\n\ntype StateProps = {\n canAddContact?: boolean;\n canManage?: boolean;\n isChannel?: boolean;\n userId?: string;\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 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 AddingMembers,\n}\n\nconst RightHeader: FC = ({\n isColumnOpen,\n isProfile,\n isSearch,\n isManagement,\n isStickerSearch,\n isGifSearch,\n isPollResults,\n isAddingChatMembers,\n profileState,\n managementScreen,\n canAddContact,\n userId,\n canManage,\n isChannel,\n onClose,\n messageSearchQuery,\n stickerSearchQuery,\n gifSearchQuery,\n setLocalTextSearchQuery,\n setStickerSearchQuery,\n setGifSearchQuery,\n searchTextMessagesLocal,\n toggleManagement,\n openHistoryCalendar,\n shouldSkipAnimation,\n addContact,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const backButtonRef = useRef(null);\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 handleStickerSearchQueryChange = useCallback((query: string) => {\n setStickerSearchQuery({ query });\n }, [setStickerSearchQuery]);\n\n const handleGifSearchQueryChange = useCallback((query: string) => {\n setGifSearchQuery({ query });\n }, [setGifSearchQuery]);\n\n const handleAddContact = useCallback(() => {\n addContact({ userId });\n }, [addContact, userId]);\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 ) : isAddingChatMembers ? (\n HeaderContent.AddingMembers\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 ) : 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 openHistoryCalendar({ selectedAt: getDayStartAt(Date.now()) })}\n ariaLabel=\"Search messages by date\"\n >\n \n \n \n );\n case HeaderContent.AddingMembers:\n return

{lang('GroupAddMembers')}

;\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.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

Profile

\n
\n {canAddContact && (\n \n \n \n )}\n {canManage && (\n \n \n \n )}\n
\n \n );\n }\n }\n\n const isBackButton = (\n IS_SINGLE_COLUMN_LAYOUT\n || contentKey === HeaderContent.SharedMedia\n || contentKey === HeaderContent.MemberList\n || contentKey === HeaderContent.AddingMembers\n || isManagement\n );\n\n const buttonClassName = buildClassName(\n 'animated-close-icon',\n isBackButton && 'state-back',\n (shouldSkipTransition || shouldSkipAnimation) && 'no-transition',\n );\n\n return (\n
\n \n
\n \n \n {renderHeaderContent}\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 const user = isProfile && chatId && isUserId(chatId) ? selectUser(global, chatId) : undefined;\n\n const canAddContact = user && getCanAddContact(user);\n const canManage = Boolean(\n !isManagement\n && isProfile\n && !canAddContact\n && chat\n && !selectIsChatWithSelf(global, chat.id)\n // chat.isCreator is for Basic Groups\n && (isUserId(chat.id) || ((isChatAdmin(chat) || chat.isCreator) && !chat.isNotJoined)),\n );\n\n return {\n canManage,\n canAddContact,\n isChannel,\n userId: user?.id,\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 'openHistoryCalendar',\n 'addContact',\n ]),\n)(RightHeader));\n","import { useMemo, useRef } from '../../../lib/teact/teact';\n\nimport {\n ApiChat, ApiChatMember, ApiMessage, ApiUser,\n} from '../../../api/types';\nimport { ProfileTabType, SharedMediaType } from '../../../types';\n\nimport { MEMBERS_SLICE, MESSAGE_SEARCH_SLICE, SHARED_MEDIA_SLICE } from '../../../config';\nimport { getMessageContentIds, sortChatIds, sortUserIds } from '../../../modules/helpers';\nimport useOnChange from '../../../hooks/useOnChange';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\n\nexport default function useProfileViewportIds(\n isRightColumnShown: boolean,\n loadMoreMembers: AnyToVoidFunction,\n loadCommonChats: AnyToVoidFunction,\n searchMessages: AnyToVoidFunction,\n tabType: ProfileTabType,\n mediaSearchType?: SharedMediaType,\n groupChatMembers?: ApiChatMember[],\n commonChatIds?: string[],\n usersById?: Record,\n chatsById?: Record,\n chatMessages?: Record,\n foundIds?: number[],\n chatId?: string,\n lastSyncTime?: number,\n serverTimeOffset = 0,\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 sortUserIds(groupChatMembers.map(({ userId }) => userId), usersById, undefined, serverTimeOffset);\n }, [groupChatMembers, serverTimeOffset, usersById]);\n\n const chatIds = useMemo(() => {\n if (!commonChatIds || !chatsById) {\n return undefined;\n }\n\n return sortChatIds(commonChatIds, chatsById, true);\n }, [chatsById, commonChatIds]);\n\n const [memberViewportIds, getMoreMembers, noProfileInfoForMembers] = useInfiniteScrollForLoadableItems(\n resultType, loadMoreMembers, lastSyncTime, memberIds,\n );\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 const [voiceViewportIds, getMoreVoices, noProfileInfoForVoices] = useInfiniteScrollForSharedMedia(\n 'voice', resultType, searchMessages, lastSyncTime, chatMessages, foundIds,\n );\n\n const [commonChatViewportIds, getMoreCommonChats, noProfileInfoForCommonChats] = useInfiniteScrollForLoadableItems(\n resultType, loadCommonChats, lastSyncTime, chatIds,\n );\n\n let viewportIds: number[] | string[] | undefined;\n let getMore: AnyToVoidFunction | undefined;\n let noProfileInfo = false;\n\n switch (resultType) {\n case 'members':\n viewportIds = memberViewportIds;\n getMore = getMoreMembers;\n noProfileInfo = noProfileInfoForMembers;\n break;\n case 'commonChats':\n viewportIds = commonChatViewportIds;\n getMore = getMoreCommonChats;\n noProfileInfo = noProfileInfoForCommonChats;\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 case 'voice':\n viewportIds = voiceViewportIds;\n getMore = getMoreVoices;\n noProfileInfo = noProfileInfoForVoices;\n break;\n }\n\n return [resultType, viewportIds, getMore, noProfileInfo] as const;\n}\n\nfunction useInfiniteScrollForLoadableItems(\n currentResultType?: ProfileTabType,\n handleLoadMore?: AnyToVoidFunction,\n lastSyncTime?: number,\n itemIds?: string[],\n) {\n const [viewportIds, getMore] = useInfiniteScroll(\n lastSyncTime ? handleLoadMore : undefined,\n itemIds,\n undefined,\n MEMBERS_SLICE,\n );\n\n const isOnTop = !viewportIds || !itemIds || viewportIds[0] === itemIds[0];\n\n return [viewportIds, getMore, !isOnTop] 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) {\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, {\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 ApiChat,\n MAIN_THREAD_ID,\n} from '../../api/types';\nimport { GlobalActions } from '../../global/types';\nimport {\n NewChatMembersProgress, ISettings, MediaViewerOrigin, ProfileState, ProfileTabType, SharedMediaType, AudioOrigin,\n} from '../../types';\n\nimport {\n MEMBERS_SLICE,\n PROFILE_SENSITIVE_AREA,\n SHARED_MEDIA_SLICE,\n SLIDE_TRANSITION_DURATION,\n} from '../../config';\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport {\n getHasAdminRight, isChatAdmin, isChatChannel, isChatGroup, isUserBot, isUserId,\n} from '../../modules/helpers';\nimport {\n selectChatMessages,\n selectChat,\n selectCurrentMediaSearch,\n selectIsRightColumnShown,\n selectTheme,\n selectActiveDownloadIds,\n selectUser,\n} from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../util/captureEvents';\nimport { getSenderName } from '../left/search/helpers/getSenderName';\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';\nimport useLang from '../../hooks/useLang';\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 ProfileInfo from '../common/ProfileInfo';\nimport Document from '../common/Document';\nimport Audio from '../common/Audio';\nimport ChatExtra from '../common/ChatExtra';\nimport Media from '../common/Media';\nimport WebLink from '../common/WebLink';\nimport NothingFound from '../common/NothingFound';\nimport FloatingActionButton from '../ui/FloatingActionButton';\nimport DeleteMemberModal from './DeleteMemberModal';\nimport GroupChatInfo from '../common/GroupChatInfo';\n\nimport './Profile.scss';\n\ntype OwnProps = {\n chatId: string;\n userId?: string;\n profileState: ProfileState;\n onProfileStateChange: (state: ProfileState) => void;\n};\n\ntype StateProps = {\n theme: ISettings['theme'];\n isChannel?: boolean;\n currentUserId?: string;\n resolvedUserId?: string;\n chatMessages?: Record;\n foundIds?: number[];\n mediaSearchType?: SharedMediaType;\n hasCommonChatsTab?: boolean;\n hasMembersTab?: boolean;\n areMembersHidden?: boolean;\n canAddMembers?: boolean;\n canDeleteMembers?: boolean;\n members?: ApiChatMember[];\n commonChatIds?: string[];\n chatsById: Record;\n usersById: Record;\n isRightColumnShown: boolean;\n isRestricted?: boolean;\n lastSyncTime?: number;\n serverTimeOffset: number;\n activeDownloadIds: 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 { type: 'voice', title: 'SharedVoiceTab2' },\n];\n\nconst HIDDEN_RENDER_DELAY = 1000;\n\nconst Profile: FC = ({\n chatId,\n profileState,\n onProfileStateChange,\n theme,\n isChannel,\n resolvedUserId,\n currentUserId,\n chatMessages,\n foundIds,\n mediaSearchType,\n hasCommonChatsTab,\n hasMembersTab,\n areMembersHidden,\n canAddMembers,\n canDeleteMembers,\n commonChatIds,\n members,\n usersById,\n chatsById,\n isRightColumnShown,\n isRestricted,\n lastSyncTime,\n activeDownloadIds,\n serverTimeOffset,\n setLocalMediaSearchType,\n loadMoreMembers,\n loadCommonChats,\n openChat,\n searchMediaMessagesLocal,\n openMediaViewer,\n openAudioPlayer,\n openUserInfo,\n focusMessage,\n loadProfilePhotos,\n setNewChatMembersDialogState,\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 const lang = useLang();\n const [activeTab, setActiveTab] = useState(0);\n const [deletingUserId, setDeletingUserId] = useState();\n\n const tabs = useMemo(() => ([\n ...(hasMembersTab ? [{\n type: 'members', title: isChannel ? 'ChannelSubscribers' : 'GroupMembers',\n }] : []),\n ...TABS,\n ...(hasCommonChatsTab ? [{\n type: 'commonChats', title: 'SharedGroupsTab2',\n }] : []),\n ]), [hasCommonChatsTab, hasMembersTab, isChannel]);\n const tabType = tabs[activeTab].type as ProfileTabType;\n\n const [resultType, viewportIds, getMore, noProfileInfo] = useProfileViewportIds(\n isRightColumnShown, loadMoreMembers, loadCommonChats, searchMediaMessagesLocal, tabType, mediaSearchType, members,\n commonChatIds, usersById, chatsById, chatMessages, foundIds, chatId, lastSyncTime, serverTimeOffset,\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 const handleNewMemberDialogOpen = useCallback(() => {\n setNewChatMembersDialogState(NewChatMembersProgress.InProgress);\n }, [setNewChatMembersDialogState]);\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 useEffect(() => {\n if (lastSyncTime) {\n loadProfilePhotos({ profileId });\n }\n }, [loadProfilePhotos, profileId, lastSyncTime]);\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: string) => {\n openUserInfo({ id });\n }, [openUserInfo]);\n\n const handleMessageFocus = useCallback((messageId: number) => {\n focusMessage({ chatId: profileId, messageId });\n }, [profileId, focusMessage]);\n\n const handleDeleteMembersModalClose = useCallback(() => {\n setDeletingUserId(undefined);\n }, []);\n\n useEffect(() => {\n if (!transitionRef.current || !IS_TOUCH_ENV) {\n return undefined;\n }\n\n return captureEvents(transitionRef.current, {\n selectorToPreventScroll: '.Profile',\n onSwipe: ((e, direction) => {\n if (direction === SwipeDirection.Left) {\n setActiveTab(Math.min(activeTab + 1, tabs.length - 1));\n return true;\n } else if (direction === SwipeDirection.Right) {\n setActiveTab(Math.max(0, activeTab - 1));\n return true;\n }\n\n return false;\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 getMemberContextAction(memberId: string) {\n return memberId === currentUserId || !canDeleteMembers ? undefined : [{\n title: lang('lng_context_remove_from_group'),\n icon: 'stop',\n handler: () => {\n setDeletingUserId(memberId);\n },\n }];\n }\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 'commonChats':\n text = lang('NoGroupsInCommon');\n break;\n case 'documents':\n text = lang('lng_media_file_empty');\n break;\n case 'links':\n text = lang('lng_media_link_empty');\n break;\n case 'audio':\n text = lang('lng_media_song_empty');\n break;\n case 'voice':\n text = lang('lng_media_audio_empty');\n break;\n default:\n text = lang('SharedMedia.EmptyTitle');\n }\n\n return (\n
\n \n
\n );\n }\n\n return (\n \n {resultType === 'media' ? (\n (viewportIds as number[])!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'documents' ? (\n (viewportIds as number[])!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'links' ? (\n (viewportIds as number[])!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'audio' ? (\n (viewportIds as number[])!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'voice' ? (\n (viewportIds as number[])!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'members' ? (\n (viewportIds as string[])!.map((id, i) => (\n handleMemberClick(id)}\n contextActions={getMemberContextAction(id)}\n >\n \n \n ))\n ) : resultType === 'commonChats' ? (\n (viewportIds as string[])!.map((id, i) => (\n openChat({ 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 {canAddMembers && (\n \n \n \n )}\n {canDeleteMembers && (\n \n )}\n \n );\n};\n\nfunction renderProfileInfo(chatId: string, resolvedUserId?: string) {\n return (\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 const { byId: chatsById } = global.chats;\n\n const isGroup = chat && isChatGroup(chat);\n const isChannel = chat && isChatChannel(chat);\n const hasMembersTab = isGroup || (isChannel && isChatAdmin(chat!));\n const members = chat?.fullInfo?.members;\n const areMembersHidden = hasMembersTab && chat && chat.fullInfo && !chat.fullInfo.canViewMembers;\n const canAddMembers = hasMembersTab && chat && (getHasAdminRight(chat, 'inviteUsers') || chat.isCreator);\n const canDeleteMembers = hasMembersTab && chat && (getHasAdminRight(chat, 'banUsers') || chat.isCreator);\n\n const activeDownloadIds = selectActiveDownloadIds(global, chatId);\n\n let hasCommonChatsTab;\n let resolvedUserId;\n let user;\n if (userId) {\n resolvedUserId = userId;\n } else if (isUserId(chatId)) {\n resolvedUserId = chatId;\n }\n if (resolvedUserId) {\n user = selectUser(global, resolvedUserId);\n hasCommonChatsTab = user && !user.isSelf && !isUserBot(user);\n }\n\n return {\n theme: selectTheme(global),\n isChannel,\n resolvedUserId,\n chatMessages,\n foundIds,\n mediaSearchType,\n hasCommonChatsTab,\n hasMembersTab,\n areMembersHidden,\n canAddMembers,\n canDeleteMembers,\n currentUserId: global.currentUserId,\n isRightColumnShown: selectIsRightColumnShown(global),\n isRestricted: chat?.isRestricted,\n lastSyncTime: global.lastSyncTime,\n serverTimeOffset: global.serverTimeOffset,\n activeDownloadIds,\n usersById,\n chatsById,\n ...(hasMembersTab && members && { members }),\n ...(hasCommonChatsTab && user && { commonChatIds: user.commonChats?.ids }),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalMediaSearchType',\n 'loadMoreMembers',\n 'searchMediaMessagesLocal',\n 'openMediaViewer',\n 'openAudioPlayer',\n 'openUserInfo',\n 'focusMessage',\n 'loadProfilePhotos',\n 'setNewChatMembersDialogState',\n 'loadCommonChats',\n 'openChat',\n ]),\n)(Profile));\n","import { useCallback, useEffect } from '../../../lib/teact/teact';\n\nexport default function useTransitionFixes(\n containerRef: { current: HTMLDivElement | null },\n transitionElSelector = '.Transition.shared-media-transition',\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(transitionElSelector);\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, transitionElSelector]);\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, memo } 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 memo(RightSearchAsync);\n","import React, { FC, memo } 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 memo(ManagementAsync);\n","import React, { FC, memo } 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 memo(StickerSearchAsync);\n","import React, { FC, memo } 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 memo(GifSearchAsync);\n","import React, { FC, memo } 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 memo(PollResultsAsync);\n","import React, {\n FC, useCallback, useMemo, memo, useState, useEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport {\n ApiChat, ApiChatMember, ApiUpdateConnectionStateType, ApiUser,\n} from '../../api/types';\nimport { NewChatMembersProgress } from '../../types';\n\nimport { pick, unique } from '../../util/iteratees';\nimport { selectChat } from '../../modules/selectors';\nimport searchWords from '../../util/searchWords';\nimport {\n getUserFullName, isChatChannel, isUserBot, sortChatIds,\n} from '../../modules/helpers';\nimport useLang from '../../hooks/useLang';\nimport usePrevious from '../../hooks/usePrevious';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Picker from '../common/Picker';\nimport FloatingActionButton from '../ui/FloatingActionButton';\nimport Spinner from '../ui/Spinner';\n\nimport './AddChatMembers.scss';\n\nexport type OwnProps = {\n chatId: string;\n isActive: boolean;\n onNextStep: (memberIds: string[]) => void;\n onClose: NoneToVoidFunction;\n};\n\ntype StateProps = {\n connectionState?: ApiUpdateConnectionStateType;\n isChannel?: boolean;\n members?: ApiChatMember[];\n currentUserId?: string;\n usersById: Record;\n chatsById: Record;\n localContactIds?: string[];\n searchQuery?: string;\n isLoading: boolean;\n isSearching?: boolean;\n localUserIds?: string[];\n globalUserIds?: string[];\n};\n\ntype DispatchProps = Pick;\n\nconst AddChatMembers: FC = ({\n isChannel,\n connectionState,\n members,\n onNextStep,\n currentUserId,\n usersById,\n chatsById,\n localContactIds,\n isLoading,\n searchQuery,\n isSearching,\n localUserIds,\n globalUserIds,\n setUserSearchQuery,\n onClose,\n isActive,\n loadContactList,\n}) => {\n const lang = useLang();\n const [selectedMemberIds, setSelectedMemberIds] = useState([]);\n const prevSelectedMemberIds = usePrevious(selectedMemberIds);\n const noPickerScrollRestore = prevSelectedMemberIds === selectedMemberIds;\n\n useEffect(() => {\n if (isActive && connectionState === 'connectionStateReady') {\n loadContactList();\n }\n }, [connectionState, isActive, loadContactList]);\n\n useHistoryBack(isActive, onClose);\n\n const memberIds = useMemo(() => {\n return members ? members.map((member) => member.userId) : [];\n }, [members]);\n\n const handleFilterChange = useCallback((query: string) => {\n setUserSearchQuery({ query });\n }, [setUserSearchQuery]);\n\n const displayedIds = useMemo(() => {\n const contactIds = localContactIds\n ? sortChatIds(localContactIds.filter((id) => id !== currentUserId), chatsById)\n : [];\n\n if (!searchQuery) {\n return contactIds.filter((id) => !memberIds.includes(id));\n }\n\n const foundContactIds = 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 sortChatIds(\n unique([\n ...foundContactIds,\n ...(localUserIds || []),\n ...(globalUserIds || []),\n ]).filter((contactId) => {\n const user = usersById[contactId];\n\n // The user can be added to the chat if the following conditions are met:\n // the user has not yet been added to the current chat\n // AND (it is not found (user from global search) OR it is not a bot OR it is a bot,\n // but the current chat is not a channel AND the appropriate permission is set).\n return !memberIds.includes(contactId)\n && (!user || !isUserBot(user) || (!isChannel && user.canBeInvitedToGroup));\n }),\n chatsById,\n );\n }, [\n localContactIds, chatsById, searchQuery, localUserIds, globalUserIds,\n currentUserId, usersById, memberIds, isChannel,\n ]);\n\n const handleNextStep = useCallback(() => {\n if (selectedMemberIds.length) {\n setUserSearchQuery({ query: '' });\n onNextStep(selectedMemberIds);\n }\n }, [selectedMemberIds, setUserSearchQuery, onNextStep]);\n\n return (\n
\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 { userIds: localContactIds } = global.contactList || {};\n const { byId: usersById } = global.users;\n const { byId: chatsById } = global.chats;\n const { currentUserId, newChatMembersProgress, connectionState } = global;\n const isChannel = chat && isChatChannel(chat);\n\n const {\n query: searchQuery,\n fetchingStatus,\n globalUserIds,\n localUserIds,\n } = global.userSearch;\n\n return {\n isChannel,\n members: chat?.fullInfo?.members,\n currentUserId,\n usersById,\n chatsById,\n localContactIds,\n searchQuery,\n isSearching: fetchingStatus,\n isLoading: newChatMembersProgress === NewChatMembersProgress.Loading,\n globalUserIds,\n localUserIds,\n connectionState,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadContactList', 'setUserSearchQuery']),\n)(AddChatMembers));\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 {\n ManagementScreens, NewChatMembersProgress, ProfileState, RightColumnContent,\n} 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';\nimport useHistoryBack from '../../hooks/useHistoryBack';\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 StickerSearch from './StickerSearch.async';\nimport GifSearch from './GifSearch.async';\nimport PollResults from './PollResults.async';\nimport AddChatMembers from './AddChatMembers';\n\nimport './RightColumn.scss';\n\ntype StateProps = {\n contentKey?: RightColumnContent;\n chatId?: string;\n threadId?: number;\n currentProfileUserId?: string;\n isChatSelected: boolean;\n shouldSkipHistoryAnimations?: 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 openUserInfo,\n closeLocalTextSearch,\n setStickerSearchQuery,\n setGifSearchQuery,\n closePollResults,\n addChatMembers,\n setNewChatMembersDialogState,\n shouldSkipHistoryAnimations,\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 isStickerSearch = contentKey === RightColumnContent.StickerSearch;\n const isGifSearch = contentKey === RightColumnContent.GifSearch;\n const isPollResults = contentKey === RightColumnContent.PollResults;\n const isAddingChatMembers = contentKey === RightColumnContent.AddingMembers;\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((shouldScrollUp = true) => {\n switch (contentKey) {\n case RightColumnContent.AddingMembers:\n setNewChatMembersDialogState(NewChatMembersProgress.Closed);\n break;\n case RightColumnContent.ChatInfo:\n if (isScrolledDown && shouldScrollUp) {\n setProfileState(ProfileState.Profile);\n break;\n }\n toggleChatInfo(undefined, true);\n break;\n case RightColumnContent.UserInfo:\n if (isScrolledDown && shouldScrollUp) {\n setProfileState(ProfileState.Profile);\n break;\n }\n openUserInfo({ id: undefined }, true);\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.Search: {\n blurSearchInput();\n closeLocalTextSearch();\n break;\n }\n case RightColumnContent.StickerSearch:\n blurSearchInput();\n setStickerSearchQuery({ query: undefined });\n break;\n case RightColumnContent.GifSearch: {\n blurSearchInput();\n setGifSearchQuery({ query: undefined });\n break;\n }\n case RightColumnContent.PollResults:\n closePollResults();\n break;\n }\n }, [\n contentKey, isScrolledDown, toggleChatInfo, openUserInfo, closePollResults, setNewChatMembersDialogState,\n managementScreen, toggleManagement, closeLocalTextSearch, setStickerSearchQuery, setGifSearchQuery,\n ]);\n\n const handleSelectChatMember = useCallback((memberId, isPromoted) => {\n setSelectedChatMemberId(memberId);\n setIsPromotedByCurrentUser(isPromoted);\n }, []);\n\n const handleAppendingChatMembers = useCallback((memberIds: string[]) => {\n addChatMembers({ chatId, memberIds });\n }, [addChatMembers, chatId]);\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 useHistoryBack(isChatSelected && (contentKey === RightColumnContent.ChatInfo\n || contentKey === RightColumnContent.UserInfo || contentKey === RightColumnContent.Management\n || contentKey === RightColumnContent.AddingMembers),\n () => close(false), toggleChatInfo);\n\n // eslint-disable-next-line consistent-return\n function renderContent(isActive: boolean) {\n if (renderingContentKey === -1) {\n return undefined;\n }\n\n switch (renderingContentKey) {\n case RightColumnContent.AddingMembers:\n return (\n \n );\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\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 shouldSkipHistoryAnimations: global.shouldSkipHistoryAnimations,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openUserInfo',\n 'toggleChatInfo',\n 'toggleManagement',\n 'closeLocalTextSearch',\n 'setStickerSearchQuery',\n 'setGifSearchQuery',\n 'closePollResults',\n 'addChatMembers',\n 'setNewChatMembersDialogState',\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","export default function download(url: string, filename: string) {\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n try {\n link.click();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err); // Suppress redundant \"Blob loading failed\" error popup on IOS\n }\n}\n","import { FC, memo, useEffect } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, Thread } from '../../global/types';\nimport { ApiMediaFormat, ApiMessage } from '../../api/types';\n\nimport * as mediaLoader from '../../util/mediaLoader';\nimport download from '../../util/download';\nimport {\n getMessageContentFilename, getMessageMediaHash,\n} from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\n\ntype StateProps = {\n activeDownloads: Record;\n messages: Record;\n threadsById: Record;\n }>;\n};\n\ntype DispatchProps = Pick;\n\nconst startedDownloads = new Set();\n\nconst DownloadManager: FC = ({\n activeDownloads,\n messages,\n cancelMessageMediaDownload,\n}) => {\n useEffect(() => {\n Object.entries(activeDownloads).forEach(([chatId, messageIds]) => {\n const activeMessages = messageIds.map((id) => messages[Number(chatId)].byId[id]);\n activeMessages.forEach((message) => {\n const downloadHash = getMessageMediaHash(message, 'download');\n if (!downloadHash) {\n cancelMessageMediaDownload({ message });\n return;\n }\n\n if (!startedDownloads.has(downloadHash)) {\n const mediaData = mediaLoader.getFromMemory(downloadHash);\n if (mediaData) {\n startedDownloads.delete(downloadHash);\n download(mediaData, getMessageContentFilename(message));\n cancelMessageMediaDownload({ message });\n return;\n }\n\n mediaLoader.fetch(downloadHash, ApiMediaFormat.BlobUrl, true).then((result) => {\n startedDownloads.delete(downloadHash);\n if (result) {\n download(result, getMessageContentFilename(message));\n }\n cancelMessageMediaDownload({ message });\n });\n\n startedDownloads.add(downloadHash);\n }\n });\n });\n }, [\n cancelMessageMediaDownload,\n messages,\n activeDownloads,\n ]);\n\n return undefined;\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const activeDownloads = global.activeDownloads.byChatId;\n const messages = global.messages.byChatId;\n return {\n activeDownloads,\n messages,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['cancelMessageMediaDownload']),\n)(DownloadManager));\n","import React, { FC, memo } 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 memo(NotificationsAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst DialogsAsync: FC = ({ isOpen }) => {\n const Dialogs = useModuleLoader(Bundles.Extra, 'Dialogs', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Dialogs ? : undefined;\n};\n\nexport default memo(DialogsAsync);\n","import React, { FC, memo } 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 memo(ForwardPickerAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport { OwnProps } from './SafeLinkModal';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst SafeLinkModalAsync: FC = (props) => {\n const { url } = props;\n const SafeLinkModal = useModuleLoader(Bundles.Extra, 'SafeLinkModal', !url);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return SafeLinkModal ? : undefined;\n};\n\nexport default memo(SafeLinkModalAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport { OwnProps } from './HistoryCalendar';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst HistoryCalendarAsync: FC = (props) => {\n const { isOpen } = props;\n const HistoryCalendar = useModuleLoader(Bundles.Extra, 'HistoryCalendar', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return HistoryCalendar ? : undefined;\n};\n\nexport default memo(HistoryCalendarAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport { Bundles } from '../../../util/moduleLoader';\nimport { OwnProps } from './GroupCall';\n\nconst GroupCallAsync: FC = (props) => {\n const { groupCallId } = props;\n const GroupCall = useModuleLoader(Bundles.Calls, 'GroupCall', !groupCallId);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return GroupCall ? : undefined;\n};\n\nexport default memo(GroupCallAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport { Bundles } from '../../util/moduleLoader';\n\ntype OwnProps = {\n groupCallId?: string;\n};\n\nconst ActiveCallHeaderAsync: FC = (props) => {\n const { groupCallId } = props;\n const ActiveCallHeader = useModuleLoader(Bundles.Calls, 'ActiveCallHeader', !groupCallId);\n\n return ActiveCallHeader ? : undefined;\n};\n\nexport default memo(ActiveCallHeaderAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport { Bundles } from '../../util/moduleLoader';\n\ntype OwnProps = {\n isOpen: boolean;\n};\n\nconst CallFallbackConfirmAsync: FC = ({ isOpen }) => {\n const CallFallbackConfirm = useModuleLoader(Bundles.Calls, 'CallFallbackConfirm', !isOpen);\n\n return CallFallbackConfirm ? : undefined;\n};\n\nexport default memo(CallFallbackConfirmAsync);\n","import React, {\n FC, useEffect, memo, useCallback,\n} from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { LangCode } from '../../types';\nimport { GlobalActions } from '../../global/types';\nimport { ApiMessage } from '../../api/types';\n\nimport '../../modules/actions/all';\nimport {\n BASE_EMOJI_KEYWORD_LANG, DEBUG, INACTIVE_MARKER, PAGE_TITLE,\n} from '../../config';\nimport { pick } from '../../util/iteratees';\nimport {\n selectChatMessage,\n selectCountNotMutedUnread,\n selectIsForwardModalOpen,\n selectIsMediaViewerOpen,\n selectIsRightColumnShown,\n selectIsServiceChatReady,\n} from '../../modules/selectors';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport buildClassName from '../../util/buildClassName';\nimport { fastRaf } from '../../util/schedulers';\nimport { waitForTransitionEnd } from '../../util/cssAnimationEndListeners';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useBackgroundMode from '../../hooks/useBackgroundMode';\nimport useBeforeUnload from '../../hooks/useBeforeUnload';\nimport useOnChange from '../../hooks/useOnChange';\nimport usePreventPinchZoomGesture from '../../hooks/usePreventPinchZoomGesture';\nimport { processDeepLink } from '../../util/deeplink';\nimport { LOCATION_HASH } from '../../hooks/useHistoryBack';\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 DownloadManager from './DownloadManager';\nimport Notifications from './Notifications.async';\nimport Dialogs from './Dialogs.async';\nimport ForwardPicker from './ForwardPicker.async';\nimport SafeLinkModal from './SafeLinkModal.async';\nimport HistoryCalendar from './HistoryCalendar.async';\nimport StickerSetModal from '../common/StickerSetModal.async';\nimport GroupCall from '../calls/group/GroupCall.async';\nimport ActiveCallHeader from '../calls/ActiveCallHeader.async';\nimport CallFallbackConfirm from '../calls/CallFallbackConfirm.async';\n\nimport './Main.scss';\n\ntype StateProps = {\n lastSyncTime?: number;\n isLeftColumnShown: boolean;\n isRightColumnShown: boolean;\n isMediaViewerOpen: boolean;\n isForwardModalOpen: boolean;\n hasNotifications: boolean;\n hasDialogs: boolean;\n audioMessage?: ApiMessage;\n safeLinkModalUrl?: string;\n isHistoryCalendarOpen: boolean;\n shouldSkipHistoryAnimations?: boolean;\n openedStickerSetShortName?: string;\n activeGroupCallId?: string;\n isServiceChatReady?: boolean;\n animationLevel: number;\n language?: LangCode;\n wasTimeFormatSetManually?: boolean;\n isCallFallbackConfirmOpen: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst NOTIFICATION_INTERVAL = 1000;\n\nlet notificationInterval: number | undefined;\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nlet DEBUG_isLogged = false;\n\nconst Main: FC = ({\n lastSyncTime,\n isLeftColumnShown,\n isRightColumnShown,\n isMediaViewerOpen,\n isForwardModalOpen,\n hasNotifications,\n hasDialogs,\n audioMessage,\n activeGroupCallId,\n safeLinkModalUrl,\n isHistoryCalendarOpen,\n shouldSkipHistoryAnimations,\n openedStickerSetShortName,\n isServiceChatReady,\n animationLevel,\n language,\n wasTimeFormatSetManually,\n isCallFallbackConfirmOpen,\n loadAnimatedEmojis,\n loadNotificationSettings,\n loadNotificationExceptions,\n updateIsOnline,\n loadTopInlineBots,\n loadEmojiKeywords,\n loadCountryList,\n ensureTimeFormat,\n openStickerSetShortName,\n checkVersionNotification,\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 updateIsOnline(true);\n loadAnimatedEmojis();\n loadNotificationSettings();\n loadNotificationExceptions();\n loadTopInlineBots();\n\n loadEmojiKeywords({ language: BASE_EMOJI_KEYWORD_LANG });\n if (language !== BASE_EMOJI_KEYWORD_LANG) {\n loadEmojiKeywords({ language });\n }\n\n loadCountryList({ langCode: language });\n }\n }, [\n lastSyncTime, loadAnimatedEmojis, loadNotificationExceptions, loadNotificationSettings, updateIsOnline,\n loadTopInlineBots, loadEmojiKeywords, loadCountryList, language,\n ]);\n\n useEffect(() => {\n if (lastSyncTime && isServiceChatReady) {\n checkVersionNotification();\n }\n }, [lastSyncTime, isServiceChatReady, checkVersionNotification]);\n\n useEffect(() => {\n if (lastSyncTime && !wasTimeFormatSetManually) {\n ensureTimeFormat();\n }\n }, [lastSyncTime, wasTimeFormatSetManually, ensureTimeFormat]);\n\n useEffect(() => {\n if (lastSyncTime && LOCATION_HASH.startsWith('#?tgaddr=')) {\n processDeepLink(decodeURIComponent(LOCATION_HASH.substr('#?tgaddr='.length)));\n }\n }, [lastSyncTime]);\n\n const {\n transitionClassNames: middleColumnTransitionClassNames,\n } = useShowTransition(!isLeftColumnShown, undefined, true, undefined, shouldSkipHistoryAnimations);\n\n const {\n transitionClassNames: rightColumnTransitionClassNames,\n } = useShowTransition(isRightColumnShown, undefined, true, undefined, shouldSkipHistoryAnimations);\n\n const className = buildClassName(\n middleColumnTransitionClassNames.replace(/([\\w-]+)/g, 'middle-column-$1'),\n rightColumnTransitionClassNames.replace(/([\\w-]+)/g, 'right-column-$1'),\n shouldSkipHistoryAnimations && 'history-animation-disabled',\n );\n\n // Dispatch heavy transition event when opening middle column\n useOnChange(([prevIsLeftColumnShown]) => {\n if (prevIsLeftColumnShown === undefined || animationLevel === 0) {\n return;\n }\n\n const dispatchHeavyAnimationEnd = dispatchHeavyAnimationEvent();\n\n waitForTransitionEnd(document.getElementById('MiddleColumn')!, dispatchHeavyAnimationEnd);\n }, [isLeftColumnShown]);\n\n // Dispatch heavy transition event and add body class when opening right column\n useOnChange(([prevIsRightColumnShown]) => {\n if (prevIsRightColumnShown === undefined || animationLevel === 0) {\n return;\n }\n\n fastRaf(() => {\n document.body.classList.add('animating-right-column');\n });\n\n const dispatchHeavyAnimationEnd = dispatchHeavyAnimationEvent();\n\n waitForTransitionEnd(document.getElementById('RightColumn')!, () => {\n dispatchHeavyAnimationEnd();\n\n fastRaf(() => {\n document.body.classList.remove('animating-right-column');\n });\n });\n }, [isRightColumnShown]);\n\n const handleBlur = useCallback(() => {\n updateIsOnline(false);\n\n const initialUnread = selectCountNotMutedUnread(getGlobal());\n let index = 0;\n\n clearInterval(notificationInterval);\n notificationInterval = window.setInterval(() => {\n if (document.title.includes(INACTIVE_MARKER)) {\n updateIcon(false);\n return;\n }\n\n if (index % 2 === 0) {\n const newUnread = selectCountNotMutedUnread(getGlobal()) - initialUnread;\n if (newUnread > 0) {\n updatePageTitle(`${newUnread} notification${newUnread > 1 ? 's' : ''}`);\n updateIcon(true);\n }\n } else {\n updatePageTitle(PAGE_TITLE);\n updateIcon(false);\n }\n\n index++;\n }, NOTIFICATION_INTERVAL);\n }, [updateIsOnline]);\n\n const handleFocus = useCallback(() => {\n updateIsOnline(true);\n\n clearInterval(notificationInterval);\n notificationInterval = undefined;\n\n if (!document.title.includes(INACTIVE_MARKER)) {\n updatePageTitle(PAGE_TITLE);\n }\n\n updateIcon(false);\n }, [updateIsOnline]);\n\n const handleStickerSetModalClose = useCallback(() => {\n openStickerSetShortName({ stickerSetShortName: undefined });\n }, [openStickerSetShortName]);\n\n // Online status and browser tab indicators\n useBackgroundMode(handleBlur, handleFocus);\n useBeforeUnload(handleBlur);\n\n usePreventPinchZoomGesture(isMediaViewerOpen);\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 {activeGroupCallId && (\n <>\n \n \n \n )}\n \n \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\n// For some reason setting `document.title` to the same value\n// causes increment of Chrome Dev Tools > Performance Monitor > DOM Nodes counter\nfunction updatePageTitle(nextTitle: string) {\n if (document.title !== nextTitle) {\n document.title = nextTitle;\n }\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { settings: { byKey: { animationLevel, language, wasTimeFormatSetManually } } } = global;\n const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n const audioMessage = audioChatId && audioMessageId\n ? selectChatMessage(global, audioChatId, audioMessageId)\n : undefined;\n\n return {\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 hasDialogs: Boolean(global.dialogs.length),\n audioMessage,\n safeLinkModalUrl: global.safeLinkModalUrl,\n isHistoryCalendarOpen: Boolean(global.historyCalendarSelectedAt),\n shouldSkipHistoryAnimations: global.shouldSkipHistoryAnimations,\n openedStickerSetShortName: global.openedStickerSetShortName,\n isServiceChatReady: selectIsServiceChatReady(global),\n activeGroupCallId: global.groupCalls.activeGroupCallId,\n animationLevel,\n language,\n wasTimeFormatSetManually,\n isCallFallbackConfirmOpen: Boolean(global.groupCalls.isFallbackConfirmOpen),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadAnimatedEmojis', 'loadNotificationSettings', 'loadNotificationExceptions', 'updateIsOnline',\n 'loadTopInlineBots', 'loadEmojiKeywords', 'openStickerSetShortName', 'loadCountryList', 'ensureTimeFormat',\n 'checkVersionNotification',\n ]),\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"],"names":["closeLocalTextSearch","global","chatId","threadId","selectCurrentMessageList","updateLocalTextSearch","replaceLocalTextSearchResults","undefined","addReducer","actions","payload","query","chatThreadKey","buildChatThreadKey","currentQuery","localTextSearch","byChatThreadKey","MEMO_EMPTY_ARRAY","mediaType","updateLocalMediaSearchType","id","type","shouldReplaceHistory","currentMessageList","replaceThreadParam","exitMessageSelectMode","messages","contentToBeScheduled","forwardMessages","toChatId","setGlobal","updateCurrentMessageList","isChatInfoShown","openChat","chatCreation","newChatMembersProgress","targetIndexDelta","orderedIds","position","indexOf","nextId","FOCUS_NO_HIGHLIGHT_DURATION","FAST_SMOOTH_MAX_DURATION","ANIMATION_END_DELAY","blurTimeout","scrollOffset","messageId","paramName","chatMessages","selectChatMessages","viewportIds","selectViewportIds","lastOwnEditableMessageId","findLast","Boolean","selectAllowedMessageActions","canEdit","replyingToId","selectReplyingToId","selectIsViewportNewest","chatMessageKeys","Object","keys","newIndex","toString","length","Number","MAIN_THREAD_ID","chat","selectChat","lastMessage","threadInfo","selectThreadInfo","lastMessageId","setReplyingToId","focusMessage","avatarOwnerId","profilePhotoIndex","origin","mediaViewer","volume","playbackRate","isMuted","audioPlayer","selectIsRightColumnShown","pollResults","voters","window","setTimeout","newGlobal","getGlobal","noHighlight","replyStack","selectReplyStack","pop","focusLastMessage","messageListType","groupedId","groupedChatId","replyMessageId","isResizingContainer","ids","selectForwardedMessageIdsByGroupId","shouldSwitchChat","clearTimeout","updateFocusedMessage","updateFocusDirection","FocusDirection","includes","direction","loadViewportMessages","fromChatId","messageIds","groupedMessageIds","selectMessageIdsByGroupId","isModalShown","closeMediaViewer","selectedMessages","openForwardMenu","message","byChatId","activeDownloads","filter","map","canDownload","forEach","downloadMessageMedia","selectCurrentChat","enterMessageSelectMode","childMessageIds","withShift","toggleMessageSelection","shouldShowContextMenuHint","disableContextMenuHint","showNotification","IS_TOUCH_ENV","isPollModalOpen","currentVersion","APP_VERSION","slice","join","serviceNotifications","find","version","SERVICE_NOTIFICATIONS_USER_ID","date","getServerTime","serverTimeOffset","content","text","parseMessageInput","isOutgoing","createServiceNotification","serviceChat","maxId","Math","max","fractionalPart","floor","serviceNotification","isUnread","apiUpdate","globalSearch","updateGlobalSearch","globalResults","localResults","resultsByType","fetchingStatus","chats","recentlyFoundChatIds","newRecentIds","unshift","updateGlobalSearchContent","stickers","search","resultIds","gifs","offsetId","results","updateSelectedUserId","updateUserSearch","globalUserIds","localUserIds","leftColumnWidth","management","isActive","IS_SINGLE_COLUMN_LAYOUT","IS_TABLET_COLUMN_LAYOUT","isLeftColumnShown","messageLists","action","emoji","recentEmojis","newEmojis","e","sticker","recent","hash","newStickers","s","notification","localId","generateIdFor","newNotifications","notifications","existingNotificationIndex","findIndex","n","splice","push","data","hasErrorKey","getReadableErrorText","newDialogs","dialogs","existingErrorIndex","err","url","safeLinkModalUrl","selectedAt","historyCalendarSelectedAt","payment","isPaymentModalOpen","clearPayment","closeInvoice","error","uploadProgressCallbacks","Map","runDebouncedForMarkRead","debounce","cb","async","isOutlying","isBudgetPreload","addOffset","LoadMoreDirection","round","MESSAGE_LIST_SLICE","result","callApi","selectThreadOriginChat","limit","users","threadInfos","localMessages","allMessages","concat","byId","buildCollectionByKey","addChatMessagesById","updateOutlyingIds","updateListedIds","addUsers","addChats","updateThreadInfos","listedIds","selectListedIds","outlyingIds","selectOutlyingIds","areSortedArraysIntersecting","historyIds","newViewportIds","getViewportSlice","safeReplaceViewportIds","sourceIds","index","i","findClosestIndex","indexForDirection","from","to","areSomeLocal","areAllLocal","sendMessage","params","progressCallback","attachment","progress","messageLocalId","has","set","fileUploads","byMessageLocalId","replyingTo","IS_IOS","rafPromise","selectThreadTopMessageId","delete","isRestricted","Promise","resolve","loadWithBudget","selectFocusedMessageId","selectRealLastReadId","replyOriginForId","threadUpdate","MESSAGE_DELETED","replyMessage","selectChatMessage","updateChatMessage","replyToMessageId","loadMessage","isDeleting","updateThreadUnreadFromForwardedMessage","scheduledAt","clearWebPagePreview","value","noWebPage","selectNoWebPage","isSingle","attachments","isGrouped","restParams","entities","commonParams","groupedAttachments","split","MAX_MEDIA_FILES_FOR_ALBUM","firstAttachment","restAttachments","Date","now","selectEditingMessage","setEditingId","get","previousLocalId","cancelApiProgress","draft","replyToMsgId","updateChat","draftDate","localOnly","selectDraft","isUnpin","isOneSide","isSilent","unpinAllMessages","shouldDeleteForAll","editingId","selectEditingId","selectEditingScheduledId","activeChat","reason","description","peer","minId","selectFirstUnreadId","unreadCount","readCount","count","l","countSortedIds","lastReadInboxMessageId","webPagePreview","loadWebPagePreview","options","option","offset","shouldResetVoters","unique","user","offsets","nextOffset","loadPollOptionResults","fromChat","toChat","sort","a","b","realMessages","m","isServiceNotificationMessage","poll","replaceScheduledMessages","loadScheduledHistory","selectScheduledMessage","loadPinnedMessages","searchThrottled","throttle","searchGifs","updateGifSearch","added","addedStickers","updateStickerSets","sets","loadStickerSets","setIds","addedSetIds","loadStickers","stickerSetId","pause","recentStickers","loadRecentStickers","favorite","favoriteStickers","loadFavoriteStickers","greeting","featured","featuredStickers","loadFeaturedStickers","stickerSetShortName","stickerSetAccessHash","stickerSet","selectStickerSet","accessHash","packs","updateStickerSet","currentEmoji","forEmoji","rebuildStickersForEmoji","replaceAnimatedEmojis","loadAnimatedEmojis","saved","savedGifs","loadSavedGifs","unfave","unfaveSticker","installedDate","language","currentEmojiKeywords","emojiKeywords","isLoading","fromVersion","keywords","searchStickers","setsById","title","searchWords","updateStickersForEmoji","loadStickersForEmoji","openedStickerSetShortName","searchMessagesGlobal","offsetRate","maxDate","minDate","localResult","chatOrUser","GLOBAL_SEARCH_SLICE","totalCount","nextOffsetId","nextRate","currentSearchQuery","selectCurrentGlobalSearchQuery","updateGlobalSearchFetchingStatus","addMessages","updateGlobalSearchResults","localChats","localUsers","globalChats","globalUsers","chatIds","userIds","searchChats","timestampPlusDay","foundIds","currentSearch","selectCurrentTextSearch","topMessageId","MESSAGE_SEARCH_SLICE","newFoundIds","updateLocalTextSearchResults","searchTextMessages","peerId","selectCurrentMediaSearchPeerId","selectCurrentMediaSearch","currentType","currentResults","SHARED_MEDIA_SLICE","updateLocalMediaSearchResults","searchSharedMedia","timestamp","getDispatch","searchMessagesByDate","ManagementProgress","username","updateManagementProgress","updateManagement","isUsernameAvailable","isChatBasicGroup","loadAndReplaceArchivedChats","CHAT_LIST_LOAD_SLICE","archived","withPinned","updateUsers","updateChats","replaceChatListIds","updateChatListSecondaryInfo","loadAndUpdateUsers","contactIds","contactList","selectUser","updatedUsers","loadTopMessages","afterSyncCallback","DEBUG","console","log","savedUsers","lastLocalServiceMessage","selectLastServiceNotification","currentUserId","savedPrivateChatIds","savedChats","currentChatId","selectedChat","isUserId","selectedChatUser","replaceChats","draftsById","replyingToById","loadAndReplaceChats","areMessagesLoaded","currentThreadId","draftsByChatId","reduce","acc","newCurrentChatId","currentMessageListInfo","originChannelId","currentMessageListInfoOrigin","resultOrigin","byIdOrigin","listedIdsOrigin","threadsById","Array","prototype","replaceUsers","audioChatId","audioMessageId","closeAudioPlayer","loadAndReplaceMessages","lastSyncTime","sync","afterSync","all","updateAppBadge","selectCountNotMutedUnread","runDebouncedForFetchFullUser","runThrottledForSearch","replaceInlineBotSettings","inlineBotSettings","inlineBots","byUsername","replaceInlineBotsIsLoading","userId","topPeers","lastRequestedAt","loadTopUsers","getCompareString","lastName","firstName","collator","Intl","Collator","sortedUsers","compare","isSelf","loadContactList","isUserBot","commonChats","isFullyLoaded","updateUser","updateChatMutedState","phoneNumber","phone","updateContact","deleteUser","profileId","isPrivate","photos","userSearch","updateUserSearchFetchingStatus","searchUsers","pick","runDebouncedForSearch","sendBotCommand","command","button","match","RE_TME_LINK","RE_TG_LINK","openTelegramLink","toggleSafeLinkModal","showDialog","alert","isError","answerCallbackButton","openPollModal","getReceipt","receiptMessageId","getPaymentForm","setInvoiceMessageInfo","openPaymentModal","bot","selectChatBot","removeBlockedContact","topInlineBots","inlineBotData","inlineBot","switchPm","canLoadMore","shouldReplaceSettings","newInlineBotData","currentIds","Set","newResults","help","isGallery","searchInlineBot","queryId","resultId","botId","param","startParam","replaceSettings","hasPassword","updateTwoFaSettings","hint","currentPassword","onSuccess","isSuccess","password","email","waitingEmailCodeLength","code","requestInfo","saveInfo","selectPaymentChatId","selectPaymentMessageId","shouldSave","shippingOptions","setRequestInfoId","updateShippingOptions","setPaymentStep","PaymentStep","validateRequestedInfo","setPaymentForm","step","invoice","shippingAddressRequested","nameRequested","phoneRequested","emailRequested","setReceipt","receipt","publishableKey","selectProviderPublishableKey","credentials","k","buildQueryString","cardNumber","expiryMonth","expiryYear","cvv","zip","country","response","fetch","method","headers","Authorization","json","getStripeError","setStripeCardInfo","sendStripeCredentials","shippingOptionId","saveCredentials","formId","selectPaymentFormId","requestInfoId","selectPaymentRequestId","stripeCredentials","selectStripeCredentials","requestedInfoId","sendPaymentForm","save","runThrottledForUpdateAppBadge","update","noTopChatsRequest","selectIsChatListed","loadTopChats","newProfilePhoto","closeMessageNotifications","listType","selectChatListType","updateChatListIds","isNotJoined","requestChatUpdate","leaveChat","typingStatus","senderId","isFromScheduled","hasUnreadMention","unreadMentionsCount","notifyAboutNewMessage","messageUpdate","channelId","selectCommonBoxChatId","fullInfo","targetChat","folderId","ARCHIVED_FOLDER_ID","orderedPinnedIds","isPinned","newOrderedPinnedIds","MAX_ACTIVE_PINNED_CHATS","listIds","active","pinnedId","updateChatListType","folder","chatFoldersById","chatFolders","newChatFoldersById","newOrderedIds","orderedId","folders","recommended","replacedMembers","addedMember","deletedMemberId","shouldUpdate","members","some","deleteIndex","adminMembers","isOwner","isAdmin","membersCount","photo","formattedText","ANIMATION_DELAY","updateWithLocalMedia","isScheduled","currentMessage","video","document","getMessageContent","blobUrl","thumbnail","isPreloadedGlobally","previewBlobUrl","updateScheduledMessage","updateThreadUnread","selectThreadByMessage","originMessage","updateListedAndViewportIds","firstMessageId","isUnreadChatNotLoaded","isMessageLocal","addViewportId","messagesCount","firstUnreadId","updateChatLastMessage","force","currentLastMessage","findLastMessage","deleteMessages","newLastMessage","threadIdsToUpdate","deleteChatMessages","requestThreadInfoUpdate","chatsIdsToUpdate","commonBoxChatId","shouldForceReply","updateThreadInfo","newMessage","isMessageInCurrentMessageList","delayedGlobal","scheduledIds","selectScheduledIds","selectIsChatWithBot","selectScheduledMessages","deleteChatScheduledMessages","thread","markMessageListRead","currentPinnedIds","selectPinnedIds","newPinnedIds","newTheadInfo","messagesById","loadFullChat","scheduledMessages","deleteScheduledMessages","pollId","pollUpdate","selectChatMessageByPollId","updatedPoll","updatedResults","isChosen","chosenAnswers","chosenAnswer","chosenAnswerIndex","recentVoterIds","totalVoters","newRecentVoterIds","newTotalVoters","targetOption","targetOptionIndex","updatedOption","votersCount","selectIsServiceChatReady","flushStatusUpdatesThrottled","pendingStatusUpdates","statusUpdate","status","targetUser","isBlocked","addBlockedContact","settings","privacy","key","rules","updateNotifySettings","peerType","shouldShowPreviews","addNotifyException","twoFaSettings","call","connectionState","groupCalls","activeGroupCallId","leaveGroupCall","shouldRemove","removeGroupCall","updateGroupCall","omit","participantsCount","groupCallId","participants","participant","updateGroupCallParticipant","useBeforeUnload","callback","useEffect","onBeforeUnload","metaViewport","querySelector","defaultViewportContent","getAttribute","preventEvent","preventDefault","useBrowserOnline","isOnline","setIsOnline","useState","navigator","onLine","handleChange","addEventListener","removeEventListener","ANIMATION_LEVEL_OPTIONS","memo","withGlobal","searchQuery","chatsById","animationLevel","byKey","globalSearchChatId","searchDate","theme","selectTheme","contactsFilter","onSearchQuery","onSelectSettings","onSelectContacts","onSelectArchived","setGlobalSearchChatId","onReset","shouldSkipTransition","openTipsChat","setGlobalSearchDate","setSettingOption","lang","useLang","hasMenu","LeftColumnContent","selectedSearchDate","useMemo","formatDateToString","archivedUnreadChatsCount","values","total","isChatArchived","withOtherVersions","location","hostname","MainButton","onTrigger","isOpen","Button","ripple","size","color","className","onClick","ariaLabel","buildClassName","handleSearchFocus","useCallback","handleSelectSaved","handleDarkModeToggle","stopPropagation","newTheme","shouldUseSystemTheme","switchTheme","ANIMATION_LEVEL_MAX","handleAnimationLevelChange","newLevel","_","body","classList","toggle","isSearchFocused","searchInputPlaceholder","DropdownMenu","trigger","footer","APP_NAME","MenuItem","icon","Switcher","label","checked","noAnimation","toLowerCase","langCode","href","FEEDBACK_URL","localStorage","setItem","JSON","stringify","disableHistoryBack","SearchInput","inputId","parentContainerClassName","focused","placeholder","autoComplete","canClose","onChange","onFocus","PickerSelectedItem","isMinimized","clickArg","chatOrUserId","dir","isRtl","Spinner","usersById","orderedFolderIds","activeChatFolder","shouldSkipHistoryAnimations","notifySettings","selectNotifySettings","notifyExceptions","selectNotifyExceptions","foldersDispatch","onScreenSelect","loadChatFolders","setActiveChatFolder","transitionRef","useRef","displayedFolders","folderCountersById","resolverFn","ms","dependencies","runThrottled","useThrottle","setValue","isFrozen","freeze","unfreeze","useFlag","useHeavyAnimationCheck","useOnChange","counters","unreadDialogsCount","hasActiveDialogs","getFolderUnreadDialogs","badgeCount","isBadgeActive","useThrottledMemo","folderTabs","handleSwitchTab","current","captureEvents","selectorToPreventScroll","onSwipe","SwipeDirection","min","isNotInAllTabRef","captureEscKeyListener","useHistoryBack","handleKeyDown","ctrlKey","shiftKey","startsWith","digit","shouldRender","shouldRenderPlaceholder","transitionClassNames","useShowTransition","renderCurrentTab","activeFolder","ChatList","folderType","TabList","tabs","activeTab","onSwitchTab","Transition","ref","name","activeKey","renderCount","props","LeftSearch","useModuleLoader","Bundles","Loading","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","isConnecting","isMouseInside","handleSelectSettings","handleSelectContacts","handleSelectNewChannel","handleSelectNewGroup","handleSelectArchived","autoCloseTimeout","shouldRenderUpdateButton","updateButtonClassNames","handleUpdateClick","isAppOutdated","markIsAppOutdated","timeout","reload","useAppOutdatedCheck","ShowTransition","isCustom","shouldCleanup","cleanupExceptionKey","fluid","pill","Settings","NewChat","ArchivedChats","ContentType","RENDER_COUNT","setGlobalSearchQuery","resetChatCreation","loadPasswordInfo","clearTwoFaError","setLeftColumnWidth","resetLeftColumnWidth","resizeRef","setContent","settingsScreen","setSettingsScreen","SettingsScreens","setContactsFilter","foldersState","useFoldersReducer","lastResetTime","setLastResetTime","contentType","Main","Archived","NewChannel","NewGroup","handleReset","forceReturnToChatList","pickerSearchInput","getElementById","blur","handleSearchQuery","initResize","resetResize","handleMouseUp","elementRef","onResize","initialWidth","markIsActive","unmarkIsActive","initialMouseX","setInitialMouseX","initialElementWidth","setInitialElementWidth","style","width","remove","handleMouseMove","event","newWidth","ceil","clientX","stopDrag","offsetWidth","add","useResize","handleSettingsScreenSelect","screen","LAYERS_ANIMATION_NAME","currentScreen","isChannel","onMouseDown","onMouseUp","onDoubleClick","setSize","windowSize","handleResize","MAX_MESSAGES_LIST_WIDTH","HeaderMenuContainer","isChatChannel","selectIsInSelectMode","noMenu","isChatWithSelf","selectIsChatWithSelf","isMainThread","isDiscussionThread","isRightColumnShown","canRestartBot","selectIsUserBlocked","canStartBot","selectIsChatBotNotStarted","canSubscribe","isChatSuperGroup","canSearch","canCall","ARE_CALLS_SUPPORTED","canMute","canLeave","canEnterVoiceChat","isCallActive","canCreateVoiceChat","adminRights","manageCall","isCreator","canExpandActions","joinChannel","openLocalTextSearch","restartBot","openCallFallbackConfirm","menuButtonRef","menuPosition","setMenuPosition","handleHeaderMenuOpen","rect","getBoundingClientRect","x","right","y","bottom","handleHeaderMenuClose","handleHeaderMenuHide","handleSubscribeClick","handleStartBot","handleRestartBot","handleSearchClick","focus","searchInput","disabled","anchor","withExtraActions","onSubscribeChannel","onSearchClick","onCloseAnimationEnd","useWebpThumbnail","thumbDataUri","getMessageMediaThumbDataUri","shouldDecodeThumbnail","isWebpSupported","thumbnailDecoded","setThumbnailDecoded","EMPTY_IMAGE_DATA_URI","useLayoutEffect","webpToPngBase64","then","catch","drawRect","height","radius","containerRef","markupParams","reverseIndex","barHeight","getBarHeight","markHeight","getMarkHeight","trackHeight","getTrackHeight","clipPathId","clipPath","d","getClipPath","markTranslateY","getMarkTranslateY","trackTranslateY","getTrackTranslateY","calculateMarkup","firstChild","firstElementChild","currentElement","transform","svg","div","defs","innerHTML","customTitle","onUnpinMessage","onAllPinnedClick","mediaThumbnail","mediaBlobUrl","useMedia","getMessageMediaHash","getMessageSummaryText","isUnpinDialogOpen","openUnpinDialog","closeUnpinDialog","handleUnpinMessage","ConfirmDialog","confirmLabel","confirmHandler","getPictogramDimensions","src","alt","renderPictogram","renderText","RippleEffect","scaleImage","image","ratio","outputType","Blob","URL","createObjectURL","img","Image","onload","scale","blob","finally","revokeObjectURL","steppedScale","bitmap","createImageBitmap","resizeWidth","resizeHeight","resizeQuality","Error","res","canvas","createElement","ctx","getContext","transferFromImageBitmap","drawImage","toBlob","oc","octx","mul","cur","LOGO_DIMENSIONS","MINIMAL_SIZE","sender","audio","voice","fileName","artist","performer","getSenderTitle","getTranslation","album","getChatTitle","audioCoverHash","getAudioHasCover","avatarHash","getChatAvatarHash","media","thumbnailSizes","AVATAR_FULL_DIMENSIONS","getCoverSize","fn","deps","defaultValue","setIsLoading","setError","setResult","wasCancelled","telegramLogoPath","resizeImage","makeGoodArtwork","useAsync","buildMediaMetadata","artwork","selectSender","noUi","setAudioPlayerVolume","setAudioPlayerPlaybackRate","setAudioPlayerMuted","isVoice","senderName","mediaData","mediaLoader","mediaMetadata","useMessageMediaMetadata","playPause","stop","isPlaying","requestNextTrack","requestPreviousTrack","isFirst","isLast","setVolume","toggleMuted","setPlaybackRate","useAudioPlayer","makeTrackId","getMediaDuration","isVoicePlaying","handleClick","handleClose","clearMediaSession","handleVolumeChange","handleVolumeClick","handlePlaybackClick","volumeIcon","renderAudio","subtitle","renderVoice","withClickPropagation","RangeSlider","groupCall","selectChatGroupCall","isLoaded","isCallNotEmpty","hasPinnedOffset","joinGroupCall","subscribeToGroupCallUpdates","handleJoinGroupCall","fetchedParticipants","isUser","subscribed","p","Avatar","audioMessage","pinnedIds","state","isSelectModeActive","isChatWithBot","currentTransitionKey","assign","pinnedMessageId","topMessageSender","selectForwardedSender","pinnedMessageIds","canUnpin","firstPinnedMessage","isReady","openChatWithInfo","pinMessage","openPreviousChat","toggleLeftColumn","isBackButtonActive","pinnedMessageIndex","setPinnedMessageIndex","isArray","pinnedMessage","pinnedMessagesCount","chatTitleLength","topMessageTitle","useEnsureMessage","windowWidth","useWindowSize","isLeftColumnHideable","MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN","shouldShowCloseButton","componentRef","shouldAnimateTools","handleHeaderClick","handlePinnedMessageClick","cycleRestrict","handleAllPinnedClick","setBackButtonActive","handleBackClick","messageInput","EDITABLE_INPUT_ID","canToolsCollideWithChatInfo","SAFE_SCREEN_WIDTH_FOR_CHAT_INFO","MOBILE_SCREEN_MAX_WIDTH","shouldUseStackedToolsClass","MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","shouldRenderAudioPlayer","audioPlayerClassNames","renderingAudioMessage","useCurrentOrPrev","shouldRenderPinnedMessage","pinnedMessageClassNames","renderingPinnedMessage","renderingPinnedMessagesCount","renderingCanUnpin","renderingPinnedMessageTitle","canRevealTools","componentEl","renderInfo","renderBackButton","PrivateChatInfo","withFullInfo","withMediaViewer","withUpdatingStatus","noRtl","GroupChatInfo","asClose","withUnreadCount","formatIntegerCompact","isAudioPlayerRendered","Infinity","getMessageKey","isAlbum","messageOrAlbum","groupMessages","currentAlbum","currentSenderGroup","currentDateGroup","originalDate","datetime","getDayStart","senderGroups","dateGroups","isInAlbum","mainMessage","albumId","nextMessage","nextMessageDayStartsAt","isActionMessage","forwardInfo","senderUserId","hiddenUserName","inlineButtons","INTERSECTION_THROTTLE_FOR_MEDIA","IS_ANDROID","INTERSECTION_MARGIN_FOR_MEDIA","isEmojiOnlyMessage","customShape","getMinMediaWidth","hasText","hasCommentButton","calculateMediaDimensions","noAvatars","isOwn","isOwnMessage","isForwarded","isForwardedMessage","getMessagePhoto","getMessageWebPagePhoto","getMessageVideo","isWebPagePhoto","calculateInlineImageDimensions","calculateVideoDimensions","minMediaWidth","getMessageText","stretchFactor","finalWidth","finalHeight","isSmall","accumulate","list","initValue","accumulator","item","clamp","num","low","high","calculateContainerSize","layout","styles","dimensions","sides","calculateAlbumLayout","ratios","proportions","getProportions","averageRatio","getAverageRatio","albumCount","forceCalc","maxWidth","getAvailableWidth","REM","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","AlbumRectPart","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","element","calculateAuthorWidth","font","whiteSpace","left","opacity","appendChild","useFocusMessage","isFocused","focusDirection","noFocusHighlight","messagesContainer","closest","fastSmoothScroll","ContextMenuContainer","targetUserIds","targetChatId","targetMessageId","targetMessage","selectIsMessageFocused","focusedMessage","observeIntersection","isEmbedded","appearanceOrder","isLastInList","useOnIntersect","noAppearanceAnimation","markShown","targetUsers","renderActionMessageText","asPlain","isContextMenuOpen","contextMenuPosition","handleBeforeContextMenu","handleContextMenu","handleContextMenuClose","handleContextMenuHide","useContextMenuHandlers","isContextMenuShown","preventMessageInputBlur","onContextMenu","customText","isIntersecting","useIsIntersecting","pictogramId","isRoundVideo","getMessageRoundVideo","senderTitle","outgoingStatus","signature","views","isEdited","formatTime","MessageOutgoingStatus","observeIntersectionForPlaying","shouldLoop","isModalOpen","openModal","closeModal","isAnimated","isMemojiSticker","MEMOJI_STICKER_ID","shouldLoad","shouldPlay","mediaHash","getMessageMediaFormat","isMediaLoaded","isAnimationLoaded","markAnimationLoaded","isMediaReady","useMediaTransition","getStickerDimensions","thumbClassName","stickerClassName","AnimatedSticker","animationData","play","noLoop","onLoad","fromSticker","useBlurredMediaThumbRef","fullMediaData","useCanvasBlur","IS_CANVAS_FILTER_SUPPORTED","SELECTED_APPENDIX_COLORS","dark","outgoing","incoming","light","canAutoLoad","isInSelectMode","isSelected","uploadProgress","nonInteractive","shouldAffectAppendix","isDownloading","onCancelUpload","localBlobUrl","isLoadAllowed","setIsLoadAllowed","loadProgress","useMediaWithLoadProgress","thumbRef","downloadProgress","isUploading","isTransferring","transferProgress","getMediaTransferState","wasLoadDisabled","usePrevious","shouldRenderSpinner","spinnerClassNames","shouldRenderDownloadButton","downloadButtonClassNames","isAllowed","contentEl","inSelectMode","getImageData","getAppendixColorFromImage","getCustomAppendixBg","appendixBg","setProperty","setAttribute","ProgressSpinner","useVideoAutoPause","playerRef","canPlay","wasPlaying","paused","canPlayRef","freezePlaying","unfreezePlaying","contains","safePlay","unfreezePlayingOnRaf","fastRaf","useBackgroundMode","canAutoPlay","videoRef","getMessageWebPageVideo","isPlayAllowed","setIsPlayAllowed","previewClassNames","isInline","ApiMediaFormat","isBuffered","bufferingHandlers","useBuffering","shouldRenderPlayButton","playButtonClassNames","playProgress","setPlayProgress","handleTimeUpdate","currentTarget","currentTime","duration","useVideoCleanup","cancelMessageMediaDownload","autoPlay","muted","loop","playsInline","onTimeUpdate","isGif","formatMediaDuration","contact","countryList","phoneCodes","phoneCodeList","openUserInfo","formatPhoneNumberWithCode","getPercentage","toFixed","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","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","containerId","question","getPollTypeString","CheckboxGroup","loadingOptions","RadioGroup","loadingOption","isQuiz","getReadableVotersCount","isText","inPreview","onMediaClick","onCancelMediaTransfer","webPage","getMessageWebPage","isSquarePhoto","handleMediaClick","siteName","displayUrl","isMediaInteractive","truncatedDescription","trimText","SafeLink","getMessageInvoice","amount","currency","isTest","photoUrl","formatCurrency","withSelectControl","WrappedComponent","ownProps","selectIsMessageSelected","handleMessageSelect","newProps","PhotoWithSelect","Photo","VideoWithSelect","Video","activeDownloadIds","selectActiveDownloadIds","uploadsById","hasCustomAppendix","albumLayout","cancelSendingMessage","mediaCount","handleCancelUpload","containerWidth","containerHeight","fileUpload","selectCanAutoLoadMedia","selectCanAutoPlayMedia","currentOnRelease","playingProgressRef","shouldSpinnerRender","isActivated","setIsActivated","setProgress","svgCenter","ROUND_VIDEO_DIMENSIONS_PX","playerEl","playingProgressEl","stopPlaying","capturePlaying","onRelease","stopCurrentAudio","videoClassName","onEnded","recentReplierIds","recentRepliers","hasUnread","GROUP_MESSAGE_HOVER_ATTRIBUTE","APPENDIX_OWN","__html","APPENDIX_NOT_OWN","handleDocumentGroupMouseEnter","lastGroupElement","getLastElementInDocumentGroup","handleDocumentGroupMouseLeave","removeAttribute","nextElementSibling","withSenderName","withAvatar","viaBotId","replyToChatId","isRepliesChat","isChatWithRepliesBot","chatUsername","forceSenderName","isAnonymousOwnMessage","canShowSender","originSender","botSender","threadTopMessageId","isThreadTop","shouldHideReply","replyMessageSender","selectUploadProgress","isForwarding","highlight","singleEmoji","getMessageSingleEmoji","every","canReply","selectIsDownloading","isSingleEmoji","animatedEmoji","selectAnimatedEmoji","isGroupSelected","selectIsDocumentGroupSelected","isPinnedList","canAutoLoadMedia","canAutoPlayMedia","autoLoadFileMaxSizeMb","shouldLoopStickers","selectShouldLoopStickers","selectOutgoingStatus","observeIntersectionForBottom","observeIntersectionForMedia","observeIntersectionForAnimatedStickers","noComments","isFirstInGroup","isLastInGroup","isFirstInDocumentGroup","isLastInDocumentGroup","clickInlineButton","bottomMarkerRef","isLocal","hasReply","isReplyMessage","hasThread","asForwarded","isLinkedChannelPost","isInDocumentGroup","getMessageCustomShape","textParts","renderMessageText","adminTitle","metaSafeAuthorWidth","canShowActionButton","canForward","canFocus","isChannelPost","fromMessageId","avatarPeer","senderPeer","selectMessage","handleMouseDown","handleDoubleClick","handleContentDoubleClick","isSwiped","markSwiped","unmarkSwiped","startedAt","target","matches","useOuterHandlers","handleAvatarClick","handleSenderClick","handleViaBotClick","handleReplyClick","handleAudioPlay","handleAlbumMediaClick","handleMetaClick","handleReadMedia","handleVoteSend","handleGroupForward","handleForward","handleFocus","handleFocusForwarded","handleDocumentGroupSelectAll","openMediaViewer","openAudioPlayer","markMessagesRead","sendPollVote","focusMessageInComments","replyToTopMessageId","MediaViewerOrigin","albumMessageId","selectWithGroupedId","useInnerHandlers","containerClassName","contentClassName","hasComments","hasActionButton","classNames","isMedia","isMediaWithNoText","isViaBot","isRound","buildContentClassName","withCommentButton","withAppendix","calculatedWidth","noMediaCorners","extraPadding","isAvatarPeerUser","avatarUser","avatarChat","hiddenName","renderAvatar","shouldInlineMeta","textContentClass","senderColor","getUserColorKey","renderSenderName","AnimatedEmoji","forceLoadPreview","Audio","AudioOrigin","isSelectable","onPlay","onReadMedia","Document","renderContent","dangerouslySetInnerHTML","messageGroups","isViewportNewest","withUsers","anchorIdRef","memoUnreadDividerBeforeIdRef","memoFirstUnreadIdRef","hasLinkedChat","isSchedule","onFabToggle","onNotchToggle","openHistoryCalendar","observeIntersectionForReading","observe","useIntersectionObserver","rootRef","throttleMs","margin","freezeForReading","unfreezeForReading","noAutoFreeze","entries","mentionIds","entry","dataset","useMessageObservers","backwardsTriggerRef","forwardsTriggerRef","fabTriggerRef","loadMoreBackwards","loadMoreForwards","toggleScrollTools","offsetHeight","scrollHeight","scrollTop","scrollBottom","isAtBottom","MESSAGE_LIST_SENSITIVE_AREA","LOCAL_MESSAGE_ID_BASE","triggerEntry","resetScroll","observeIntersectionForFab","freezeForFab","unfreezeForFab","FAB_THRESHOLD","observeIntersectionForNotch","freezeForNotch","unfreezeForNotch","useScrollHooks","unreadDivider","messageCountToAnimate","messageGroup","flatten","appearanceIndex","dateGroup","dateGroupIndex","dateGroupsArray","senderGroup","senderGroupIndex","senderGroupsArray","compact","currentDocumentGroupId","messageIndex","isMessageAlbum","documentGroupId","nextDocumentGroupId","originalId","getMessageOriginalId","teactFastList","SCHEDULED_WHEN_ONLINE","formatHumanDate","dividend","getUserIdDividend","lastUnreadMessageId","loadGreetingStickers","debounceMs","handleStickerSelect","selectedSticker","StickerButton","isGroupChatJustCreated","renderScheduled","renderSavedMessages","renderGroup","runDebouncedForScroll","selectCurrentMessageIds","restrictionReason","focusingId","withLastMessageWhenPreloading","chatBot","botDescription","isChatLoaded","isChannelChat","isGroupChat","isChatGroup","isBot","threadFirstMessageId","selectFirstMessageId","linkedChatId","hasTools","canPost","setScrollOffset","scrollOffsetRef","selectScrollOffset","anchorTopRef","listItemElementsRef","memoFocusingIdRef","isScrollTopJustUpdatedRef","shouldAnimateAppearanceRef","setContainerHeight","onTickEnd","listedMessages","orderBy","loadMoreAround","isScrolled","updateStickyDates","markIsScrolled","runDebounced","useDebounce","container","currentStuck","stuckDateEl","allElements","querySelectorAll","containerTop","el","offsetTop","top","findStuckDate","useStickyDates","handleScroll","parentElement","observer","ResizeObserver","offsetParent","contentRect","disconnect","windowHeight","normalHeight","String","clientHeight","preservedItemElements","useLayoutEffectWithPrevDeps","prevMessageIds","prevIsViewportNewest","prevContainerHeight","shouldForceScroll","hasLastMessageChanged","hasViewportShifted","wasMessageAdded","isAlreadyFocusing","lastItemElement","bottomOffset","newScrollTop","isResized","isAnimatingScroll","useEffectWithPrevDeps","prevIsSelectModeActive","dispatchHeavyAnimationEvent","shouldRenderGreeting","onScroll","withExtraShift","focusNextReply","messageElements","lastMessageElement","MAX_QUICK_IMG_SIZE","FILE_EXT_REGEX","buildAttachment","filename","isQuick","mimeType","quick","SUPPORTED_IMAGE_CONTENT_TYPES","preloadImage","resizedUrl","fetchBlob","replace","SUPPORTED_VIDEO_CONTENT_TYPES","videoWidth","videoHeight","preloadVideo","createPosterForVideo","resetInput","applyIosAutoCapitalizationFix","inputEl","POLYFILL_OPTIONS","encoderPath","reuseWorker","BLOB_PARAMS","opusRecorderPromise","OpusRecorder","mediaRecorder","init","default","start","analyzerCallback","startMediaRecorder","pausedAt","chunks","waveform","ondataavailable","typedArray","releaseAnalyzer","recorder","source","sourceNode","analyser","context","createAnalyser","fftSize","connect","dataLength","frequencyBinCount","dataArray","Uint8Array","isDestroyed","tick","getByteFrequencyData","requestAnimationFrame","subscribeToAnalyzer","reject","onstop","onerror","delayStop","CLIPBOARD_ACCEPTED_TYPES","getMessageTextAsHtml","tempEl","INLINE_BOT_QUERY_REGEXP","HAS_NEW_LINE","RE_COMMAND","DeleteMessageModal","openTimeout","isFirstTimeActivation","onActivate","buttonProps","AttachMenu","SymbolMenu","InlineBotTooltip","MentionTooltip","CustomSend","StickerTooltip","BotCommandTooltip","useMouseInside","isKeyboardSingleUse","forceOpen","markForceOpen","unmarkForceOpen","keyboardButtons","forwardMessageIds","forwardedMessagesCount","exitForwardMode","canAnimate","useAsyncRendering","clearEmbedded","handleMessageClick","faded","AttachmentModal","BotCommandMenu","PollModal","DropArea","RE_LINK","RegExp","RE_LINK_TEMPLATE","messageText","toggleMessageWebPage","link","linkEntity","ApiMessageEntityTypes","textMatch","renderingWebPage","webPageWithoutPhoto","messageStub","CalendarModal","MainButtonState","chatUser","selectChatUser","REPLIES_USER_ID","messageWithActualBotKeyboard","selectNewestMessageWithBotKeyboardButtons","shouldSuggestStickers","baseEmojiKeywords","BASE_EMOJI_KEYWORD_LANG","botKeyboardMessageId","keyboardMessage","editingMessage","canScheduleUntilOnline","wasOnline","withScheduledButton","shouldSchedule","botKeyboardPlaceholder","keyboardPlaceholder","stickersForEmoji","groupChatMembers","topInlineBotIds","isInlineBotLoading","chatBotCommands","botCommands","dropAreaState","onDropHide","editMessage","saveDraft","clearDraft","setStickerSearchQuery","setGifSearchQuery","closePollModal","addRecentEmoji","sendInlineBotResult","appendixRef","html","setHtml","lastMessageSendTimeSeconds","prevDropAreaState","isCalendarOpen","openCalendar","closeCalendar","scheduledMessageArgs","setScheduledMessageArgs","htmlRef","setAttachments","isBotKeyboardOpen","openBotKeyboard","closeBotKeyboard","isBotCommandMenuOpen","openBotCommandMenu","closeBotCommandMenu","isAttachMenuOpen","openAttachMenu","closeAttachMenu","isSymbolMenuOpen","openSymbolMenu","closeSymbolMenu","isDeleteModalOpen","openDeleteModal","closeDeleteModal","isSymbolMenuLoaded","onSymbolMenuLoadingComplete","isHoverDisabled","disableHover","enableHover","startRecordingVoice","stopRecordingVoice","pauseRecordingVoice","activeVoiceRecording","currentRecordTime","recordButtonRef","mainButtonRef","startRecordTimeRef","setActiveVoiceRecording","setCurrentRecordTime","IS_SAFARI","IS_VOICE_RECORDING_SUPPORTED","voiceRecording","tickVolume","boxShadow","useVoiceRecording","mainButtonState","Edit","Send","Record","canShowCustomSendMenu","isMentionTooltipOpen","closeMentionTooltip","insertMention","mentionFilteredUsers","useMentionTooltip","isInlineBotTooltipOpen","inlineBotId","isInlineBotTooltipGallery","inlineBotSwitchPm","inlineBotResults","closeTooltip","closeInlineBotTooltip","inlineBotHelp","loadMore","loadMoreForInlineBot","markIsOpen","unmarkIsOpen","innerText","getPlainText","queryInlineBot","resetInlineBot","canShowHelp","parseStartWithUsernameString","usernameLowered","prevQuery","prevUsername","useInlineBotTooltip","isBotCommandTooltipOpen","close","closeBotCommandTooltip","filteredBotCommands","botTooltipCommands","setFilteredBotCommands","getFilteredCommands","nextFilteredBotCommands","prepareForRegExp","substr","useBotCommandTooltip","isCustomSendMenuOpen","allowedAttachmentOptions","getAllowedAttachmentOptions","isChatAdmin","slowMode","getChatSlowModeOptions","isStickerTooltipOpen","closeStickerTooltip","isDisabled","cleanHtml","trim","clearStickersForEmoji","IS_EMOJI_SUPPORTED","parseEmojiOnlyString","hasStickers","useStickerTooltip","canSendStickers","isEmojiTooltipOpen","closeEmojiTooltip","filteredEmojis","insertEmoji","useEmojiTooltip","insertTextAndUpdateCursor","selection","getSelection","newHtml","rangeCount","selectionRange","getRangeAt","isSelectionInsideInput","range","deleteContents","fragment","createContextualFragment","lastInsertedNode","lastChild","insertNode","setStartAfter","setEndAfter","collapse","removeAllRanges","addRange","insertHtmlInSelection","dispatchEvent","Event","bubbles","focusEditableElement","removeSymbol","execCommand","tempInput","contentEditable","textLength","createRange","setStart","setEnd","removeChild","deleteLastCharacterOutsideSelection","resetComposer","shouldPreserveInput","stopRecordingVoiceRef","handleEditComplete","editedMessage","hasMessageMedia","useEditing","updateDraft","draftChatId","draftThreadId","runDebouncedForSaveDraft","DRAFT_DEBOUNCE","prevChatId","prevThreadId","prevHtml","handleBlur","useDraft","handlePaste","clipboardData","input","activeElement","EDITABLE_INPUT_MODAL_ID","items","kind","file","getAsFile","pastedText","getData","substring","useClipboardPaste","handleFileSelect","files","handleAppendFiles","handleClearAttachment","handleSend","currentAttachments","record","maxLength","extraLength","textParams","nowSeconds","secondsSinceLastMessage","nextSendDateNotReached","nextSendDate","seconds","secondsRemaining","isSlowMode","handleActivateBotCommandMenu","handleActivateSymbolMenu","handleGifSelect","gif","handleInlineBotSelect","inlineResult","handleBotCommandSelect","handlePollSend","handleSilentSend","handleMessageSchedule","isWhenOnline","restArgs","getTime","handleMessageScheduleUntilOnline","handleCloseCalendar","handleSearchOpen","handleSymbolMenuOpen","handleAllScheduledClick","mainButtonHandler","areVoiceMessagesNotAllowed","canAttachMedia","prevEditedMessage","renderedEditedMessage","scheduledDefaultDate","setSeconds","setMilliseconds","scheduledMaxDate","setFullYear","getFullYear","sendButtonAriaLabel","symbolMenuButtonClassName","onSend","Portal","DropAreaState","withQuick","onHide","onFileSelect","caption","onCaptionUpdate","onFileAppend","onClear","onInsertUserName","filteredUsers","onSelectResult","withUsername","canAttachEmbedLinks","MessageInput","forcedPlaceholder","shouldSetFocus","shouldSuppressFocus","shouldSuppressTextFormatter","onUpdate","onSuppressedFocus","formatVoiceRecordDuration","onStickerSelect","emojis","onEmojiSelect","onPollCreate","onGifSelect","onRemoveSymbol","onSearchOpen","onSilentSend","onScheduleSend","withTimePicker","maxAt","getDayStartAt","isFutureMode","secondButtonLabel","onSubmit","onSecondButtonClick","MobileSearch","MessageSelectToolbar","UnpinAllMessagesModal","PaymentModal","ReceiptModal","CLOSE_ANIMATION_DURATION","isImage","isBlurred","isBackgroundBlurred","background","customBackground","backgroundColor","patternColor","themes","isMobileSearchActive","isReceiptModalOpen","getCanPostInChat","isBotNotStarted","isPinnedMessageList","isScheduledMessageList","currentUserBannedRights","defaultBannedRights","hasPinnedOrAudioMessage","loadUser","closePaymentModal","clearReceipt","setDropAreaState","isFabShown","setIsFabShown","isNotchShown","setIsNotchShown","isUnpinModalOpen","setIsUnpinModalOpen","setIsReady","ANIMATION_LEVEL_MIN","renderingChatId","usePrevDuringAnimation","renderingThreadId","renderingMessageListType","renderingCanPost","renderingHasTools","renderingIsFabShown","visualViewport","documentElement","handleDragEnter","dataTransfer","shouldDrawQuick","handleHideDropArea","handleOpenUnpinModal","closeUnpinModal","handleUnpinAllMessages","handleTabletFocus","customBackgroundValue","settingValue","cacheApi","CUSTOM_BG_CACHE_NAME","Type","useCustomBackground","MASK_IMAGE_DISABLED","messagingDisabledClassName","messageSendingRestrictionReason","getMessageSendingRestrictionReason","composerHiddenScale","toolbarHiddenScale","composerTranslateX","toolbarTranslateX","unpinHiddenScale","toolbarForUnpinHiddenScale","sidePadding","messageListWidth","rightColumnWidth","getMessageListWidth","sendButtonWidth","composerWidth","toolbarWidth","calculateMiddleFooterTransforms","footerClassName","createMessageHash","isMessagingDisabled","onTransitionEnd","propertyName","DARK_THEME_BG_COLOR","LIGHT_THEME_BG_COLOR","onDragEnter","onUnpin","HeaderContent","isProfile","isManagement","messageSearchQuery","stickerSearchQuery","selectCurrentStickerSearch","gifSearchQuery","selectCurrentGifSearch","canAddContact","getCanAddContact","canManage","isColumnOpen","isSearch","isStickerSearch","isGifSearch","isPollResults","isAddingChatMembers","profileState","managementScreen","setLocalTextSearchQuery","searchTextMessagesLocal","toggleManagement","shouldSkipAnimation","addContact","backButtonRef","handleMessageSearchQueryChange","handleStickerSearchQueryChange","handleGifSearchQueryChange","handleAddContact","setShouldSkipTransition","contentKey","ProfileState","Profile","SharedMedia","MemberList","Search","PollResults","StickerSearch","GifSearch","AddingMembers","ManagementScreens","ManageInitial","ManageChatPrivacyType","ManageDiscussion","ManageChannelSubscribers","ManageGroupPermissions","ManageChatAdministrators","ManageGroupRemovedUsers","ManageGroupUserPermissionsCreate","ManageGroupUserPermissions","ManageGroupRecentActions","ManageGroupAdminRights","ManageGroupMembers","renderingContentKey","renderHeaderContent","autoFocusSearch","isBackButton","buttonClassName","useInfiniteScrollForLoadableItems","currentResultType","handleLoadMore","itemIds","getMore","useInfiniteScroll","MEMBERS_SLICE","useInfiniteScrollForSharedMedia","forSharedMediaType","messageIdsRef","getMessageContentIds","reverse","runThrottledForScroll","isScrollingProgrammatically","TABS","buildInfiniteScrollItemSelector","resultType","mediaSearchType","isGroup","hasMembersTab","areMembersHidden","canViewMembers","canAddMembers","getHasAdminRight","canDeleteMembers","hasCommonChatsTab","resolvedUserId","commonChatIds","onProfileStateChange","setLocalMediaSearchType","loadMoreMembers","loadCommonChats","searchMediaMessagesLocal","loadProfilePhotos","setNewChatMembersDialogState","setActiveTab","deletingUserId","setDeletingUserId","tabType","noProfileInfo","searchMessages","memberIds","sortUserIds","sortChatIds","memberViewportIds","getMoreMembers","noProfileInfoForMembers","mediaViewportIds","getMoreMedia","noProfileInfoForMedia","documentViewportIds","getMoreDocuments","noProfileInfoForDocuments","linkViewportIds","getMoreLinks","noProfileInfoForLinks","audioViewportIds","getMoreAudio","noProfileInfoForAudio","voiceViewportIds","getMoreVoices","noProfileInfoForVoices","commonChatViewportIds","getMoreCommonChats","noProfileInfoForCommonChats","useProfileViewportIds","prevTabType","tabsEl","prevProfileState","determineProfileState","tabListEl","useProfileState","applyTransitionFix","releaseTransitionFix","transitionElSelector","setMinHeight","transitionEl","minHeight","overflowY","scrollBarWidth","clientWidth","marginRight","useTransitionFixes","cacheBuster","resetCacheBuster","setCacheBuster","useCacheBuster","handleTransitionStop","handleNewMemberDialogOpen","NewChatMembersProgress","handleSelectMedia","handlePlayAudio","handleMemberClick","handleMessageFocus","handleDeleteMembersModalClose","renderingDelay","isFirstTab","SLIDE_TRANSITION_DURATION","canRenderContents","renderSharedMedia","noSpinner","NothingFound","Media","withDate","smaller","onDateClick","WebLink","onMessageClick","getSenderName","ListItem","teactOrderKey","contextActions","memberId","handler","forceShowSelf","InfiniteScroll","itemSelector","sensitiveArea","PROFILE_SENSITIVE_AREA","preloadBackwards","noScrollRestoreOnTop","noFastList","onLoadMore","ProfileInfo","ChatExtra","renderProfileInfo","shouldRestoreHeight","onStart","onStop","big","FloatingActionButton","DeleteMemberModal","RightSearch","Management","localContactIds","isSearching","onNextStep","setUserSearchQuery","selectedMemberIds","setSelectedMemberIds","noPickerScrollRestore","member","handleFilterChange","displayedIds","foundContactIds","fullName","getUserFullName","contactId","canBeInvitedToGroup","handleNextStep","Picker","selectedIds","filterValue","filterPlaceholder","searchInputId","onSelectedIdsChange","onFilterChange","noScrollRestore","MAIN_SCREENS_COUNT","RightColumnContent","MANAGEMENT_SCREENS_COUNT","blurSearchInput","areActiveChatsLoaded","selectAreActiveChatsLoaded","selectRightColumnContentKey","currentProfileUserId","selectedId","isChatSelected","toggleChatInfo","closePollResults","addChatMembers","setProfileState","setManagementScreen","selectedChatMemberId","setSelectedChatMemberId","isPromotedByCurrentUser","setIsPromotedByCurrentUser","isScrolledDown","isOverlaying","shouldScrollUp","handleSelectChatMember","isPromoted","handleAppendingChatMembers","onChatMemberSelect","prevContentKey","MediaViewer","download","click","startedDownloads","downloadHash","getMessageContentFilename","Notifications","Dialogs","ForwardPicker","SafeLinkModal","HistoryCalendar","GroupCall","ActiveCallHeader","CallFallbackConfirm","notificationInterval","DEBUG_isLogged","updateIcon","asUnread","updatePageTitle","nextTitle","wasTimeFormatSetManually","isMediaViewerOpen","selectIsMediaViewerOpen","isForwardModalOpen","selectIsForwardModalOpen","hasNotifications","hasDialogs","isHistoryCalendarOpen","isServiceChatReady","isCallFallbackConfirmOpen","isFallbackConfirmOpen","loadNotificationSettings","loadNotificationExceptions","updateIsOnline","loadTopInlineBots","loadEmojiKeywords","loadCountryList","ensureTimeFormat","openStickerSetShortName","checkVersionNotification","LOCATION_HASH","processDeepLink","decodeURIComponent","middleColumnTransitionClassNames","rightColumnTransitionClassNames","prevIsLeftColumnShown","dispatchHeavyAnimationEnd","waitForTransitionEnd","prevIsRightColumnShown","initialUnread","clearInterval","setInterval","INACTIVE_MARKER","newUnread","PAGE_TITLE","handleStickerSetModalClose","stopEvent","IS_PWA","usePreventPinchZoomGesture","onDrop","onDragOver","initApi"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/call-fallback-avatar.50c421eaa09a90e44ec4..png b/dist/call-fallback-avatar.50c421eaa09a90e44ec4..png new file mode 100644 index 000000000..3a850f2ee Binary files /dev/null and b/dist/call-fallback-avatar.50c421eaa09a90e44ec4..png differ diff --git a/dist/index.html b/dist/index.html index 2b4847c22..9a958d3f3 100644 --- a/dist/index.html +++ b/dist/index.html @@ -1 +1 @@ -Telegram
\ No newline at end of file +Telegram
\ No newline at end of file diff --git a/dist/main.38800c1e32e7e441cc8a.js b/dist/main.38800c1e32e7e441cc8a.js deleted file mode 100644 index 5de0582a0..000000000 --- a/dist/main.38800c1e32e7e441cc8a.js +++ /dev/null @@ -1,2 +0,0 @@ -(()=>{"use strict";var e,t,n,r,o,d,a={1226:(e,t,n)=>{n.d(t,{t9:()=>c,u3:()=>l,g8:()=>i});var r=n(3716),o=n(6926),d=n(9118);let a;const u=new Map,s=new Map;function i(e,t){return a||(r.eM&&console.log(">>> START LOAD WORKER"),a=new Worker(new URL(n.p+n.u(927),n.b)),function(e){a.addEventListener("message",(({data:t})=>{if("update"===t.type)e(t.update);else if("methodResponse"===t.type){const e=u.get(t.messageId);e&&(t.error?e.reject(t.error):e.resolve(t.response))}else if("methodCallback"===t.type){var n,r;null===(n=u.get(t.messageId))||void 0===n||null===(r=n.callback)||void 0===r||r.call(n,...t.callbackArgs)}else if("unhandledError"===t.type)throw t.error}))}(e),"iOS"===t.platform&&window.addEventListener("focus",(async()=>{try{await Promise.race([f({type:"ping"}),(0,d.wO)(150).then((()=>Promise.reject(new Error("HEALTH_CHECK_TIMEOUT"))))])}catch(e){console.error(e),Date.now()-h>=5e3&&window.location.reload()}}))),f({type:"initApi",args:[t]})}function c(e,...t){if(a)return f({type:"callMethod",name:e,args:t});r.eM&&console.warn("API is not initialized")}function l(e){e.isCanceled=!0;const{messageId:t}=s.get(e)||{};t&&a.postMessage({type:"cancelProgress",messageId:t})}function f(e){const t=(0,o.Z)(u),n={messageId:t,...e},r={messageId:t},d=new Promise(((e,t)=>{Object.assign(r,{resolve:e,reject:t})}));if("args"in n&&"function"==typeof n.args[1]){const e=n.args.pop();r.callback=e,s.set(e,r)}return u.set(t,r),d.catch((()=>{})).finally((()=>{u.delete(t),r.callback&&s.delete(r.callback)})),a.postMessage(n),d}const h=Date.now()},6137:(e,t,n)=>{n.d(t,{Vv:()=>r.Vv,_f:()=>r._f,_Q:()=>r._Q,IU:()=>o.I});var r=n(4746),o=n(9077)},9077:(e,t,n)=>{let r;n.d(t,{I:()=>r}),function(e){e[e.BlobUrl=0]="BlobUrl",e[e.Lottie=1]="Lottie",e[e.Progressive=2]="Progressive",e[e.Stream=3]="Stream"}(r||(r={}))},4746:(e,t,n)=>{let r;n.d(t,{Vv:()=>r,_f:()=>o,_Q:()=>d}),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 o=-1,d="MESSAGE_DELETED"},88:(e,t,n)=>{n.d(t,{Z:()=>h});var r=n(4050),o=n(5116);const d=36,a=2147483647;function u(e,t,n){let r;for(e=n?Math.floor(e/700):e>>1,e+=Math.floor(e/t),r=0;e>455;r+=d)e=Math.floor(e/35);return Math.floor(r+36*e/(e+38))}function s(e,t){const n=[],r=[],o=e.length;let s,i,c,l,f,h,m,p,g,y,v,b,w;for(s=128,c=0,l=72,f=e.lastIndexOf("-"),f<0&&(f=0),h=0;h=128)throw new RangeError("Illegal input >= 0x80");n.push(e.charCodeAt(h))}for(m=f>0?f+1:0;m=o)throw RangeError("punycode_bad_input(1)");if(v=(I=e.charCodeAt(m++))-48<10?I-22:I-65<26?I-65:I-97<26?I-97:d,v>=d)throw RangeError("punycode_bad_input(2)");if(v>Math.floor((a-c)/g))throw RangeError("punycode_overflow(1)");if(c+=v*g,b=y<=l?1:y>=l+26?26:y-l,vMath.floor(a/(d-b)))throw RangeError("punycode_overflow(2)");g*=d-b}if(i=n.length+1,l=u(c-p,i,0===p),Math.floor(c/i)>a-s)throw RangeError("punycode_overflow(3)");s+=Math.floor(c/i),c%=i,t&&r.splice(c,0,e.charCodeAt(m-1)-65<26),n.splice(c,0,s),c++}var I;if(t)for(c=0,w=n.length;c{const t=[];let n=0;const r=e.length;let o;for(;n65535&&(o-=65536,t.push(String.fromCharCode(o>>>10&1023|55296)),o=56320|1023&o),t.push(String.fromCharCode(o))}return t.join("")})(n)}var i=n(3716),c=n(6752),l=n(1396);function f(e){if(!e)return;const t=(0,l.X)(e);if(t)try{let e=decodeURI(t);const n=e.match(/^https?:\/\/([^/:?#]+)(?:[/:?#]|$)/i);if(!n)return;const r=n[1];return e=e.replace(r,function(e){const t=e.split("."),n=[];for(let e=0;e{const{toggleSafeLinkModal:u,openTelegramLink:s}=(0,o.uC)(),h=d||t,m=e!==h,p=(0,r.I4)((t=>t.ctrlKey||t.altKey||t.shiftKey||t.metaKey||!e||!e.match(i.FS)&&!e.match(i.g$)?!m||(u({url:e}),t.preventDefault(),!1):(t.preventDefault(),s({url:e}),!1)),[m,s,u,e]);if(!e)return;const g=(0,c.Z)(n||"text-entity-link",t.length>50&&"long-word-break-all");return r.ZP.createElement("a",{href:(0,l.X)(e),title:f(e),target:"_blank",rel:"noopener noreferrer",className:g,onClick:p,dir:a?"rtl":"auto"},h)}))},5376:(e,t,n)=>{n.d(t,{yW:()=>r,K2:()=>o,mD:()=>d,Oh:()=>a,v6:()=>u});function r(e){return e>536870912?`${(e/1073741824).toFixed(1)} GB`:e>524288?`${(e/1048576).toFixed(1)} MB`:`${(e/1024).toFixed(1)} KB`}function o(e){const{fileName:t,mimeType:n}=e;return d(t,n)}function d(e,t){return e&&-1!==e.indexOf(".")?e.split(".").pop():t.split("/").pop()}function a(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 u(e){return Boolean(e.previewBlobUrl||e.thumbnail)}},4784:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(3681);const o=new RegExp(`^(?:${r.Z.source})+$`,""),d=e=>{if(e.length>24)return!1;if(!Boolean(e.match(o)))return!1;let t=0;for(;r.Z.exec(e);)if(t++,t>3)return r.Z.lastIndex=0,!1;return t}},8005:(e,t,n)=>{n.d(t,{D:()=>g});var r=n(4050),o=n(2858),d=n(8035),a=n(9937),u=n(2340),s=n(5116),i=n(782),c=n(6752),l=n(8033);const f=(0,s.c$)(void 0,((e,t)=>(0,i.ei)(t,["openUserInfo"])))((({className:e,sender:t,openUserInfo:n,children:o})=>{const d=(0,r.I4)((()=>{t&&n({id:t.id})}),[t,n]);return t?r.ZP.createElement(l.Z,{className:(0,c.Z)("UserLink",e),onClick:d},o):o})),h=(0,s.c$)(void 0,((e,t)=>(0,i.ei)(t,["focusMessage"])))((({className:e,message:t,children:n,focusMessage:o})=>{const d=(0,r.I4)((()=>{t&&o({chatId:t.chatId,messageId:t.id})}),[o,t]);return t?r.ZP.createElement(l.Z,{className:(0,c.Z)("MessageLink",e),onClick:d},n):n})),m=(0,s.c$)(void 0,((e,t)=>(0,i.ei)(t,["openChat"])))((({className:e,chatId:t,openChat:n,children:o})=>{const d=(0,r.I4)((()=>{t&&n({id:t})}),[t,n]);return t?r.ZP.createElement(l.Z,{className:(0,c.Z)("ChatLink",e),onClick:d},o):o})),p=(0,s.c$)(void 0,((e,t)=>(0,i.ei)(t,["joinGroupCall"])))((({className:e,groupCall:t,joinGroupCall:n,children:o})=>{const d=(0,r.I4)((()=>{t&&n({id:t.id,accessHash:t.accessHash})}),[t,n]);return t?r.ZP.createElement(l.Z,{className:(0,c.Z)("GroupCallLink",e),onClick:d},o):o}));function g(e,t,n,s,i,c,l={}){if(!t.content.action)return[];const{text:f,translationValues:g,amount:b,currency:w,call:I}=t.content.action,C=[],S={...l,maxTextLength:32};let E,P=e("Chat.Service.Group.UpdatedPinnedMessage1"!==f||i?f:"Message.PinnedGenericMessage",g&&g.length?g:void 0);return P.includes("%payment_amount%")&&(E=v(P,"%payment_amount%",(0,a.x)(b,w,e.code)),P=E.pop(),C.push(...E)),E=v(P,"%action_origin%",n?!l.isEmbedded&&function(e,t,n){return(0,o.YC)(t.id)?y(t,n):function(e,t,n){const a=(0,d.Z)((0,o.U)(e,t));return n?a:r.ZP.createElement(m,{className:"action-link",chatId:t.id},t&&(0,u.Z)(a))}(e,t,n)}(e,n,l.asPlain)||" ":"User"),P=E.pop(),C.push(...E),E=v(P,"%target_user%",s?s.map((e=>y(e,l.asPlain))).filter(Boolean):"User"),P=E.pop(),C.push(...E),E=v(P,"%message%",i?function(e,t,n={}){const a=(0,o.MK)(e,t),{photo:s,video:i,document:c,sticker:l}=(0,o.qp)(t),{maxTextLength:f,isEmbedded:m,asPlain:p}=n,g=m&&a&&!s&&!i&&!c&&!l;let y=(0,d.Z)(a,f);return m&&(s?y="a photo":i?y=i.isGif?"a GIF":"a video":c?y="a document":l&&(y=a)),p?g?`«${y}»`:y:g?r.ZP.createElement("span",null,"«",r.ZP.createElement(h,{className:"action-link",message:t},(0,u.Z)(y)),"»"):r.ZP.createElement(h,{className:"action-link",message:t},(0,u.Z)(y))}(e,i,S):"a message"),P=E.pop(),C.push(...E),E=v(P,"%product%",i?function(e){return e.content&&e.content.invoice?e.content.invoice.title:"a product"}(i):"a product"),P=E.pop(),C.push(...E),E=v(P,"%target_chat%",c?function(e,t){const n="another chat";return t?n:r.ZP.createElement(m,{className:"action-link",chatId:e},n)}(c,l.asPlain):"another chat"),C.push(...E),l.asPlain?C.join("").trim():I?function(e,t){return r.ZP.createElement(p,{groupCall:e},t)}(I,C):C}function y(e,t){const n=(0,d.Z)((0,o.Js)(e));return t?n:r.ZP.createElement(f,{className:"action-link",sender:e},e&&(0,u.Z)(n))}function v(e,t,n){const r=e.indexOf(t);if(r<0||!n)return[e];const o=[];return o.push(e.substring(0,r)),Array.isArray(n)?n.forEach(((e,t)=>{o.push(e),t+1{n.d(t,{Z:()=>h});var r=n(4050),o=n(3681),d=n(3716),a=n(7361),u=n(4284),s=n(6752),i=n(7373),c=n(88);const l=/^[\d\wа-яё]$/i,f=/(\*\*|__).+?\1/g;function h(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 o.Z.lastIndex=0,m(e,"big","jsx");case"emoji":return o.Z.lastIndex=0,m(e,"small","jsx");case"emoji_html":return o.Z.lastIndex=0,m(e,"small","html");case"br":return p(e,"jsx");case"br_html":return p(e,"html");case"highlight":return d=e,a=n.highlight,d.reduce(((e,t)=>{if("string"!=typeof t||!a)return[...e,t];const n=t.toLowerCase(),o=n.indexOf(a.toLowerCase()),d=n[o+a.length];if(o<0||d&&d.match(l))return[...e,t];const u=[];return u.push(t.substring(0,o)),u.push(r.ZP.createElement("span",{className:"matching-text-highlight"},t.substring(o,o+a.length))),u.push(t.substring(o+a.length)),[...e,...u]}),[]);case"links":return function(e){return e.reduce(((e,t)=>{if("string"!=typeof t)return[...e,t];const n=t.match(g);if(!n||!n.length)return[...e,t];const o=[];let d=n.shift(),a=0;for(;d;){const e=t.indexOf(d,a);o.push(t.substring(a,e)),d.startsWith("@")?o.push(r.ZP.createElement(i.Z,{username:d},d)):(d.endsWith("?")&&(d=d.slice(0,d.length-1)),o.push(r.ZP.createElement(c.Z,{text:d,url:d}))),a=e+d.length,d=n.shift()}return o.push(t.substring(a)),[...e,...o]}),[])}(e);case"simple_markdown":return y(e,"jsx");case"simple_markdown_html":return y(e,"html")}var d,a;return e}),[e])}function m(e,t,n){return a.op?e:e.reduce(((e,d)=>{if("string"!=typeof d)return[...e,d];const a=(d=(0,u.g6)(d)).split(o.Z),i=d.match(o.Z)||[];return e.push(a[0]),i.reduce(((e,d,i)=>{const c=(0,u.U_)((0,o.l)(d));if(!c)return e;const l=(0,s.Z)("emoji","small"===t&&"emoji-small");"jsx"===n&&e.push(r.ZP.createElement("img",{className:l,src:`./img-apple-${"big"===t?"160":"64"}/${c}.png`,alt:d})),"html"===n&&e.push(`${d}`);const f=2*i+2;return a[f]&&e.push(a[f]),e}),e)}),[])}function p(e,t){return e.reduce(((e,n)=>"string"!=typeof n?[...e,n]:[...e,...n.split(/\r\n|\r|\n/g).reduce(((e,n,o,d)=>{const a=n.trimLeft(),u=n.length-a.length;return e.push(String.fromCharCode(160).repeat(u)+a),o!==d.length-1&&e.push("jsx"===t?r.ZP.createElement("br",null):"
"),e}),[])]),[])}const g=new RegExp(`${d.FM}|${d.uW}`,"ig");function y(e,t){return e.reduce(((e,n)=>{if("string"!=typeof n)return[...e,n];const o=n.split(f),d=n.match(f)||[];return e.push(o[0]),d.reduce(((e,n,d)=>{"jsx"===t?e.push(n.startsWith("**")?r.ZP.createElement("b",null,n.replace(/\*\*/g,"")):r.ZP.createElement("i",null,n.replace(/__/g,""))):e.push(n.startsWith("**")?`${n.replace(/\*\*/g,"")}`:`${n.replace(/__/g,"")}`);const a=2*d+2;return o[a]&&e.push(o[a]),e}),e)}),[])}},386:(e,t,n)=>{n.d(t,{q:()=>d,b:()=>a});var r=n(3716),o=n(7361);function d(e,t=!1){o.cj||!document.activeElement||document.activeElement.id!==r.R2||!t&&e.target!==e.currentTarget||e.preventDefault()}function a(e){d(e,!0)}},7373:(e,t,n)=>{n.d(t,{Z:()=>u});var r=n(4050),o=n(5116),d=n(782),a=n(1638);const u=(0,o.c$)(((e,{userId:t})=>({userOrChat:t?(0,a.dy)(e,t):void 0})),((e,t)=>(0,d.ei)(t,["openChat","openChatByUsername"])))((({username:e,userOrChat:t,children:n,openChat:o,openChatByUsername:d})=>r.ZP.createElement("a",{onClick:()=>{t?o({id:t.id}):e&&d({username:e.substring(1)})},className:"text-entity-link",dir:"auto"},n)))},231:(e,t,n)=>{n.d(t,{Z:()=>u});var r=n(4050),o=n(6752),d=n(9204),a=n(8512);const u=({ref:e,type:t="button",onClick:n,onContextMenu:u,onMouseDown:s,onMouseEnter:i,onMouseLeave:c,onFocus:l,children:f,size:h="default",color:m="primary",backgroundImage:p,className:g,round:y,pill:v,fluid:b,isText:w,isLoading:I,ariaLabel:C,href:S,download:E,disabled:P,ripple:M,faded:A,tabIndex:k,isRtl:T,withClickPropagation:N})=>{let L=(0,r.sO)(null);e&&(L=e);const[R,D]=(0,r.eJ)(!1),Z=(0,o.Z)("Button",g,h,m,y&&"round",v&&"pill",b&&"fluid",P&&"disabled",w&&"text",I&&"loading",M&&"has-ripple",A&&"faded",R&&"clicked",p&&"with-image"),O=(0,r.I4)((e=>{!P&&n&&n(e),D(!0),setTimeout((()=>{D(!1)}),400)}),[P,n]),x=(0,r.I4)((e=>{N||e.preventDefault(),!P&&s&&s(e)}),[s,P,N]);return S?r.ZP.createElement("a",{ref:L,className:Z,href:S,title:C,download:E,tabIndex:k,dir:T?"rtl":void 0},f,!P&&M&&r.ZP.createElement(a.Z,null)):r.ZP.createElement("button",{ref:L,type:t,className:Z,onClick:O,onContextMenu:u,onMouseDown:x,onMouseEnter:i&&!P?i:void 0,onMouseLeave:c&&!P?c:void 0,onFocus:l&&!P?l:void 0,"aria-label":C,title:C,tabIndex:k,dir:T?"rtl":void 0,style:p?`background-image: url(${p})`:void 0},I?r.ZP.createElement("div",null,r.ZP.createElement("span",{dir:T?"auto":void 0},"Please wait..."),r.ZP.createElement(d.Z,{color:w?"blue":"white"})):f,!P&&M&&r.ZP.createElement(a.Z,null))}},4605:(e,t,n)=>{n.d(t,{Z:()=>s});var r=n(4050),o=n(6752),d=n(9107),a=n(2340),u=n(9204);const s=(0,r.X$)((({id:e,name:t,value:n,label:s,subLabel:i,checked:c,disabled:l,round:f,blocking:h,isLoading:m,onChange:p,onCheck:g})=>{const y=(0,d.Z)(),v=(0,r.I4)((e=>{p&&p(e),g&&g(e.currentTarget.checked)}),[p,g]),b=(0,o.Z)("Checkbox",l&&"disabled",f&&"round",m&&"loading",h&&"blocking");return r.ZP.createElement("label",{className:b,dir:y.isRtl?"rtl":void 0},r.ZP.createElement("input",{type:"checkbox",id:e,name:t,value:n,checked:c,disabled:l,onChange:v}),r.ZP.createElement("div",{className:"Checkbox-main"},r.ZP.createElement("span",{className:"label",dir:"auto"},(0,a.Z)(s)),i&&r.ZP.createElement("span",{className:"subLabel",dir:"auto"},(0,a.Z)(i))),m&&r.ZP.createElement(u.Z,null))}))},3106:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(4050),o=n(2328);const d=({trigger:e,className:t,children:n,positionX:d="left",positionY:a="top",footer:u,forceOpen:s,onOpen:i,onClose:c})=>{const l=(0,r.sO)(null),f=(0,r.sO)(null),[h,m]=(0,r.eJ)(!1);return r.ZP.createElement("div",{ref:f,className:`DropdownMenu ${t||""}`,onKeyDown:e=>{const t=l.current;if(!h||40!==e.keyCode||!t)return;const n=document.activeElement,r=Array.from(t.children);n&&-1!==r.indexOf(n)||r[0].focus()}},e({onTrigger:()=>{m(!h),h?c&&c():i&&i()},isOpen:h}),r.ZP.createElement(o.Z,{ref:l,containerRef:f,isOpen:h||!!s,className:t||"",positionX:d,positionY:a,footer:u,autoClose:!0,onClose:()=>{m(!1),c&&c()},shouldSkipTransition:s},n))}},7687:(e,t,n)=>{n.d(t,{Z:()=>a});var r=n(4050),o=n(6752),d=n(9107);const a=(0,r.X$)((({ref:e,id:t,className:n,value:a,label:u,error:s,success:i,disabled:c,readOnly:l,placeholder:f,autoComplete:h,inputMode:m,maxLength:p,onChange:g,onInput:y,onKeyPress:v,onKeyDown:b,onBlur:w,onPaste:I})=>{const C=(0,d.Z)(),S=s||i||u,E=(0,o.Z)("input-group",a&&"touched",s?"error":i&&"success",c&&"disabled",l&&"disabled",S&&"with-label",n);return r.ZP.createElement("div",{className:E,dir:C.isRtl?"rtl":void 0},r.ZP.createElement("input",{ref:e,className:"form-control",type:"text",id:t,dir:"auto",value:a||"",placeholder:f,maxLength:p,autoComplete:h,inputMode:m,disabled:c,readOnly:l,onChange:g,onInput:y,onKeyPress:v,onKeyDown:b,onBlur:w,onPaste:I}),S&&r.ZP.createElement("label",{htmlFor:t},S))}))},8033:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(4050),o=n(6752);const d=({children:e,className:t,isRtl:n,onClick:d})=>{const a=(0,r.I4)((e=>{e.preventDefault(),d(e)}),[d]);return r.ZP.createElement("a",{href:"#",className:(0,o.Z)("Link",t),dir:n?"rtl":"auto",onClick:d?a:void 0},e)}},4288:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(4050),o=n(9204);const d=(0,r.X$)((({color:e="blue"})=>r.ZP.createElement("div",{className:"Loading"},r.ZP.createElement(o.Z,{color:e,withBackground:"white"===e}))))},2328:(e,t,n)=>{n.d(t,{Z:()=>h});var r=n(4050),o=n(1212),d=n(2313),a=n(8758),u=n(274),s=n(3989),i=n(6752),c=n(8674),l=n(6590),f=n(386);const h=({ref:e,containerRef:t,isOpen:n,className:h,style:m,menuStyle:p,children:g,positionX:y="left",positionY:v="top",autoClose:b=!1,footer:w,noCloseOnBackdrop:I=!1,onCloseAnimationEnd:C,onClose:S,onMouseEnter:E,onMouseLeave:P,shouldSkipTransition:M})=>{let A=(0,r.sO)(null);e&&(A=e);const k=t||A,{transitionClassNames:T}=(0,o.Z)(n,C,M,void 0,M);(0,r.d4)((()=>n&&S?(0,s.Z)(S):void 0),[n,S]),(0,l.ZP)(n,S,void 0,void 0,b),(0,u.Z)((([e])=>{void 0!==e&&(0,c.YW)(200)}),[n]);const N=(0,d.Z)(A,n,b?S:void 0,void 0,!0);(0,a.Z)(n,k,I?void 0:S);const L=(0,i.Z)("bubble menu-container custom-scroll",v,y,w&&"with-footer",T);return r.ZP.createElement("div",{className:(0,i.Z)("Menu no-selection",h),onKeyDown:n?N:void 0,onMouseEnter:E,onMouseLeave:n?P:void 0,style:m},n&&r.ZP.createElement("div",{className:"backdrop",onMouseDown:f.b}),r.ZP.createElement("div",{ref:A,className:L,style:`transform-origin: ${v} ${y};${p||""}`,onClick:b?S:void 0},g,w&&r.ZP.createElement("div",{className:"footer"},w)))}},8964:(e,t,n)=>{n.d(t,{Z:()=>a});var r=n(4050),o=n(6752),d=n(9107);const a=e=>{const{icon:t,className:n,children:a,onClick:u,href:s,download:i,disabled:c,destructive:l,ariaLabel:f}=e,h=(0,d.Z)(),m=(0,r.I4)((e=>{if(c||!u)return e.stopPropagation(),void e.preventDefault();u(e)}),[c,u]),p=(0,r.I4)((e=>{if(13===e.keyCode||32===e.keyCode)return c||!u?(e.stopPropagation(),void e.preventDefault()):void u(e)}),[c,u]),g=(0,o.Z)("MenuItem",n,c&&"disabled",l&&"destructive"),y=r.ZP.createElement(r.ZP.Fragment,null,t&&r.ZP.createElement("i",{className:`icon-${t}`,"data-char":t.startsWith("char-")?t.replace("char-",""):void 0}),a);return s?r.ZP.createElement("a",{tabIndex:0,className:g,href:s,download:i,"aria-label":f,title:f,target:s.startsWith(window.location.origin)?"_self":"_blank",rel:"noopener noreferrer",dir:h.isRtl?"rtl":void 0,onClick:u},y):r.ZP.createElement("div",{role:"button",tabIndex:0,className:g,onClick:m,onKeyDown:p,"aria-label":f,title:f,dir:h.isRtl?"rtl":void 0},y)}},8512:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(4050),o=n(9118);const d=(0,r.X$)((()=>{const[e,t]=(0,r.eJ)([]),n=(0,r.Ye)((()=>(0,o.Ds)((()=>{t([])}),700,!1)),[]),d=(0,r.I4)((r=>{if(0!==r.button)return;const o=r.currentTarget,d=o.getBoundingClientRect(),a=o.offsetWidth/2;t([...e,{x:r.clientX-d.x-a/2,y:r.clientY-d.y-a/2,size:a}]),requestAnimationFrame((()=>{n()}))}),[e,n]);return r.ZP.createElement("div",{className:"ripple-container",onMouseDown:d},e.map((({x:e,y:t,size:n})=>r.ZP.createElement("span",{style:`left: ${e}px; top: ${t}px; width: ${n}px; height: ${n}px;`}))))}))},9204:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(4050),o=n(6752);const d=({color:e="blue",withBackground:t})=>r.ZP.createElement("div",{className:(0,o.Z)("Spinner",e,t&&"with-background")},r.ZP.createElement("div",null))},3716:(e,t,n)=>{n.d(t,{Ti:()=>r,ou:()=>o,iC:()=>d,Ji:()=>a,eM:()=>u,ZT:()=>s,Cg:()=>i,S:()=>c,b_:()=>l,Vx:()=>f,sd:()=>h,Uh:()=>m,gJ:()=>p,lO:()=>g,Cy:()=>y,lW:()=>v,SG:()=>b,lF:()=>w,fo:()=>I,ee:()=>C,by:()=>S,lo:()=>P,gZ:()=>M,hT:()=>A,YQ:()=>k,rS:()=>T,t_:()=>N,Ov:()=>L,EN:()=>R,pn:()=>D,Hk:()=>Z,Vk:()=>O,mo:()=>x,qU:()=>_,ul:()=>F,NM:()=>B,Qx:()=>$,mw:()=>U,oB:()=>j,zy:()=>W,CX:()=>G,xS:()=>V,b6:()=>H,AR:()=>z,r_:()=>Q,R2:()=>K,nY:()=>J,QU:()=>q,jT:()=>Y,_m:()=>X,ks:()=>ee,l3:()=>te,u_:()=>ne,rO:()=>re,AE:()=>oe,AJ:()=>de,fK:()=>ae,V$:()=>ue,bK:()=>se,ck:()=>ie,xn:()=>ce,K7:()=>le,w7:()=>fe,z7:()=>he,qp:()=>me,Q:()=>pe,Mw:()=>ge,DC:()=>ye,Y7:()=>ve,yK:()=>be,K2:()=>we,bM:()=>Ie,ku:()=>Ce,zq:()=>Se,n:()=>Ee,pR:()=>Pe,kU:()=>Me,Y:()=>Ae,Ng:()=>ke,oG:()=>Te,wG:()=>Ne,dI:()=>Le,FM:()=>Re,uW:()=>De,g$:()=>Ze,FS:()=>Oe,FD:()=>xe,aw:()=>_e,FV:()=>Fe,Nf:()=>Be,WS:()=>$e,DU:()=>Ue,EG:()=>je,t4:()=>We,sR:()=>Ge,$O:()=>Ve,Bg:()=>He,vi:()=>ze,Db:()=>Qe,mU:()=>Ke,p3:()=>Je,It:()=>qe,Vv:()=>Ye,g:()=>Xe,Ro:()=>et,aC:()=>tt,LH:()=>nt});const r="Telegram",o=" [Inactive]",d="Telegram WebZ",a="1.23.1",u=!1,s=!1,i=!1,c="Shoot!\nSomething went wrong, please see the error details in Dev Tools Console.",l="user_auth",f="GramJs:sessionId",h=!1,m="tt-global-state",p=30,g=5e3,y=!1,v="tt-media",b="tt-media-avatars",w="tt-media-progressive",I="tt-custom-bg",C="tt-lang-packs-v6",S=[1,5,10,50,100,500],E="undefined"!=typeof window&&window.innerHeight>=900,P=1,M=750,A=E?60:40,k=2*A,T=72,N=E?30:25,L=100,R=42,D=42,Z=20,O=30,x=200,_=500,F=20,B=!1,$=1,U=1,j=0,W=2,G=W,V=16,H=17,z=15,Q=1e4,K="editable-message-text",J="editable-message-text-modal",q=1440,Y=1150,X=1275,ee=925,te=600,ne=950,re=450,oe=1e9,de="0",ae=100,ue=1500,se=250,ie=600,ce=500,le=(Math.round((se+ie)/2),new Set(["newMessage","newScheduledMessage","deleteMessages","deleteScheduledMessages","deleteHistory"]),13),fe=11,he=160,me=120,pe=64,ge=48,ye=32,ve=64,be=64,we=160,Ie=140,Ce=80,Se=100,Ee="MEMOJI_STICKER",Pe="en",Me=200,Ae=450,ke="video/quicktime",Te=new Set(["image/png","image/gif","image/jpeg"]),Ne=new Set(["video/mp4"]),Le=new Set([...Te,...Ne]),Re="((ftp|https?):\\/\\/)?((www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,63})\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)",De="(@[\\w\\d_-]+)",Ze=/^tg:(\/\/)?([?=&\d\w_-]+)?/gm,Oe=/^(?:https?:\/\/)?(?:t\.me\/)/gm,xe=new Set(["AU","BD","CA","CO","EG","HN","IE","IN","JO","MX","MY","NI","NZ","PH","PK","SA","SV","US"]),_e="777000",Fe="1271266957",Be=0,$e=1,Ue=10,je=5,We=2147483646,Ge="en",Ve="android",He=["android","ios","tdesktop","macos"],ze="TelegramTips",Qe=["ar","pt-br","id","it","ko","ms","pl","es","tr"],Ke="https://bugs.telegram.org/?tag_ids=41&sort=time",Je="#A2AF8E",qe="#0F0F0F",Ye="#0a0a0a8c",Xe="rgba(90, 110, 70, 0.6)",et=100,tt=100*et,nt=!1},274:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(4050),o=n(7204);const d=(e,t,n)=>{const d=(0,o.Z)(t);return(0,r.d4)((()=>e(d||[])),t,n)}},706:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(4050);const o=(e=!1)=>{const[t,n]=(0,r.eJ)(e);return[t,(0,r.I4)((()=>{n(!0)}),[]),(0,r.I4)((()=>{n(!1)}),[])]}},5326:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(4050);const o=()=>{const[,e]=(0,r.eJ)(!1);return(0,r.I4)((()=>{e((e=>!e))}),[])}},8674:(e,t,n)=>{n.d(t,{_L:()=>o,OV:()=>d,YW:()=>s,ZP:()=>i});var r=n(4050);const o="tt-event-heavy-animation-start",d="tt-event-heavy-animation-end";let a,u=!1;const s=e=>(u||(u=!0,document.dispatchEvent(new Event(o))),a&&(clearTimeout(a),a=void 0),e&&(a=window.setTimeout((()=>{u=!1,document.dispatchEvent(new Event(d)),a=void 0}),e)),()=>{u=!1,document.dispatchEvent(new Event(d))}),i=(e,t)=>{(0,r.d4)((()=>(u&&e(),document.addEventListener(o,e),document.addEventListener(d,t),()=>{document.removeEventListener(d,t),document.removeEventListener(o,e)})),[t,e])}},6590:(e,t,n)=>{n.d(t,{Oy:()=>s,Wv:()=>l,ZP:()=>h});var r=n(4050),o=n(7361),d=n(7204),a=n(5116),u=n(782);const s=window.location.hash,i=`${window.location.pathname}${window.location.search}`,c={currentIndex:0,nextStateIndexToReplace:-1,isHistoryAltered:!1,isDisabled:!1,isEdge:!1,currentIndexes:[]},l=()=>{c.isDisabled=!0},f=()=>{c.isEdge&&setTimeout((()=>{c.isEdge=!1}),350)};function h(e,t,n,o,s=!1,l){const f=(0,r.sO)(-1),h=(0,r.sO)(!1),m=(0,d.Z)(e),p=(0,r.sO)(!0),g=(0,r.sO)([]),y=(0,d.Z)(l),v=(0,r.sO)(!1),b=(0,r.I4)(((t=!1)=>{if(l){const e=y||[];if(e.length{const e=++c.currentIndex;c.currentIndexes.push(e),window.history.pushState({index:e,state:o},"",`#${l[l.length-1]}`),g.current.push({index:e,hash:l[l.length-1]})}),0);else{const t=e.length-l.length;if(v.current)v.current=!1;else{if(l.length!==g.current.length&&t>0){const e=g.current[g.current.length-t-1];let n=t;if(e){const t=c.currentIndexes.findIndex((t=>t===e.index));n=c.currentIndexes.length-t-1}c.isHistoryAltered=!0,window.history.go(-n),g.current.splice(g.current.length-t-1,t).forEach((({index:e})=>{c.currentIndexes.splice(c.currentIndexes.indexOf(e),1)}))}l.length>0&&setTimeout((()=>{const e=++c.currentIndex;c.currentIndexes[c.currentIndexes.length-1]=e,window.history.replaceState({index:e,state:o},"",`${i}#${l[l.length-1]}`),g.current[g.current.length-1]={index:e,hash:l[l.length-1]}}),0)}}}else e&&!t&&(p.current=!1,h.current?(h.current=!1,c.currentIndexes.push(f.current)):setTimeout((()=>{const e=++c.currentIndex;c.currentIndexes.push(e),window.history[c.currentIndexes.includes(c.nextStateIndexToReplace-1)&&0!==window.history.state.index&&c.nextStateIndexToReplace===e&&!s?"replaceState":"pushState"]({index:e,state:o},""),f.current=e,s&&(c.nextStateIndexToReplace=c.currentIndex+1)}),0)),!t&&e||p.current||(f.current!==c.currentIndex&&s||(c.isHistoryAltered=!0,window.history.back(),setTimeout((()=>{c.nextStateIndexToReplace=-1}),400)),c.currentIndexes.splice(c.currentIndexes.indexOf(f.current),1),p.current=!0)}),[o,l,e,y,s]);return(0,r.d4)((()=>{const r=e=>{if(c.isHistoryAltered)return void setTimeout((()=>{c.isHistoryAltered=!1}),0);const{index:r}=e.state,o=r||0;try{const r=l?g.current[g.current.length-1].index:f.current,d=c.currentIndexes[c.currentIndexes.indexOf(r)-1];if(c.isDisabled)return;!p.current&&(0===o||o===d)||l&&(0===o||o===d)?(l&&(v.current=!0,g.current.pop()),c.currentIndexes.splice(c.currentIndexes.indexOf(r),1),t&&(c.isEdge&&(0,a.uC)().disableHistoryAnimations(),t(!c.isEdge),p.current=!0)):o===r&&p.current&&n&&!l&&(h.current=!0,c.isEdge&&(0,a.uC)().disableHistoryAnimations(),n(e.state.state))}catch(e){}},o=l?!y||!(0,u.et)(y,l):m!==e;return!c.isDisabled&&o&&b(),window.addEventListener("popstate",r),()=>window.removeEventListener("popstate",r)}),[o,b,l,e,t,n,y,m,s]),{forceClose:()=>b(!0)}}o.cj&&(window.addEventListener("touchstart",(e=>{const t=e.touches[0].pageX;(t<=300||t>=window.innerWidth-300)&&(c.isEdge=!0)})),window.addEventListener("touchend",f),window.addEventListener("popstate",f)),window.history.replaceState({index:c.currentIndex},"",i)},2313:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(4050);const o=(e,t,n,o,d)=>{const[a,u]=(0,r.eJ)(-1);return(0,r.d4)((()=>{u(-1);const n=e.current;t&&n&&!d&&(n.tabIndex=-1,n.focus())}),[e,t,d]),(0,r.I4)((t=>{const r=e.current;if(!r)return;if(13===t.keyCode&&n)return void n(a);if(38!==t.keyCode&&40!==t.keyCode)return;const d=document.activeElement,s=Array.from(o?r.querySelectorAll(o):r.children);let i=d&&s.indexOf(d)||a;if(38===t.keyCode&&i>0)i--;else if(40===t.keyCode&&i{n.d(t,{Z:()=>a});var r=n(663),o=n(5326),d=n(9290);const a=()=>{const e=(0,o.Z)();return(0,d.Z)((()=>r.ll(e)),[e]),r.i0}},8778:(e,t,n)=>{n.d(t,{Z:()=>a});var r=n(4050),o=n(9203),d=n(5326);const a=(e,t,n=!1,a=!1)=>{const u=(0,o.o5)(e,t),s=(0,d.Z)();return a&&(0,o.Qt)(s),(0,r.d4)((()=>{n||u||(0,o.$y)(e,t).then(s)}),[e,s,u,t,n]),u}},9290:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(7204);const o=(e,t)=>{const n=(0,r.Z)(t);n&&!t.some(((e,t)=>e!==n[t]))||e(n||[])}},7204:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(4050);const o=function(e,t){const n=(0,r.sO)(),{current:o}=n;return t&&void 0===e||(n.current=e),o}},1212:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(4050),o=n(6752);const d=(e=!1,t,n=!1,d="fast",a=!1)=>{const[u,s]=(0,r.eJ)(!e),i=(0,r.sO)(),[c,l]=(0,r.eJ)(e&&n);e?(s(!1),l(!0),i.current&&(window.clearTimeout(i.current),i.current=void 0)):(l(!1),u||i.current||(i.current=window.setTimeout((()=>{s(!0),t&&t(),i.current=void 0}),a?0:350)));const f=c&&!(a&&!e),h=Boolean(i.current),m=e||h;return{shouldRender:m,transitionClassNames:(0,o.Z)(d&&"opacity-transition",d,f&&"open",m&&"shown",h&&"closing")}}},8758:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(4050);function o(e,t,n){(0,r.d4)((()=>{const r=e=>{const r=t.current,o=e.target;r&&o&&(r.contains(e.target)&&!o.classList.contains("backdrop")||(e.preventDefault(),e.stopPropagation(),n&&n()))};return e&&n&&document.addEventListener("mousedown",r),()=>{document.removeEventListener("mousedown",r)}}),[e,t,n])}},5247:(e,t,n)=>{n.d(t,{Oo:()=>s,xg:()=>i,lQ:()=>h});var r=n(3716);const o=new Set(["scroll","mouseenter","mouseleave"]),d={},a=new Map,u={};function s(e,t,n,r=!1){const o=c(t,e);l(o,e,r)?function(e,t,n){u[e]||(u[e]=0,document.addEventListener(e,m)),function(e){return d[e]||(d[e]=new Map),d[e]}(e).set(t,n),function(e){const t=a.get(e);if(t)return t;const n=new Set;return a.set(e,n),n}(t).add(e),u[e]++}(o,e,n):e.addEventListener(o,n,r)}function i(e,t,n,r=!1){const o=c(t,e);l(o,e,r)?f(o,e):e.removeEventListener(o,n,r)}function c(e,t){const n=e.replace(/^on/,"").replace(/Capture$/,"").toLowerCase();return"change"===n&&"SELECT"!==t.tagName?"input":"doubleclick"===n?"dblclick":"focus"===n?"focusin":"blur"===n?"focusout":n}function l(e,t,n){return!n&&!o.has(e)&&"VIDEO"!==t.tagName&&"IFRAME"!==t.tagName}function f(e,t){u[e]--,u[e]||document.removeEventListener(e,m),d[e].delete(t),a.get(t).delete(e)}function h(e){const t=a.get(e);t&&(t.forEach((t=>f(t,e))),a.delete(e))}function m(e){const t=d[e.type];if(t){let n=!1,r=e.target;const o=()=>{n=!0},d=()=>{e.preventDefault()},a=new Proxy(e,{get:(e,t)=>"currentTarget"===t?r:"stopPropagation"===t||"stopImmediatePropagation"===t?o:"preventDefault"===t?d:Reflect.get(e,t)});for(;r&&r!==document.body;){const e=t.get(r);if(e&&(e(a),n))return;r=r.parentNode}}}r.eM&&document.addEventListener("dblclick",(()=>{console.log("DELEGATED EVENTS",{delegationRegistry:d,delegatedEventsByElement:a,documentEventCounters:u})}))},2916:(e,t,n)=>{n.d(t,{Z:()=>y});var r=n(4050),o=n(6926),d=n(3716),a=n(5247);const u=new Set(["key","ref","teactFastList","teactOrderKey"]),s=new Set(["dir"]),i={autoPlay:"autoplay",autoComplete:"autocomplete"},c={};function l(e,t,n,o,c,{skipComponentUpdate:y=!1,forceIndex:v=!1,fragment:b,moveDirection:w}={}){if(!y&&t&&n&&(0,r.op)(t)&&(0,r.op)(n)&&!(0,r.k)(t,n)&&(n=function(e,t){return e.componentInstance.props=t.componentInstance.props,(0,r.SO)(e.componentInstance)}(t,n)),!y&&n&&(0,r.op)(n)&&n.componentInstance.isMounted&&h(n,o,c,e),t===n)return n;if(!t&&n){(0,r.op)(n)&&(n=f(n,o,c,e));const t=m(n);(0,r.CD)(n,t),v&&e.childNodes[c]?e.insertBefore(t,e.childNodes[c]):(b||e).appendChild(t)}else if(t&&!n)e.removeChild((0,r.U9)(t)),(0,r.Zb)(t);else if(t&&n)if((0,r.k)(t,n)){(0,r.op)(n)&&(n=f(n,o,c,e));const d=m(n);(0,r.CD)(n,d),e.replaceChild(d,(0,r.U9)(t)),(0,r.Zb)(t)}else{const o=(0,r.op)(t)&&(0,r.op)(n);if(o||(0,r.CD)(n,(0,r.U9)(t)),(0,r.O_)(t)&&(0,r.O_)(n)){if(w){const n=(0,r.U9)(t),o=e.childNodes["up"===w?c:c+1];o?e.insertBefore(n,o):(b||e).appendChild(n)}o||function(e,t,n){const r=Object.keys(e.props),o=Object.keys(t.props);r.forEach((r=>{const o=e.props[r],d=t.props[r];void 0!==o&&(void 0===d||o!==d&&r.startsWith("on"))&&function(e,t,n){"className"===t?e.className="":"value"===t?e.value="":"style"===t?e.style.cssText="":"dangerouslySetInnerHTML"===t?e.innerHTML="":t.startsWith("on")?(0,a.xg)(e,t,n,t.endsWith("Capture")):t.startsWith("data-")||s.has(t)?e.removeAttribute(t):u.has(t)||delete e[i[t]||t]}(n,r,o)})),o.forEach((r=>{const o=e.props[r],d=t.props[r];void 0!==d&&d!==o&&g(n,r,d)}))}(t,n,(0,r.U9)(t)),n.children=function(e,t,n){if(t.props.teactFastList)return function(e,t,n){const o=new Set(t.children.map((e=>{const t="props"in e&&e.props.key;return d.eM&&(0,r.O_)(e)&&!t&&console.warn("Missing `key` in `teactFastList`"),t})));let a=0;const u=e.children.reduce(((e,r,d)=>{let u="props"in r?r.props.key:void 0;if(u&&!o.has(u))return l(n,r,void 0,t,-1),e;if(!u){const o=t.children[d],a=o&&"props"in o?o.props.key:void 0;if(!o||a)return l(n,r,void 0,t,-1),e;u=`__indexKey#${d}`}return e[u]={$element:r,index:a++,order:"props"in r?r.props.teactOrderKey:void 0},e}),{});let s,i,c=[],f=0;return t.children.forEach(((e,r)=>{const o="props"in e?e.props.key:`__indexKey#${r}`,d=u[o];if(!d)return s||(s=[],i=r),void s.push(e);s&&(c=c.concat(p(s,i,n,t)),i=void 0,s=void 0);const a="props"in e?e.props.teactOrderKey:void 0,h=d.index!==f&&d.order!==a,m=h&&f>d.index;h&&!m||f++,c.push(l(n,d.$element,e,t,r,{forceIndex:!0,...h&&{moveDirection:m?"down":"up"}}))})),s&&(c=c.concat(p(s,i,n,t))),c}(e,t,n);const o=Math.max(e.children.length,t.children.length),a=[],u=t.children.length>e.children.length+1?document.createDocumentFragment():void 0;for(let r=0;r=e.children.length?{fragment:u}:void 0);o&&a.push(o)}return u&&n.appendChild(u),a}(t,n,o?e:(0,r.U9)(t))}}return n}function f(e,t,n,o){if(!(0,r.op)(e))return e;const{componentInstance:d}=e;if(!d.isMounted){h(e=(0,r.Hb)(d),t,n,o);const a=e.children[0];(0,r.op)(a)&&(e.children=[f(a,e,0,o)]),d.isMounted=!0}return e}function h(e,t,n,r){const{componentInstance:o}=e;o.onUpdate=()=>{t.children[n]=l(r,t.children[n],o.$element,t,n,{skipComponentUpdate:!0})}}function m(e){if((0,r.V2)(e))return document.createTextNode("");if((0,r.iB)(e))return document.createTextNode(e.value);if((0,r.op)(e))return m(e.children[0]);const{tag:t,props:n,children:o=[]}=e,d=document.createElement(t);return"object"==typeof n.ref&&(n.ref.current=d),Object.keys(n).forEach((e=>{void 0!==n[e]&&g(d,e,n[e])})),e.children=o.map(((t,n)=>l(d,void 0,t,e,n))),d}function p(e,t,n,r){if(1===e.length)return[l(n,void 0,e[0],r,t,{forceIndex:!0})];if(e.length>1){const o=document.createDocumentFragment(),d=e.map((e=>l(n,void 0,e,r,t,{fragment:o})));return n.childNodes[t]?n.insertBefore(o,n.childNodes[t]):n.appendChild(o),d}throw new Error("Unexpected input")}function g(e,t,n){"className"===t?e.className=n:"value"===t?e.value=n:"style"===t?e.style.cssText=n:"dangerouslySetInnerHTML"===t?e.innerHTML=n.__html:t.startsWith("on")?(0,a.Oo)(e,t,n,t.endsWith("Capture")):t.startsWith("data-")||s.has(t)?e.setAttribute(t,n):u.has(t)||(e[i[t]||t]=n)}const y={render:function(e,t){if(!t)return;let n=t.getAttribute("data-teact-head-id");n||(n=(0,o.Z)(c),c[n]={children:[]},t.setAttribute("data-teact-head-id",n));const r=c[n];r.children=[l(t,r.children[0],e,r,0)]}}},4050:(e,t,n)=>{n.d(t,{V2:()=>f,iB:()=>h,op:()=>p,O_:()=>g,SO:()=>S,k:()=>E,Zb:()=>P,Hb:()=>M,U9:()=>T,CD:()=>N,eJ:()=>L,d4:()=>D,bt:()=>Z,Ye:()=>O,I4:()=>x,sO:()=>_,X$:()=>F,ZP:()=>B});var r=n(3716),o=n(9118),d=n(782),a=n(275),u=n(3592),s=n(5247);let i;!function(e){e[e.Empty=0]="Empty",e[e.Text=1]="Text",e[e.Tag=2]="Tag",e[e.Component=3]="Component"}(i||(i={}));const c=Symbol("Fragment");let l;function f(e){return e.type===i.Empty}function h(e){return e.type===i.Text}function m(e){return e.type===i.Tag}function p(e){return e.type===i.Component}function g(e){return m(e)||p(e)}function y(e,t,...n){return t||(t={}),n=(0,d.xH)(n),e===c?n:"function"==typeof e?function(e,t,n){let r;0===n.length?r=void 0:1===n.length?[r]=n:r=n;const o={$element:{},Component:e,name:e.name,props:{...t,...r&&{children:r}},isMounted:!1,hooks:{state:{cursor:0,byCursor:[]},effects:{cursor:0,byCursor:[]},memos:{cursor:0,byCursor:[]}}};return o.$element=v(o),o.$element}(e,t,n):function(e,t,n){return{type:i.Tag,tag:e,props:t,children:b(n).map(I)}}(e,t,n)}function v(e,t=[]){const{props:n}=e;return{componentInstance:e,type:i.Component,props:n,children:t}}function b(e){let t=e.length-1;for(;t>=0&&w(e[t]);t--);return t+17&&console.warn(`[Teact] Slow component render: ${n}, ${Math.round(t)} ms`),C[n].renderTimes.push(t),C[n].renderCount++}}catch(t){(0,u.S)(t),o=e.renderedValue}if(e.isMounted&&o===e.renderedValue)return e.$element;e.renderedValue=o;const d=I(o);return e.$element=v(e,[d]),e.$element}function E(e,t){return typeof e!=typeof t||e.type!==t.type||(h(e)&&h(t)?e.value!==t.value:m(e)&&m(t)?e.tag!==t.tag||e.props.key!==t.props.key:!(!p(e)||!p(t)||e.componentInstance.Component===t.componentInstance.Component&&e.props.key===t.props.key))}function P(e){var t;g(e)&&(p(e)?(t=e.componentInstance).isMounted&&(t.hooks.memos.byCursor.forEach((e=>{e.current=null})),t.hooks.effects.byCursor.forEach((({cleanup:e})=>{if("function"==typeof e)try{e()}catch(e){(0,u.S)(e)}})),t.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.renderedValue=null,e.Component=null,e.props=null,e.forceUpdate=null,e.onUpdate=null}(t)):e.target&&((0,s.lQ)(e.target),e.target=null),e.children.forEach(P))}function M(e){return S(e),e.isMounted=!0,e.$element}function A(e){e.isMounted&&(e.hooks.state.byCursor.forEach((e=>{e.value=e.nextValue})),e.prepareForFrame=(0,o.wT)((()=>A(e))),e.forceUpdate=(0,o.mS)((()=>k(e))))}function k(e){if(!e.isMounted||!e.onUpdate)return;const t=e.$element;S(e),e.$element!==t&&e.onUpdate()}function T(e){return p(e)?T(e.children[0]):e.target}function N(e,t){p(e)?N(e.children[0],t):e.target=t}function L(e){const{cursor:t,byCursor:n}=l.hooks.state;var d;return void 0===n[t]&&(n[t]={value:e,nextValue:e,setter:(d=l,e=>{n[t].nextValue!==e&&(n[t].nextValue="function"==typeof e?e(n[t].value):e,d.prepareForFrame&&d.forceUpdate||(d.prepareForFrame=(0,o.wT)((()=>A(d))),d.forceUpdate=(0,o.mS)((()=>k(d)))),d.prepareForFrame(),d.forceUpdate(),r.ZT&&"TeactNContainer"!==d.name&&console.log("[Teact.useState]",d.name,d.Component&&d.Component.DEBUG_contentComponentName?`> ${d.Component.DEBUG_contentComponentName}`:"",`Forced update at cursor #${t}, next value: `,n[t].nextValue))})}),l.hooks.state.cursor++,[n[t].value,n[t].setter]}function R(e,t,n,r,o){const{cursor:d,byCursor:a}=l.hooks.effects,s=l;function i(){if(!s.isMounted)return;const{cleanup:e}=a[d];if("function"==typeof e)try{e()}catch(e){(0,u.S)(e)}}function c(){s.isMounted&&(a[d].cleanup=n())}if(void 0!==a[d]&&r&&a[d].dependencies){if(r.some(((e,t)=>e!==a[d].dependencies[t]))){if(o){const e=r.reduce(((e,t,n)=>{const r=a[d].dependencies[n];return t!==r&&e.push(`${n}: ${r} => ${t}`),e}),[]);console.log("[Teact]",o,"Effect caused by dependencies.",e.join(", "))}t(i),e(c)}}else t(i),e(c);a[d]={effect:n,dependencies:r,cleanup:a[d]?a[d].cleanup:void 0},l.hooks.effects.cursor++}function D(e,t,n){return R(o.T2,o.D0,e,t,n)}function Z(e,t,n){return R(o.R3,o.zD,e,t,n)}function O(e,t,n){const{cursor:o,byCursor:d}=l.hooks.memos;let{current:u}=d[o]||{};return(void 0===d[o]||t.some(((e,t)=>e!==d[o].dependencies[t])))&&(r.eM&&n&&console.log(`[Teact.useMemo] ${l.name} (${n}): Update is caused by:`,d[o]?(0,a.c)(t,d[o].dependencies).join(", "):"[first render]"),u=e()),d[o]={current:u,dependencies:t},l.hooks.memos.cursor++,u}function x(e,t){return O((()=>e),t)}function _(e){return O((()=>({current:e})),[])}function F(e,t=a.Z,n){return function(o){const d=_(o),u=_();return(!u.current||d.current&&!t(d.current,o))&&(r.eM&&n&&console.log(`[Teact.memo] ${e.name} (${n}): Update is caused by:`,(0,a.c)(d.current,o).join(", ")),d.current=o,u.current=y(e,o)),u.current}}document.addEventListener("dblclick",(()=>{console.log("COMPONENTS",(0,d.Xo)(Object.values(C),"renderCount","desc"))}));const B={createElement:y,Fragment:c}},5116:(e,t,n)=>{n.d(t,{ZP:()=>f,R3:()=>w,Rd:()=>I,uC:()=>C,Q6:()=>S,ll:()=>E,Iq:()=>P,c$:()=>M});var r=n(4050),o=n(3716),d=n(5326),a=n(6926),u=n(9118),s=n(275),i=n(782),c=n(3592);function l(){return(l=Object.assign||function(e){for(var t=1;t7&&console.warn(`[TeactN] Slow containers update: ${Math.round(t)} ms`)}}],g={},y=new Map;function v(){p.forEach((e=>e(h)))}const b=(0,u.mS)(v);function w(e,t=!1){"object"==typeof e&&e!==h&&(h=e,t?v():b())}function I(){return h}function C(){return g}function S(e,t){m[e]||(m[e]=[],g[e]=(t,n=!1)=>{!function(e,t,n){m[e]&&m[e].forEach((e=>{const r=e(h,g,t);r&&w(r,n)}))}(e,t,n)}),m[e].push(t)}function E(e){p.push(e)}function P(e){const t=p.indexOf(e);-1!==t&&p.splice(t,1)}function M(e=(()=>({})),t=(()=>({}))){return n=>function o(u){o.DEBUG_contentComponentName=n.name;const[i]=(0,r.eJ)((0,a.Z)(y)),f=(0,d.Z)();(0,r.d4)((()=>()=>{y.delete(i)}),[i]);let m=y.get(i);if(m||(m={mapStateToProps:e,mapReducersToProps:t,ownProps:u,areMappedPropsChanged:!1,forceUpdate:f,DEBUG_updates:0,DEBUG_componentName:n.name},y.set(i,m)),m.areMappedPropsChanged&&(m.areMappedPropsChanged=!1),!m.mappedProps||!(0,s.Z)(m.ownProps,u)){m.ownProps=u;try{m.mappedProps={...e(h,u),...t(w,g)}}catch(e){(0,c.S)(e)}}return r.ZP.createElement(n,l({},m.mappedProps,u))}}o.eM&&(window.getGlobal=I,document.addEventListener("dblclick",(()=>{console.log("GLOBAL CONTAINERS",(0,i.Xo)(Array.from(y.values()).map((({DEBUG_componentName:e,DEBUG_updates:t})=>({DEBUG_componentName:e,DEBUG_updates:t}))),"DEBUG_updates","desc"))})))},3681:(e,t,n)=>{n.d(t,{l:()=>d,Z:()=>a});const r=/\uFE0F/g,o=String.fromCharCode(8205);function d(e){return e.indexOf(o)<0?e.replace(r,""):e}const a=/(?:\ud83d\udc68\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffc-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb\udffd-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb-\udffd\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb-\udffe]|\ud83d\udc68\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc68\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc68\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\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\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\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\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\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\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\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\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\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\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffc-\udfff]|\ud83e\uddd1\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb\udffd-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb-\udffd\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d[\udc68\udc69]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d[\udc68\udc69]|\ud83e\uddd1\u200d\ud83e\udd1d\u200d\ud83e\uddd1|\ud83d\udc6b\ud83c[\udffb-\udfff]|\ud83d\udc6c\ud83c[\udffb-\udfff]|\ud83d\udc6d\ud83c[\udffb-\udfff]|\ud83d\udc8f\ud83c[\udffb-\udfff]|\ud83d\udc91\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d\udc8f\udc91])|(?:\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\uddd4\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?\u200d[\u2640\u2642]\ufe0f|(?:\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\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\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\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|\ud83d\ude36\u200d\ud83c\udf2b\ufe0f|\u2764\ufe0f\u200d\ud83d\udd25|\u2764\ufe0f\u200d\ud83e\ude79|\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|\ud83d\ude2e\u200d\ud83d\udca8|\ud83d\ude35\u200d\ud83d\udcab|\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-\udc8e\udc90\udc92-\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},1363:(e,t,n)=>{var r=n(5116),o=n(1226),d=n(3716),a=n(7361),u=n(8406),s=n(9524),i=n(7358),c=n(4688),l=n(1622);(0,r.Q6)("initApi",((e,t)=>{(async()=>{d.Cg||(await(0,c.Qw)(),(0,c.f3)()),(0,o.g8)(t.apiUpdate,{userAgent:navigator.userAgent,platform:a.Lt,sessionData:(0,c.K8)(),isTest:window.location.search.includes("test"),isMovSupported:a.pA})})()})),(0,r.Q6)("setAuthPhoneNumber",((e,t,n)=>{const{phoneNumber:r}=n;return(0,o.t9)("provideAuthPhoneNumber",r.replace(/[^\d]/g,"")),{...e,authIsLoading:!0,authError:void 0}})),(0,r.Q6)("setAuthCode",((e,t,n)=>{const{code:r}=n;return(0,o.t9)("provideAuthCode",r),{...e,authIsLoading:!0,authError:void 0}})),(0,r.Q6)("setAuthPassword",((e,t,n)=>{const{password:r}=n;return(0,o.t9)("provideAuthPassword",r),{...e,authIsLoading:!0,authError:void 0}})),(0,r.Q6)("uploadProfilePhoto",((e,t,n)=>{const{file:r}=n;(0,o.t9)("uploadProfilePhoto",r)})),(0,r.Q6)("signUp",((e,t,n)=>{const{firstName:r,lastName:d}=n;return(0,o.t9)("provideAuthRegistration",{firstName:r,lastName:d}),{...e,authIsLoading:!0,authError:void 0}})),(0,r.Q6)("returnToAuthPhoneNumber",(e=>((0,o.t9)("restartAuth"),{...e,authError:void 0}))),(0,r.Q6)("goToAuthQrCode",(e=>((0,o.t9)("restartAuthWithQr"),{...e,authIsLoadingQrCode:!0,authError:void 0}))),(0,r.Q6)("saveSession",((e,t,n)=>{const{sessionData:r}=n;r?(0,c.wX)(n.sessionData,e.currentUserId):(0,c.jv)()})),(0,r.Q6)("signOut",(()=>{(async()=>{try{await(0,u.r1)(),await(0,o.t9)("destroy"),await(0,l.I)(!1)}catch(e){}(0,r.uC)().reset()})()})),(0,r.Q6)("reset",(()=>{(0,c.jv)(),s.clear(d.lW),s.clear(d.SG),s.clear(d.lF),s.clear(d.fo);const e=d.ee.replace(/\d+$/,""),t=(d.ee.match(/\d+$/)||[0])[0];for(let n=0;n{(async()=>{await(0,o.t9)("disconnect")})()})),(0,r.Q6)("loadNearestCountry",(e=>{"connectionStateReady"===e.connectionState&&(async()=>{const e=await(0,o.t9)("fetchNearestCountry");(0,r.R3)({...(0,r.Rd)(),authNearestCountry:e})})()})),(0,r.Q6)("setDeviceToken",((e,t,n)=>{(0,r.R3)({...e,push:{deviceToken:n,subscribedAt:Date.now()}})})),(0,r.Q6)("deleteDeviceToken",(e=>{const t={...e};delete t.push,(0,r.R3)(t)}))},9667:(e,t,n)=>{var r=n(5116),o=n(1713),d=n(3716),a=n(1226),u=n(782),s=n(8406),i=n(663),c=n(1638),l=n(307),f=n(2858);function h(e,{visibility:t,allowedIds:n,deniedIds:r}){const{users:{byId:o},chats:{byId:d}}=e,a={visibility:t};let u,s;const i=e=>{if(!(0,f.YC)(e))return;const{id:t,accessHash:n}=o[e]||{};return t?{id:t,accessHash:n}:void 0},c=e=>{if((0,f.YC)(e))return;const t=d[e];return t?{id:t.id}:void 0};return"contacts"!==t&&"nobody"!==t||(u=n.map(i).filter(Boolean),s=n.map(c).filter(Boolean),u.length>0&&(a.allowedUsers=u),s.length>0&&(a.allowedChats=s)),"everybody"!==t&&"contacts"!==t||(u=r.map(i).filter(Boolean),s=r.map(c).filter(Boolean),u.length>0&&(a.blockedUsers=u),s.length>0&&(a.blockedChats=s)),a}(0,r.Q6)("updateProfile",((e,t,n)=>{const{photo:d,firstName:u,lastName:s,bio:i,username:f}=n;(async()=>{const{currentUserId:t}=e;if(t){if((0,r.R3)({...(0,r.Rd)(),profileEdit:{progress:o.rN.InProgress}}),d&&await(0,a.t9)("updateProfilePhoto",d),(u||s||i)&&await(0,a.t9)("updateProfile",{firstName:u,lastName:s,about:i})){e=(0,r.Rd)();const n=t&&(0,c.dy)(e,t);n&&(0,r.R3)((0,l.Nq)(e,n.id,{firstName:u,lastName:s,fullInfo:{...n.fullInfo,bio:i}}))}f&&await(0,a.t9)("updateUsername",f)&&t&&(0,r.R3)((0,l.Nq)((0,r.Rd)(),t,{username:f})),(0,r.R3)({...(0,r.Rd)(),profileEdit:{progress:o.rN.Complete}})}})()})),(0,r.Q6)("checkUsername",((e,t,n)=>{const{username:d}=n;(async()=>{if(e.profileEdit&&e.profileEdit.progress===o.rN.InProgress)return;(0,r.R3)({...e,profileEdit:{progress:e.profileEdit?e.profileEdit.progress:o.rN.Idle,isUsernameAvailable:void 0}});const t=await(0,a.t9)("checkUsername",d);e=(0,r.Rd)(),(0,r.R3)({...e,profileEdit:{...e.profileEdit,isUsernameAvailable:t}})})()})),(0,r.Q6)("loadWallpapers",(()=>{(async()=>{const e=await(0,a.t9)("fetchWallpapers");if(!e)return;const t=(0,r.Rd)();(0,r.R3)({...t,settings:{...t.settings,loadedWallpapers:e.wallpapers}})})()})),(0,r.Q6)("uploadWallpaper",((e,t,n)=>{const d=n,u=URL.createObjectURL(d);(0,r.R3)({...e,settings:{...e.settings,loadedWallpapers:[{slug:o.mp,document:{fileName:"",size:d.size,mimeType:d.type,previewBlobUrl:u}},...e.settings.loadedWallpapers||[]]}}),(async()=>{const t=await(0,a.t9)("uploadWallpaper",d);if(!t)return;const{wallpaper:n}=t;if(!(e=(0,r.Rd)()).settings.loadedWallpapers)return;const s=e.settings.loadedWallpapers[0];if(!s||s.slug!==o.mp)return;const i={...n,document:{...n.document,previewBlobUrl:u}};(0,r.R3)({...e,settings:{...e.settings,loadedWallpapers:[i,...e.settings.loadedWallpapers.slice(1)]}})})()})),(0,r.Q6)("loadBlockedContacts",(()=>{(async()=>{var e,t;const n=await(0,a.t9)("fetchBlockedContacts");if(!n)return;let o=(0,r.Rd)();null!==(e=n.users)&&void 0!==e&&e.length&&(o=(0,l.Sh)(o,(0,u.ee)(n.users,"id"))),null!==(t=n.chats)&&void 0!==t&&t.length&&(o=(0,l.GL)(o,(0,u.ee)(n.chats,"id"))),o={...o,blocked:{...o.blocked,ids:[...o.blocked.ids||[],...n.blockedIds],totalCount:n.totalCount}},(0,r.R3)(o)})()})),(0,r.Q6)("blockContact",((e,t,n)=>{const{contactId:o,accessHash:d}=n;(async()=>{if(!await(0,a.t9)("blockContact",o,d))return;const e=(0,r.Rd)();(0,r.R3)((0,l.O4)(e,o))})()})),(0,r.Q6)("unblockContact",((e,t,n)=>{const{contactId:o}=n;let d;if((0,f.YC)(o)){const t=(0,c.dy)(e,o);if(!t)return;d=t.accessHash}(async()=>{if(!await(0,a.t9)("unblockContact",o,d))return;const e=(0,r.Rd)();(0,r.R3)((0,l.rB)(e,o))})()})),(0,r.Q6)("loadAuthorizations",(()=>{(async()=>{const e=await(0,a.t9)("fetchAuthorizations");e&&(0,r.R3)({...(0,r.Rd)(),activeSessions:e})})()})),(0,r.Q6)("terminateAuthorization",((e,t,n)=>{const{hash:o}=n;(async()=>{if(!await(0,a.t9)("terminateAuthorization",o))return;const e=(0,r.Rd)();(0,r.R3)({...e,activeSessions:e.activeSessions.filter((e=>e.hash!==o))})})()})),(0,r.Q6)("terminateAllAuthorizations",(()=>{(async()=>{if(!await(0,a.t9)("terminateAllAuthorizations"))return;const e=(0,r.Rd)();(0,r.R3)({...e,activeSessions:e.activeSessions.filter((e=>e.isCurrent))})})()})),(0,r.Q6)("loadNotificationExceptions",(e=>{const{serverTimeOffset:t}=e;(async()=>{const e=await(0,a.t9)("fetchNotificationExceptions",{serverTimeOffset:t});e&&(0,r.R3)((0,l.aJ)((0,r.Rd)(),e))})()})),(0,r.Q6)("loadNotificationSettings",(e=>{const{serverTimeOffset:t}=e;(async()=>{const e=await(0,a.t9)("fetchNotificationSettings",{serverTimeOffset:t});e&&(0,r.R3)((0,l.BI)((0,r.Rd)(),e))})()})),(0,r.Q6)("updateNotificationSettings",((e,t,n)=>{const{peerType:o,isSilent:d,shouldShowPreviews:u}=n;(async()=>{await(0,a.t9)("updateNotificationSettings",o,{isSilent:d,shouldShowPreviews:u})&&(0,r.R3)((0,l.HN)((0,r.Rd)(),o,d,u))})()})),(0,r.Q6)("updateWebNotificationSettings",((e,t,n)=>{(async()=>{(0,r.R3)((0,l.BI)((0,r.Rd)(),n));const e=(0,r.Rd)(),{hasPushNotifications:t,hasWebNotifications:o}=e.settings.byKey;o&&t?await(0,s.Ld)():await(0,s.r1)()})()})),(0,r.Q6)("updateContactSignUpNotification",((e,t,n)=>{const{isSilent:o}=n;(async()=>{await(0,a.t9)("updateContactSignUpNotification",o)&&(0,r.R3)((0,l.BI)((0,r.Rd)(),{hasContactJoinedNotifications:!o}))})()})),(0,r.Q6)("loadLanguages",(()=>{(async()=>{const e=await(0,a.t9)("fetchLanguages");e&&(0,r.R3)((0,l.BI)((0,r.Rd)(),{languages:e}))})()})),(0,r.Q6)("loadPrivacySettings",(()=>{(async()=>{const[e,t,n,o,d]=await Promise.all([(0,a.t9)("fetchPrivacySettings","phoneNumber"),(0,a.t9)("fetchPrivacySettings","lastSeen"),(0,a.t9)("fetchPrivacySettings","profilePhoto"),(0,a.t9)("fetchPrivacySettings","forwards"),(0,a.t9)("fetchPrivacySettings","chatInvite")]);if(!(e&&t&&n&&o&&d))return;const u=(0,r.Rd)();u.settings.privacy.phoneNumber=e,u.settings.privacy.lastSeen=t,u.settings.privacy.profilePhoto=n,u.settings.privacy.forwards=o,u.settings.privacy.chatInvite=d,(0,r.R3)(u)})()})),(0,r.Q6)("setPrivacyVisibility",((e,t,n)=>{const{privacyKey:o,visibility:d}=n,{privacy:{[o]:u}}=e.settings;if(!u)return;const s=h(e,{visibility:d,allowedIds:[...u.allowUserIds,...u.allowChatIds],deniedIds:[...u.blockUserIds,...u.blockChatIds]});(async()=>{const e=await(0,a.t9)("setPrivacySettings",o,s);if(e){const t=(0,r.Rd)();t.settings.privacy[o]=e,(0,r.R3)(t)}})()})),(0,r.Q6)("setPrivacySettings",((e,t,n)=>{const{privacyKey:o,isAllowList:d,contactsIds:u}=n,{privacy:{[o]:s}}=e.settings;if(!s)return;const i=h(e,{visibility:s.visibility,allowedIds:d?u:[...s.allowUserIds,...s.allowChatIds],deniedIds:d?[...s.blockUserIds,...s.blockChatIds]:u});(async()=>{const e=await(0,a.t9)("setPrivacySettings",o,i);if(e){const t=(0,r.Rd)();t.settings.privacy[o]=e,(0,r.R3)(t)}})()})),(0,r.Q6)("updateIsOnline",((e,t,n)=>{(0,a.t9)("updateIsOnline",n)})),(0,r.Q6)("loadContentSettings",(()=>{(async()=>{const e=await(0,a.t9)("fetchContentSettings");e&&(0,r.R3)((0,l.BI)((0,r.Rd)(),e))})()})),(0,r.Q6)("updateContentSettings",((e,t,n)=>{(async()=>{(0,r.R3)((0,l.BI)((0,r.Rd)(),{isSensitiveEnabled:n})),await(0,a.t9)("updateContentSettings",n)||(0,r.R3)((0,l.BI)((0,r.Rd)(),{isSensitiveEnabled:!n}))})()})),(0,r.Q6)("loadCountryList",((e,t,n={})=>{let{langCode:o}=n;o||(o=e.settings.byKey.language),(async()=>{const e=await(0,a.t9)("fetchCountryList",{langCode:o});e&&(0,r.R3)({...(0,r.Rd)(),countryList:e})})()})),(0,r.Q6)("ensureTimeFormat",((e,t)=>{if(e.authNearestCountry){const n=d.FD.has(e.authNearestCountry.toUpperCase())?"12h":"24h";t.setSettingOption({timeFormat:n}),(0,i.qf)(n)}(async()=>{if((0,r.Rd)().settings.byKey.wasTimeFormatSetManually)return;const e=await(0,a.t9)("fetchNearestCountry");if(e){const n=d.FD.has(e.toUpperCase())?"12h":"24h";t.setSettingOption({timeFormat:n}),(0,i.qf)(n)}})()}))},4907:(e,t,n)=>{var r=n(5116),o=n(3716),d=n(8406),a=n(307),u=n(663),s=n(1638),i=n(1622),c=n(1947);(0,r.Q6)("apiUpdate",((e,t,n)=>{switch(o.eM&&"updateUserStatus"!==n["@type"]&&"updateServerTimeOffset"!==n["@type"]&&console.log("[GramJs] UPDATE",n["@type"],{update:n}),n["@type"]){case"updateApiReady":!function(e){const{hasWebNotifications:t,hasPushNotifications:n}=(0,s.dZ)(e);t&&n&&(0,d.Ld)(),(0,u.m0)(e.settings.byKey.language)}(e);break;case"updateAuthorizationState":!function(e){let t=(0,r.Rd)();const n="authorizationStateReady"===t.authState,o=e.authorizationState;switch((0,r.R3)({...t,authState:o,authIsLoading:!1}),t=(0,r.Rd)(),o){case"authorizationStateLoggingOut":(0,i.I)(!1),(0,r.R3)({...t,isLoggingOut:!0});break;case"authorizationStateWaitCode":(0,r.R3)({...t,authIsCodeViaApp:e.isCodeViaApp});break;case"authorizationStateWaitPassword":(0,r.R3)({...t,authHint:e.hint});break;case"authorizationStateWaitQrCode":(0,r.R3)({...t,authIsLoadingQrCode:!1,authQrCode:e.qrCode});break;case"authorizationStateReady":if(n)break;(0,i.I)(!0),(0,r.R3)({...t,isLoggingOut:!1,lastSyncTime:Date.now()})}}(n);break;case"updateAuthorizationError":!function(e){(0,r.R3)({...(0,r.Rd)(),authError:e.message})}(n);break;case"updateConnectionState":!function(e){const{connectionState:t}=e,n=(0,r.Rd)();(0,r.R3)({...n,connectionState:t}),"connectionStateReady"===t&&"authorizationStateReady"===n.authState?(0,r.uC)().sync():"connectionStateBroken"===t&&(0,r.uC)().signOut()}(n);break;case"updateSession":!function(e){const{sessionData:t}=e,{authRememberMe:n,authState:o}=(0,r.Rd)(),d=!t||!t.mainDcId;n&&"authorizationStateReady"===o&&!d&&(0,r.uC)().saveSession({sessionData:t})}(n);break;case"updateServerTimeOffset":!function(e){const t=(0,r.Rd)();t.serverTimeOffset!==e.serverTimeOffset&&(0,r.R3)({...t,serverTimeOffset:e.serverTimeOffset})}(n);break;case"updateCurrentUser":!function(e){const{currentUser:t}=e;(0,r.R3)({...(0,a.Nq)((0,r.Rd)(),t.id,t),currentUserId:t.id}),function(e){const t=localStorage.getItem(o.b_);if(!t)return;const n=JSON.parse(t);n.id=e,localStorage.setItem(o.b_,JSON.stringify(n))}(t.id)}(n);break;case"error":{"SESSION_REVOKED"===n.error.message&&t.signOut();const e=(0,c.J_)(n.error);e?t.addPaymentError({error:e}):t.showDialog&&t.showDialog({data:{...n.error,hasErrorKey:!0}});break}}}))},7895:(e,t,n)=>{var r=n(5116),o=n(3716),d=n(7361),a=n(663),u=n(6917),s=n(1638),i=n(1622);!function(){function e(){const e=document.documentElement.className.match(/theme-(\w+)/),t=e?e[1]:"light",n=(0,r.Rd)(),d=(0,s.Pu)(n),{animationLevel:a}=n.settings.byKey;d!==t&&((0,u.Z)(d,a===o.zy),(0,r.R3)({...n}))}const t=window.matchMedia("(prefers-color-scheme: dark)");"function"==typeof t.addEventListener?t.addEventListener("change",e):"function"==typeof t.addListener&&t.addListener(e)}(),(0,r.Q6)("init",(e=>{const{animationLevel:t,messageTextSize:n,language:r}=e.settings.byKey,c=(0,s.Pu)(e);(0,a.m0)(r,void 0,!0),document.documentElement.style.setProperty("--composer-text-size",`${Math.max(n,d.cj?16:15)}px`),document.documentElement.style.setProperty("--message-meta-height",`${Math.floor(1.3125*n)}px`),document.documentElement.style.setProperty("--message-text-size",`${n}px`),document.documentElement.setAttribute("data-message-text-size",n.toString()),document.body.classList.add("initial"),document.body.classList.add(`animation-level-${t}`),document.body.classList.add(d.$b?"is-touch-env":"is-pointer-env"),(0,u.Z)(c,t===o.zy),(0,i.p)(),d.cj?document.body.classList.add("is-ios"):d.wZ?document.body.classList.add("is-android"):d.jm&&document.body.classList.add("is-macos")})),(0,r.Q6)("setIsUiReady",((e,t,n)=>{const{uiReadyState:r}=n;return 2===r&&document.body.classList.remove("initial"),{...e,uiReadyState:r}})),(0,r.Q6)("setAuthPhoneNumber",((e,t,n)=>{const{phoneNumber:r}=n;return{...e,authPhoneNumber:r}})),(0,r.Q6)("setAuthRememberMe",((e,t,n)=>({...e,authRememberMe:Boolean(n)}))),(0,r.Q6)("clearAuthError",(e=>({...e,authError:void 0}))),(0,r.Q6)("disableHistoryAnimations",(()=>{setTimeout((()=>{(0,r.R3)({...(0,r.Rd)(),shouldSkipHistoryAnimations:!1}),document.body.classList.remove("no-animate")}),450),(0,r.R3)({...(0,r.Rd)(),shouldSkipHistoryAnimations:!0},!0)}))},3781:(e,t,n)=>{var r=n(5116),o=n(307);(0,r.Q6)("setSettingOption",((e,t,n)=>(0,o.BI)(e,n))),(0,r.Q6)("setThemeSettings",((e,t,n)=>{const{theme:r,...d}=n;return(0,o.lr)(e,r,d)}))},8332:(e,t,n)=>{n.d(t,{YC:()=>i,Bf:()=>c,G9:()=>l,ZV:()=>f,eA:()=>h,Ru:()=>m,pK:()=>p,l6:()=>g,zX:()=>y,U:()=>v,GM:()=>b,hu:()=>w,RT:()=>I,Hp:()=>C,Nl:()=>S,VE:()=>E,Mg:()=>P,Qm:()=>M,H5:()=>A,q8:()=>k,Hd:()=>T,OE:()=>N,pE:()=>L,i4:()=>R,Sm:()=>D,cc:()=>Z,P4:()=>O,O:()=>x,wG:()=>F,Fu:()=>B,SB:()=>$,zF:()=>U,ih:()=>j});var r=n(6137),o=n(3716),d=n(782),a=n(5527),u=n(790);const s=Date.now()/1e3+31622400;function i(e){return"number"==typeof e?e>0:!e.startsWith("-")}function c(e){return l(e)||f(e)}function l(e){return"chatTypeBasicGroup"===e.type}function f(e){return"chatTypeSuperGroup"===e.type}function h(e){return"chatTypeChannel"===e.type}function m(e){return"chatTypePrivate"===e.type||"chatTypeBasicGroup"===e.type}function p(e){return e===o.FV}function g(e){switch(e.type){case"chatTypePrivate":return"PrivateChat";case"chatTypeBasicGroup":case"chatTypeSuperGroup":return"AccDescrGroup";case"chatTypeChannel":return"AccDescrChannel";default:return"Chat"}}function y(e){if("chatTypePrivate"===e.type||"chatTypeSecret"===e.type)return e.id}function v(e,t,n,r=!1){return r||n&&t.id===n.id&&n.isSelf?e("SavedMessages"):t.title||e("HiddenName")}function b(e){if(e.fullInfo)return e.fullInfo.about}function w(e){const{username:t}=e;if(t)return`https://t.me/${t}`;const{inviteLink:n}=e.fullInfo||{};return n}function I(e,t="normal"){if(e.avatarHash)switch(t){case"big":return`profile${e.id}?${e.avatarHash}`;default:return`avatar${e.id}?${e.avatarHash}`}}function C(e){return!e.lastMessage}function S(e){return Boolean(e.adminRights)}function E(e,t){return!!e.adminRights&&e.adminRights[t]}function P(e,t){var n,r;return Boolean((null===(n=e.currentUserBannedRights)||void 0===n?void 0:n[t])||(null===(r=e.defaultBannedRights)||void 0===r?void 0:r[t]))}function M(e,t){return t!==r._f||!(e.isRestricted||e.migratedTo||e.isNotJoined||p(e.id))&&(!!e.isCreator||!!i(e.id)||(h(e)?E(e,"postMessages"):S(e)||!P(e,"sendMessages")))}function A(e,t=!1){if(!e)return{canAttachMedia:!1,canAttachPolls:!1,canSendStickers:!1,canSendGifs:!1,canAttachEmbedLinks:!1};const n=S(e);return{canAttachMedia:n||!P(e,"sendMedia"),canAttachPolls:(n||!P(e,"sendPolls"))&&(!i(e.id)||t),canSendStickers:n||!P(e,"sendStickers"),canSendGifs:n||!P(e,"sendGifs"),canAttachEmbedLinks:n||!P(e,"embedLinks")}}function k(e,t,n){if(null!=t&&t.sendMessages){const{untilDate:n}=t;return n&&nfunction(e,t,n,r,o,d,a,u){if(!e.isListed)return!1;if(d&&d.has(e.id))return!1;if(a&&a.has(e.id))return!0;if(u&&u.has(e.id))return!0;if(L(e)&&t.excludeArchived)return!1;if(t.excludeMuted&&!e.unreadMentionsCount&&R(e,r,o))return!1;if(!e.unreadCount&&!e.unreadMentionsCount&&!e.hasUnreadMark&&t.excludeRead)return!1;if(i(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(c(e))return!!t.groups;if(h(e))return!!t.channels}return!1}(e[d],n,t,r,o,a,u,s))),n.pinnedChatIds]}function x(e,t,n,r="all"){const o=new Set(t),a=n?new Set(n):void 0,u=(null==n?void 0:n.reduce(((t,n)=>{const d=e[n];return d&&o.has(d.id)&&_(d,r)&&t.push(d),t}),[]))||[],s=t.reduce(((t,n)=>{const o=e[n];return!o||a&&a.has(o.id)||!_(o,r)||t.push(o),t}),[]);return{pinnedChats:u,otherChats:(0,d.Xo)(s,N,"desc")}}function _(e,t){if(!e.lastMessage||e.migratedTo)return!1;switch(t){case"all":if(L(e))return!1;break;case"archived":if(!L(e))return!1}return!e.isRestricted&&!e.isNotJoined}function F(e,t){const n=new Set(t);return{pinnedChats:e.pinnedChats.filter((({id:e})=>n.has(e))),otherChats:e.otherChats.filter((({id:e})=>n.has(e)))}}function B(e,t,n,r,o,d){const[a]=O(e,t,n,o,d,r),u=a.map((t=>e[t])).filter((e=>(null==e?void 0:e.lastMessage)&&!e.isRestricted&&!e.isNotJoined));return{unreadDialogsCount:u.reduce(((e,t)=>t.unreadCount||t.hasUnreadMark?e+1:e),0),hasActiveDialogs:u.some((e=>e.unreadMentionsCount||!R(e,o,d)&&(e.unreadCount||e.hasUnreadMark)))}}function $(e,t,n,r,o,d,a){const{id:u,title:s,emoticon:i,description:c,pinnedChatIds:l,excludedChatIds:f,includedChatIds:h,excludeArchived:m,excludeMuted:p,excludeRead:g,...y}=r;return Object.values(y).filter(Boolean).length>1||null!=f&&f.length||null!=h&&h.length?e("Chats",function(e,t,n,r,o,d){const[a,u]=O(e,t,n,o,d,r),{pinnedChats:s,otherChats:i}=x(e,a,u,"folder");return s.length+i.length}(t,n,r,o,d,a)):y.bots?e("FilterBots"):y.groups?e("FilterGroups"):y.channels?e("FilterChannels"):y.contacts?e("FilterContacts"):y.nonContacts?e("FilterNonContacts"):void 0}function U(e,t,n){if(n&&!i(t))return n.isSelf?e("FromYou"):(0,a.Vl)(n)}function j(e,t,n=!1,r){return(0,d.Xo)(e,(e=>{const o=t[e];if(!o)return 0;let d=0;return o.lastMessage&&(d+=o.lastMessage.date),n&&o.isVerified&&(d+=3e9),r&&r.includes(e)&&(d=Date.now()+3e8+(r.length-r.indexOf(e))),d}),"desc")}},2858:(e,t,n)=>{n.d(t,{uw:()=>ie,H5:()=>o.H5,MR:()=>q,kw:()=>r.kw,cc:()=>o.cc,Qm:()=>o.Qm,RT:()=>o.RT,GM:()=>o.GM,hu:()=>o.hu,N0:()=>ne,OE:()=>o.OE,Hd:()=>o.Hd,U:()=>o.U,l6:()=>o.l6,T7:()=>v,SB:()=>o.SB,Fu:()=>o.Fu,VE:()=>o.VE,XV:()=>se,Sc:()=>ae,N5:()=>x,oP:()=>_,qp:()=>L,w6:()=>T,R5:()=>ue,$D:()=>g,aE:()=>$,ep:()=>X,c0:()=>ee,eO:()=>G,Tp:()=>l,kG:()=>Y,Ti:()=>K,DH:()=>Q,KK:()=>h,O$:()=>D,t9:()=>W,Y5:()=>O,zF:()=>o.zF,q8:()=>o.q8,_O:()=>y,bf:()=>B,MK:()=>m,UD:()=>p,b7:()=>Z,kd:()=>F,s1:()=>V,F$:()=>H,Cg:()=>z,bV:()=>re,HV:()=>oe,zX:()=>o.zX,OU:()=>P,RI:()=>M,Ow:()=>le,Rs:()=>r.Rs,Vl:()=>r.Vl,Js:()=>r.Js,db:()=>r.db,Tq:()=>r.Tq,jC:()=>de,BM:()=>te,u8:()=>R,Lo:()=>C,Ul:()=>E,Nl:()=>o.Nl,pE:()=>o.pE,G9:()=>o.G9,eA:()=>o.eA,Bf:()=>o.Bf,Hp:()=>o.Hp,ZV:()=>o.ZV,pK:()=>o.pK,Ru:()=>o.Ru,NB:()=>r.NB,MF:()=>I,CD:()=>k,rl:()=>U,hC:()=>j,CI:()=>A,B4:()=>b,ss:()=>w,jM:()=>S,cS:()=>r.cS,YC:()=>o.YC,kM:()=>r.kM,Mg:()=>o.Mg,Ak:()=>f,O:()=>o.O,P4:()=>o.P4,wG:()=>o.wG,i4:()=>o.i4,Sm:()=>o.Sm,ih:()=>o.ih,Z0:()=>r.Z0});var r=n(5527),o=n(8332),d=n(6137),a=n(3716),u=n(7361),s=n(4784);const i="The message is not supported on this version of Telegram",c=new RegExp(a.FM,"i");function l(e){const{chatId:t,id:n}=e;return function(e,t){return`msg${e}-${t}`}(t,n)}function f(e){const t=e.match(/^msg(-?\d+)-(\d+)/);return{chatId:t[1],messageId:Number(t[2])}}function h(e){return e.previousLocalId||e.id}function m(e,t,n=!1){const{text:r,photo:o,video:d,audio:a,voice:u,document:s,sticker:c,contact:l,poll:f,invoice:h}=t.content,m=r&&r.text.substr(0,80);return t.groupedId?`${n?"":"🖼 "}${m||e("lng_in_dlg_album")}`:o?`${n?"":"🖼 "}${m||e("AttachPhoto")}`:d?`${n?"":"📹 "}${m||e(d.isGif?"AttachGif":"AttachVideo")}`:c?`${c.emoji||""} ${e("AttachSticker")}`.trim():a?`${n?"":"🎧 "}${function(e){const{audio:t,text:n}=e.content;return t&&[t.title,t.performer].filter(Boolean).join(" — ")||(null==n?void 0:n.text)}(t)||e("AttachMusic")}`:u?`${n?"":"🎤 "}${m||e("AttachAudio")}`:s?`${n?"":"📎 "}${m||s.fileName}`:l?e("AttachContact"):f?`${n?"":"📊 "}${f.summary.question}`:h?"Invoice":r?m:i}function p(e){const{text:t,sticker:n,photo:r,video:o,audio:d,voice:a,document:u,poll:s,webPage:c,contact:l,invoice:f}=e.content;return t?t.text:n||r||o||d||a||u||l||s||c||f?void 0:i}function g(e){const{text:t,sticker:n,photo:r,video:o,audio:d,voice:a,document:u,poll:i,webPage:c,contact:l}=e.content;return!!(n||null!=o&&o.isRound)||!(!t||r||o||d||a||u||i||c||l)&&((0,s.Z)(t.text)||!1)}function y(e){const{text:t}=e.content;if(t&&t.text.length<=6&&1===g(e))return t.text}function v(e){const{text:t}=e.content;let n;if(null!=t&&t.entities){let e=t.entities.find((e=>e.type===d.Vv.TextUrl));if(e&&(n=e.url.match(c)),!n&&(e=t.entities.find((e=>e.type===d.Vv.Url)),e)){const{offset:r,length:o}=e;n=t.text.substring(r,r+o).match(c)}}if(!n&&t&&(n=t.text.match(c)),n)return{url:n[0],domain:n[3]}}function b(e){return e.isOutgoing}function w(e){return Boolean(e.replyToMessageId)}function I(e){return Boolean(e.forwardInfo)}function C(e){return!!e.content.action}function S(e){return e.chatId===a.aw&&Math.round(e.id)!==e.id}function E(e){return Boolean(e.senderId)&&!(0,o.YC)(e.senderId)&&b(e)}function P(e,t){return(0,o.YC)(t.id)?(0,r.Js)(t):(0,o.U)(e,t)}function M(e){return e.sendingState?"messageSendingStateFailed"===e.sendingState?"failed":"pending":"succeeded"}function A(e){return e.id>=a.AE}function k(e){return e.content.action&&"historyClear"===e.content.action.type}function T(e){const{content:t}=e,n=t.webPage?t.webPage.video:t.video,r=t.webPage?t.webPage.photo:t.photo,o=t.webPage?t.webPage.document:t.document;if(o)return o.fileName;if(n)return n.fileName;if(t.sticker){const e=t.sticker.isAnimated?"tgs":(0,u.on)()?"webp":"png";return`${t.sticker.id}.${e}`}if(t.audio)return t.audio.fileName;const d=l(e);return r?`${d}.jpg`:t.voice?u.m5?`${d}.ogg`:`${d}.wav`:d}var N=n(5376);function L(e){return e.content}function R(e){return Boolean(D(e)||Z(e)||$(e)||B(e)||function(e){return e.content.contact}(e)||W(e)||x(e)||_(e)||F(e))}function D(e){return e.content.photo}function Z(e){return e.content.video}function O(e){const{video:t}=e.content;return null!=t&&t.isRound?t:void 0}function x(e){return e.content.action}function _(e){return e.content.audio}function F(e){return e.content.voice}function B(e){return e.content.sticker}function $(e){return e.content.document}function U(e){const t=$(e);return t?"photo"===t.mediaType:void 0}function j(e){const t=$(e);return t?"video"===t.mediaType:void 0}function W(e){return e.content.poll}function G(e){return e.content.invoice}function V(e){return e.content.webPage}function H(e){var t;return null===(t=V(e))||void 0===t?void 0:t.photo}function z(e){var t;return null===(t=V(e))||void 0===t?void 0:t.video}function Q(e){var t;return null===(t=function(e){const t=D(e)||Z(e)||$(e)||B(e)||H(e)||z(e);if(t)return t.thumbnail}(e))||void 0===t?void 0:t.dataUri}function K(e,t){const{photo:n,video:r,sticker:o,audio:d,voice:a,document:u}=e.content,s=H(e),i=z(e),c=r||i,f=n||s;if(!(f||c||o||d||a||u))return;const h=l(e);if(c)switch(t){case"micro":case"pictogram":return`${h}?size=m`;case"inline":return te(e)?void 0:J(c,h);case"viewerPreview":return`${h}?size=m`;case"viewerFull":return J(c,h);case"download":return`${h}?download`}if(f)switch(t){case"micro":case"pictogram":return`${h}?size=m`;case"inline":return te(e)?void 0:`${h}?size=x`;case"viewerPreview":return`${h}?size=x`;case"viewerFull":case"download":return`${h}?size=z`}if(u)switch(t){case"micro":case"pictogram":case"inline":case"viewerPreview":if(!(0,N.v6)(u)||te(e))return;return`${h}?size=m`;case"viewerFull":case"download":return h}if(o)switch(t){case"micro":return;case"pictogram":return`${h}?size=m`;case"inline":return h;case"download":return`${h}?download`}if(d)switch(t){case"micro":case"pictogram":return q(d)?`${h}?size=m`:void 0;case"inline":return J(d,h);case"download":return`${h}?download`}if(a)switch(t){case"micro":case"pictogram":return;case"inline":return h;case"download":return`${h}?download`}}function J(e,t){return u.I_&&u.s$?`${t}?fileSize=${e.size}&mimeType=${e.mimeType}`:t}function q(e){return e.thumbnailSizes&&e.thumbnailSizes.length>0}function Y(e,t){const{sticker:n,video:r,audio:o,voice:a}=e.content,s=r||z(e);return n&&"inline"===t&&n.isAnimated?d.IU.Lottie:s&&u.I_&&("viewerFull"===t||"inline"===t)?d.IU.Progressive:o||a?a&&!u.m5?d.IU.BlobUrl:d.IU.Progressive:d.IU.BlobUrl}function X(e){const{photo:t,video:n,document:r}=e.content,o=H(e),d=z(e);if(t||o)return`photo${e.date}.jpeg`;const{fileName:a}=n||d||r||{};return a}function ee(e){const{video:t,document:n}=e.content,r=z(e),{size:o}=t||r||n||{};return o}function te(e){const{photo:t,video:n,document:r}=e.content;return(null==t?void 0:t.blobUrl)||(null==n?void 0:n.blobUrl)||(null==r?void 0:r.previewBlobUrl)}function ne(e,t,n=!1){const r=ue(e,t,n?"media":"inlineMedia");return n?r.reverse():r}function re(e){return e.sizes.find((e=>"z"===e.type))||e.sizes.find((e=>"y"===e.type))||oe(e)}function oe(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 de(e){if(e.width&&e.height)return e}function ae(e,t,n=!1){const r=A(e);return{isUploading:r,isTransferring:r||n,transferProgress:Number(t)}}function ue(e,t,n){let r;switch(n){case"media":r=e=>{const t=Z(e);return D(e)||t&&!t.isRound&&!t.isGif};break;case"documents":r=$;break;case"links":r=e=>V(e)||function(e){const{text:t}=e.content,n=t&&t.text.match(c);if(n)return{url:n[0],domain:n[3]}}(e);break;case"audio":r=_;break;case"voice":r=e=>{const t=Z(e);return F(e)||t&&t.isRound};break;case"inlineMedia":r=e=>{const t=Z(e);return D(e)||t&&!t.isRound&&!t.isGif||U(e)||j(e)};break;default:return[]}return t.reduce(((t,n)=>(e[n]&&r(e[n])&&t.push(n),t)),[])}function se(e){const{audio:t,voice:n,video:r}=L(e),o=t||n||r||z(e);if(o)return o.duration}function ie(e,t){return`${e}_${t}`}const ce={missing_payment_information:{field:"cardNumber",message:"Incorrect card number"},invalid_number:{field:"cardNumber",message:"Incorrect card number"},number:{field:"cardNumber",message:"Incorrect card number"},exp_year:{field:"expiry",message:"Incorrect year"},exp_month:{field:"expiry",message:"Incorrect month"},invalid_expiry_year:{field:"expiry",message:"Incorrect year"},invalid_expiry_month:{field:"expiry",message:"Incorrect month"},cvc:{field:"cvv",message:"Incorrect CVV"},invalid_cvc:{field:"cvv",message:"Incorrect CVV"}};function le(e){const{message:t,code:n,param:r}=e,{field:o,message:d}=r?ce[r]:ce[n];return{field:o,message:d,description:t}}},5527:(e,t,n)=>{n.d(t,{Vl:()=>s,Js:()=>i,Tq:()=>c,kM:()=>l,NB:()=>f,cS:()=>h,kw:()=>m,Z0:()=>p,db:()=>g,Rs:()=>y});var r=n(3716),o=n(790),d=n(782),a=n(2267);const u=[1,8,5,2,7,4,6];function s(e){if(e)switch(e.type){case"userTypeBot":case"userTypeRegular":return e.firstName||e.lastName;case"userTypeDeleted":case"userTypeUnknown":return"Deleted";default:return}}function i(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 c(e,t,n){if(t.id===r.aw)return e("ServiceNotifications").toLowerCase();if(t.type&&"userTypeBot"===t.type)return e("Bot");if(!t.status)return"";switch(t.status.type){case"userStatusEmpty":return e("ALongTimeAgo");case"userStatusLastMonth":return e("WithinAMonth");case"userStatusLastWeek":return e("WithinAWeek");case"userStatusOffline":{const{wasOnline:r}=t.status;if(!r)return e("LastSeen.Offline");const d=new Date((new Date).getTime()+1e3*n),a=new Date(1e3*r);if(a>=d)return e("LastSeen.JustNow");const u=new Date(d.getTime()-a.getTime());if(u.getTime()/1e3<60)return e("LastSeen.JustNow");if(u.getTime()/1e3<3600)return e("LastSeen.MinutesAgo",Math.floor(u.getTime()/1e3/60));const s=new Date;if(s.setHours(0,0,0,0),a>new Date(s.getTime()+1e3*n))return u.getTime()/1e3<21600?e("LastSeen.HoursAgo",Math.floor(u.getTime()/1e3/60/60)):e("LastSeen.TodayAt",(0,o.mr)(a,e));const i=new Date;return i.setDate(d.getDate()-1),i.setHours(0,0,0,0),a>new Date(i.getTime()+1e3*n)?e("LastSeen.YesterdayAt",(0,o.mr)(a,e)):e("LastSeen.AtDate",(0,o.Tu)(e,a))}case"userStatusOnline":return e("Online");case"userStatusRecently":return e("Lately");default:return}}function l(e){const{id:t,status:n,type:o}=e;return!!n&&t!==r.aw&&"userStatusOnline"===n.type&&"userTypeBot"!==o}function f(e){return!(!e.status||"userTypeBot"===e.type||e.id===r.aw||"userTypeDeleted"!==e.type&&"userTypeUnknown"!==e.type)}function h(e){return"userTypeBot"===e.type}function m(e){return!e.isContact&&!h(e)}function p(e,t,n,r=0){return(0,d.Xo)(e,(e=>{const o=(0,a.b)(r);if(n&&n.includes(e))return o+172800-(n.length-n.indexOf(e));const d=t[e];if(!d||!d.status)return 0;if("userStatusOnline"===d.status.type)return d.status.expires;if("userStatusOffline"===d.status.type&&d.status.wasOnline)return d.status.wasOnline;switch(d.status.type){case"userStatusRecently":return o-86400;case"userStatusLastWeek":return o-604800;case"userStatusLastMonth":return o-18144e3;default:return 0}}),"desc")}function g(e){return"number"==typeof e?Math.abs(e):Math.abs(Number(e))}function y(e){const t=e?g(e.id)%7:0;return u[t]}},6788:(e,t,n)=>{n.d(t,{Mg:()=>a,B1:()=>u,SL:()=>s,a4:()=>c,GL:()=>l,fZ:()=>f,Pi:()=>h,vv:()=>m,Dd:()=>p});var r=n(3716),o=n(782),d=n(1638);function a(e,t,n){return{...e,chats:{...e.chats,listIds:{...e.chats.listIds,[t]:n}}}}function u(e,t,n){const{[t]:r}=e.chats.listIds,o=null!=r&&r.length?n.filter((e=>!r.includes(e))):n;return r&&!o.length?e:a(e,t,[...r||[],...o])}function s(e,t){return{...e,chats:{...e.chats,byId:t}}}function i(e,t,n,r){const{byId:d}=e.chats,a=d[t],u=n.isMin&&a&&!a.isMin,s={...a,...u?(0,o.CE)(n,["isMin","accessHash"]):n,...r&&{photos:[r,...a.photos||[]]}};return s.id&&s.type,s}function c(e,t,n,r){const{byId:o}=e.chats;return s(e,{...o,[t]:i(e,t,n,r)})}function l(e,t){const n=Object.keys(t).reduce(((n,r)=>{const o=i(e,r,t[r]);return o&&(n[r]=o),n}),{});return e=s(e,{...e.chats.byId,...n})}function f(e,t){const{byId:n}=e.chats;let r=!1;const o=Object.keys(t).reduce(((o,d)=>{if(!n[d]||n[d].isMin&&!t[d].isMin){const n=i(e,d,t[d]);n&&(o[d]=n,r||(r=!0))}return o}),{});return r&&(e=s(e,{...e.chats.byId,...o})),e}function h(e,t,n){const o=n===r.WS?"archived":"active";let d=e.chats.listIds;return Object.keys(d).forEach((e=>{const n=d[e]||[];e!==o||n.includes(t)?e!==o&&n.includes(t)&&(d={...d,[e]:n.filter((e=>e!==t))}):d={...d,[e]:[...n,t]}})),c(e={...e,chats:{...e.chats,listIds:d}},t,{folderId:n||void 0})}function m(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}}}}function p(e,t){const n=(0,d.Ek)(e,t);if(!n)return e;const{[n]:r}=e.chats.listIds;return r&&(e=a(e,n,r.filter((e=>e!==t)))),c(e,t,{isNotJoined:!0})}},307:(e,t,n)=>{n.d(t,{O4:()=>ye,c_:()=>h,fZ:()=>r.fZ,m6:()=>f,aK:()=>pe,aJ:()=>me,Sh:()=>G,$S:()=>I,bp:()=>Ae,WY:()=>ke,K4:()=>g,bV:()=>y,h8:()=>H,M6:()=>k,i9:()=>N,Dd:()=>r.Dd,vy:()=>_,rB:()=>ve,g_:()=>O,Mg:()=>r.Mg,SL:()=>r.SL,Pb:()=>oe,w3:()=>P,BI:()=>fe,lr:()=>he,pf:()=>l,s5:()=>B,y9:()=>C,nA:()=>Se,_7:()=>Pe,Q$:()=>Ce,Dq:()=>Me,vT:()=>Ie,QH:()=>Ee,Ob:()=>T,a4:()=>r.a4,B1:()=>r.B1,vv:()=>r.vv,Pi:()=>r.Pi,cY:()=>m,GL:()=>r.GL,Wy:()=>s,wV:()=>A,cq:()=>M,rq:()=>Z,No:()=>q,Og:()=>Y,xv:()=>ee,px:()=>X,xj:()=>v,c1:()=>se,z5:()=>ue,qr:()=>re,dx:()=>de,fw:()=>le,H9:()=>ce,HN:()=>ge,ff:()=>b,P4:()=>p,x1:()=>V,TM:()=>we,Rg:()=>D,z3:()=>R,IM:()=>x,Xg:()=>S,j6:()=>E,lG:()=>L,IE:()=>be,Nq:()=>j,Lm:()=>z,Q3:()=>Q,eD:()=>W});var r=n(6788),o=n(6137),d=n(3716),a=n(1638),u=n(782);function s(e,t,n=o._f,r="thread",a){const{messageLists:u}=e.messages;let s=u;if(a||d.Cg)s=t?[{chatId:t,threadId:n,type:r}]:[];else if(t){const e=u[u.length-1];e&&e.chatId===t&&e.threadId===n&&e.type===r||(s=e&&e.chatId===d.AJ?[...u.slice(0,-1),{chatId:t,threadId:n,type:r}]:[...u,{chatId:t,threadId:n,type:r}])}else s=u.slice(0,-1);return{...e,messages:{...e.messages,messageLists:s}}}function i(e,t,n){return c(e,t,{byId:n})}function c(e,t,n){const r=e.messages.byChatId[t]||{byId:{},threadsById:{}};return{...e,messages:{...e.messages,byChatId:{...e.messages.byChatId,[t]:{...r,...n}}}}}function l(e,t,n,r,o){return function(e,t,n,r){const o=e.messages.byChatId[t];return c(e,t,{threadsById:{...null==o?void 0:o.threadsById,[n]:{...null==o?void 0:o.threadsById[n],...r}}})}(e,t,n,{[r]:o})}function f(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).forEach((t=>{e=h(e,t,n[t])})),e}function h(e,t,n){const r=(0,a.Zw)(e,t);return r&&Object.keys(n).every((e=>Boolean(r[Number(e)])))?e:i(e,t,{...n,...r})}function m(e,t,n,r){const o=(0,a.Zw)(e,t)||{},d={...o[n],...r};return d.id?i(e,t,{...o,[n]:d}):e}function p(e,t,n,r){const o=(0,a.Fn)(e,t)||{},d={...o[n],...r};return d.id?P(e,t,{...o,[n]:d}):e}function g(e,t,n){const r=(0,a.Zw)(e,t);if(!r)return e;const o=(0,u.CE)(r,n),d=Object.values((0,u.q0)(r,n)).filter((({forwardInfo:e})=>null==e?void 0:e.isLinkedChannelPost));if(Object.keys(e.messages.byChatId[t].threadsById).map(Number).forEach((r=>{const o=(0,a.tZ)(e,t,r);let d=(0,a.gb)(e,t,r),u=(0,a.qC)(e,t,r),s=(0,a.Cb)(e,t,r),i=(0,a.KB)(e,t),c=null==o?void 0:o.messagesCount;n.forEach((e=>{d&&d.includes(e)&&(d=d.filter((t=>t!==e)),void 0!==c&&(c-=1)),u&&u.includes(e)&&(u=u.filter((t=>t!==e))),s&&s.includes(e)&&(s=s.filter((t=>t!==e))),i&&i.includes(e)&&(i=i.filter((t=>t!==e)))})),e=l(e,t,r,"listedIds",d),e=l(e,t,r,"outlyingIds",u),e=l(e,t,r,"viewportIds",s),e=l(e,t,r,"pinnedIds",i),o&&void 0!==c&&(e=l(e,t,r,"threadInfo",{...o,messagesCount:c}))})),d.length){const n=(0,a.Bt)(e),r=n&&n.chatId===t&&"thread"===n.type,o=null==n?void 0:n.threadId;d.forEach((n=>{const{fromChatId:d,fromMessageId:u}=n.forwardInfo,i=(0,a.hj)(e,d,u);r&&o===u&&(e=s(e,t)),i&&(e=m(e,d,u,{threadInfo:void 0}))}))}return e=i(e,t,o)}function y(e,t,n){const r=(0,a.Fn)(e,t);if(!r)return e;const d=(0,u.CE)(r,n);let s=(0,a.qy)(e,t);return s&&(n.forEach((e=>{s.includes(e)&&(s=s.filter((t=>t!==e)))})),e=l(e,t,o._f,"scheduledIds",s)),P(e,t,d)}function v(e,t,n,r){const o=(0,a.gb)(e,t,n),d=null!=o&&o.length?r.filter((e=>!o.includes(e))):r;return o&&!d.length?e:l(e,t,n,"listedIds",w([...o||[],...d]))}function b(e,t,n,r){const o=(0,a.qC)(e,t,n),d=null!=o&&o.length?r.filter((e=>!o.includes(e))):r;return o&&!d.length?e:l(e,t,n,"outlyingIds",w([...o||[],...d]))}function w(e){return e.sort(((e,t)=>e-t))}function I(e,t,n,r){const o=(0,a.Cb)(e,t,n)||[];return o.includes(r)?e:l(e,t,n,"viewportIds",w([...o.length{e=S(e,t.chatId,t.threadId,t)})),e}function P(e,t,n){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})}function M(e,t,n,r=!1,o=!1){return{...e,focusedMessage:{...e.focusedMessage,chatId:t,messageId:n,noHighlight:r,isResizingContainer:o}}}function A(e,t){return{...e,focusedMessage:{...e.focusedMessage,direction:t}}}function k(e,t,n){return{...e,selectedMessages:{chatId:t,messageIds:n?Array.prototype.concat([],n):[]}}}function T(e,t,n,r,o,d,s,i=!1){const{selectedMessages:c}=e;d&&(s=(0,a.xH)(e,t,d));const l=s||[o];if(!c)return k(e,t,l);const{messageIds:f}=c;let h;const m=l.filter((e=>!f.includes(e)));if(m&&!m.length)h=f.filter((e=>!l.includes(e)));else if(i&&f.length){const d=(0,a.$W)(e,t,n,r),s=d.indexOf(f[f.length-1]),i=d.indexOf(o),c=Math.min(s,i),l=Math.max(s,i),m=d.slice(c,l+1);h=(0,u.Tw)([...f,...m])}else h=[...f,...m];return h.length?{...e,selectedMessages:{...c,messageIds:h}}:N(e)}function N(e){return{...e,selectedMessages:void 0}}function L(e,t,n,r,o){const{channelPostId:d,fromChatId:u}=t.forwardInfo||{};if(d&&u){const t=(0,a.tZ)(e,n,d);t&&(e=l(e,n,d,"threadInfo",{...t,lastMessageId:r,messagesCount:t.messagesCount+(o?-1:1)}))}return e}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,...(0,u.ee)(d,"id")},[t]:{...e.stickers[t],hash:n,..."search"===t?{resultIds:o}:{setIds:r.map((({id:e})=>e))}}}}}function D(e,t,n){const r=e.stickers.setsById[t]||{};return{...e,stickers:{...e.stickers,setsById:{...e.stickers.setsById,[t]:{...r,...n}}}}}function Z(e,t,n,r){const{results:o}=e.gifs.search;let d;if(t||!o)d=n;else{const e=new Set(o.map((e=>e.id)));d=[...o,...n.filter((t=>!e.has(t.id)))]}return{...e,gifs:{...e.gifs,search:{...e.gifs.search,offset:r,results:d}}}}function O(e,t){return{...e,animatedEmojis:t}}function x(e,t,n,r){const o=[...(0,a.Pk)(e,t),...n||[]],d=(0,u.Tw)(o.map((({id:e})=>e))),s=(0,u.ee)(o,"id"),i=d.map((e=>s[e]));return{...e,stickers:{...e.stickers,forEmoji:{emoji:t,stickers:i,hash:r}}}}function _(e){const{emoji:t,stickers:n,hash:r}=e.stickers.forEmoji||{};return t?x(e,t,n,r):e}var F=n(735);function B(e,t){return{...e,users:{...e.users,byId:t}}}function $(e,t,n){const{byId:r}=e.users,o=r[t],d=n.isMin&&o&&!o.isMin,a={...o,...d?(0,u.CE)(n,["isMin","accessHash"]):n};return a.id&&a.type?a:o}function U(e,t){const{userIds:n}=e.contactList||{};if(!n)return e;const r=t.filter((e=>(null==e?void 0:e.isContact)&&!n.includes(e.id))).map((e=>e.id));return 0===r.length?e:{...e,contactList:{userIds:[...r,...n]}}}function j(e,t,n){const{byId:r}=e.users,o=$(e,t,n);return B(e=U(e,[o]),{...r,[t]:o})}function W(e,t){const n=Object.keys(t).reduce(((n,r)=>{const o=$(e,r,t[r]);return o&&(n[r]=o),n}),{});return e=B(e=U(e,Object.values(n)),{...e.users.byId,...n})}function G(e,t){const{byId:n}=e.users;let r=!1;const o=Object.keys(t).reduce(((o,d)=>{if(!n[d]||n[d].isMin&&!t[d].isMin){const n=$(e,d,t[d]);n&&(o[d]=n,r||(r=!0))}return o}),{});return r&&(e=U(e=B(e,{...e.users.byId,...o}),Object.values(o))),e}function V(e,t){return e.users.selectedId===t?e:{...e,users:{...e.users,selectedId:t}}}function H(e,t){const{byId:n}=e.users,{userIds:r}=e.contactList||{};return delete n[t],B(e={...e,contactList:{userIds:r?r.filter((e=>e!==t)):F.D}},n)}function z(e,t){return{...e,userSearch:{...e.userSearch,...t}}}function Q(e,t){return z(e,{fetchingStatus:t})}function K(e,t,n){const{byId:r}=e.users,o=r[t];return o&&o.fullInfo?j(e,t,{...o,fullInfo:{...o.fullInfo,isBlocked:n}}):e}const J=e=>`${e.chatId}_${e.id}`;function q(e,t){return{...e,globalSearch:{...e.globalSearch,...t}}}function Y(e,t){return q(e,{currentContent:t})}function X(e,t,n,r,o){var d;const{resultsByType:a}=e.globalSearch||{},s=t.reduce(((e,t)=>(e[J(t)]=t,e)),{}),i=null==a||null===(d=a[r])||void 0===d?void 0:d.foundIds;if(void 0!==i&&Object.keys(s).every((e=>i.includes(J(s[e])))))return ee(e,{messages:!1});const c=i||[],l=t.map((e=>J(e))),f=Array.prototype.concat(c,l),h=(0,u.et)(c,f)?c:f;return q(e=ee(e,{messages:!1}),{resultsByType:{...(e.globalSearch||{}).resultsByType,[r]:{totalCount:n,nextOffsetId:o,foundIds:h}}})}function ee(e,t){return q(e,{fetchingStatus:{...e.globalSearch.fetchingStatus,...t}})}var te=n(2858);function ne(e,t,n){return{...e,localTextSearch:{byChatThreadKey:{...e.localTextSearch.byChatThreadKey,[t]:n}}}}function re(e,t,n,r,o){const d=(0,te.uw)(t,n);return ne(e,d,{...e.localTextSearch.byChatThreadKey[d],isActive:r,query:o})}function oe(e,t,n,r,o,d){const a=(0,te.uw)(t,n);return ne(e,a,{...e.localTextSearch.byChatThreadKey[a],results:{foundIds:r,totalCount:o,nextOffsetId:d}})}function de(e,t,n,r,o,d){const a=(0,te.uw)(t,n),{results:s}=e.localTextSearch.byChatThreadKey[a]||{},i=(null==s?void 0:s.foundIds)||[],c=ie((0,u.Tw)(Array.prototype.concat(i,r)));return oe(e,t,n,(0,u.et)(i,c)?i:c,o,d)}function ae(e,t,n){return{...e,localMediaSearch:{byChatId:{...e.localMediaSearch.byChatId,[t]:n}}}}function ue(e,t,n){return ae(e,t,{...e.localMediaSearch.byChatId[t],currentType:n})}function se(e,t,n,r,o,d){const{resultsByType:a}=e.localMediaSearch.byChatId[t]||{},s=null!=a&&a[n]?a[n].foundIds:[],i=ie((0,u.Tw)(Array.prototype.concat(s,r)));return function(e,t,n,r,o,d){return ae(e,t,{...e.localMediaSearch.byChatId[t],resultsByType:{...(e.localMediaSearch.byChatId[t]||{}).resultsByType,[n]:{foundIds:r,totalCount:o,nextOffsetId:d}}})}(e,t,n,(0,u.et)(s,i)?s:i,o,d)}function ie(e){return e.sort(((e,t)=>e-t))}function ce(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 fe(e,t){return{...e,settings:{...e.settings,byKey:{...e.settings.byKey,...t}}}}function he(e,t,n){return{...e,settings:{...e.settings,themes:{...e.settings.themes,[t]:{...e.settings.themes[t]||{},...n}}}}}function me(e,t){return t.forEach((t=>{const{chatId:n,...r}=t;e=pe(e,n,r)})),e}function pe(e,t,n){return{...e,settings:{...e.settings,notifyExceptions:{...e.settings.notifyExceptions,[t]:n}}}}function ge(e,t,n,r){switch(t){case"contact":return fe(e,{...void 0!==n&&{hasPrivateChatsNotifications:!n},...void 0!==r&&{hasPrivateChatsMessagePreview:r}});case"group":return fe(e,{...void 0!==n&&{hasGroupNotifications:!n},...void 0!==r&&{hasGroupMessagePreview:r}});case"broadcast":return fe(e,{...void 0!==n&&{hasBroadcastNotifications:!n},...void 0!==r&&{hasBroadcastMessagePreview:r}});default:return}}function ye(e,t){return e=K(e,t,!0),{...e,blocked:{...e.blocked,ids:[t,...e.blocked.ids],totalCount:e.blocked.totalCount+1}}}function ve(e,t){return e=K(e,t,!1),{...e,blocked:{...e.blocked,ids:e.blocked.ids.filter((e=>e!==t)),totalCount:e.blocked.totalCount-1}}}function be(e,t){return{...e,twoFaSettings:{...e.twoFaSettings,...t}}}function we(e,t){return{...e,payment:{...e.payment,shippingOptions:t}}}function Ie(e,t){return{...e,payment:{...e.payment,requestId:t}}}function Ce(e,t){return{...e,payment:{...e.payment,step:t}}}function Se(e,t){if(!t.content||!t.content.invoice)return e;const{title:n,text:r,amount:o,currency:d,isTest:a,photoUrl:u}=t.content.invoice;return{...e,payment:{...e.payment,invoiceContent:{title:n,text:r,photoUrl:u,amount:o,currency:d,isTest:a}}}}function Ee(e,t){return{...e,payment:{...e.payment,stripeCredentials:{...t}}}}function Pe(e,t){return{...e,payment:{...e.payment,...t}}}function Me(e,t,n){if(!t||!n)return{...e,payment:{...e.payment,receipt:void 0}};const{invoice:r}=n.content,{photoUrl:o,text:d,title:a}=r||{};return{...e,payment:{...e.payment,receipt:{...t,photoUrl:o,text:d,title:a}}}}function Ae(e){return{...e,payment:{}}}function ke(e){return{...e,payment:{...e.payment,isPaymentModalOpen:!1}}}},8857:(e,t,n)=>{n.d(t,{Z1:()=>s,Dg:()=>i,FM:()=>c,xo:()=>l,P_:()=>f,YK:()=>h,IK:()=>m,pk:()=>p,g4:()=>g,N:()=>y,Ek:()=>v,Mw:()=>b,ep:()=>w,DI:()=>I,A1:()=>C,UW:()=>S});var r=n(6137),o=n(2858),d=n(6376),a=n(3716),u=n(2913);function s(e,t){return e.chats.byId[t]}function i(e,t){const n=(0,o.zX)(t);return!!n&&(0,d.dy)(e,n)}function c(e,t){return t===e.currentUserId}function l(e,t){const n=i(e,t);return n&&(0,o.cS)(n)}function f(e){return Object.values(e.chats.byId).find((({isSupport:e})=>e))}function h(e,t){if(!(0,o.YC)(t.id)&&!(0,o.eA)(t)&&t.fullInfo)return t.fullInfo.members&&t.fullInfo.members.length!==a.mo?t.fullInfo.members.reduce(((t,{userId:n})=>e.users.byId[n]&&(0,o.kM)(e.users.byId[n])&&n!==e.currentUserId?t+1:t),0):t.fullInfo.onlineCount}function m(e,t){const n=s(e,t),r=n&&(0,o.zX)(n),a=r&&(0,d.dy)(e,r);if(a&&(0,o.cS)(a))return a}function p(e,t){const n=s(e,t),d=m(e,t);if(!n||!d)return!1;if(n.lastMessage&&(0,o.CD)(n.lastMessage))return!0;const a=e.messages.byChatId[t];if(!a)return!1;const{listedIds:u}=a.threadsById[r._f]||{};return u&&!u.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=s(e,t);if(n&&y(e,t))return n.folderId===a.WS?"archived":"active"}function b(e,t){return e.chatFolders.byId[t]}function w(e,t,n=a.Nf){const{active:r,archived:o}=e.chats.orderedPinnedIds;if(n===a.Nf)return!!r&&r.includes(t);if(n===a.WS)return!!o&&o.includes(t);const{byId:d}=e.chatFolders,{pinnedChatIds:u}=d[n]||{};return!!u&&u.includes(t)}function I(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,r=(0,u.d)(e),d=(0,u.N)(e);return t.reduce(((e,t)=>{const a=n[t];return!(a&&a.unreadCount&&a.isListed)||a.isNotJoined||a.isRestricted||!a.unreadMentionsCount&&(0,o.i4)(a,r,d)?e:e+a.unreadCount}),0)}function S(e){return Boolean(s(e,a.aw))}},1638:(e,t,n)=>{n.d(t,{hg:()=>j,xs:()=>oe,_k:()=>X,zB:()=>g,g4:()=>u.g4,bH:()=>ye,__:()=>be,xl:()=>ee,Nu:()=>ne,nB:()=>te,Z1:()=>u.Z1,IK:()=>u.IK,DI:()=>u.DI,Mw:()=>u.Mw,Ek:()=>u.Ek,hj:()=>G,ZB:()=>z,Zw:()=>I,YK:()=>u.YK,Dg:()=>u.Dg,X5:()=>ie,A1:()=>u.A1,jr:()=>w,yN:()=>f,JX:()=>Le,pP:()=>Me,we:()=>Ee,og:()=>Se,$W:()=>M,Bt:()=>b,y5:()=>l,n5:()=>Ce,Ms:()=>Z,_$:()=>R,kK:()=>H,wU:()=>D,yZ:()=>_,It:()=>ue,G$:()=>Q,y8:()=>fe,cv:()=>Y,pk:()=>u.pk,N:()=>u.N,ep:()=>u.ep,xo:()=>u.xo,FM:()=>u.FM,a6:()=>me,te:()=>re,Ev:()=>se,CA:()=>ce,zQ:()=>Ae,_X:()=>K,vk:()=>le,Jf:()=>Te,UW:()=>u.UW,s4:()=>s.s4,b9:()=>W,VF:()=>Ie,gb:()=>E,aW:()=>Pe,xH:()=>he,FT:()=>ge,tV:()=>O,NJ:()=>Fe.N,dZ:()=>Fe.d,dT:()=>J,qC:()=>P,gx:()=>Re,eh:()=>Ze,Mz:()=>De,sp:()=>Oe,KB:()=>k,$$:()=>xe,rd:()=>ae,p9:()=>F,Yy:()=>L,Wq:()=>ke,qy:()=>T,Tm:()=>V,Fn:()=>C,Vt:()=>N,D7:()=>pe,Ur:()=>q,yB:()=>we,Ny:()=>h,E_:()=>m,Pk:()=>p,i3:()=>_e,P_:()=>u.P_,Pu:()=>Ne,Db:()=>U,tZ:()=>x,Cm:()=>B,qS:()=>$,uZ:()=>de,dy:()=>s.dy,Cb:()=>A});var r=n(1713),o=n(7361),d=n(6137),a=n(3716),u=n(8857),s=n(6376),i=n(2858),c=n(782);function l(e){return e.stickers.search}function f(e){return e.gifs.search}function h(e,t){return e.stickers.setsById[t]}function m(e,t){return Object.values(e.stickers.setsById).find((e=>e.shortName.toLowerCase()===t.toLowerCase()))}function p(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 g(e,t){const{animatedEmojis:n}=e;if(!n||!n.stickers)return;const r=t.replace("️","");return n.stickers.find((e=>e.emoji===t||e.emoji===r))}var y=n(2267),v=n(735);function b(e){const{messageLists:t}=e.messages;if(t.length)return t[t.length-1]}function w(e){const{chatId:t}=b(e)||{};return t?(0,u.Z1)(e,t):void 0}function I(e,t){var n;return null===(n=e.messages.byChatId[t])||void 0===n?void 0:n.byId}function C(e,t){var n;return null===(n=e.scheduledMessages.byChatId[t])||void 0===n?void 0:n.byId}function S(e,t,n,r){const o=e.messages.byChatId[t];if(!o)return;const d=o.threadsById[n];return d?d[r]:void 0}function E(e,t,n){return S(e,t,n,"listedIds")}function P(e,t,n){return S(e,t,n,"outlyingIds")}function M(e,t,n,r){switch(r){case"thread":return A(e,t,n);case"pinned":return k(e,t);case"scheduled":return T(e,t)}}function A(e,t,n){return S(e,t,n,"viewportIds")}function k(e,t){return S(e,t,d._f,"pinnedIds")}function T(e,t){return S(e,t,d._f,"scheduledIds")}function N(e,t,n){return S(e,t,n,"scrollOffset")}function L(e,t,n){return S(e,t,n,"replyingToId")}function R(e,t,n){return S(e,t,n,"editingId")}function D(e,t){return S(e,t,d._f,"editingScheduledId")}function Z(e,t,n){return S(e,t,n,"draft")}function O(e,t,n){return S(e,t,n,"noWebPage")}function x(e,t,n){return S(e,t,n,"threadInfo")}function _(e,t,n){return S(e,t,n,"firstMessageId")}function F(e,t,n){return S(e,t,n,"replyStack")}function B(e,t,n){if(n===d._f)return(0,u.Z1)(e,t);const r=x(e,t,n);return r?(0,u.Z1)(e,r.originChannelId||t):void 0}function $(e,t,n){if(n===d._f)return;const r=x(e,t,n);return r?r.topMessageId:void 0}function U(e,t,n){const r=e.messages.byChatId[t];if(!r)return;const{replyToMessageId:o,replyToTopMessageId:d}=n;return o||d?Object.values(r.threadsById).find((e=>e.threadInfo&&(o&&o===e.threadInfo.topMessageId||d&&d===e.threadInfo.topMessageId))):void 0}function j(e,t,n){const r=b(e);if(!r)return!1;const{threadInfo:o}=U(e,t,n)||{};return t===r.chatId&&(r.threadId===d._f||o&&r.threadId===o.threadId)}function W(e,t,n){const r=A(e,t,n);if(!r||!r.length)return!0;let o;if(n===d._f){const n=(0,u.Z1)(e,t);if(!n||!n.lastMessage)return!0;o=n.lastMessage.id}else{const r=x(e,t,n);if(!r||!r.lastMessageId)return;o=r.lastMessageId}return o>=a.AE&&!G(e,t,o)||r[r.length-1]>=o}function G(e,t,n){const r=I(e,t);return r?r[n]:void 0}function V(e,t,n){const r=C(e,t);return r?r[n]:void 0}function H(e,t,n,r){if("scheduled"===r){const n=D(e,t);return n?V(e,t,n):void 0}{const r=R(e,t,n);return r?G(e,t,r):void 0}}function z(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 Q(e,t){const{chatId:n,messageId:r}=e.focusedMessage||{};return n===t?r:void 0}function K(e,t){const n=Q(e,t.chatId);return!!n&&(n===t.id||n===t.previousLocalId)}function J(e,t,n=!1){return function(e,t){const{lastReadOutboxMessageId:n}=(0,u.Z1)(e,t.chatId)||{};return(0,i.CI)(t)||!n||ne===t.id))}(e,t.content.sticker),O=!b&&D&&!Z,x=!b&&Z,_=!b,F=!b&&(m||h),B=!b,$=Boolean((null===(o=w.webPage)||void 0===o?void 0:o.document)||(null===(d=w.webPage)||void 0===d?void 0:d.video)||(null===(a=w.webPage)||void 0===a?void 0:a.photo)||w.audio||w.voice||w.photo||w.video||w.document||w.sticker);return{noOptions:[C,L,E,P,T,A,N,R,O,x,_,F,B,$].every((e=>!e)),canReply:C,canEdit:L,canPin:E,canUnpin:P,canReport:T,canDelete:A,canDeleteForAll:N,canForward:R,canFaveSticker:O,canUnfaveSticker:x,canCopy:_,canCopyLink:F,canSelect:B,canDownload:$}}function ee(e){const{messageIds:t}=e.selectedMessages||{},{chatId:n,threadId:r}=b(e)||{},o=n&&I(e,n);if(!o||!t||!r)return{};const d=t.map((t=>o[t]&&X(e,o[t],r))).filter(Boolean);return{canDelete:d.every((e=>e.canDelete)),canDeleteForAll:d.every((e=>e.canDeleteForAll))}}function te(e){const{messageIds:t}=e.selectedMessages||{},{chatId:n,threadId:r}=b(e)||{},o=n&&I(e,n);return!!(o&&t&&r)&&t.map((t=>o[t]&&X(e,o[t],r))).filter(Boolean).every((e=>e.canReport))}function ne(e){const{messageIds:t}=e.selectedMessages||{},{chatId:n,threadId:r}=b(e)||{},o=n&&I(e,n);return!!(o&&t&&r)&&t.map((t=>o[t]&&X(e,o[t],r))).filter(Boolean).some((e=>e.canDownload))}function re(e,t){const n=e.activeDownloads.byChatId[t.chatId];return!!n&&n.includes(t.id)}function oe(e,t){return e.activeDownloads.byChatId[t]||v.D}function de(e,t){var n;return null===(n=e.fileUploads.byMessageLocalId[t.previousLocalId||t.id])||void 0===n?void 0:n.progress}function ae(e,t,n){if(n===d._f){const n=(0,u.Z1)(e,t);if(!n)return;if(!n.lastReadInboxMessageId)return;return n.lastMessage?(0,i.CI)(n.lastMessage)?n.lastMessage.id:Math.min(n.lastMessage.id,n.lastReadInboxMessageId):n.lastReadInboxMessageId}{const r=x(e,t,n);if(!r)return;return r.lastReadInboxMessageId?Math.min(r.lastReadInboxMessageId,r.lastMessageId||1/0):r.topMessageId}}function ue(e,t,n){const r=(0,u.Z1)(e,t);if(n===d._f){if(!r)return}else{const r=x(e,t,n);if(!r||void 0!==r.lastMessageId&&r.lastMessageId===r.lastReadInboxMessageId)return}const o=P(e,t,n),s=E(e,t,n),i=I(e,t);if(!i||!o&&!s)return;const c=ae(e,t,n);if(!c&&r&&r.isNotJoined)return;const l=t===a.aw?e.serviceNotifications.reduce(((e,t)=>!t.isUnread&&t.id>e?t.id:e),-1):-1;function f(e){return e.find((e=>(!c||e>c)&&i[e]&&(!i[e].isOutgoing||i[e].isFromScheduled)&&e>l))}if(o){const e=f(o);if(e)return e}if(s){const e=f(s);if(e)return e}}function se(e){const{forwardMessages:t}=e;return Boolean(t.isModalShown)}function ie(e,t){const n=Object.values(e.chats.byId).find((e=>(0,i.Ru)(e)&&e.lastMessage&&e.lastMessage.id===t));if(n)return n.id;const{byChatId:r}=e.messages;return Object.keys(r).find((n=>{const o=(0,u.Z1)(e,n);return o&&(0,i.Ru)(o)&&r[o.id].byId[t]}))}function ce(e){const{selectedMessages:t}=e;return Boolean(t)}function le(e,t){const{messageIds:n}=e.selectedMessages||{};return!!n&&n.includes(t)}function fe(e,t,n){const r=I(e,t);if(r)return Object.values(r).filter((e=>e.groupedId===n&&e.forwardInfo)).map((({forwardInfo:e})=>e.fromMessageId))}function he(e,t,n){const r=I(e,t);if(r)return Object.keys(r).map(Number).filter((e=>r[e].groupedId===n))}function me(e,t,n){const{messageIds:r}=e.selectedMessages||{};if(!r)return!1;const o=he(e,t,n);return o&&o.every((e=>r.includes(e)))}function pe(e){const{messageIds:t}=e.selectedMessages||{};return t?t.length:0}function ge(e,t){const n=(0,u.Z1)(e,t);if(!n)return;if(!(0,u.xo)(e,n))return;const r=I(e,t),o=A(e,t,d._f);if(!r||!o)return;const a=(0,c.dF)(o,(e=>!r[e].isOutgoing&&Boolean(r[e].keyboardButtons))),s=(0,c.dF)(o,(e=>Boolean(r[e].shouldHideKeyboardButtons)));return a&&s&&s>a?void 0:a?r[a]:void 0}function ye(e,t){const n=(0,u.Z1)(e,t.chatId);if(!n)return;const r=q(e,t),o=Boolean((0,i.O$)(t)||(0,i.F$)(t)),d=Boolean((0,i.b7)(t)||(0,i.Cg)(t)),a=Boolean((0,i.oP)(t)||(0,i.kd)(t)||(0,i.aE)(t)),{canAutoLoadPhotoFromContacts:s,canAutoLoadPhotoInPrivateChats:c,canAutoLoadPhotoInGroups:l,canAutoLoadPhotoInChannels:f,canAutoLoadVideoFromContacts:h,canAutoLoadVideoInPrivateChats:m,canAutoLoadVideoInGroups:p,canAutoLoadVideoInChannels:g,canAutoLoadFileFromContacts:y,canAutoLoadFileInPrivateChats:v,canAutoLoadFileInGroups:b,canAutoLoadFileInChannels:w}=e.settings.byKey;return o?ve({global:e,chat:n,sender:r,canAutoLoadMediaFromContacts:s,canAutoLoadMediaInPrivateChats:c,canAutoLoadMediaInGroups:l,canAutoLoadMediaInChannels:f}):d?ve({global:e,chat:n,sender:r,canAutoLoadMediaFromContacts:h,canAutoLoadMediaInPrivateChats:m,canAutoLoadMediaInGroups:p,canAutoLoadMediaInChannels:g}):!a||ve({global:e,chat:n,sender:r,canAutoLoadMediaFromContacts:y,canAutoLoadMediaInPrivateChats:v,canAutoLoadMediaInGroups:b,canAutoLoadMediaInChannels:w})}function ve({global:e,chat:t,sender:n,canAutoLoadMediaFromContacts:r,canAutoLoadMediaInPrivateChats:o,canAutoLoadMediaInGroups:d,canAutoLoadMediaInChannels:a}){const u=Boolean(n&&(n.id===e.currentUserId||(0,s.nM)(e,n)));return Boolean(u&&r||!u&&o&&(0,i.YC)(t.id)||d&&(0,i.Bf)(t)||a&&(0,i.eA)(t))}function be(e,t){const n=(0,i.b7)(t)||(0,i.Cg)(t);if(!n)return;const{canAutoPlayVideos:r,canAutoPlayGifs:o}=e.settings.byKey,d=n.isGif||n.isRound;return r&&!d||o&&d}function we(e){return e.settings.byKey.shouldLoopStickers}function Ie(e){const{serviceNotifications:t}=e,n=Math.max(...t.map((({id:e})=>e)));return t.find((({id:e})=>e===n))}function Ce(e){const{chatId:t,threadId:n}=b(e)||{};if(!t||!n)return;const r=(0,i.uw)(t,n),o=e.localTextSearch.byChatThreadKey[r];return o&&o.isActive?o:void 0}function Se(e){const{byChatId:t}=e.localMediaSearch,{chatId:n}=b(e)||{},r=e.users.selectedId;return r&&t[r]?r:n}function Ee(e){const t=Se(e);if(t)return e.localMediaSearch.byChatId[t]}function Pe(e,t){return e.management.byChatId[t]}function Me(e){const{chatId:t,threadId:n}=b(e)||{};if(!t||!n)return;if((0,i.YC)(t))return"user";const r=(0,u.Z1)(e,t);return r?(0,i.Bf)(r)?"group":"channel":void 0}function Ae(e){const{mediaViewer:t}=e;return Boolean(t.messageId||t.avatarOwnerId)}function ke(e){const{users:t,isChatInfoShown:n,newChatMembersProgress:d}=e,a=d!==r.WB.Closed,s=function(e){const{pollResults:t}=e;return Boolean(t.messageId)}(e),i=Boolean(!o.wB&&Ce(e)),c=function(e){const{chatId:t,threadId:n}=b(e)||{};if(!t||!n)return;const r=e.management.byChatId[t];return r&&r.isActive?r:void 0}(e),h=void 0!==l(e).query,m=void 0!==f(e).query,{chatId:p}=b(e)||{},g=t.selectedId,y=(0,u.g4)(e),v=Boolean(g&&y),w=Boolean(p&&y)&&n;return s?r.qt.PollResults:i?r.qt.Search:c?r.qt.Management:h?r.qt.StickerSearch:m?r.qt.GifSearch:a?r.qt.AddingMembers:v?r.qt.UserInfo:w?r.qt.ChatInfo:void 0}function Te(e){return void 0!==ke(e)}function Ne(e){const{theme:t,shouldUseSystemTheme:n}=e.settings.byKey;return n?(0,o.vn)():t}function Le(e){return e.globalSearch.query}function Re(e){return e.payment.chatId}function De(e){return e.payment.messageId}function Ze(e){return e.payment.formId}function Oe(e){return e.payment.requestId}function xe(e){return e.payment.nativeParams?e.payment.nativeParams.publishableKey:void 0}function _e(e){return e.payment.stripeCredentials}var Fe=n(2913)},2913:(e,t,n)=>{function r(e){return e.settings.byKey}function o(e){return e.settings.notifyExceptions}n.d(t,{d:()=>r,N:()=>o})},6376:(e,t,n)=>{function r(e,t){return e.users.byId[t]}function o(e,t){var n;const o=r(e,t);return null==o||null===(n=o.fullInfo)||void 0===n?void 0:n.isBlocked}function d(e,t){return e.contactList&&e.contactList.userIds.includes(t.id)}n.d(t,{dy:()=>r,s4:()=>o,nM:()=>d})},1713:(e,t,n)=>{let r,o,d,a,u,s,i,c,l,f,h,m,p,g;n.d(t,{Uq:()=>r,fo:()=>o,MT:()=>d,du:()=>a,nJ:()=>u,qt:()=>s,bZ:()=>i,Cr:()=>c,Nh:()=>l,rN:()=>f,wv:()=>h,WB:()=>m,vi:()=>p,KB:()=>g,mp:()=>y,u1:()=>v}),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"}(o||(o={})),function(e){e[e.Main=0]="Main",e[e.EditProfile=1]="EditProfile",e[e.Notifications=2]="Notifications",e[e.DataStorage=3]="DataStorage",e[e.Language=4]="Language",e[e.General=5]="General",e[e.GeneralChatBackground=6]="GeneralChatBackground",e[e.GeneralChatBackgroundColor=7]="GeneralChatBackgroundColor",e[e.Privacy=8]="Privacy",e[e.PrivacyPhoneNumber=9]="PrivacyPhoneNumber",e[e.PrivacyLastSeen=10]="PrivacyLastSeen",e[e.PrivacyProfilePhoto=11]="PrivacyProfilePhoto",e[e.PrivacyForwarding=12]="PrivacyForwarding",e[e.PrivacyGroupChats=13]="PrivacyGroupChats",e[e.PrivacyPhoneNumberAllowedContacts=14]="PrivacyPhoneNumberAllowedContacts",e[e.PrivacyPhoneNumberDeniedContacts=15]="PrivacyPhoneNumberDeniedContacts",e[e.PrivacyLastSeenAllowedContacts=16]="PrivacyLastSeenAllowedContacts",e[e.PrivacyLastSeenDeniedContacts=17]="PrivacyLastSeenDeniedContacts",e[e.PrivacyProfilePhotoAllowedContacts=18]="PrivacyProfilePhotoAllowedContacts",e[e.PrivacyProfilePhotoDeniedContacts=19]="PrivacyProfilePhotoDeniedContacts",e[e.PrivacyForwardingAllowedContacts=20]="PrivacyForwardingAllowedContacts",e[e.PrivacyForwardingDeniedContacts=21]="PrivacyForwardingDeniedContacts",e[e.PrivacyGroupChatsAllowedContacts=22]="PrivacyGroupChatsAllowedContacts",e[e.PrivacyGroupChatsDeniedContacts=23]="PrivacyGroupChatsDeniedContacts",e[e.PrivacyActiveSessions=24]="PrivacyActiveSessions",e[e.PrivacyBlockedUsers=25]="PrivacyBlockedUsers",e[e.Folders=26]="Folders",e[e.FoldersCreateFolder=27]="FoldersCreateFolder",e[e.FoldersEditFolder=28]="FoldersEditFolder",e[e.FoldersEditFolderFromChatList=29]="FoldersEditFolderFromChatList",e[e.FoldersIncludedChats=30]="FoldersIncludedChats",e[e.FoldersIncludedChatsFromChatList=31]="FoldersIncludedChatsFromChatList",e[e.FoldersExcludedChats=32]="FoldersExcludedChats",e[e.FoldersExcludedChatsFromChatList=33]="FoldersExcludedChatsFromChatList",e[e.TwoFaDisabled=34]="TwoFaDisabled",e[e.TwoFaNewPassword=35]="TwoFaNewPassword",e[e.TwoFaNewPasswordConfirm=36]="TwoFaNewPasswordConfirm",e[e.TwoFaNewPasswordHint=37]="TwoFaNewPasswordHint",e[e.TwoFaNewPasswordEmail=38]="TwoFaNewPasswordEmail",e[e.TwoFaNewPasswordEmailCode=39]="TwoFaNewPasswordEmailCode",e[e.TwoFaEnabled=40]="TwoFaEnabled",e[e.TwoFaChangePasswordCurrent=41]="TwoFaChangePasswordCurrent",e[e.TwoFaChangePasswordNew=42]="TwoFaChangePasswordNew",e[e.TwoFaChangePasswordConfirm=43]="TwoFaChangePasswordConfirm",e[e.TwoFaChangePasswordHint=44]="TwoFaChangePasswordHint",e[e.TwoFaTurnOff=45]="TwoFaTurnOff",e[e.TwoFaRecoveryEmailCurrentPassword=46]="TwoFaRecoveryEmailCurrentPassword",e[e.TwoFaRecoveryEmail=47]="TwoFaRecoveryEmail",e[e.TwoFaRecoveryEmailCode=48]="TwoFaRecoveryEmailCode",e[e.TwoFaCongratulations=49]="TwoFaCongratulations"}(d||(d={})),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"}(a||(a={})),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"}(u||(u={})),function(e){e[e.ChatInfo=0]="ChatInfo",e[e.UserInfo=1]="UserInfo",e[e.Search=2]="Search",e[e.Management=3]="Management",e[e.StickerSearch=4]="StickerSearch",e[e.GifSearch=5]="GifSearch",e[e.PollResults=6]="PollResults",e[e.AddingMembers=7]="AddingMembers"}(s||(s={})),function(e){e[e.Inline=0]="Inline",e[e.ScheduledInline=1]="ScheduledInline",e[e.SharedMedia=2]="SharedMedia",e[e.ProfileAvatar=3]="ProfileAvatar",e[e.SettingsAvatar=4]="SettingsAvatar",e[e.MiddleHeaderAvatar=5]="MiddleHeaderAvatar",e[e.Album=6]="Album",e[e.ScheduledAlbum=7]="ScheduledAlbum",e[e.SearchResult=8]="SearchResult"}(i||(i={})),function(e){e[e.Inline=0]="Inline",e[e.SharedMedia=1]="SharedMedia",e[e.Search=2]="Search"}(c||(c={})),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.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"}(h||(h={})),function(e){e[e.Closed=0]="Closed",e[e.InProgress=1]="InProgress",e[e.Loading=2]="Loading"}(m||(m={})),function(e){e[e.Profile=0]="Profile",e[e.SharedMedia=1]="SharedMedia",e[e.MemberList=2]="MemberList"}(p||(p={})),function(e){e[e.ShippingInfo=0]="ShippingInfo",e[e.Shipping=1]="Shipping",e[e.PaymentInfo=2]="PaymentInfo",e[e.Checkout=3]="Checkout"}(g||(g={}));const y="UPLOADING_WALLPAPER_SLUG";let v;!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"}(v||(v={}))},9933:(e,t,n)=>{n.d(t,{c:()=>d,j:()=>a});var r=n(9118);let o;function d(e,t){t||(o&&!o.isCancelled&&(o.isCancelled=!0),o=t={isCancelled:!1}),(0,r.T2)((()=>{!t.isCancelled&&e()&&d(e,t)}))}function a(e){(0,r.T2)((()=>{e()&&a(e)}))}},7358:(e,t,n)=>{n.d(t,{w:()=>o});var r=n(3716);function o(e){"function"==typeof window.navigator.setAppBadge&&window.navigator.setAppBadge(e).catch((e=>{r.eM&&console.error(e)}))}},275:(e,t,n)=>{function r(e,t){if(e===t)return!0;const n=Object.keys(e),r=n.length;if(r!==Object.keys(t).length)return!1;if(0===r)return!0;for(let o=0;o(e[r]!==t[r]&&n.push(`${r}: ${e[r]} => ${t[r]}`),n)),[])}n.d(t,{Z:()=>r,c:()=>o})},6752:(e,t,n)=>{n.d(t,{Z:()=>r});const r=(...e)=>e.filter(Boolean).join(" ")},9524:(e,t,n)=>{n.d(t,{Type:()=>o,fetch:()=>d,save:()=>a,clear:()=>u});const r=self.caches;let o;async function d(e,t,n,d=!1){if(r)try{const a=new Request(t.replace(/:/g,"_")),u=await r.open(e),s=await u.match(a);if(!s)return;const i=s.headers.get("Content-Type");switch(n){case o.Text:return await s.text();case o.Blob:{if(t.startsWith("avatar")&&i&&i.startsWith("text"))return;const e=await s.blob();if(t.startsWith("sticker"))return new Blob([e],{type:"image/webp"});const n=!e.type||!d&&e.type.includes("html");let r=e.type||i;return n&&r?(d||(r=r.replace(/html/gi,"")),new Blob([e],{type:r})):e}case o.Json:return await s.json();default:return}}catch(e){return void console.warn(e)}}async function a(e,t,n){if(r)try{const o="string"==typeof n||n instanceof Blob?n:JSON.stringify(n),d=new Request(t.replace(/:/g,"_")),a=new Response(o),u=await r.open(e);return await u.put(d,a)}catch(e){return void console.warn(e)}}async function u(e){try{if(!r)return;return await r.delete(e)}catch(e){return void console.warn(e)}}!function(e){e[e.Text=0]="Text",e[e.Blob=1]="Blob",e[e.Json=2]="Json"}(o||(o={}))},3989:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(517);function o(e){return(0,r.Z)({onEsc:e})}},517:(e,t,n)=>{n.d(t,{Z:()=>d});const r={Enter:"onEnter",Backspace:"onBackspace",Delete:"onDelete",Esc:"onEsc",Escape:"onEsc",ArrowUp:"onUp",ArrowDown:"onDown",ArrowLeft:"onLeft",ArrowRight:"onRight",Tab:"onTab"},o={onEnter:[],onDelete:[],onBackspace:[],onEsc:[],onUp:[],onDown:[],onLeft:[],onRight:[],onTab:[]};function d(e){return a()||document.addEventListener("keydown",u,!0),Object.keys(e).forEach((t=>{const n=e[t];if(!n)return;const r=o[t];r&&r.push(n)})),()=>{!function(e){Object.keys(e).forEach((t=>{const n=e[t],r=o[t];if(r){const e=r.findIndex((e=>e===n));-1!==e&&r.splice(e,1)}})),a()||document.removeEventListener("keydown",u,!1)}(e)}}function a(){return Object.values(o).some((e=>Boolean(e.length)))}function u(e){const t=r[e.key];if(!t)return;const{length:n}=o[t];n&&(e.stopPropagation(),(0,o[t][n-1])(e))}},790:(e,t,n)=>{n.d(t,{$Y:()=>a,_F:()=>u,kj:()=>s,mr:()=>c,VX:()=>l,Tu:()=>f,np:()=>h,j1:()=>m,ZK:()=>g,k9:()=>y,rM:()=>v,xH:()=>b,xk:()=>I,IS:()=>C});const r=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],o=["January","February","March","April","May","June","July","August","September","October","November","December"],d=o.map((e=>e.toLowerCase()));function a(e){const t=new Date(e);return t.setHours(0,0,0,0),t}function u(e){return a(e).getTime()}function s(e){const t=new Date(1e3*e);return`${t.getFullYear()}-${t.getMonth()}`}function i(e){return`${e.getFullYear()}-${e.getMonth()+1}-${e.getDate()}`}function c(e,t){const n="number"==typeof e?new Date(e):e,r=t.timeFormat||"24h";let o=n.getHours(),d="";return"12h"===r&&(d=o>=12?" PM":" AM",o=o>12?o%12:o),`${String(o).padStart(2,"0")}:${String(n.getMinutes()).padStart(2,"0")}${d}`}function l(e,t){const n="number"==typeof t?new Date(t):t,o=a(new Date);if(n>=o)return c(n,e);const d=new Date(o);if(d.setDate(o.getDate()-7),n>=d)return e(`Weekday.Short${r[n.getDay()]}`);const u=n.getFullYear()!==o.getFullYear(),s=e(u?"formatDateScheduleYear":"formatDateSchedule")||(u?"d MMM yyyy":"d MMM");return p(e,n,s)}function f(e,t){const n="number"==typeof t?new Date(t):t,r=e("formatterYearMax")||"dd.MM.yyyy";return p(e,n,r)}function h(e,t,n=!1){const r=e(n?"formatterMonthYear2":"formatterMonthYear")||"MMM yyyy";return p(e,t,r)}function m(e,t,n=!1,o=!1,d){const u="number"==typeof t?new Date(t):t,s=a(new Date);if(!o){if(i(u)===i(s))return(d||!n?E:S)(e("Weekday.Today"));const t=new Date(s);if(t.setDate(s.getDate()-1),i(u)===i(t))return(d||!n?E:S)(e("Weekday.Yesterday"));const o=new Date(s),a=new Date(s);if(o.setDate(s.getDate()-7),a.setDate(s.getDate()+7),u>=o&&u<=a){const t=r[u.getDay()];return(d||!n?E:S)(e(n?`Weekday.Short${t}`:`Weekday.${t}`))}}const c=u.getFullYear()!==s.getFullYear(),l=e(n?c?"formatDateScheduleYear":"formatDateSchedule":c?"chatFullDate":"chatDate")||"d MMMM yyyy";return(d||!n?E:S)(p(e,u,l))}function p(e,t,n){const r=t.getDate(),d=t.getMonth();return n.replace("LLLL",e(o[d])).replace("MMMM",e(`Month.Gen${o[d]}`)).replace("MMM",e(`Month.Short${o[d]}`)).replace("MM",String(d+1).padStart(2,"0")).replace("dd",String(r).padStart(2,"0")).replace("d",String(r)).replace("yyyy",String(t.getFullYear()))}function g(e,t,n){const r="number"==typeof t?new Date(t):t;return`${m(e,r,!0,void 0,n)}, ${c(r,e)}`}function y(e,t){const n=Math.floor(e/3600),r=Math.floor(e%3600/60),o=Math.floor(e%3600%60),d=t?Math.floor(t/3600):0,a=t?Math.floor(t%3600/60):0;let u="";return n>0||d>0?(u+=`${String(n).padStart(2,"0")}:`,u+=`${String(r).padStart(2,"0")}:`):u+=a>=10?`${String(r).padStart(2,"0")}:`:`${String(r)}:`,u+=String(o).padStart(2,"0"),u}function v(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 o=(e=Math.floor(e/60))%60;e-=o;const d=(e=Math.floor(e/60))%60;return d>0&&t.push(String(d).padStart(2,"0")),t.push(String(o).padStart(d>0?2:1,"0")),t.push(String(r).padStart(2,"0")),`${t.join(":")},${String(n).padStart(2,"0")}`}function b(e,t="en-US"){return e.toLocaleString(t,{year:"numeric",month:"short",day:"numeric"})}function w(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 I(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||!w(t,n-1,r||void 0)?void 0:`${r?`${r}-`:""}${String(n).padStart(2,"0")}-${String(t).padStart(2,"0")}`}const o=e.split(" "),a=t?o[0]:o[1],u=(t?o[1]:o[0]).toLowerCase(),s=d.findIndex((e=>e.startsWith(u)));return-1!==s&&w(Number(a),s)?`${String(s+1).padStart(2,"0")}-${String(a).padStart(2,"0")}`:void 0}function C(e){return e+86400}function S(e){return`${e[0].toLowerCase()}${e.slice(1)}`}function E(e){return`${e[0].toUpperCase()}${e.slice(1)}`}},4284:(e,t,n)=>{n.d(t,{g6:()=>u,U_:()=>s,NM:()=>i,Wg:()=>c});var r=n(3681);const o=["female_sign","male_sign","medical_symbol"],d=[[/\u{1f3f3}\u200d\u{1f308}/gu,"🏳️‍🌈"],[/\u{1f3f3}\u200d\u26a7\ufe0f/gu,"🏳️‍⚧️"],[/\u{1f937}\u200d\u2642/gu,"🤷‍♂️"]];function a(e){const t=e.split("-").map((e=>parseInt(e,16)));return String.fromCodePoint(...t)}function u(e){if(!e.match(r.Z))return e;for(const[t,n]of d)e=e.replace(t,n);return e}function s(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 i(e){const t={categories:[],emojis:{}};for(let n=0;ne.codePointAt(0)+127397));return String.fromCodePoint(...n)}},1396:(e,t,n)=>{function r(e){if(e)return e.includes("://")?e:`http://${e}`}n.d(t,{X:()=>r})},7361:(e,t,n)=>{n.d(t,{Bi:()=>k,cL:()=>R,wZ:()=>p,vX:()=>M,op:()=>C,cj:()=>m,jm:()=>h,pA:()=>L,m5:()=>P,I_:()=>E,fl:()=>y,t0:()=>A,s$:()=>g,Mc:()=>S,wB:()=>b,p7:()=>w,$b:()=>v,mh:()=>I,s0:()=>T,aZ:()=>D,Lt:()=>f,vn:()=>i,on:()=>d});var r=n(3716);let o;function d(){return Boolean(o)}var a,u;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=>{o=e}));let s=null!==(a=(u=window).matchMedia)&&void 0!==a&&a.call(u,"(prefers-color-scheme: dark)").matches?"dark":"light";function i(){return s}function c(e){s=e.matches?"dark":"light"}const l=window.matchMedia("(prefers-color-scheme: dark)");"function"==typeof l.addEventListener?l.addEventListener("change",c):"function"==typeof l.addListener&&l.addListener(c);const f=function(){const{userAgent:e,platform:t}=window.navigator;let n;return-1!==["Macintosh","MacIntel","MacPPC","Mac68K"].indexOf(t)?n="macOS":-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}(),h="macOS"===f,m="iOS"===f,p="Android"===f,g=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),y=window.matchMedia("(display-mode: standalone)").matches||window.navigator.standalone||document.referrer.includes("android-app://"),v=window.matchMedia("(pointer: coarse)").matches,b=window.innerWidth<=r.l3||window.innerWidth<=r.u_&&window.innerHeight<=r.rO,w=!b&&window.innerWidth<=r.ks,I=Boolean(navigator.mediaDevices&&"getUserMedia"in navigator.mediaDevices&&(window.AudioContext||window.webkitAudioContext)),C=(document.documentElement.style,f&&(h||m)),S="serviceWorker"in navigator,E=S,P=(window,Boolean((new Audio).canPlayType("audio/ogg; codecs=opus"))),M=!r.Cg&&"filter"in(document.createElement("canvas").getContext("2d")||{}),A="requestFullscreen"in document.createElement("div"),k=!navigator.userAgent.includes("Firefox"),T=p?"slide-fade":m?"slide-layers":"push-slide",N=document.createElement("video"),L=Boolean(N.canPlayType(r.Ng).replace("no","")||m);L&&r.wG.add(r.Ng);const R=window.devicePixelRatio||1,D=!0},1394:(e,t,n)=>{n.d(t,{A9:()=>d,YJ:()=>a,hl:()=>u,pt:()=>s,jj:()=>i,ud:()=>c,gm:()=>l,ao:()=>f});var r=n(9118);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function d(e){const t=e.split(","),n=t[0].match(/:(.*?);/)[1],r=atob(t[1]);let o=r.length;const d=new Uint8Array(o);for(;o--;)d[o]=r.charCodeAt(o);return new Blob([d],{type:n})}function a(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 u(e,t){return new File([e],t,{lastModified:Date.now(),type:e.type})}function s(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 c(e){const t=await i(e);return Promise.race([(0,r.wO)(2e3),new Promise(((e,n)=>{t.onseeked=()=>{t.videoWidth&&t.videoHeight||e(void 0);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 l(e){return(await fetch(e)).blob()}function f(e){const t=document.createElement("canvas");return t.width=e.width,t.height=e.height,t.getContext("2d").drawImage(e,0,0),t}"undefined"==typeof File&&(self.File=class extends Blob{constructor(e,t,n){if(n){const{type:t,...r}=n;super(e,{type:t}),o(this,"name",void 0),Object.assign(this,r)}else super(e),o(this,"name",void 0);this.name=t}})},9937:(e,t,n)=>{function r(e,t,n="en"){return new Intl.NumberFormat(n,{style:"currency",currency:t}).format("JPY"===t?e:e/100)}n.d(t,{x:()=>r})},6926:(e,t,n)=>{n.d(t,{Z:()=>r});const r=e=>{let t;do{t=String(Math.random()).replace("0.","id")}while(e.hasOwnProperty(t));return t}},1947:(e,t,n)=>{n.d(t,{ZP:()=>d,J_:()=>a});const r={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",MESSAGE_TOO_LONG:"Message is too long",SERVICE_WORKER_DISABLED:"Service Worker is disabled. Please reload the page without holding key.",MESSAGE_TOO_LONG_PLEASE_REMOVE_CHARACTERS:"The provided message 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",SCHEDULE_DATE_INVALID:"Invalid schedule date provided",WALLPAPER_DIMENSIONS_INVALID:"The wallpaper dimensions are invalid, please select another file"},o={ADDRESS_STREET_LINE1_INVALID:{field:"streetLine1",message:"Incorrect street address"},ADDRESS_STREET_LINE2_INVALID:{field:"streetLine2",message:"Incorrect street address"},ADDRESS_CITY_INVALID:{field:"city",message:"Incorrect city"},ADDRESS_COUNTRY_INVALID:{field:"countryIso2",message:"Incorrect country"},ADDRESS_POSTCODE_INVALID:{field:"postCode",message:"Incorrect post code"},ADDRESS_STATE_INVALID:{field:"state",message:"Incorrect state"},REQ_INFO_NAME_INVALID:{field:"fullName",message:"Incorrect name"},REQ_INFO_PHONE_INVALID:{field:"phone",message:"Incorrect phone"},REQ_INFO_EMAIL_INVALID:{field:"email",message:"Incorrect email"}};function d(e){const{message:t,isSlowMode:n,textParams:o}=e;if(n){const e=t.indexOf(" (caused by");return e>0?t.substring(0,e):t}let d=r[t];return d&&o&&(d=Object.keys(o).reduce(((e,t)=>e.replace(t,o[t])),d)),d}function a(e){return o[e.message]}},3592:(e,t,n)=>{n.d(t,{S:()=>d}),n(3716);var r=n(9118);function o(e){e.preventDefault(),d(e instanceof ErrorEvent?e.error:e.reason)}function d(e){console.error(e)}window.addEventListener("error",o),window.addEventListener("unhandledrejection",o),(0,r.P2)(window.alert,1e3)},782:(e,t,n)=>{function r(e,t){return e.reduce(((e,n)=>(e[n[t]]=n,e)),{})}function o(e,t){return Object.keys(e).reduce(((n,r,o)=>(n[r]=t(e[r],r,o,e),n)),{})}function d(e,t){return t.reduce(((t,n)=>(t[n]=e[n],t)),{})}function a(e,t){return t.reduce(((t,n)=>(e[n]&&(t[n]=e[n]),t)),{})}function u(e,t){const n=new Set(t.map(String));return d(e,Object.keys(e).filter((e=>!n.has(e))))}function s(e,t,n="asc"){return e.sort(((e,r)=>{if(Array.isArray(t)){const[o,d]=Array.isArray(n)?n:[n,n],[a,u]=t;let s,i;if("function"==typeof a?(s=a(e)||0,i=a(r)||0):"string"==typeof a&&(s=e[a]||0,i=r[a]||0),s!==i)return"asc"===o?s-i:i-s;{let t,n;return"function"==typeof u?(t=u(e)||0,n=u(r)||0):"string"==typeof u&&(t=e[u]||0,n=r[u]||0),"asc"===d?t-n:n-t}}let o,d;return"function"==typeof t?(o=t(e)||0,d=t(r)||0):"string"==typeof t&&(o=e[t]||0,d=r[t]||0),"asc"===n?o-d:d-o}))}function i(e){return e.reduce(((e,t)=>Array.isArray(t)?e.concat(t):(e.push(t),e)),[])}function c(e){return Array.from(new Set(e))}function l(e){return e.filter(Boolean)}function f(e,t){return e.length===t.length&&e.every(((e,n)=>e===t[n]))}function h(e,t){return e[0]<=t[t.length-1]&&e[e.length-1]>=t[0]}function m(e,t){return e.filter((e=>t.has(e)))}function p(e,t){const n=[];for(let r=0;r(t[n]=g(e[n]),t)),{})}function y(e,t){let n=e.length;for(;n--;)if(t(e[n],n,e))return e[n]}n.d(t,{ee:()=>r,Q8:()=>o,ei:()=>d,q0:()=>a,CE:()=>u,Xo:()=>s,xH:()=>i,Tw:()=>c,oA:()=>l,et:()=>f,YE:()=>h,eL:()=>m,Vl:()=>p,Xh:()=>g,dF:()=>y})},663:(e,t,n)=>{n.d(t,{ll:()=>m,i0:()=>b,Pn:()=>w,m0:()=>I,qf:()=>C});var r=n(5116),o=n(3716),d=n(9524),a=n(1226),u=n(2155);const s=/%\d?\$?[sdf@]/g,i=["value","zeroValue","oneValue","twoValue","fewValue","manyValue","otherValue"],c={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},l=new Map;let f,h;const{addCallback:m,removeCallback:p,runCallbacks:g}=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 y,v;const b=(e,t,n)=>{var r,o;if(void 0!==t){const r=Array.isArray(t)?JSON.stringify(t):t,o=l.get(`${e}_${r}_${n}`);if(o)return o}if(!f&&!h)return e;const d=(null===(r=f)||void 0===r?void 0:r[e])||(null===(o=h)||void 0===o?void 0:o[e]);return d?E(d,e,t,n):(h||S(),e)};async function w(e,t){let n=await d.fetch(o.ee,`${o.$O}_${e}_${t}`,d.Type.Json);return n||(n=await async function(e,t,n){const r=await(0,a.t9)("fetchLangStrings",{langPack:e,langCode:t,keys:[n]});if(null!=r&&r.length)return await d.save(o.ee,`${e}_${t}_${n}`,r[0]),r[0]}(o.$O,e,t)),E(n,t)}async function I(e,t,n=!1){if(f&&e===y)return void(t&&t());let u=await d.fetch(o.ee,e,d.Type.Json);if(!u&&(n&&await S(),u=await async function(e){const t=await(0,a.t9)("fetchLangPack",{sourceLangPacks:o.Bg,langCode:e});if(t)return await d.save(o.ee,e,t.langPack),t.langPack}(e),!u))return;l.clear(),y=e,f=u,document.documentElement.lang=e;const{languages:s,timeFormat:i}=(0,r.Rd)().settings.byKey,c=null==s?void 0:s.find((t=>t.langCode===e));b.isRtl=Boolean(null==c?void 0:c.rtl),b.code=e,b.timeFormat=i,t&&t(),g()}function C(e){e&&e===v||(v=e,b.timeFormat=e,g())}async function S(){h||(h=(await n.e(915).then(n.bind(n,1915))).default,g())}function E(e,t,n,r){const d=e?e["number"==typeof n?function(e){const t=y||o.sR,n=c[t]?c[t](e):0;return i[n]}(n):"value"]:void 0;if(!d||!d.trim()){const e=t.split(".");return e[e.length-1]}if(void 0!==n){const e=function(e,t){t=Array.isArray(t)?t:[t];const n=e.split(s),r=n.shift();return n.reduce(((e,n,r)=>`${e}${String(t[r]||"")}${n}`),r||"")}(d,"i"===r?(0,u.kh)(n):n),o=Array.isArray(n)?JSON.stringify(n):n;return l.set(`${t}_${o}_${r}`,e),e}return d}},647:(e,t,n)=>{n.d(t,{cC:()=>b,he:()=>y,UV:()=>v,Iq:()=>w});var r=n(6137),o=n(3716),d=n(1226),a=n(9524),u=n(1394),s=n(7361);const i=48e3;async function c(e){const t=await new Response(e).arrayBuffer();return new Promise((e=>{const r=new Uint8Array(t);let o=new Worker(new URL(n.p+n.u(745),n.b)),d=new Worker(new URL(n.p+n.u(993),n.b));o.onmessage=e=>{null===e.data?d.postMessage({command:"done"}):d.postMessage({command:"encode",buffers:e.data},e.data.map((({buffer:e})=>e)))},d.onmessage=t=>{"page"===t.data.message&&(e(new Blob([t.data.page],{type:"audio/wav"})),o.terminate(),o=void 0,d.terminate(),d=void 0)},d.postMessage({command:"init",wavBitDepth:16,wavSampleRate:i}),o.postMessage({command:"init",decoderSampleRate:i,outputBufferSampleRate:i}),o.postMessage({command:"decode",pages:r},[r.buffer])}))}var l=n(862);const f={[r.IU.BlobUrl]:a.Type.Blob,[r.IU.Lottie]:a.Type.Json,[r.IU.Progressive]:void 0,[r.IU.Stream]:void 0},h=new Map,m=new Map,p=new Map,g=new Map;function y(e,t,n=!1,i,v){if(t===r.IU.Progressive)return s.I_?function(e){const t=`./progressive/${e}`;return h.set(e,t),Promise.resolve(t)}(e):y(e,r.IU.BlobUrl,n,i,v);if(!m.has(e)){const i=async function(e,t,n){if(!o.Cy){const r=e.startsWith("avatar")?o.SG:o.lW,d=await a.fetch(r,e,f[t],n);if(d){let t=d;if("audio/ogg"!==d.type||s.m5||(t=await c(t)),"image/webp"===d.type&&!(0,s.on)()&&t){const n=await(0,l._y)(e,t);n&&(t=n)}const n=C(t);return h.set(e,n),n}}if(t===r.IU.Stream){const n=new MediaSource,r=URL.createObjectURL(n);let o=!1;return n.addEventListener("sourceopen",(()=>{if(o)return;o=!0;const r=n.addSourceBuffer("audio/mpeg"),a=I(e,n,r);g.set(e,a),(0,d.t9)("downloadMedia",{url:e,mediaFormat:t},a)})),h.set(e,r),r}const i=I(e);g.set(e,i);const m=await(0,d.t9)("downloadMedia",{url:e,mediaFormat:t,isHtmlAllowed:n},i);if(!m)throw new Error(`Failed to fetch media ${e}`);let{prepared:p,mimeType:y}=m;if("audio/ogg"===y&&!s.m5){const e=await(0,u.gm)(p);URL.revokeObjectURL(p);const t=await c(e);p=C(t),y=t.type}if("image/webp"===y&&!(0,s.on)()){const t=await(0,u.gm)(p);URL.revokeObjectURL(p);const n=await(0,l._y)(e,t);n&&(p=C(n))}return h.set(e,p),p}(e,t,n).catch((e=>{o.eM&&console.warn(e)})).finally((()=>{m.delete(e),p.delete(e),g.delete(e)}));m.set(e,i)}if(i&&v){let t=p.get(e);t||(t=new Map,p.set(e,t)),t.set(v,i)}return m.get(e)}function v(e){return h.get(e)}function b(e){p.forEach(((t,n)=>{t.forEach((t=>{if(t===e){const e=g.get(n);if(!e)return;(0,d.u3)(e),g.delete(n),p.delete(n)}}))}))}function w(e,t){const n=p.get(e);n&&n.delete(t)}function I(e,t,n){const r=(o,d)=>{var a;null===(a=p.get(e))||void 0===a||a.forEach((e=>{e(o),e.isCanceled&&(r.isCanceled=!0)})),1===o&&(null==t||t.endOfStream()),d&&(null==n||n.appendBuffer(d))};return r}function C(e){return e instanceof Blob?URL.createObjectURL(e):e}s.I_&&navigator.serviceWorker.addEventListener("message",(async e=>{const{type:t,messageId:n,params:o}=e.data;if("requestPart"!==t)return;const a=await(0,d.t9)("downloadMedia",{mediaFormat:r.IU.Progressive,...o});if(!a)return;const{arrayBuffer:u,mimeType:s,fullSize:i}=a;navigator.serviceWorker.controller.postMessage({type:"partResponse",messageId:n,result:{arrayBuffer:u,mimeType:s,fullSize:i}},[u])}))},735:(e,t,n)=>{n.d(t,{D:()=>r});const r=[]},9203:(e,t,n)=>{n.d(t,{gl:()=>o,$y:()=>u,o5:()=>s,Qt:()=>c});var r=n(3716);let o;!function(e){e[e.Auth=0]="Auth",e[e.Main=1]="Main",e[e.Extra=2]="Extra",e[e.Calls=3]="Calls"}(o||(o={}));const d={},a={};async function u(e,t){if(!d[e]){switch(e){case o.Auth:d[o.Auth]=n.e(133).then(n.bind(n,1133));break;case o.Main:r.eM&&console.log(">>> START LOAD MAIN BUNDLE"),d[o.Main]=Promise.all([n.e(824),n.e(943),n.e(884),n.e(211)]).then(n.bind(n,5211));break;case o.Extra:d[o.Extra]=Promise.all([n.e(824),n.e(943),n.e(701)]).then(n.bind(n,9701));break;case o.Calls:d[o.Calls]=Promise.all([n.e(824),n.e(884),n.e(757)]).then(n.bind(n,3535))}d[e].then(l)}const u=await d[e];return a[e]||(a[e]=u),s(e,t)}function s(e,t){const n=a[e];if(n)return n[t]}const i=[];function c(e){i.includes(e)||i.push(e)}function l(){i.forEach((e=>{e()}))}},8406:(e,t,n)=>{n.d(t,{q3:()=>v,Nz:()=>b,r1:()=>C,Ld:()=>E,zP:()=>P,Vr:()=>M,KC:()=>A});var r=n(1226),o=n(6137),d=n(8005),a=n(3716),u=n(5116),s=n(2858),i=n(663),c=n(307),l=n(1638),f=n(7361),h=n(647),m=n(9118);function p(e){const t=e.toJSON();return JSON.stringify({endpoint:t.endpoint,keys:t.keys})}function g(){return!!f.Mc&&("showNotification"in ServiceWorkerRegistration.prototype?"denied"===Notification.permission?(a.eM&&console.warn("[PUSH] The user has blocked push notifications."),!1):"PushManager"in window||(a.eM&&console.warn("[PUSH] Push messaging isn't supported."),!1):(a.eM&&console.warn("[PUSH] Push notifications aren't supported."),!1))}const y=new Set;async function v(e,t){if(void 0!==e&&y.has(e))return;const{notificationSoundVolume:n}=(0,l.dZ)((0,u.Rd)()),r=t?t/10:n/10;if(0===r)return;const o=new Audio("./notification.mp3");o.volume=r,o.setAttribute("mozaudiochannel","notification"),void 0!==e&&(o.addEventListener("ended",(()=>{y.add(e)}),{once:!0}),setTimeout((()=>{y.delete(e)}),3e3));try{await o.play()}catch(e){a.eM&&console.warn("[PUSH] Unable to play notification sound")}}const b=(0,m.Ds)(v,1e3,!0,!1);async function w(){"Notification"in window&&(["granted","denied"].includes(Notification.permission)||await Notification.requestPermission())}async function I(e){const t=(0,u.Rd)(),n=(0,u.uC)();if(e)try{const t=p(e);return await(0,r.t9)("unregisterDevice",t),await e.unsubscribe(),void n.deleteDeviceToken()}catch(e){a.eM&&console.log("[PUSH] Unable to unsubscribe from push.",e)}t.push&&(await(0,r.t9)("unregisterDevice",t.push.deviceToken),n.deleteDeviceToken())}async function C(){if(!g())return;const e=await navigator.serviceWorker.ready,t=await e.pushManager.getSubscription();await I(t)}let S=!1;async function E(){if(!g())return void await w();const e=await navigator.serviceWorker.ready;let t=await e.pushManager.getSubscription();if(function(e){const t=(0,u.Rd)();return!t.push||!e||p(e)!==t.push.deviceToken||Date.now()-t.push.subscribedAt>432e5}(t)){await I(t);try{t=await e.pushManager.subscribe({userVisibleOnly:!0});const n=p(t);a.eM&&console.log("[PUSH] Received push subscription: ",n),await(0,r.t9)("registerDevice",n),(0,u.uC)().setDeviceToken(n)}catch(e){"denied"===Notification.permission?a.eM&&console.warn("[PUSH] The user has blocked push notifications."):a.eM&&(console.log("[PUSH] Unable to subscribe to push.",e),e.code===DOMException.ABORT_ERR&&await w())}}}async function P({chat:e,message:t}){const{hasWebNotifications:n}=await async function(){if(S)return(0,l.dZ)((0,u.Rd)());const[e,t]=await Promise.all([(0,r.t9)("fetchNotificationSettings",{serverTimeOffset:(0,u.Rd)().serverTimeOffset}),(0,r.t9)("fetchNotificationExceptions",{serverTimeOffset:(0,u.Rd)().serverTimeOffset})]);if(!e)return(0,l.dZ)((0,u.Rd)());let n=(0,c.BI)((0,u.Rd)(),e);return t&&(n=(0,c.aJ)(n,t)),(0,u.R3)(n),S=!0,(0,l.dZ)(n)}();if(!function(e){if(!S)return!1;const t=(0,u.Rd)();return!((0,s.i4)(e,(0,l.dZ)(t),(0,l.NJ)(t))||e.isNotJoined||!e.isListed||document.hasFocus())}(e))return;const f="Notification"in window?"denied"!==Notification.permission||(a.eM&&console.warn("[PUSH] The user has blocked push notifications."),!1):(a.eM&&console.warn("[PUSH] This browser does not support desktop notification"),!1);if(!n||!f)return void b(String(t.id)||e.id);if(!f)return;if(!t.id)return;const{title:m,body:p}=function(e,t){const n=(0,u.Rd)(),{senderId:r,replyToMessageId:o}=t,a=r?(0,l.dy)(n,r):void 0,c=(0,s.N5)(t),f=c&&o?(0,l.hj)(n,e.id,o):void 0,{targetUserIds:h,targetChatId:m}=c||{},p=h?h.map((e=>(0,l.dy)(n,e))).filter(Boolean):void 0,g=(0,s.zX)(e),y=g?(0,l.dy)(n,g):void 0;let v;if((0,s.Sm)(e,(0,l.dZ)(n),(0,l.NJ)(n)))if((0,s.Lo)(t)){const n=e&&((0,s.eA)(e)||t.senderId===t.chatId)?e:a;v=(0,d.D)(i.i0,t,n,p,f,m,{asPlain:!0})}else{const n=(0,s.zF)(i.i0,e.id,a),r=(0,s.MK)(i.i0,t);v=n?`${n}: ${r}`:r}else v="New message";return{title:(0,s.U)(i.i0,e,y),body:v}}(e,t),y=await async function(e){const t=(0,s.RT)(e);if(!t)return;let n=h.UV(t);return n||(await h.he(t,o.IU.BlobUrl),n=h.UV(t)),n}(e);if(g()){var v;null!==(v=navigator.serviceWorker)&&void 0!==v&&v.controller&&navigator.serviceWorker.controller.postMessage({type:"newMessageNotification",payload:{title:m,body:p,icon:y,chatId:e.id,messageId:t.id}})}else{const n=(0,u.uC)(),r={body:p,icon:y,badge:y,tag:String(t.id)};"vibrate"in navigator&&(r.vibrate=[200,100,200]);const o=new Notification(m,r);o.onclick=()=>{o.close(),n.focusMessage({chatId:e.id,messageId:t.id}),window.focus&&window.focus()},o.onshow=()=>{b(String(t.id)||e.id)}}}function M(e){var t;!a.Cg&&null!==(t=navigator.serviceWorker)&&void 0!==t&&t.controller&&navigator.serviceWorker.controller.postMessage({type:"closeMessageNotifications",payload:e})}function A(){var e;null!==(e=navigator.serviceWorker)&&void 0!==e&&e.controller&&navigator.serviceWorker.controller.postMessage({type:"clientReady"})}},6272:(e,t,n)=>{n.d(t,{U9:()=>a,g3:()=>u,un:()=>s,WZ:()=>i});var r=n(782);const o="X",d="XXX XXX XXX XXX";function a(e,t){return e.filter((e=>e.iso2===t))}function u(e,t=""){var n;let o=t.replace(/[^\d+]+/g,"");o.startsWith("+")&&(o=o.substr(1));const d=e.filter((e=>o.startsWith(e.countryCode))),a=(0,r.xH)(d.map((e=>(e.prefixes||[""]).map((t=>({code:`${e.countryCode}${t}`,country:e})))))).filter((({code:e})=>o.startsWith(e))).sort(((e,t)=>e.code.length-t.code.length));return null===(n=a[a.length-1])||void 0===n?void 0:n.country}function s(e,t){let n=e.replace(/[^\d]+/g,"");if(t)n=n.substr(t.countryCode.length);else if(e.startsWith("+"))return e;const r=function(e,t){if(!t||0===t.length)return d;if(1===t.length)return t[0];const n=t.find((e=>e.startsWith(o)))||d,r=t.filter((t=>{const n=t.replace(/[^\dX]+/g,"");if(n.startsWith(o))return!1;for(let t=0;tn.length-1||n[t]!==o&&n[t]!==e[t])return!1;return!0}));return 1===r.length?r[0]:n}(n,null==t?void 0:t.patterns),a=[];let u=0;for(let e=0;e{n.d(t,{q:()=>o,V:()=>d});var r=n(6137);const o=e=>e.chatId.toString()+("thread"!==e.type?`_${e.type}`:-1!==e.threadId?`_${e.threadId}`:""),d=e=>{if(!e)return;const[t,n]=e.replace(/^#/,"").split("_");if(!t)return;const o=["thread","pinned","scheduled"].includes(n);return{chatId:t,type:n&&o?n:"thread",threadId:n&&!o?Number(n):r._f}}},9118:(e,t,n)=>{function r(e,t,n=!0,r=!0){let o;return(...d)=>{o?(clearTimeout(o),o=void 0):n&&e(...d),o=self.setTimeout((()=>{r&&e(...d),o=void 0}),t)}}function o(e,t,n=!0){let r,o,d;return(...a)=>{o=!0,d=a,r||(n&&(o=!1,e(...d)),r=self.setInterval((()=>{if(!o)return self.clearInterval(r),void(r=void 0);o=!1,e(...d)}),t))}}function d(e){return u(g,e)}function a(e){return u(y,e)}function u(e,t){let n,r=!1;return(...o)=>{n=o,r||(r=!0,e((()=>{r=!1,t(...n)})))}}function s(e){self.requestIdleCallback?self.requestIdleCallback(e):v(e)}n.d(t,{Ds:()=>r,P2:()=>o,mS:()=>d,wT:()=>a,Q8:()=>s,wO:()=>i,Pn:()=>c,T2:()=>g,D0:()=>y,R3:()=>v,zD:()=>b,Gq:()=>w});const i=e=>new Promise((t=>{setTimeout((()=>t()),e)}));function c(){return new Promise((e=>{g(e)}))}let l,f,h,m,p;function g(e,t=!1){l?t?f.push(e):l.push(e):(l=t?[]:[e],f=t?[e]:[],requestAnimationFrame((()=>{const e=l,t=f;l=void 0,f=void 0,t.forEach((e=>e())),e.forEach((e=>e()))})))}function y(e){g(e,!0)}function v(e,t=!1){h?t?m.push(e):h.push(e):(h=t?[]:[e],m=t?[e]:[],Promise.resolve().then((()=>{const e=h,t=m;h=void 0,m=void 0,t.forEach((e=>e())),e.forEach((e=>e()))})))}function b(e){v(e,!0)}function w(e,t=!1){return p||(p=[],self.addEventListener("beforeunload",(()=>{p.forEach((e=>e()))}))),t?p.push(e):p.unshift(e),()=>{p=p.filter((t=>t!==e))}}},5765:(e,t,n)=>{let r;n.d(t,{Z:()=>o});try{r=new RegExp("[^\\p{L}\\p{M}]+","ui")}catch(e){r=new RegExp("[^\\wа-яё]+","i")}function o(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)))))}},2267:(e,t,n)=>{n.d(t,{b:()=>r});const r=e=>Math.floor(Date.now()/1e3)+e},4688:(e,t,n)=>{n.d(t,{f3:()=>m,jv:()=>l,ti:()=>i,Qw:()=>h,K8:()=>f,wX:()=>c});function r(e){return new Promise(((t,n)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>n(e.error)}))}let o;function d(){return o||(o=function(e,t){const n=function(){if(navigator.userAgentData||!/Safari\//.test(navigator.userAgent)||/Chrom(e|ium)\//.test(navigator.userAgent)||!indexedDB.databases)return Promise.resolve();let e;return new Promise((t=>{const n=()=>indexedDB.databases().finally(t);e=setInterval(n,100),n()})).finally((()=>clearInterval(e)))}().then((()=>{const e=indexedDB.open("keyval-store");return e.onupgradeneeded=()=>e.result.createObjectStore(t),r(e)}));return(e,r)=>n.then((n=>r(n.transaction(t,e).objectStore(t))))}(0,"keyval")),o}var a=n(3716),u=n(9524);const s=[1,2,3,4,5];function i(e=!1){if(e&&localStorage.getItem(a.Vx))return!0;const t=localStorage.getItem(a.b_);if(!t)return!1;try{const e=JSON.parse(t);return Boolean(e&&e.id&&e.dcID)}catch(e){return!1}}function c(e,t){const{mainDcId:n,keys:r,hashes:o}=e;localStorage.setItem(a.b_,JSON.stringify({dcID:n,id:t})),localStorage.setItem("dc",String(n)),Object.keys(r).map(Number).forEach((e=>{localStorage.setItem(`dc${e}_auth_key`,JSON.stringify(r[e]))})),o&&Object.keys(o).map(Number).forEach((e=>{localStorage.setItem(`dc${e}_hash`,JSON.stringify(o[e]))}))}function l(){[a.b_,"dc",...s.map((e=>`dc${e}_auth_key`)),...s.map((e=>`dc${e}_hash`))].forEach((e=>{localStorage.removeItem(e)}))}function f(){if(!i())return;const e=JSON.parse(localStorage.getItem(a.b_)),t=Number(e.dcID),n={},r={};return s.forEach((e=>{try{const t=localStorage.getItem(`dc${e}_auth_key`);t&&(n[e]=JSON.parse(t));const o=localStorage.getItem(`dc${e}_hash`);o&&(r[e]=JSON.parse(o))}catch(e){a.eM&&console.warn("Failed to load stored session",e)}})),Object.keys(n).length?{mainDcId:t,keys:n,hashes:r}:void 0}async function h(){const e=localStorage.getItem(a.Vx);if(!e)return;const t=await function(e,t=d()){return t("readonly",(t=>r(t.get(e))))}(`GramJs:${e}`);try{c(JSON.parse(t))}catch(e){a.eM&&console.warn("Failed to load legacy session",e)}}async function m(){localStorage.removeItem(a.Vx);const e=await function(e=d()){const t=[];return function(e,t){return e("readonly",(e=>(e.openCursor().onsuccess=function(){this.result&&(t(this.result),this.result.continue())},r(e.transaction))))}(e,(e=>t.push(e.key))).then((()=>t))}();await Promise.all([u.clear("GramJs"),...e.filter((e=>"string"==typeof e&&e.startsWith("GramJs:GramJs-session-"))).map((e=>function(e,t=d()){return t("readwrite",(t=>(t.delete(e),r(t.transaction))))}(e)))])}},6917:(e,t,n)=>{n.d(t,{Z:()=>c});var r=n(9933);const o=JSON.parse('{"--color-primary":["#3390EC","#8774E1"],"--color-primary-opacity":["#50A2E980","#8378DB80"],"--color-primary-shade":["#4a95d6","#7b71c6"],"--color-background":["#FFFFFF","#212121"],"--color-background-secondary":["#f4f4f5","#0F0F0F"],"--color-background-secondary-accent":["#E4E4E5","#100f10"],"--color-background-own":["#EEFFDE","#8774E1"],"--color-background-own-apple":["#DCF8C5","#8774E1"],"--color-background-selected":["#F4F4F5","#2C2C2C"],"--color-background-own-selected":["#d0ffac","#6549d4"],"--color-chat-hover":["#F4F4F5","#2C2C2C"],"--color-chat-active":["#3390EC","#8774E1"],"--color-item-active":["#ededed","#292929"],"--color-text":["#000000","#FFFFFF"],"--color-text-secondary":["#707579","#AAAAAA"],"--color-text-secondary-apple":["#8E8E92","#AAAAAA"],"--color-borders":["#DADCE0","#303030"],"--color-borders-input":["#DADCE0","#5B5B5A"],"--color-dividers":["#C8C6CC","#404040"],"--color-links":["#3390EC","#8774E1"],"--color-gray":["#C4C9CC","#717579"],"--color-pinned":["#C4C9CC","#707579"],"--color-default-shadow":["#72727240","#1010109c"],"--color-light-shadow":["#7272722B","#00000040"],"--color-green":["#00C73E","#8774E1"],"--color-text-meta-colored":["#4DCD5E","#8378DB"],"--color-reply-hover":["#F4F4F4","#272727"],"--color-reply-active":["#E8E9E9","#2E2F2F"],"--color-reply-own-hover":["#D9F5CE","#7d6bca"],"--color-reply-own-hover-apple":["#cbefb7","#7d6bca"],"--color-reply-own-active":["#C5ECBE","#7264b6"],"--color-reply-own-active-apple":["#bae6a8","#7264b6"],"--color-accent-own":["#45AF54","#FFFFFF"],"--color-message-meta-own":["#4FAE4EFF","#FFFFFF88"],"--color-own-links":["#3390EC","#FFFFFF"],"--color-code":["#4a729a","#8774E1"],"--color-code-own":["#3c7940","#FFFFFF"],"--color-code-bg":["#70757914","#ffffff26"],"--color-code-own-bg":["#70757914","#ffffff26"],"--color-composer-button":["#707579CC","#AAAAAACC"]}');let d=!1;const a=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i,u=new Set(["--color-primary-shade","--color-text-secondary"]),s=(e,t,n)=>(1-n)*e+n*t,i=Object.keys(o).map((e=>({property:e,colors:[l(o[e][0]),l(o[e][1])]}))),c=(e,t)=>{const n="dark"===e,o=d&&t,a=n?0:1,u=n?1:0,s=Date.now(),i=document.querySelector('meta[name="theme-color"]');document.documentElement.classList.remove("theme-"+(n?"light":"dark")),d&&document.documentElement.classList.add("no-animations"),document.documentElement.classList.add(`theme-${e}`),i&&i.setAttribute("content",n?"#212121":"#fff"),setTimeout((()=>{document.documentElement.classList.remove("no-animations")}),500),d=!0,o?(0,r.c)((()=>{const e=Math.min((Date.now()-s)/200,1);return f(a,u,function(e){return 1-(1-e)**3.5}(e)),e<1})):f(a,u)};function l(e){const t=a.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 f(e,t,n=1){i.forEach((({property:r,colors:o})=>{const d=Math.round(s(o[e].r,o[t].r,n)),a=Math.round(s(o[e].g,o[t].g,n)),i=Math.round(s(o[e].b,o[t].b,n)),c=void 0!==o[e].a?Math.round(s(o[e].a,o[t].a,n)):void 0;document.documentElement.style.setProperty(r,void 0!==c?`rgba(${d},${a},${i},${c/255})`:`rgb(${d},${a},${i})`),u.has(r)&&document.documentElement.style.setProperty(`${r}-rgb`,`${d},${a},${i}`)}))}},2155:(e,t,n)=>{n.d(t,{kh:()=>d,bi:()=>u,Xv:()=>s});var r=n(3681),o=n(4284);function d(e){return String(e).replace(/\d(?=(\d{3})+$)/g,"$& ")}function a(e){return".0"===String(e.toFixed(1)).substr(-2)?Math.round(e):e.toFixed(1).replace(".",",")}function u(e){return e<1e3?e:e<1e6?`${a(e/1e3)}K`:`${a(e/1e6)}M`}function s(e,t=2){return e.replace(/[.,!@#$%^&*()_+=\-`~[\]/\\{}:"|<>?]+/gi,"").trim().split(/\s+/).slice(0,t).map((e=>{if(!e.length)return"";const t=(e=(0,o.g6)(e)).match(r.Z);return t&&e.startsWith(t[0])?t[0]:e.match(/./u)[0].toUpperCase()})).join("")}},8035:(e,t,n)=>{function r(e,t=30){return!e||e.length<=t?e:`${e.substr(0,t)}...`}n.d(t,{Z:()=>r})},862:(e,t,n)=>{n.d(t,{Hu:()=>s,_y:()=>i,p6:()=>c});var r=n(7361),o=n(1394),d=n(9118);let a,u;const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";async function i(e,t){for(l();!u.wasmReady;)await(0,d.wO)(2e3);const{result:n,width:r,height:o}=await function(e,t){return new Promise((n=>{u.requests||(u.requests=new Map),u.requests.set(e,n),u.postMessage({id:e,blob:t})}))}(e,t);if(r&&o)return function({result:e,width:t,height:n}){return a||(a=document.createElement("canvas")),new Promise((r=>{const o=new ImageData(e,t,n);a.width=t,a.height=n,a.getContext("2d").putImageData(o,0,0),a.toBlob((e=>{r(null!=e?e:void 0)}),"image/png",1)}))}({result:n,width:r,height:o})}async function c(e,t){if((0,r.on)()||"data:image/webp"!==t.substr(0,15))return t;l();const n=await i(e,(0,o.A9)(t));if(!n)throw new Error(`Can't convert webp to png. Url: ${t}`);return(0,o.YJ)(n)}function l(){u||(u=new Worker(new URL(n.p+n.u(536),n.b)),u.wasmReady=!1,u.onmessage=f)}function f(e){const{id:t}=e.data;switch(e.data.type){case"initialized":u.wasmReady=!0;break;case"result":if(u.requests.has(t)){const n=u.requests.get(t);u.requests.delete(t),n(e.data)}}}},1622:(e,t,n)=>{n.d(t,{I:()=>l,p:()=>f});var r=n(3716),o=n(5116),d=n(4688);const a=["t.me","telegram.me"].map((e=>`//${e}/_websync_?`)),u=`${r.Ji} Z`,s="tgme_sync",i=()=>Math.floor(Number(new Date)/1e3);let c;const l=e=>{const t=i(),{canRedirect:n,ts:r}=JSON.parse(localStorage.getItem(s)||"{}");return n!==e||r+86400<=t?Promise.all(a.map((t=>new Promise(((n,r)=>{const o=document.createElement("script"),d=()=>!!document.body.removeChild(o);o.src=t+new URLSearchParams({authed:Number(e).toString(),version:u}),document.body.appendChild(o),o.onload=()=>{(e=>{const t=i();localStorage.setItem(s,JSON.stringify({canRedirect:e,ts:t}))})(e),d(),c&&(clearTimeout(c),c=void 0),f(),n()},o.onerror=()=>{d(),r()}}))))):Promise.resolve()};function f(){if(r.eM)return;if(void 0!==c)return;const e=i(),{ts:t}=JSON.parse(localStorage.getItem(s)||"{}"),n=86400-(e-t);c=setTimeout((()=>{const{authState:e}=(0,o.Rd)(),t="authorizationStateReady"===e||(0,d.ti)(!0);l(t)}),Math.max(0,1e3*n))}},3858:(e,t,n)=>{n.d(t,{z:()=>l,Z:()=>h});var r=n(9118),o=n(3716),d=n(7361);const a=d.wB&&f(),u=window.innerHeight;let s=l(),i=!1;const c=(0,r.P2)((()=>{s=l(),!i&&((s.width<=o.l3||s.width<=o.u_&&s.height<=o.rO)!==d.wB||d.wB&&a!==f())&&window.location.reload()}),250,!0);function l(){let e;e=d.cj?window.visualViewport.height+window.visualViewport.pageTop:window.innerHeight;const t=.01*e;return document.documentElement.style.setProperty("--vh",`${t}px`),{width:window.innerWidth,height:window.innerHeight}}function f(){return d.cj?window.matchMedia("(orientation: landscape)").matches:window.matchMedia("screen and (min-device-aspect-ratio: 1/1) and (orientation: landscape)").matches}window.addEventListener("orientationchange",c),d.cj?window.visualViewport.addEventListener("resize",c):window.addEventListener("resize",c);const h={get:()=>s,getIsKeyboardVisible:()=>u>s.height,disableRefresh:function(){i=!0},enableRefresh:function(){i=!1}}},5359:(e,t,n)=>{e.exports=n.p+"app-inactive.bc7953c2dfebcabce2c4..png"},2162:(e,t,n)=>{e.exports=n.p+"monkey.a3d5fcdc50b18dc55695..svg"},4128:(e,t,n)=>{e.exports=n.p+"telegram-logo.1b2bb5b107f046ea9325..svg"}},u={};function s(e){var t=u[e];if(void 0!==t)return t.exports;var n=u[e]={exports:{}};return a[e].call(n.exports,n,n.exports,s),n.exports}s.m=a,s.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return s.d(t,{a:t}),t},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,s.t=function(n,r){if(1&r&&(n=this(n)),8&r)return n;if("object"==typeof n&&n){if(4&r&&n.__esModule)return n;if(16&r&&"function"==typeof n.then)return n}var o=Object.create(null);s.r(o);var d={};e=e||[null,t({}),t([]),t(t)];for(var a=2&r&&n;"object"==typeof a&&!~e.indexOf(a);a=t(a))Object.getOwnPropertyNames(a).forEach((e=>d[e]=()=>n[e]));return d.default=()=>n,s.d(o,d),o},s.d=(e,t)=>{for(var n in t)s.o(t,n)&&!s.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},s.f={},s.e=e=>Promise.all(Object.keys(s.f).reduce(((t,n)=>(s.f[n](e,t),t)),[])),s.u=e=>e+"."+{99:"f03a947e6e336feffec8",133:"48263fce9542c3e0b864",161:"286d0207d962142ad548",211:"1fd3812a4d5830a98eb6",354:"5a81437dab6fff49c131",472:"21e5264f606f2b525030",501:"72ce4b6e27f459e194cd",524:"85ca6db6bb78d08e40d5",536:"55dc7dd4ab42a2c9f037",701:"f1f158c205e1345450d1",745:"9316c5c2b711c39a20a5",757:"e669f135f9dce66de020",824:"99496e45ca79e9811441",884:"6755b1740504dc00dac9",915:"13af1c4ab9a00d84ac23",927:"15e315c28998f346b75d",941:"aad13fbc78f9d63ec948",943:"33a4b193ecb893d99436",993:"f0aad9f6787f211b4e51"}[e]+".js",s.miniCssF=e=>e+"."+{133:"48263fce9542c3e0b864",211:"1fd3812a4d5830a98eb6",472:"21e5264f606f2b525030",701:"f1f158c205e1345450d1",757:"e669f135f9dce66de020",943:"33a4b193ecb893d99436"}[e]+".css",s.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n={},r="telegram-t:",s.l=(e,t,o,d)=>{if(n[e])n[e].push(t);else{var a,u;if(void 0!==o)for(var i=document.getElementsByTagName("script"),c=0;c{a.onerror=a.onload=null,clearTimeout(h);var o=n[e];if(delete n[e],a.parentNode&&a.parentNode.removeChild(a),o&&o.forEach((e=>e(r))),t)return t(r)},h=setTimeout(f.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=f.bind(null,a.onerror),a.onload=f.bind(null,a.onload),u&&document.head.appendChild(a)}},s.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;s.g.importScripts&&(e=s.g.location+"");var t=s.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");n.length&&(e=n[n.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),s.p=e})(),o=e=>new Promise(((t,n)=>{var r=s.miniCssF(e),o=s.p+r;if(((e,t)=>{for(var n=document.getElementsByTagName("link"),r=0;r{var o=document.createElement("link");o.rel="stylesheet",o.type="text/css",o.onerror=o.onload=d=>{if(o.onerror=o.onload=null,"load"===d.type)n();else{var a=d&&("load"===d.type?"missing":d.type),u=d&&d.target&&d.target.href||t,s=new Error("Loading CSS chunk "+e+" failed.\n("+u+")");s.code="CSS_CHUNK_LOAD_FAILED",s.type=a,s.request=u,o.parentNode.removeChild(o),r(s)}},o.href=t,document.head.appendChild(o)})(e,o,t,n)})),d={179:0},s.f.miniCss=(e,t)=>{d[e]?t.push(d[e]):0!==d[e]&&{133:1,211:1,472:1,701:1,757:1,943:1}[e]&&t.push(d[e]=o(e).then((()=>{d[e]=0}),(t=>{throw delete d[e],t})))},(()=>{s.b=document.baseURI||self.location.href;var e={179:0};s.f.j=(t,n)=>{var r=s.o(e,t)?e[t]:void 0;if(0!==r)if(r)n.push(r[2]);else{var o=new Promise(((n,o)=>r=e[t]=[n,o]));n.push(r[2]=o);var d=s.p+s.u(t),a=new Error;s.l(d,(n=>{if(s.o(e,t)&&(0!==(r=e[t])&&(e[t]=void 0),r)){var o=n&&("load"===n.type?"missing":n.type),d=n&&n.target&&n.target.src;a.message="Loading chunk "+t+" failed.\n("+o+": "+d+")",a.name="ChunkLoadError",a.type=o,a.request=d,r[1](a)}}),"chunk-"+t,t)}};var t=(t,n)=>{var r,o,[d,a,u]=n,i=0;if(d.some((t=>0!==e[t]))){for(r in a)s.o(a,r)&&(s.m[r]=a[r]);u&&u(s)}for(t&&t(n);i{s(3592);var e=s(3716),t=s(5116),n=s(7361),r=s(8406);function o(n){const o=n.data;if(e.eM&&console.log("[SW] Message from worker",o),!o.type)return;const d=(0,t.uC)();switch(o.type){case"focusMessage":d.focusMessage&&d.focusMessage(o.payload);break;case"playNotificationSound":(0,r.Nz)(o.payload.id)}}function d(){navigator.serviceWorker.removeEventListener("message",o),navigator.serviceWorker.addEventListener("message",o),(0,r.KC)()}n.Mc&&(window.addEventListener("load",(async()=>{try{await navigator.serviceWorker.register(new URL(s.p+s.u(524),s.b)),e.eM&&console.log("[SW] ServiceWorker registered"),await navigator.serviceWorker.ready,navigator.serviceWorker.controller?(e.eM&&console.log("[SW] ServiceWorker ready"),d()):(e.eM&&console.error("[SW] ServiceWorker not available"),n.cj||n.wZ||(0,t.uC)().showDialog({data:{message:"SERVICE_WORKER_DISABLED",hasErrorKey:!0}}))}catch(t){e.eM&&console.error("[SW] ServiceWorker registration failed: ",t)}})),window.addEventListener("focus",(async()=>{await navigator.serviceWorker.ready,d()})));var a=s(2916);const u={isLeftColumnShown:!0,isChatInfoShown:!1,newChatMembersProgress:s(1713).WB.Closed,uiReadyState:0,serverTimeOffset:0,authRememberMe:!0,countryList:{phoneCodes:[],general:[]},blocked:{ids:[],totalCount:0},users:{byId:{}},chats:{listIds:{},isFullyLoaded:{},orderedPinnedIds:{},totalCount:{},byId:{}},messages:{byChatId:{},messageLists:[]},groupCalls:{byId:{}},scheduledMessages:{byChatId:{}},chatFolders:{byId:{},activeChatFolder:0},fileUploads:{byMessageLocalId:{}},recentEmojis:["grinning","kissing_heart","christmas_tree","brain","trophy"],stickers:{setsById:{},added:{},recent:{stickers:[]},favorite:{stickers:[]},greeting:{stickers:[]},featured:{setIds:[]},search:{},forEmoji:{}},emojiKeywords:{},gifs:{saved:{},search:{}},inlineBots:{isLoading:!1,byUsername:{}},globalSearch:{},userSearch:{},localTextSearch:{byChatThreadKey:{}},localMediaSearch:{byChatId:{}},management:{byChatId:{}},topPeers:{},topInlineBots:{},mediaViewer:{},audioPlayer:{volume:e.Qx,playbackRate:e.mw,isMuted:!1},forwardMessages:{},pollResults:{},payment:{},notifications:[],dialogs:[],activeSessions:[],settings:{byKey:{theme:"light",shouldUseSystemTheme:!0,messageTextSize:n.cj?e.b6:n.jm?e.AR:e.xS,animationLevel:e.CX,messageSendKeyCombo:"enter",canAutoLoadPhotoFromContacts:!0,canAutoLoadPhotoInPrivateChats:!0,canAutoLoadPhotoInGroups:!0,canAutoLoadPhotoInChannels:!0,canAutoLoadVideoFromContacts:!0,canAutoLoadVideoInPrivateChats:!0,canAutoLoadVideoInGroups:!0,canAutoLoadVideoInChannels:!0,canAutoLoadFileFromContacts:!1,canAutoLoadFileInPrivateChats:!1,canAutoLoadFileInGroups:!1,canAutoLoadFileInChannels:!1,autoLoadFileMaxSizeMb:10,hasWebNotifications:!0,hasPushNotifications:!0,notificationSoundVolume:5,canAutoPlayGifs:!0,canAutoPlayVideos:!0,shouldSuggestStickers:!0,shouldLoopStickers:!0,language:"en",timeFormat:"24h",wasTimeFormatSetManually:!1},themes:{light:{isBlurred:!0,patternColor:e.g},dark:{isBlurred:!0,patternColor:e.Vv}},privacy:{},notifyExceptions:{}},twoFaSettings:{},shouldShowContextMenuHint:!0,activeDownloads:{byChatId:{}},serviceNotifications:[]};var i=s(6137),c=s(9118),l=s(8674),f=s(782),h=s(1638),m=s(4688),p=s(5780),g=s(6590),y=s(2858);const v=(0,c.P2)((()=>(0,c.Q8)(E)),5e3,!1);let b,w=!1,I=!1;function C(){w=!0,b=(0,c.Gq)(E,!0),window.addEventListener("blur",E),(0,t.ll)(v)}function S(){w=!1,(0,t.Iq)(v),window.removeEventListener("blur",E),b&&b()}function E(){if(!w||I)return;const n=(0,t.Rd)();if(n.isLoggingOut)return;const r={...u,...(0,f.ei)(n,["authState","authPhoneNumber","authRememberMe","authNearestCountry","currentUserId","contactList","topPeers","topInlineBots","recentEmojis","push","shouldShowContextMenuHint","leftColumnWidth","serviceNotifications"]),audioPlayer:{volume:n.audioPlayer.volume,playbackRate:n.audioPlayer.playbackRate,isMuted:n.audioPlayer.isMuted},isChatInfoShown:P(n),users:M(n),chats:A(n),messages:k(n),globalSearch:{recentlyFoundChatIds:n.globalSearch.recentlyFoundChatIds},settings:T(n),chatFolders:N(n)},o=JSON.stringify(r);localStorage.setItem(e.Uh,o)}function P(t){return window.innerWidth>e._m&&t.isChatInfoShown}function M(t){const{users:{byId:n,selectedId:r}}=t,o=[...(t.chats.listIds.active||[]).slice(0,e.gJ).filter(y.YC),...Object.keys(n)].slice(0,e.lO);return{byId:(0,f.ei)(n,o),selectedId:window.innerWidth>e._m?r:void 0}}function A(t){const n=[...(t.chats.listIds.active||[]).slice(0,e.gJ)],{chatId:r}=(0,h.Bt)(t)||{};return{...t.chats,byId:(0,f.ei)(t.chats.byId,r?[...n,r]:n),listIds:{active:n},isFullyLoaded:{},orderedPinnedIds:{active:t.chats.orderedPinnedIds.active}}}function k(t){const n={},{chatId:r}=(0,h.Bt)(t)||{};return[...(t.chats.listIds.active||[]).slice(0,e.gJ),...r?[r]:[]].forEach((e=>{const r=t.messages.byChatId[e];if(!r)return;const o=r.threadsById[i._f];o&&o.viewportIds&&(n[e]={byId:(0,f.ei)(r.byId,o.viewportIds),threadsById:{[i._f]:o}})})),{byChatId:n,messageLists:[]}}function T(e){const{byKey:t,themes:n}=e.settings;return{byKey:t,themes:n,privacy:{},notifyExceptions:{}}}function N(e){return{...e.chatFolders,activeChatFolder:0}}document.addEventListener(l._L,(()=>{I=!0})),document.addEventListener(l.OV,(()=>{I=!1})),e.sd||((0,t.Q6)("saveSession",(()=>{w||C()})),(0,t.Q6)("reset",(()=>{localStorage.removeItem(e.Uh),w&&S()}))),(0,t.Q6)("init",(()=>{const t=(0,f.Xh)(u);return function(t){if(!e.sd)return(0,m.ti)(!0)?(C(),function(t){e.eM&&console.time("global-state-cache-read");const r=localStorage.getItem(e.Uh),o=r?JSON.parse(r):void 0;e.eM&&console.timeEnd("global-state-cache-read"),o&&function(t,n){if("shouldAutoDownloadMediaFromContacts"in t.settings.byKey){const{shouldAutoDownloadMediaFromContacts:e,shouldAutoDownloadMediaInPrivateChats:n,shouldAutoDownloadMediaInGroups:r,shouldAutoDownloadMediaInChannels:o,shouldAutoPlayVideos:d,shouldAutoPlayGifs:a,...u}=t.settings.byKey;t.settings.byKey={...u,canAutoLoadPhotoFromContacts:e,canAutoLoadVideoFromContacts:e,canAutoLoadPhotoInPrivateChats:n,canAutoLoadVideoInPrivateChats:n,canAutoLoadPhotoInGroups:r,canAutoLoadVideoInGroups:r,canAutoLoadPhotoInChannels:o,canAutoLoadVideoInChannels:o,canAutoPlayVideos:d,canAutoPlayGifs:a}}t.settings.byKey={...n.settings.byKey,...t.settings.byKey},t.settings.themes={...n.settings.themes,...t.settings.themes},t.chatFolders={...n.chatFolders,...t.chatFolders},t.stickers.greeting||(t.stickers.greeting=n.stickers.greeting),t.activeDownloads||(t.activeDownloads={byChatId:{}}),t.serviceNotifications||(t.serviceNotifications=[]),void 0===t.audioPlayer.volume&&(t.audioPlayer.volume=e.Qx),void 0===t.audioPlayer.playbackRate&&(t.audioPlayer.playbackRate=e.mw),void 0===t.groupCalls&&(t.groupCalls=n.groupCalls)}(o,t);const d={...t,...o},a=n.wB?void 0:(0,p.V)(g.Oy);return{...d,messages:{...d.messages,messageLists:a?[a]:[]}}}(t)):void S()}(t)||t}));var L=s(4050),R=s(3858);const D="tt-active-tab",Z=String(Date.now()+Math.random());let O;localStorage.setItem(D,Z);const x=window.setInterval((()=>{O&&localStorage.getItem(D)!==Z&&(O(),clearInterval(x))}),2e3);var _=s(706),F=(s(7895),s(3781),s(1363),s(9667),s(4907),s(8332)),B=s(1212),$=s(1394);const U=["400 1em Roboto","500 1em Roboto"];function j(){if("fonts"in document)return Promise.all(U.map((e=>document.fonts.load(e))))}var W=s(647),G=s(9203),V=s(6752),H=s(4128),z=s(2162);function Q(){const{listIds:e,byId:n}=(0,t.Rd)().chats;if(e.active)return Promise.all(e.active.slice(0,10).map((e=>{const t=n[e];if(!t)return;const r=(0,F.RT)(t);return r?W.he(r,i.IU.BlobUrl):void 0})))}const K={main:()=>Promise.all([(0,G.$y)(G.gl.Main,"Main").then(j),Q()]),authPhoneNumber:()=>Promise.all([j(),(0,$.pt)(H)]),authCode:()=>(0,$.pt)(z),authPassword:()=>(0,$.pt)(z),authQrCode:j},J=(0,t.c$)((e=>{const t=(0,h.Pu)(e),{background:n,backgroundColor:r}=e.settings.themes[t]||{};return{shouldSkipHistoryAnimations:e.shouldSkipHistoryAnimations,uiReadyState:e.uiReadyState,hasCustomBackground:Boolean(n),hasCustomBackgroundColor:Boolean(r),isRightColumnShown:(0,h.Jf)(e),leftColumnWidth:e.leftColumnWidth}}),((e,t)=>(0,f.ei)(t,["setIsUiReady"])))((({page:e,children:t,hasCustomBackground:n,hasCustomBackgroundColor:r,isRightColumnShown:o,shouldSkipHistoryAnimations:d,leftColumnWidth:a,setIsUiReady:u})=>{const[s,i]=(0,_.Z)(),{shouldRender:l,transitionClassNames:f}=(0,B.Z)(!s,void 0,!0);return(0,L.d4)((()=>{let t;return Promise.race([(0,c.wO)(700),(async()=>{try{await K[e]()}catch(e){}})()]).then((()=>{i(),u({uiReadyState:1}),t=window.setTimeout((()=>{u({uiReadyState:2})}),1e3)})),()=>{t&&(clearTimeout(t),t=void 0),u({uiReadyState:0})}}),[]),L.ZP.createElement("div",{id:"UiLoader"},t,l&&!d&&L.ZP.createElement("div",{className:(0,V.Z)("mask",f)},"main"===e?L.ZP.createElement(L.ZP.Fragment,null,L.ZP.createElement("div",{className:"left",style:a?`width: ${a}px`:void 0}),L.ZP.createElement("div",{className:(0,V.Z)("middle",n&&"custom-bg-image",r&&"custom-bg-color",o&&"with-right-column")}),o&&L.ZP.createElement("div",{className:"right"})):L.ZP.createElement("div",{className:"blank"})))}));var q=s(6272),Y=s(663),X=s(9107);const ee=(e,t)=>{const[n,r]=(0,L.eJ)();return e&&Y.Pn(e,t).then(r),n};function te(){let e=navigator.language;return e&&"pt-br"!==e&&(e=e.substr(0,2)),e}var ne=s(231),re=s(4605),oe=s(7687),de=s(4288),ae=s(5765),ue=s(2340),se=s(4284),ie=s(9290),ce=s(3106),le=s(8964),fe=s(9204);const he=200+e.fK,me=(0,L.X$)((0,t.c$)((e=>{const{countryList:{phoneCodes:t}}=e;return{phoneCodeList:t}}))((({id:e,value:t,isLoading:n,onChange:r,phoneCodeList:o})=>{const d=(0,X.Z)(),a=(0,L.sO)(null),[u,s]=(0,L.eJ)(),[i,c]=(0,L.eJ)([]),l=(0,L.I4)((e=>{s(e),c(function(e,t=""){return t.length?e.filter((e=>(0,ae.Z)(e.defaultName,t)||e.name&&(0,ae.Z)(e.name,t))):e}(o,e))}),[o]);(0,ie.Z)((([e])=>{0===(null==e?void 0:e.length)&&o.length>0&&l(u)}),[o,l]);const f=(0,L.I4)((e=>{r(e),setTimeout((()=>l(void 0)),he)}),[r,l]),h=(0,L.I4)((e=>{l(e.currentTarget.value)}),[l]),m=(0,L.I4)((e=>{if(8!==e.keyCode)return;const n=e.currentTarget;t&&void 0===u&&(n.value=""),l(n.value)}),[u,l,t]);return L.ZP.createElement(ce.Z,{className:"CountryCodeInput",trigger:({onTrigger:r,isOpen:o})=>{const s=()=>{if(o)return;setTimeout((()=>{a.current.select()}),50),r();const e=document.getElementById("auth-phone-number-form");e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},i=null!=u?u:(null==t?void 0:t.name)||(null==t?void 0:t.defaultName)||"";return L.ZP.createElement("div",{className:(0,V.Z)("input-group",t&&"touched")},L.ZP.createElement("input",{ref:a,className:(0,V.Z)("form-control",o&&"focus"),type:"text",id:e,value:i,autoComplete:"off",onClick:s,onFocus:s,onInput:e=>{h(e),s()},onKeyDown:m}),L.ZP.createElement("label",null,d("Login.SelectCountry.Title")),n?L.ZP.createElement(fe.Z,{color:"black"}):L.ZP.createElement("i",{onClick:s,className:(0,V.Z)("css-icon-down",o&&"open")}))}},i.map((e=>L.ZP.createElement(le.Z,{key:e.iso2,className:t&&e.iso2===t.iso2?"selected":"",onClick:()=>f(e)},L.ZP.createElement("span",{className:"country-flag"},(0,ue.Z)((0,se.Wg)(e.iso2),["hq_emoji"])),L.ZP.createElement("span",{className:"country-name"},e.name||e.defaultName),L.ZP.createElement("span",{className:"country-code"},e.countryCode)))),!i.length&&L.ZP.createElement(le.Z,{key:"no-results",className:"no-results",disabled:!0},L.ZP.createElement("span",null,d("lng_country_none"))))})));let pe=!1;const ge=(0,L.X$)((0,t.c$)((e=>{const{settings:{byKey:{language:t}},countryList:{phoneCodes:n}}=e;return{...(0,f.ei)(e,["connectionState","authState","authPhoneNumber","authIsLoading","authIsLoadingQrCode","authError","authRememberMe","authNearestCountry"]),language:t,phoneCodeList:n}}),((e,t)=>(0,f.ei)(t,["setAuthPhoneNumber","setAuthRememberMe","clearAuthError","loadNearestCountry","loadCountryList","goToAuthQrCode","setSettingOption"])))((({connectionState:e,authState:t,authPhoneNumber:r,authIsLoading:o,authIsLoadingQrCode:d,authError:a,authRememberMe:u,authNearestCountry:s,phoneCodeList:i,language:c,setAuthPhoneNumber:l,setAuthRememberMe:f,loadNearestCountry:h,loadCountryList:m,clearAuthError:p,goToAuthQrCode:g,setSettingOption:y})=>{const v=(0,X.Z)(),b=(0,L.sO)(null),w=te(),I=ee(w,"ContinueOnThisLanguage"),[C,S]=(0,L.eJ)(),[E,P]=(0,L.eJ)(),[M,A]=(0,L.eJ)(!1),[k,T]=(0,L.eJ)(),[N,R,D]=(0,_.Z)(),Z=C?`+${C.countryCode} ${E||""}`:E,O=Z&&Z.replace(/[^\d]+/g,"").length>=7;(0,L.d4)((()=>{n.$b||b.current.focus()}),[C]),(0,L.d4)((()=>{"connectionStateReady"!==e||s||h()}),[e,s,h]),(0,L.d4)((()=>{"connectionStateReady"===e&&m({langCode:c})}),[e,c,m]),(0,L.d4)((()=>{s&&i&&!C&&!M&&S((0,q.U9)(i,s)[0])}),[C,s,M,i]);const x=(0,L.I4)((e=>{e.length||P("");const t=i&&(0,q.g3)(i,e),n=!C||t&&t.iso2!==C.iso2||!t&&e.length?t:C;(!C||!n||n&&n.iso2!==C.iso2)&&S(n),P((0,q.un)(e,n))}),[i,C]),F=(0,L.I4)((()=>{R(),(0,Y.m0)(w,(()=>{D(),y({language:w})}))}),[R,y,w,D]);(0,L.d4)((()=>{void 0===E&&r&&x(r)}),[r,E,x]),(0,L.bt)((()=>{b.current&&k&&b.current.setSelectionRange(...k)}),[k]);const B=(0,L.sO)(!1),U=(0,L.I4)((()=>{B.current=!0,requestAnimationFrame((()=>{B.current=!1}))}),[]),W=(0,L.I4)((e=>{S(e),P("")}),[]),G=(0,L.I4)((e=>{a&&p(),pe||(pe=!0,j(),(0,$.pt)(z));const{value:t,selectionStart:r,selectionEnd:o}=e.target;T(r&&o&&o1&&!B.current;x(d?`${C.countryCode} ${t}`:t)}),[a,p,C,Z,x]),V=(0,L.I4)((e=>{f(e.target.checked)}),[f]),H="authorizationStateWaitPhoneNumber"===t;return L.ZP.createElement("div",{id:"auth-phone-number-form",className:"custom-scroll"},L.ZP.createElement("div",{className:"auth-form"},L.ZP.createElement("div",{id:"logo"}),L.ZP.createElement("h2",null,"Telegram"),L.ZP.createElement("p",{className:"note"},v("StartText")),L.ZP.createElement("form",{action:"",onSubmit:function(e){e.preventDefault(),o||O&&l({phoneNumber:Z})}},L.ZP.createElement(me,{id:"sign-in-phone-code",value:C,isLoading:!s&&!C,onChange:W}),L.ZP.createElement(oe.Z,{ref:b,id:"sign-in-phone-number",label:v("Login.PhonePlaceholder"),value:Z,error:a&&v(a),inputMode:"tel",onChange:G,onPaste:n.s$?U:void 0}),L.ZP.createElement(re.Z,{id:"sign-in-keep-session",label:"Keep me signed in",checked:Boolean(u),onChange:V}),O&&(H?L.ZP.createElement(ne.Z,{type:"submit",ripple:!0,isLoading:o},v("Login.Next")):L.ZP.createElement(de.Z,null)),H&&L.ZP.createElement(ne.Z,{isText:!0,ripple:!0,isLoading:d,onClick:g},v("Login.QR.Login")),w&&w!==c&&I&&L.ZP.createElement(ne.Z,{isText:!0,isLoading:N,onClick:F},I))))})));var ye=s(8778);const ve=(0,L.X$)((()=>{const e=(0,ye.Z)(G.gl.Auth,"AuthCode");return e?L.ZP.createElement(e,null):L.ZP.createElement(de.Z,null)})),be=(0,L.X$)((()=>{const e=(0,ye.Z)(G.gl.Auth,"AuthPassword");return e?L.ZP.createElement(e,null):L.ZP.createElement(de.Z,null)})),we=(0,L.X$)((()=>{const e=(0,ye.Z)(G.gl.Auth,"AuthRegister");return e?L.ZP.createElement(e,null):L.ZP.createElement(de.Z,null)}));let Ie=null;class Ce{}Ce.render=function(e,t){Ie(e,t)},self.QrCreator=Ce,function(e){function t(t,n,r,o){var d={},a=e(r,n);a.u(t),a.J(),o=o||0;var u=a.h(),s=a.h()+2*o;return d.text=t,d.level=n,d.version=r,d.O=s,d.a=function(e,t){return t-=o,!(0>(e-=o)||e>=u||0>t||t>=u)&&a.a(e,t)},d}function n(e,t,n,r,o,d,a,u,s,i){function c(t,n,r,o,a,u,s){t?(e.lineTo(n+u,r+s),e.arcTo(n,r,o,a,d)):e.lineTo(n,r)}a?e.moveTo(t+d,n):e.moveTo(t,n),c(u,r,n,r,o,-d,0),c(s,r,o,t,o,0,-d),c(i,t,o,t,n,d,0),c(a,t,n,r,n,0,d)}function r(e,t,n,r,o,d,a,u,s,i){function c(t,n,r,o){e.moveTo(t+r,n),e.lineTo(t,n),e.lineTo(t,n+o),e.arcTo(t,n,t+r,n,d)}a&&c(t,n,d,d),u&&c(r,n,-d,d),s&&c(r,o,-d,-d),i&&c(t,o,d,-d)}function o(e,o){e:{var d=o.text,a=o.v,u=o.N,s=o.K,i=o.P;for(u=Math.max(1,u||1),s=Math.min(40,s||40);u<=s;u+=1)try{var c=t(d,a,u,i);break e}catch(e){}c=void 0}if(!c)return null;for(d=e.getContext("2d"),o.background&&(d.fillStyle=o.background,d.fillRect(o.left,o.top,o.size,o.size)),a=c.O,s=o.size/a,d.beginPath(),i=0;iMath.round(e*t.size))),"linear-gradient"===r)var d=e.createLinearGradient.apply(e,n);else{if("radial-gradient"!==r)throw Error("Unsupported fill");d=e.createRadialGradient.apply(e,n)}o.forEach((([e,t])=>{d.addColorStop(e,t)})),e.fillStyle=d}}(d,o),d.fill(),e}var d={minVersion:1,maxVersion:40,ecLevel:"L",left:0,top:0,size:200,fill:"#000",background:null,text:"no text",radius:.5,quiet:0};Ie=function(e,t){var n={};Object.assign(n,d,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),o(t,n)):((e=document.createElement("canvas")).width=n.size,e.height=n.size,n=o(e,n),t.appendChild(n))}}(function(){function e(o,a){function u(e,t){for(var n=-1;7>=n;n+=1)if(!(-1>=e+n||l<=e+n))for(var r=-1;7>=r;r+=1)-1>=t+r||l<=t+r||(c[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 s(e,n){for(var a=l=4*o+17,s=Array(a),m=0;m=y;y+=1)for(var v=-2;2>=v;v+=1)c[p+y][g+v]=-2==y||2==y||-2==v||2==v||0==y&&0==v}for(a=8;as;s+=1)m=!e&&1==(a>>s&1),c[6>s?s:8>s?s+1:l-15+s][8]=m,c[8][8>s?l-s-1:9>s?15-s:14-s]=m;if(c[l-8][8]=!e,7<=o){for(a=r.A(o),s=0;18>s;s+=1)m=!e&&1==(a>>s&1),c[Math.floor(s/3)][s%3+l-8-3]=m;for(s=0;18>s;s+=1)m=!e&&1==(a>>s&1),c[s%3+l-8-3][Math.floor(s/3)]=m}if(null==f){for(e=d.I(o,i),a=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}(),s=0;s8*m)throw Error("code length overflow. ("+a.f()+">"+8*m+")");for(a.f()+4<=8*m&&a.put(0,4);0!=a.f()%8;)a.m(!1);for(;!(a.f()>=8*m||(a.put(236,8),a.f()>=8*m));)a.put(17,8);var b=0;for(m=s=0,p=Array(e.length),g=Array(e.length),y=0;yy;y+=1)null==c[s][g-y]&&(v=!1,p>>m&1)),n(s,g-y)&&(v=!v),c[s][g-y]=v,-1==--m&&(p+=1,m=7));if(0>(s+=a)||l<=s){s-=a,a=-a;break}}}var i=n[a],c=null,l=0,f=null,h=[],m={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||l<=e||0>t||l<=t)throw Error(e+","+t);return c[e][t]},h:function(){return l},J:function(){for(var e=0,t=0,n=0;8>n;n+=1){s(!0,n);var o=r.D(m);(0==n||e>o)&&(e=o,t=n)}s(!1,t)}};return m}function t(e,n){if(void 0===e.length)throw Error(e.length+"/"+n);var r=function(){for(var t=0;td.b()-e.b())return d;for(var n=o.g(d.c(0))-o.g(e.c(0)),r=Array(d.b()),a=0;ar?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=u;u+=1)if(!(0>r+u||t<=r+u))for(var s=-1;1>=s;s+=1)0>o+s||t<=o+s||(0!=u||0!=s)&&a==e.a(r+u,o+s)&&(d+=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]}}}(),d=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 o=0;o{const{connectionState:t,authState:n,authQrCode:r,settings:{byKey:{language:o}}}=e;return{connectionState:t,authState:n,authQrCode:r,language:o}}),((e,t)=>(0,f.ei)(t,["returnToAuthPhoneNumber","setSettingOption"])))((({connectionState:e,authState:t,authQrCode:n,language:r,returnToAuthPhoneNumber:o,setSettingOption:d})=>{const a=te(),u=(0,X.Z)(),s=(0,L.sO)(null),i=ee(a,"ContinueOnThisLanguage"),[c,l,f]=(0,_.Z)();(0,L.d4)((()=>{if(!n||"connectionStateReady"!==e)return;const t=s.current;t.innerHTML="",t.classList.remove("pre-animate"),Se.render({text:`tg://login?token=${n.token}`,radius:.5,ecLevel:"M",fill:"#4E96D4",size:280},t)}),[e,n]);const h=(0,L.I4)((()=>{l(),(0,Y.m0)(a,(()=>{f(),d({language:a})}))}),[l,d,a,f]),m="authorizationStateWaitQrCode"===t;return L.ZP.createElement("div",{id:"auth-qr-form",className:"custom-scroll"},L.ZP.createElement("div",{className:"auth-form qr"},n?L.ZP.createElement("div",{key:"qr-container",className:"qr-container pre-animate",ref:s}):L.ZP.createElement("div",{key:"qr-loading",className:"qr-loading"},L.ZP.createElement(de.Z,null)),L.ZP.createElement("h3",null,u("Login.QR.Title")),L.ZP.createElement("ol",null,L.ZP.createElement("li",null,L.ZP.createElement("span",null,u("Login.QR.Help1"))),L.ZP.createElement("li",null,L.ZP.createElement("span",null,(0,ue.Z)(u("Login.QR.Help2"),["simple_markdown"]))),L.ZP.createElement("li",null,L.ZP.createElement("span",null,u("Login.QR.Help3")))),m&&L.ZP.createElement(ne.Z,{isText:!0,onClick:o},u("Login.QR.Cancel")),a&&a!==r&&i&&L.ZP.createElement(ne.Z,{isText:!0,isLoading:c,onClick:h},i)))}))),Pe=(0,L.X$)((0,t.c$)((e=>(0,f.ei)(e,["authState"])),((e,t)=>(0,f.ei)(t,["reset","initApi","returnToAuthPhoneNumber","goToAuthQrCode"])))((({authState:e,reset:t,initApi:r,returnToAuthPhoneNumber:o,goToAuthQrCode:d})=>{(0,L.d4)((()=>{t(),r()}),[t,r]);const a="iOS"===n.Lt||"Android"===n.Lt;switch((0,g.ZP)(!a&&"authorizationStateWaitPhoneNumber"===e||a&&"authorizationStateWaitQrCode"===e,(()=>{a?o():d()})),(0,L.d4)((()=>(R.Z.disableRefresh(),()=>{R.Z.enableRefresh()})),[]),e){case"authorizationStateWaitCode":return L.ZP.createElement(J,{page:"authCode",key:"authCode"},L.ZP.createElement(ve,null));case"authorizationStateWaitPassword":return L.ZP.createElement(J,{page:"authPassword",key:"authPassword"},L.ZP.createElement(be,null));case"authorizationStateWaitRegistration":return L.ZP.createElement(we,null);case"authorizationStateWaitPhoneNumber":return L.ZP.createElement(J,{page:"authPhoneNumber",key:"authPhoneNumber"},L.ZP.createElement(ge,null));case"authorizationStateWaitQrCode":return L.ZP.createElement(J,{page:"authQrCode",key:"authQrCode"},L.ZP.createElement(Ee,null));default:return a?L.ZP.createElement(J,{page:"authPhoneNumber",key:"authPhoneNumber"},L.ZP.createElement(ge,null)):L.ZP.createElement(J,{page:"authQrCode",key:"authQrCode"},L.ZP.createElement(Ee,null))}}))),Me=(0,L.X$)((()=>{const e=(0,ye.Z)(G.gl.Main,"Main");return e?L.ZP.createElement(e,null):void 0}));var Ae=s(5359);const ke=()=>L.ZP.createElement("div",{id:"AppInactive"},L.ZP.createElement("div",{className:"content"},L.ZP.createElement("img",{src:Ae,alt:""}),L.ZP.createElement("h3",{className:"title"},"Such error, many tabs"),L.ZP.createElement("div",{className:"description"},"Telegram supports only one active tab with the app.",L.ZP.createElement("br",null),"Please reload this page to continue using this tab or close it."),L.ZP.createElement("div",{className:"actions"},L.ZP.createElement(ne.Z,{isText:!0,ripple:!0,onClick:()=>{window.location.reload()}},"Reload app"))));function Te(){return t.ZP.createElement(J,{page:"main",key:"main"},t.ZP.createElement(Me,null))}const Ne=(0,t.c$)((e=>(0,f.ei)(e,["authState"])),((e,t)=>(0,f.ei)(t,["disconnect"])))((({authState:n,disconnect:r})=>{const[o,d]=(0,_.Z)(!1);if((0,L.d4)((()=>{(0,R.z)(),O=()=>{r(),document.title=`${e.Ti}${e.ou}`,d()}}),[r,d]),o)return t.ZP.createElement(ke,null);if(n)switch(n){case"authorizationStateWaitPhoneNumber":case"authorizationStateWaitCode":case"authorizationStateWaitPassword":case"authorizationStateWaitRegistration":case"authorizationStateWaitQrCode":return t.ZP.createElement(Pe,null);case"authorizationStateClosed":case"authorizationStateClosing":case"authorizationStateLoggingOut":case"authorizationStateReady":return Te()}return(0,m.ti)(!0)?Te():t.ZP.createElement(Pe,null)}));e.eM&&console.log(">>> INIT"),(0,t.uC)().init(),e.eM&&console.log(">>> START INITIAL RENDER"),a.Z.render(t.ZP.createElement(Ne,null),document.getElementById("root")),e.eM&&console.log(">>> FINISH INITIAL RENDER"),document.addEventListener("dblclick",(()=>{console.warn("GLOBAL STATE",(0,t.Rd)())}))})()})(); -//# sourceMappingURL=main.38800c1e32e7e441cc8a.js.map \ No newline at end of file diff --git a/dist/main.38800c1e32e7e441cc8a.js.map b/dist/main.38800c1e32e7e441cc8a.js.map deleted file mode 100644 index f6fffc7ea..000000000 --- a/dist/main.38800c1e32e7e441cc8a.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"main.38800c1e32e7e441cc8a.js","mappings":"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AG,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,IAA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","sources":["webpack://telegram-t/webpack/runtime/create fake namespace object","webpack://telegram-t/webpack/runtime/load script","webpack://telegram-t/webpack/runtime/css loading","webpack://telegram-t/./src/api/gramjs/worker/provider.ts","webpack://telegram-t/./src/api/types/media.ts","webpack://telegram-t/./src/api/types/messages.ts","webpack://telegram-t/./src/lib/punycode.js","webpack://telegram-t/./src/components/common/SafeLink.tsx","webpack://telegram-t/./src/components/common/helpers/documentInfo.ts","webpack://telegram-t/./src/components/common/helpers/parseEmojiOnlyString.ts","webpack://telegram-t/./src/components/common/UserLink.tsx","webpack://telegram-t/./src/components/common/MessageLink.tsx","webpack://telegram-t/./src/components/common/ChatLink.tsx","webpack://telegram-t/./src/components/common/GroupCallLink.tsx","webpack://telegram-t/./src/components/common/helpers/renderActionMessageText.tsx","webpack://telegram-t/./src/components/common/helpers/renderText.tsx","webpack://telegram-t/./src/components/middle/helpers/preventMessageInputBlur.ts","webpack://telegram-t/./src/components/middle/message/MentionLink.tsx","webpack://telegram-t/./src/components/ui/Button.tsx","webpack://telegram-t/./src/components/ui/Checkbox.tsx","webpack://telegram-t/./src/components/ui/DropdownMenu.tsx","webpack://telegram-t/./src/components/ui/InputText.tsx","webpack://telegram-t/./src/components/ui/Link.tsx","webpack://telegram-t/./src/components/ui/Loading.tsx","webpack://telegram-t/./src/components/ui/Menu.tsx","webpack://telegram-t/./src/components/ui/MenuItem.tsx","webpack://telegram-t/./src/components/ui/RippleEffect.tsx","webpack://telegram-t/./src/components/ui/Spinner.tsx","webpack://telegram-t/./src/config.ts","webpack://telegram-t/./src/hooks/useEffectWithPrevDeps.ts","webpack://telegram-t/./src/hooks/useFlag.ts","webpack://telegram-t/./src/hooks/useForceUpdate.ts","webpack://telegram-t/./src/hooks/useHeavyAnimationCheck.ts","webpack://telegram-t/./src/hooks/useHistoryBack.ts","webpack://telegram-t/./src/hooks/useKeyboardListNavigation.ts","webpack://telegram-t/./src/hooks/useLang.ts","webpack://telegram-t/./src/hooks/useModuleLoader.ts","webpack://telegram-t/./src/hooks/useOnChange.ts","webpack://telegram-t/./src/hooks/usePrevious.ts","webpack://telegram-t/./src/hooks/useShowTransition.ts","webpack://telegram-t/./src/hooks/useVirtualBackdrop.ts","webpack://telegram-t/./src/lib/teact/dom-events.ts","webpack://telegram-t/./src/lib/teact/teact-dom.ts","webpack://telegram-t/./src/lib/teact/teact.ts","webpack://telegram-t/./src/lib/teact/teactn.tsx","webpack://telegram-t/./src/lib/twemojiRegex.js","webpack://telegram-t/./src/modules/actions/api/initial.ts","webpack://telegram-t/./src/modules/actions/api/settings.ts","webpack://telegram-t/./src/modules/actions/apiUpdaters/initial.ts","webpack://telegram-t/./src/modules/actions/ui/initial.ts","webpack://telegram-t/./src/modules/actions/ui/settings.ts","webpack://telegram-t/./src/modules/helpers/chats.ts","webpack://telegram-t/./src/modules/helpers/messages.ts","webpack://telegram-t/./src/modules/helpers/messageMedia.ts","webpack://telegram-t/./src/modules/helpers/localSearch.ts","webpack://telegram-t/./src/modules/helpers/payments.ts","webpack://telegram-t/./src/modules/helpers/users.ts","webpack://telegram-t/./src/modules/reducers/chats.ts","webpack://telegram-t/./src/modules/reducers/messages.ts","webpack://telegram-t/./src/modules/reducers/symbols.ts","webpack://telegram-t/./src/modules/reducers/users.ts","webpack://telegram-t/./src/modules/reducers/globalSearch.ts","webpack://telegram-t/./src/modules/reducers/localSearch.ts","webpack://telegram-t/./src/modules/reducers/management.ts","webpack://telegram-t/./src/modules/reducers/settings.ts","webpack://telegram-t/./src/modules/reducers/twoFaSettings.ts","webpack://telegram-t/./src/modules/reducers/payments.ts","webpack://telegram-t/./src/modules/selectors/chats.ts","webpack://telegram-t/./src/modules/selectors/symbols.ts","webpack://telegram-t/./src/modules/selectors/messages.ts","webpack://telegram-t/./src/modules/selectors/localSearch.ts","webpack://telegram-t/./src/modules/selectors/management.ts","webpack://telegram-t/./src/modules/selectors/ui.ts","webpack://telegram-t/./src/modules/selectors/globalSearch.ts","webpack://telegram-t/./src/modules/selectors/payments.ts","webpack://telegram-t/./src/modules/selectors/settings.ts","webpack://telegram-t/./src/modules/selectors/users.ts","webpack://telegram-t/./src/types/index.ts","webpack://telegram-t/./src/util/animation.ts","webpack://telegram-t/./src/util/appBadge.ts","webpack://telegram-t/./src/util/arePropsShallowEqual.ts","webpack://telegram-t/./src/util/buildClassName.ts","webpack://telegram-t/./src/util/cacheApi.ts","webpack://telegram-t/./src/util/captureEscKeyListener.ts","webpack://telegram-t/./src/util/captureKeyboardListeners.ts","webpack://telegram-t/./src/util/dateFormat.ts","webpack://telegram-t/./src/util/emoji.ts","webpack://telegram-t/./src/util/ensureProtocol.ts","webpack://telegram-t/./src/util/environmentWebp.ts","webpack://telegram-t/./src/util/environmentSystemTheme.ts","webpack://telegram-t/./src/util/environment.ts","webpack://telegram-t/./src/util/files.ts","webpack://telegram-t/./src/util/formatCurrency.ts","webpack://telegram-t/./src/util/generateIdFor.ts","webpack://telegram-t/./src/util/getReadableErrorText.ts","webpack://telegram-t/./src/util/handleError.ts","webpack://telegram-t/./src/util/iteratees.ts","webpack://telegram-t/./src/util/langProvider.ts","webpack://telegram-t/./src/util/callbacks.ts","webpack://telegram-t/./src/util/oggToWav.ts","webpack://telegram-t/./src/util/mediaLoader.ts","webpack://telegram-t/./src/util/memo.ts","webpack://telegram-t/./src/util/moduleLoader.ts","webpack://telegram-t/./src/util/notifications.ts","webpack://telegram-t/./src/util/phoneNumber.ts","webpack://telegram-t/./src/util/routing.ts","webpack://telegram-t/./src/util/schedulers.ts","webpack://telegram-t/./src/util/searchWords.ts","webpack://telegram-t/./src/util/serverTime.ts","webpack://telegram-t/./node_modules/idb-keyval/dist/esm/index.js","webpack://telegram-t/./node_modules/safari-14-idb-fix/dist/esm/index.js","webpack://telegram-t/./src/util/sessions.ts","webpack://telegram-t/./src/util/switchTheme.ts","webpack://telegram-t/./src/util/textFormat.ts","webpack://telegram-t/./src/util/trimText.ts","webpack://telegram-t/./src/util/webpToPng.ts","webpack://telegram-t/./src/util/websync.ts","webpack://telegram-t/./src/util/windowSize.ts","webpack://telegram-t/webpack/bootstrap","webpack://telegram-t/webpack/runtime/compat get default export","webpack://telegram-t/webpack/runtime/define property getters","webpack://telegram-t/webpack/runtime/ensure chunk","webpack://telegram-t/webpack/runtime/get javascript chunk filename","webpack://telegram-t/webpack/runtime/get mini-css chunk filename","webpack://telegram-t/webpack/runtime/global","webpack://telegram-t/webpack/runtime/hasOwnProperty shorthand","webpack://telegram-t/webpack/runtime/make namespace object","webpack://telegram-t/webpack/runtime/publicPath","webpack://telegram-t/webpack/runtime/jsonp chunk loading","webpack://telegram-t/./src/util/setupServiceWorker.ts","webpack://telegram-t/./src/global/initial.ts","webpack://telegram-t/./src/global/cache.ts","webpack://telegram-t/./src/global/index.ts","webpack://telegram-t/./src/util/activeTabMonitor.ts","webpack://telegram-t/./src/util/fonts.ts","webpack://telegram-t/./src/components/common/UiLoader.tsx","webpack://telegram-t/./src/hooks/useLangString.ts","webpack://telegram-t/./src/components/auth/helpers/getSuggestedLanguage.ts","webpack://telegram-t/./src/components/auth/CountryCodeInput.tsx","webpack://telegram-t/./src/components/auth/AuthPhoneNumber.tsx","webpack://telegram-t/./src/components/auth/AuthCode.async.tsx","webpack://telegram-t/./src/components/auth/AuthPassword.async.tsx","webpack://telegram-t/./src/components/auth/AuthRegister.async.tsx","webpack://telegram-t/./node_modules/qr-creator/dist/qr-creator.es6.min.js","webpack://telegram-t/./src/components/auth/AuthQrCode.tsx","webpack://telegram-t/./src/components/auth/Auth.tsx","webpack://telegram-t/./src/components/main/Main.async.tsx","webpack://telegram-t/./src/components/main/AppInactive.tsx","webpack://telegram-t/./src/App.tsx","webpack://telegram-t/./src/index.tsx"],"sourcesContent":["var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"telegram-t:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\t;\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","var createStylesheet = (chunkId, fullhref, resolve, reject) => {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tvar onLinkComplete = (event) => {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + realHref + \")\");\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tlinkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\tdocument.head.appendChild(linkTag);\n\treturn linkTag;\n};\nvar findStylesheet = (href, fullhref) => {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = (chunkId) => {\n\treturn new Promise((resolve, reject) => {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t179: 0\n};\n\n__webpack_require__.f.miniCss = (chunkId, promises) => {\n\tvar cssChunks = {\"133\":1,\"211\":1,\"472\":1,\"701\":1,\"757\":1,\"943\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(() => {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, (e) => {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr","import { ApiInitialArgs, 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';\nimport { pause } from '../../../util/schedulers';\n\ntype RequestStates = {\n messageId: string;\n resolve: Function;\n reject: Function;\n callback?: AnyToVoidFunction;\n};\n\nconst HEALTH_CHECK_TIMEOUT = 150;\nconst HEALTH_CHECK_MIN_DELAY = 5 * 1000; // 5 sec\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, initialArgs: ApiInitialArgs) {\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(new URL('./worker.ts', import.meta.url));\n subscribeToWorker(onUpdate);\n\n if (initialArgs.platform === 'iOS') {\n setupIosHealthCheck();\n }\n }\n\n return makeRequest({\n type: 'initApi',\n args: [initialArgs],\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 requestStates.get(data.messageId)?.callback?.(...data.callbackArgs);\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 (('args' in payload) && 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\nconst startedAt = Date.now();\n\n// Workaround for iOS sometimes stops interacting with worker\nfunction setupIosHealthCheck() {\n window.addEventListener('focus', async () => {\n try {\n await Promise.race([\n makeRequest({ type: 'ping' }),\n pause(HEALTH_CHECK_TIMEOUT).then(() => Promise.reject(new Error('HEALTH_CHECK_TIMEOUT'))),\n ]);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n\n if (Date.now() - startedAt >= HEALTH_CHECK_MIN_DELAY) {\n window.location.reload();\n }\n }\n });\n}\n","// We cache avatars as Data URI for faster initial load\n// and messages media as Blob for smaller size.\n\nexport enum ApiMediaFormat {\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 { ApiGroupCall } from './calls';\n\nexport interface ApiDimensions {\n width: number;\n height: number;\n}\n\nexport interface ApiPhotoSize extends ApiDimensions {\n type: 's' | 'm' | 'x' | 'y' | 'z';\n}\n\nexport interface ApiThumbnail extends ApiDimensions {\n dataUri: string;\n}\n\nexport interface ApiPhoto {\n id: string;\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 stickers?: ApiSticker[];\n packs?: Record;\n covers?: ApiSticker[];\n shortName: string;\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 thumbnailSizes?: ApiPhotoSize[];\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 mediaType?: 'photo' | 'video';\n mediaSize?: ApiDimensions;\n}\n\nexport interface ApiContact {\n firstName: string;\n lastName: string;\n phoneNumber: string;\n userId: string;\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?: string[];\n solution?: string;\n solutionEntities?: ApiMessageEntity[];\n };\n}\n\nexport interface ApiInvoice {\n text: string;\n title: string;\n photoUrl?: string;\n amount: number;\n currency: string;\n receiptMsgId?: number;\n isTest?: boolean;\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 targetUserIds?: string[];\n targetChatId?: string;\n type: 'historyClear' | 'contactSignUp' | 'chatCreate' | 'other';\n photo?: ApiPhoto;\n amount?: number;\n currency?: string;\n translationValues: string[];\n call?: Partial;\n}\n\nexport interface ApiWebPage {\n id: number;\n url: string;\n displayUrl: string;\n type?: string;\n siteName?: string;\n title?: string;\n description?: string;\n photo?: ApiPhoto;\n duration?: number;\n document?: ApiDocument;\n video?: ApiVideo;\n}\n\nexport interface ApiMessageForwardInfo {\n isChannelPost: boolean;\n channelPostId?: number;\n isLinkedChannelPost?: boolean;\n fromChatId?: string;\n senderUserId?: string;\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?: string;\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: string;\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?: string;\n replyToChatId?: string;\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 isMentioned?: boolean;\n isMediaUnread?: boolean;\n groupedId?: string;\n isInAlbum?: boolean;\n hasUnreadMention?: boolean;\n inlineButtons?: ApiKeyboardButtons;\n keyboardButtons?: ApiKeyboardButtons;\n keyboardPlaceholder?: string;\n isKeyboardSingleUse?: boolean;\n viaBotId?: string;\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: string;\n topMessageId?: number;\n originChannelId?: string;\n messagesCount: number;\n lastMessageId?: number;\n lastReadInboxMessageId?: number;\n recentReplierIds?: string[];\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[][];\nexport type ApiReplyKeyboard = {\n keyboardPlaceholder?: string;\n isKeyboardSingleUse?: boolean;\n} & {\n [K in 'inlineButtons' | 'keyboardButtons']?: ApiKeyboardButtons;\n};\n\nexport type ApiMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio' | 'voice' | 'profilePhoto';\nexport type ApiGlobalMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio' | 'voice';\n\nexport type ApiReportReason = 'spam' | 'violence' | 'pornography' | 'childAbuse'\n| 'copyright' | 'geoIrrelevant' | 'fake' | 'other';\n\nexport const MAIN_THREAD_ID = -1;\n\n// `Symbol` can not be transferred from worker\nexport const MESSAGE_DELETED = 'MESSAGE_DELETED';\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 { getDispatch } from '../../lib/teact/teactn';\nimport convertPunycode from '../../lib/punycode';\n\nimport {\n DEBUG, RE_TG_LINK, RE_TME_LINK,\n} from '../../config';\nimport buildClassName from '../../util/buildClassName';\nimport { ensureProtocol } from '../../util/ensureProtocol';\n\ntype OwnProps = {\n url?: string;\n text: string;\n className?: string;\n children?: any;\n isRtl?: boolean;\n};\n\nconst SafeLink: FC = ({\n url,\n text,\n className,\n children,\n isRtl,\n}) => {\n const { toggleSafeLinkModal, openTelegramLink } = getDispatch();\n\n const content = children || text;\n const isNotSafe = url !== content;\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_TG_LINK))\n ) {\n if (isNotSafe) {\n toggleSafeLinkModal({ url });\n\n e.preventDefault();\n return false;\n }\n\n return true;\n }\n\n e.preventDefault();\n openTelegramLink({ url });\n\n return false;\n }, [isNotSafe, openTelegramLink, toggleSafeLinkModal, 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 {content}\n \n );\n};\n\nfunction getDomain(url?: string) {\n if (!url) {\n return undefined;\n }\n\n const href = ensureProtocol(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(SafeLink);\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","// @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","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?: string;\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, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiGroupCall } 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 groupCall?: Partial;\n children: any;\n};\n\ntype DispatchProps = Pick;\n\nconst GroupCallLink: FC = ({\n className, groupCall, joinGroupCall, children,\n}) => {\n const handleClick = useCallback(() => {\n if (groupCall) {\n joinGroupCall({ id: groupCall.id, accessHash: groupCall.accessHash });\n }\n }, [groupCall, joinGroupCall]);\n\n if (!groupCall) {\n return children;\n }\n\n return (\n {children}\n );\n};\n\nexport default withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['joinGroupCall']),\n)(GroupCallLink);\n","import React from '../../../lib/teact/teact';\n\nimport {\n ApiChat, ApiMessage, ApiUser, ApiGroupCall,\n} from '../../../api/types';\nimport { LangFn } from '../../../hooks/useLang';\nimport {\n getChatTitle,\n getMessageContent,\n getMessageSummaryText,\n getUserFullName,\n isUserId,\n} from '../../../modules/helpers';\nimport trimText from '../../../util/trimText';\nimport { formatCurrency } from '../../../util/formatCurrency';\nimport { TextPart } from './renderMessageText';\nimport renderText from './renderText';\n\nimport UserLink from '../UserLink';\nimport MessageLink from '../MessageLink';\nimport ChatLink from '../ChatLink';\nimport GroupCallLink from '../GroupCallLink';\n\ninterface ActionMessageTextOptions {\n maxTextLength?: number;\n asPlain?: boolean;\n isEmbedded?: boolean;\n}\n\nconst NBSP = '\\u00A0';\n\nexport function renderActionMessageText(\n lang: LangFn,\n message: ApiMessage,\n actionOrigin?: ApiUser | ApiChat,\n targetUsers?: ApiUser[],\n targetMessage?: ApiMessage,\n targetChatId?: string,\n options: ActionMessageTextOptions = {},\n) {\n if (!message.content.action) {\n return [];\n }\n const {\n text, translationValues, amount, currency, call,\n } = message.content.action;\n const content: TextPart[] = [];\n const textOptions: ActionMessageTextOptions = { ...options, maxTextLength: 32 };\n const translationKey = text === 'Chat.Service.Group.UpdatedPinnedMessage1' && !targetMessage\n ? 'Message.PinnedGenericMessage'\n : text;\n\n let unprocessed = lang(translationKey, translationValues && translationValues.length ? translationValues : undefined);\n let processed: TextPart[];\n\n if (unprocessed.includes('%payment_amount%')) {\n processed = processPlaceholder(\n unprocessed,\n '%payment_amount%',\n formatCurrency(amount!, currency, lang.code),\n );\n unprocessed = processed.pop() as string;\n content.push(...processed);\n }\n\n processed = processPlaceholder(\n unprocessed,\n '%action_origin%',\n actionOrigin\n ? (!options.isEmbedded && renderOriginContent(lang, 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 targetUsers\n ? targetUsers.map((user) => renderUserContent(user, options.asPlain)).filter(Boolean as any)\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(lang, 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 if (call) {\n return renderGroupCallContent(call, content);\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(lang: LangFn, message: ApiMessage, options: ActionMessageTextOptions = {}) {\n const text = getMessageSummaryText(lang, message);\n const {\n photo, video, document, sticker,\n } = getMessageContent(message);\n\n const { maxTextLength, isEmbedded, asPlain } = options;\n\n const showQuotes = isEmbedded && text && !photo && !video && !document && !sticker;\n let messageText = trimText(text as string, maxTextLength)!;\n\n if (isEmbedded) {\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\n if (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(lang: LangFn, origin: ApiUser | ApiChat, asPlain?: boolean) {\n return isUserId(origin.id)\n ? renderUserContent(origin as ApiUser, asPlain)\n : renderChatContent(lang, origin as ApiChat, asPlain);\n}\n\nfunction renderGroupCallContent(groupCall: Partial, text: TextPart[]): string | TextPart | undefined {\n return (\n \n {text}\n \n );\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(lang: LangFn, chat: ApiChat, asPlain?: boolean): string | TextPart | undefined {\n const text = trimText(getChatTitle(lang, chat));\n\n if (asPlain) {\n return text;\n }\n\n return {chat && renderText(text!)};\n}\n\nfunction renderMigratedContent(chatId: string, 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[]): 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 if (Array.isArray(replaceValue)) {\n replaceValue.forEach((value, index) => {\n content.push(value);\n if (index + 1 < replaceValue.length) {\n content.push(', ');\n }\n });\n } else {\n content.push(replaceValue);\n }\n content.push(text.substring(placeholderPosition + placeholder.length));\n\n return content;\n}\n","import React from '../../../lib/teact/teact';\nimport EMOJI_REGEX, { removeVS16s } from '../../../lib/twemojiRegex';\n\nimport { RE_LINK_TEMPLATE, RE_MENTION_TEMPLATE } from '../../../config';\nimport { IS_EMOJI_SUPPORTED } from '../../../util/environment';\nimport { fixNonStandardEmoji, nativeToUnified } 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 part = fixNonStandardEmoji(part);\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 = nativeToUnified(removeVS16s(emoji));\n if (!code) return emojiResult;\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}|${RE_MENTION_TEMPLATE}`, '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);\n if (!links || !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 if (nextLink.endsWith('?')) {\n nextLink = nextLink.slice(0, nextLink.length - 1);\n }\n\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 React from '../../../lib/teact/teact';\n\nimport { EDITABLE_INPUT_ID } from '../../../config';\nimport { IS_IOS } from '../../../util/environment';\n\nexport function preventMessageInputBlur(e: React.MouseEvent, withBubbling = false) {\n if (\n IS_IOS\n || !document.activeElement\n || document.activeElement.id !== EDITABLE_INPUT_ID\n || (!withBubbling && e.target !== e.currentTarget)\n ) {\n return;\n }\n\n e.preventDefault();\n}\n\nexport function preventMessageInputBlurWithBubbling(e: React.MouseEvent) {\n preventMessageInputBlur(e, true);\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?: string;\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 { 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 backgroundImage?: string;\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 isRtl?: boolean;\n withClickPropagation?: boolean;\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 backgroundImage,\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 isRtl,\n withClickPropagation,\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 backgroundImage && 'with-image',\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 if (!withClickPropagation) e.preventDefault();\n if (!disabled && onMouseDown) {\n onMouseDown(e);\n }\n }, [onMouseDown, disabled, withClickPropagation]);\n\n if (href) {\n return (\n }\n className={fullClassName}\n href={href}\n title={ariaLabel}\n download={download}\n tabIndex={tabIndex}\n dir={isRtl ? 'rtl' : undefined}\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 dir={isRtl ? 'rtl' : undefined}\n // @ts-ignore\n style={backgroundImage ? `background-image: url(${backgroundImage})` : undefined}\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 { ChangeEvent } from 'react';\nimport React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\nimport renderText from '../common/helpers/renderText';\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 lang = useLang();\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","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 forceOpen?: boolean;\n onOpen?: NoneToVoidFunction;\n onClose?: NoneToVoidFunction;\n children: any;\n};\n\nconst DropdownMenu: FC = ({\n trigger,\n className,\n children,\n positionX = 'left',\n positionY = 'top',\n footer,\n forceOpen,\n onOpen,\n onClose,\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 if (isOpen) {\n if (onClose) onClose();\n } else if (onOpen) onOpen();\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 if (onClose) onClose();\n };\n\n return (\n \n {trigger({ onTrigger: toggleIsOpen, isOpen })}\n\n \n {children}\n \n \n );\n};\n\nexport default DropdownMenu;\n","import { ChangeEvent, FormEvent, RefObject } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\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 onPaste?: (e: React.ClipboardEvent) => 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 onPaste,\n}) => {\n const lang = useLang();\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 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 isRtl?: boolean;\n onClick?: (e: React.MouseEvent) => void;\n};\n\nconst Link: FC = ({\n children, className, isRtl, onClick,\n}) => {\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 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 { 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';\nimport useHistoryBack from '../../hooks/useHistoryBack';\nimport { preventMessageInputBlurWithBubbling } from '../middle/helpers/preventMessageInputBlur';\n\nimport './Menu.scss';\n\ntype OwnProps = {\n ref?: RefObject;\n containerRef?: RefObject;\n isOpen: boolean;\n className?: string;\n style?: string;\n menuStyle?: string;\n positionX?: 'left' | 'right';\n positionY?: 'top' | 'bottom';\n autoClose?: boolean;\n shouldSkipTransition?: 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 menuStyle,\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 shouldSkipTransition,\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 {\n transitionClassNames,\n } = useShowTransition(\n isOpen,\n onCloseAnimationEnd,\n shouldSkipTransition,\n undefined,\n shouldSkipTransition,\n );\n\n useEffect(\n () => (isOpen && onClose ? captureEscKeyListener(onClose) : undefined),\n [isOpen, onClose],\n );\n\n useHistoryBack(isOpen, onClose, undefined, undefined, autoClose);\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, undefined, true);\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 React, { FC, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\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 lang = useLang();\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, memo,\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 }) => (\n \n ))}\n
\n );\n};\n\nexport default memo(RippleEffect);\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","export const PAGE_TITLE = 'Telegram';\nexport const INACTIVE_MARKER = ' [Inactive]';\n\nexport const APP_NAME = process.env.APP_NAME || 'Telegram WebZ';\nexport const APP_VERSION = process.env.APP_VERSION || 'dev';\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 SESSION_USER_KEY = 'user_auth';\nexport const LEGACY_SESSION_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-v6';\nexport const ASSET_CACHE_NAME = 'tt-assets';\nexport const AUTODOWNLOAD_FILESIZE_MB_LIMITS = [1, 5, 10, 50, 100, 500];\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 MEMBERS_SLICE = 30;\nexport const MEMBERS_LOAD_SLICE = 200;\nexport const PINNED_MESSAGES_LIMIT = 50;\nexport const BLOCKED_LIST_LIMIT = 100;\nexport const PROFILE_PHOTOS_LIMIT = 40;\nexport const PROFILE_SENSITIVE_AREA = 500;\nexport const COMMON_CHATS_LIMIT = 100;\nexport const GROUP_CALL_PARTICIPANTS_LIMIT = 100;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 20;\nexport const ALL_CHATS_PRELOAD_DISABLED = false;\n\nexport const DEFAULT_VOLUME = 1;\nexport const DEFAULT_PLAYBACK_RATE = 1;\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;\nexport const IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 17;\nexport const MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 15;\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;\nexport const TMP_CHAT_ID = '0';\n\nexport const ANIMATION_END_DELAY = 100;\n\nexport const FAST_SMOOTH_MAX_DISTANCE = 1500;\nexport const FAST_SMOOTH_MIN_DURATION = 250;\nexport const FAST_SMOOTH_MAX_DURATION = 600;\nexport const FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE = 500; // px\n\n// Average duration of message sending animation\nexport const API_UPDATE_THROTTLE = Math.round((FAST_SMOOTH_MIN_DURATION + FAST_SMOOTH_MAX_DURATION) / 2);\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\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 STICKER_SIZE_INLINE_BOT_RESULT = 100;\nexport const RECENT_STICKERS_LIMIT = 20;\nexport const MEMOJI_STICKER_ID = 'MEMOJI_STICKER';\n\nexport const BASE_EMOJI_KEYWORD_LANG = 'en';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\n\nexport const VIDEO_MOV_TYPE = 'video/quicktime';\n\nexport const SUPPORTED_IMAGE_CONTENT_TYPES = new Set([\n 'image/png', 'image/gif', 'image/jpeg',\n]);\n\nexport const SUPPORTED_VIDEO_CONTENT_TYPES = new Set([\n 'video/mp4', // video/quicktime added dynamically in environment.ts\n]);\n\nexport const CONTENT_TYPES_WITH_PREVIEW = new Set([\n ...SUPPORTED_IMAGE_CONTENT_TYPES,\n ...SUPPORTED_VIDEO_CONTENT_TYPES,\n]);\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,63})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_MENTION_TEMPLATE = '(@[\\\\w\\\\d_-]+)';\nexport const RE_TG_LINK = /^tg:(\\/\\/)?([?=&\\d\\w_-]+)?/gm;\nexport const RE_TME_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/)/gm;\n\n// eslint-disable-next-line max-len\nexport const COUNTRIES_WITH_12H_TIME_FORMAT = new Set(['AU', 'BD', 'CA', 'CO', 'EG', 'HN', 'IE', 'IN', 'JO', 'MX', 'MY', 'NI', 'NZ', 'PH', 'PK', 'SA', 'SV', 'US']);\n\n// MTProto constants\nexport const SERVICE_NOTIFICATIONS_USER_ID = '777000';\nexport const REPLIES_USER_ID = '1271266957'; // TODO For Test connection ID must be equal to 708513\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_CODE = 'en';\nexport const DEFAULT_LANG_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios', 'tdesktop', 'macos'] as const;\nexport const TIPS_USERNAME = 'TelegramTips';\nexport const LOCALIZED_TIPS = ['ar', 'pt-br', 'id', 'it', 'ko', 'ms', 'pl', 'es', 'tr'];\nexport const FEEDBACK_URL = 'https://bugs.telegram.org/?tag_ids=41&sort=time';\nexport const LIGHT_THEME_BG_COLOR = '#A2AF8E';\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\n// Group calls\nexport const GROUP_CALL_VOLUME_MULTIPLIER = 100;\nexport const GROUP_CALL_DEFAULT_VOLUME = 100 * GROUP_CALL_VOLUME_MULTIPLIER;\nexport const ENABLE_THUMBNAIL_VIDEO = false;\n","import { useEffect } from '../lib/teact/teact';\nimport usePrevious from './usePrevious';\n\nexport default (cb: (args: PT) => void, dependencies: T, debugKey?: string) => {\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, debugKey);\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 { 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 { useEffect } from '../lib/teact/teact';\n\nexport const ANIMATION_START_EVENT = 'tt-event-heavy-animation-start';\nexport const ANIMATION_END_EVENT = 'tt-event-heavy-animation-end';\n\nlet timeout: number | undefined;\nlet isAnimating = false;\n\nexport const dispatchHeavyAnimationEvent = (duration?: number) => {\n if (!isAnimating) {\n isAnimating = true;\n document.dispatchEvent(new Event(ANIMATION_START_EVENT));\n }\n\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n if (duration) {\n timeout = window.setTimeout(() => {\n isAnimating = false;\n document.dispatchEvent(new Event(ANIMATION_END_EVENT));\n timeout = undefined;\n }, duration);\n }\n\n return () => {\n isAnimating = false;\n document.dispatchEvent(new Event(ANIMATION_END_EVENT));\n };\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","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\n\nimport { IS_IOS } from '../util/environment';\nimport usePrevious from './usePrevious';\nimport { getDispatch } from '../lib/teact/teactn';\nimport { areSortedArraysEqual } from '../util/iteratees';\n\ntype HistoryState = {\n currentIndex: number;\n nextStateIndexToReplace: number;\n isHistoryAltered: boolean;\n isDisabled: boolean;\n isEdge: boolean;\n currentIndexes: number[];\n};\n\n// Carefully selected by swiping and observing visual changes\n// TODO: may be different on other devices such as iPad, maybe take dpi into account?\nconst SAFARI_EDGE_BACK_GESTURE_LIMIT = 300;\nconst SAFARI_EDGE_BACK_GESTURE_DURATION = 350;\nexport const LOCATION_HASH = window.location.hash;\nconst PATH_BASE = `${window.location.pathname}${window.location.search}`;\n\nconst historyState: HistoryState = {\n currentIndex: 0,\n nextStateIndexToReplace: -1,\n isHistoryAltered: false,\n isDisabled: false,\n isEdge: false,\n currentIndexes: [],\n};\n\nexport const disableHistoryBack = () => {\n historyState.isDisabled = true;\n};\n\nconst handleTouchStart = (event: TouchEvent) => {\n const x = event.touches[0].pageX;\n\n if (x <= SAFARI_EDGE_BACK_GESTURE_LIMIT || x >= window.innerWidth - SAFARI_EDGE_BACK_GESTURE_LIMIT) {\n historyState.isEdge = true;\n }\n};\n\nconst handleTouchEnd = () => {\n if (historyState.isEdge) {\n setTimeout(() => {\n historyState.isEdge = false;\n }, SAFARI_EDGE_BACK_GESTURE_DURATION);\n }\n};\n\nif (IS_IOS) {\n window.addEventListener('touchstart', handleTouchStart);\n window.addEventListener('touchend', handleTouchEnd);\n window.addEventListener('popstate', handleTouchEnd);\n}\n\nwindow.history.replaceState({ index: historyState.currentIndex }, '', PATH_BASE);\n\nexport default function useHistoryBack(\n isActive: boolean | undefined,\n onBack: ((noDisableAnimation: boolean) => void) | undefined,\n onForward?: (state: any) => void,\n currentState?: any,\n shouldReplaceNext = false,\n hashes?: string[],\n) {\n const indexRef = useRef(-1);\n const isForward = useRef(false);\n const prevIsActive = usePrevious(isActive);\n const isClosed = useRef(true);\n const indexHashRef = useRef<{ index: number; hash: string }[]>([]);\n const prevHashes = usePrevious(hashes);\n const isHashChangedFromEvent = useRef(false);\n\n const handleChange = useCallback((isForceClose = false) => {\n if (!hashes) {\n if (isActive && !isForceClose) {\n isClosed.current = false;\n\n if (isForward.current) {\n isForward.current = false;\n historyState.currentIndexes.push(indexRef.current);\n } else {\n setTimeout(() => {\n const index = ++historyState.currentIndex;\n\n historyState.currentIndexes.push(index);\n\n window.history[(\n (\n historyState.currentIndexes.includes(historyState.nextStateIndexToReplace - 1)\n && window.history.state.index !== 0\n && historyState.nextStateIndexToReplace === index\n && !shouldReplaceNext\n )\n ? 'replaceState'\n : 'pushState'\n )]({\n index,\n state: currentState,\n }, '');\n\n indexRef.current = index;\n\n if (shouldReplaceNext) {\n historyState.nextStateIndexToReplace = historyState.currentIndex + 1;\n }\n }, 0);\n }\n }\n\n if ((isForceClose || !isActive) && !isClosed.current) {\n if ((indexRef.current === historyState.currentIndex || !shouldReplaceNext)) {\n historyState.isHistoryAltered = true;\n window.history.back();\n\n setTimeout(() => {\n historyState.nextStateIndexToReplace = -1;\n }, 400);\n }\n historyState.currentIndexes.splice(historyState.currentIndexes.indexOf(indexRef.current), 1);\n\n isClosed.current = true;\n }\n } else {\n const prev = prevHashes || [];\n if (prev.length < hashes.length) {\n setTimeout(() => {\n const index = ++historyState.currentIndex;\n historyState.currentIndexes.push(index);\n\n window.history.pushState({\n index,\n state: currentState,\n }, '', `#${hashes[hashes.length - 1]}`);\n\n indexHashRef.current.push({\n index,\n hash: hashes[hashes.length - 1],\n });\n }, 0);\n } else {\n const delta = prev.length - hashes.length;\n if (isHashChangedFromEvent.current) {\n isHashChangedFromEvent.current = false;\n } else {\n if (hashes.length !== indexHashRef.current.length) {\n if (delta > 0) {\n const last = indexHashRef.current[indexHashRef.current.length - delta - 1];\n let realDelta = delta;\n if (last) {\n const indexLast = historyState.currentIndexes.findIndex(\n (l) => l === last.index,\n );\n realDelta = historyState.currentIndexes.length - indexLast - 1;\n }\n historyState.isHistoryAltered = true;\n window.history.go(-realDelta);\n const removed = indexHashRef.current.splice(indexHashRef.current.length - delta - 1, delta);\n removed.forEach(({ index }) => {\n historyState.currentIndexes.splice(historyState.currentIndexes.indexOf(index), 1);\n });\n }\n }\n\n if (hashes.length > 0) {\n setTimeout(() => {\n const index = ++historyState.currentIndex;\n historyState.currentIndexes[historyState.currentIndexes.length - 1] = index;\n\n window.history.replaceState({\n index,\n state: currentState,\n }, '', `${PATH_BASE}#${hashes[hashes.length - 1]}`);\n\n indexHashRef.current[indexHashRef.current.length - 1] = {\n index,\n hash: hashes[hashes.length - 1],\n };\n }, 0);\n }\n }\n }\n }\n }, [currentState, hashes, isActive, prevHashes, shouldReplaceNext]);\n\n useEffect(() => {\n const handlePopState = (event: PopStateEvent) => {\n if (historyState.isHistoryAltered) {\n setTimeout(() => {\n historyState.isHistoryAltered = false;\n }, 0);\n return;\n }\n const { index: i } = event.state;\n const index = i || 0;\n try {\n const currIndex = hashes ? indexHashRef.current[indexHashRef.current.length - 1].index : indexRef.current;\n\n const prev = historyState.currentIndexes[historyState.currentIndexes.indexOf(currIndex) - 1];\n\n if (historyState.isDisabled) return;\n\n if ((!isClosed.current && (index === 0 || index === prev)) || (hashes && (index === 0 || index === prev))) {\n if (hashes) {\n isHashChangedFromEvent.current = true;\n indexHashRef.current.pop();\n }\n\n historyState.currentIndexes.splice(historyState.currentIndexes.indexOf(currIndex), 1);\n\n if (onBack) {\n if (historyState.isEdge) {\n getDispatch()\n .disableHistoryAnimations();\n }\n onBack(!historyState.isEdge);\n isClosed.current = true;\n }\n } else if (index === currIndex && isClosed.current && onForward && !hashes) {\n isForward.current = true;\n if (historyState.isEdge) {\n getDispatch()\n .disableHistoryAnimations();\n }\n onForward(event.state.state);\n }\n } catch (e) {\n // Forward navigation for hashed is not supported\n }\n };\n\n const hasChanged = hashes\n ? (!prevHashes || !areSortedArraysEqual(prevHashes, hashes))\n : prevIsActive !== isActive;\n\n if (!historyState.isDisabled && hasChanged) {\n handleChange();\n }\n\n window.addEventListener('popstate', handlePopState);\n return () => window.removeEventListener('popstate', handlePopState);\n }, [\n currentState, handleChange, hashes, isActive, onBack, onForward, prevHashes, prevIsActive, shouldReplaceNext,\n ]);\n\n return {\n forceClose: () => handleChange(true),\n };\n}\n","import { RefObject } from 'react';\nimport { useState, useCallback, useEffect } from '../lib/teact/teact';\n\nexport default (\n elementRef: RefObject,\n isOpen: boolean,\n onSelectWithEnter?: (index: number) => void,\n itemSelector?: string,\n noCaptureFocus?: boolean,\n) => {\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n useEffect(() => {\n setFocusedIndex(-1);\n\n const element = elementRef.current;\n if (isOpen && element && !noCaptureFocus) {\n element.tabIndex = -1;\n element.focus();\n }\n }, [elementRef, isOpen, noCaptureFocus]);\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(focusedIndex);\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(itemSelector ? element.querySelectorAll(itemSelector) : 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 }, [elementRef, onSelectWithEnter, itemSelector, focusedIndex]);\n\n return handleKeyDown;\n};\n","import * 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 { 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 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 { 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 { 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 [hasOpenClassName, setHasOpenClassName] = useState(isOpen && noOpenTransition);\n\n if (isOpen) {\n setIsClosed(false);\n setHasOpenClassName(true);\n\n if (closeTimeoutRef.current) {\n window.clearTimeout(closeTimeoutRef.current);\n closeTimeoutRef.current = undefined;\n }\n } else {\n setHasOpenClassName(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 // `noCloseTransition`, when set to true, should remove the open class immediately\n const shouldHaveOpenClassName = hasOpenClassName && !(noCloseTransition && !isOpen);\n const isClosing = Boolean(closeTimeoutRef.current);\n const shouldRender = isOpen || isClosing;\n const transitionClassNames = buildClassName(\n className && 'opacity-transition',\n className,\n shouldHaveOpenClassName && 'open',\n shouldRender && 'shown',\n isClosing && 'closing',\n );\n\n return {\n shouldRender,\n transitionClassNames,\n };\n};\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","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, asCapture = false) {\n const eventName = resolveEventName(propName, element);\n if (canUseEventDelegation(eventName, element, asCapture)) {\n addDelegatedListener(eventName, element, handler);\n } else {\n element.addEventListener(eventName, handler, asCapture);\n }\n}\n\nexport function removeEventListener(element: HTMLElement, propName: string, handler: Handler, asCapture = false) {\n const eventName = resolveEventName(propName, element);\n if (canUseEventDelegation(eventName, element, asCapture)) {\n removeDelegatedListener(eventName, element);\n } else {\n element.removeEventListener(eventName, handler, asCapture);\n }\n}\n\nfunction resolveEventName(propName: string, element: HTMLElement) {\n const eventName = propName\n .replace(/^on/, '')\n .replace(/Capture$/, '').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, asCapture: boolean) {\n return (\n !asCapture\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 {\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 HTML_ATTRIBUTES = new Set(['dir']);\nconst MAPPED_ATTRIBUTES: { [k: string]: string } = {\n autoPlay: 'autoplay',\n autoComplete: 'autocomplete',\n};\nconst INDEX_KEY_PREFIX = '__indexKey#';\n\nconst headsByElement: Record = {};\n// eslint-disable-next-line @typescript-eslint/naming-convention\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 if (props[key] !== undefined) {\n setAttribute(element, key, props[key]);\n }\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 const currentValue = $current.props[key];\n const newValue = $new.props[key];\n\n if (\n currentValue !== undefined\n && (\n newValue === undefined\n || (currentValue !== newValue && key.startsWith('on'))\n )\n ) {\n removeAttribute(element, key, currentValue);\n }\n });\n\n newKeys.forEach((key) => {\n const currentValue = $current.props[key];\n const newValue = $new.props[key];\n\n if (newValue !== undefined && newValue !== currentValue) {\n setAttribute(element, key, newValue);\n }\n });\n}\n\nfunction setAttribute(element: HTMLElement, key: string, value: any) {\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 === 'dangerouslySetInnerHTML') {\n // eslint-disable-next-line no-underscore-dangle\n element.innerHTML = value.__html;\n } else if (key.startsWith('on')) {\n addEventListener(element, key, value, key.endsWith('Capture'));\n } else if (key.startsWith('data-') || HTML_ATTRIBUTES.has(key)) {\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 === 'dangerouslySetInnerHTML') {\n element.innerHTML = '';\n } else if (key.startsWith('on')) {\n removeEventListener(element, key, value, key.endsWith('Capture'));\n } else if (key.startsWith('data-') || HTML_ATTRIBUTES.has(key)) {\n element.removeAttribute(key);\n } else if (!FILTERED_ATTRIBUTES.has(key)) {\n delete (element as any)[MAPPED_ATTRIBUTES[key] || key];\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\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","import { DEBUG, DEBUG_MORE } from '../../config';\nimport {\n fastRaf, fastRafPrimary, onTickEnd, onTickEndPrimary, throttleWithPrimaryRaf, throttleWithRaf,\n} from '../../util/schedulers';\nimport { flatten, orderBy } from '../../util/iteratees';\nimport arePropsShallowEqual, { getUnequalProps } 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// eslint-disable-next-line @typescript-eslint/naming-convention\nexport type FC_withDebug = FC & {\n DEBUG_contentComponentName?: string;\n};\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 prepareForFrame?: () => void;\n forceUpdate?: () => void;\n onUpdate?: () => void;\n}\n\nexport type VirtualElement =\n VirtualElementEmpty\n | VirtualElementText\n | VirtualElementTag\n | VirtualElementComponent;\nexport type VirtualRealElement =\n VirtualElementTag\n | 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\n// eslint-disable-next-line @typescript-eslint/naming-convention\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 // eslint-disable-next-line @typescript-eslint/naming-convention\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 need to remove all references to DOM objects. We also clean all other references, just in case.\nfunction helpGc(componentInstance: ComponentInstance) {\n /* eslint-disable no-null/no-null */\n\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.renderedValue = 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 /* eslint-enable no-null/no-null */\n}\n\nfunction prepareComponentForFrame(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 componentInstance.prepareForFrame = throttleWithPrimaryRaf(() => prepareComponentForFrame(componentInstance));\n componentInstance.forceUpdate = throttleWithRaf(() => forceUpdateComponent(componentInstance));\n}\n\nfunction forceUpdateComponent(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted || !componentInstance.onUpdate) {\n return;\n }\n\n const currentElement = componentInstance.$element;\n\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.prepareForFrame || !componentInstance.forceUpdate) {\n componentInstance.prepareForFrame = throttleWithPrimaryRaf(\n () => prepareComponentForFrame(componentInstance),\n );\n componentInstance.forceUpdate = throttleWithRaf(\n () => forceUpdateComponent(componentInstance),\n );\n }\n\n componentInstance.prepareForFrame();\n componentInstance.forceUpdate();\n\n if (DEBUG_MORE) {\n if (componentInstance.name !== 'TeactNContainer') {\n // eslint-disable-next-line no-console\n console.log(\n '[Teact.useState]',\n componentInstance.name,\n // `componentInstance.Component` may be set to `null` by GC helper\n componentInstance.Component && (componentInstance.Component as FC_withDebug).DEBUG_contentComponentName\n ? `> ${(componentInstance.Component as FC_withDebug).DEBUG_contentComponentName}`\n : '',\n `Forced update at cursor #${cursor}, next value: `,\n byCursor[cursor].nextValue,\n );\n }\n }\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 primarySchedulerFn: typeof onTickEnd | typeof requestAnimationFrame,\n effect: () => Function | void,\n dependencies?: any[],\n debugKey?: string,\n) {\n const { cursor, byCursor } = renderingInstance.hooks.effects;\n const componentInstance = renderingInstance;\n\n function execCleanup() {\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\n function exec() {\n if (!componentInstance.isMounted) {\n return;\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 if (debugKey) {\n const causedBy = dependencies.reduce((res, newValue, i) => {\n const prevValue = byCursor[cursor].dependencies![i];\n if (newValue !== prevValue) {\n res.push(`${i}: ${prevValue} => ${newValue}`);\n }\n\n return res;\n }, []);\n\n // eslint-disable-next-line no-console\n console.log(\n '[Teact]',\n debugKey,\n 'Effect caused by dependencies.',\n causedBy.join(', '),\n );\n }\n\n primarySchedulerFn(execCleanup);\n schedulerFn(exec);\n }\n } else {\n primarySchedulerFn(execCleanup);\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[], debugKey?: string) {\n return useLayoutEffectBase(fastRaf, fastRafPrimary, effect, dependencies, debugKey);\n}\n\nexport function useLayoutEffect(effect: () => Function | void, dependencies?: any[], debugKey?: string) {\n return useLayoutEffectBase(onTickEnd, onTickEndPrimary, effect, dependencies, debugKey);\n}\n\nexport function useMemo(resolver: () => T, dependencies: any[], debugKey?: string): 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 if (DEBUG && debugKey) {\n // eslint-disable-next-line no-console\n console.log(\n `[Teact.useMemo] ${renderingInstance.name} (${debugKey}): Update is caused by:`,\n byCursor[cursor]\n ? getUnequalProps(dependencies, byCursor[cursor].dependencies).join(', ')\n : '[first render]',\n );\n }\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, debugKey?: string) {\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 if (DEBUG && debugKey) {\n // eslint-disable-next-line no-console\n console.log(\n `[Teact.memo] ${Component.name} (${debugKey}): Update is caused by:`,\n getUnequalProps(propsRef.current!, props).join(', '),\n );\n }\n\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","import React, {\n FC, FC_withDebug, 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, { getUnequalProps } 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\n// `noThrottle = true` is used as a workaround for iOS gesture history navigation\nexport function setGlobal(newGlobal?: GlobalState, noThrottle = false) {\n if (typeof newGlobal === 'object' && newGlobal !== currentGlobal) {\n currentGlobal = newGlobal;\n if (!noThrottle) {\n runCallbacksThrottled();\n } else {\n runCallbacks();\n }\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, noThrottle?: boolean) {\n if (reducers[name]) {\n reducers[name].forEach((reducer) => {\n const newGlobal = reducer(currentGlobal, actions, payload);\n if (newGlobal) {\n setGlobal(newGlobal, noThrottle);\n }\n });\n }\n}\n\nfunction updateContainers() {\n // eslint-disable-next-line @typescript-eslint/naming-convention\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, noThrottle = false) => {\n onDispatch(name, payload, noThrottle);\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 (TeactNContainer as FC_withDebug).DEBUG_contentComponentName = Component.name;\n\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\nif (DEBUG) {\n (window as any).getGlobal = getGlobal;\n\n document.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log(\n 'GLOBAL CONTAINERS',\n orderBy(\n Array.from(containers.values())\n .map(({ DEBUG_componentName, DEBUG_updates }) => ({ DEBUG_componentName, DEBUG_updates })),\n 'DEBUG_updates',\n 'desc',\n ),\n );\n });\n}\n","// Copyright Twitter Inc. Licensed under MIT\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\n// Version 2c193ce 28.05.2021\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 /(?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\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\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\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\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\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\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\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\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\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\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc8f\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc91\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d\\udc8f\\udc91])|(?:\\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\\uddd4\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f|(?:\\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\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\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\\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|\\ud83d\\ude36\\u200d\\ud83c\\udf2b\\ufe0f|\\u2764\\ufe0f\\u200d\\ud83d\\udd25|\\u2764\\ufe0f\\u200d\\ud83e\\ude79|\\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|\\ud83d\\ude2e\\u200d\\ud83d\\udca8|\\ud83d\\ude35\\u200d\\ud83d\\udcab|\\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-\\udc8e\\udc90\\udc92-\\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 {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { initApi, callApi } from '../../../api/gramjs';\nimport { GlobalState } from '../../../global/types';\n\nimport {\n LANG_CACHE_NAME,\n CUSTOM_BG_CACHE_NAME,\n MEDIA_CACHE_NAME,\n MEDIA_CACHE_NAME_AVATARS,\n MEDIA_PROGRESSIVE_CACHE_NAME,\n IS_TEST,\n} from '../../../config';\nimport { IS_MOV_SUPPORTED, PLATFORM_ENV } from '../../../util/environment';\nimport { unsubscribe } from '../../../util/notifications';\nimport * as cacheApi from '../../../util/cacheApi';\nimport { updateAppBadge } from '../../../util/appBadge';\nimport {\n storeSession,\n loadStoredSession,\n clearStoredSession,\n importLegacySession,\n clearLegacySessions,\n} from '../../../util/sessions';\nimport { forceWebsync } from '../../../util/websync';\n\naddReducer('initApi', (global: GlobalState, actions) => {\n (async () => {\n if (!IS_TEST) {\n await importLegacySession();\n void clearLegacySessions();\n }\n\n void initApi(actions.apiUpdate, {\n userAgent: navigator.userAgent,\n platform: PLATFORM_ENV,\n sessionData: loadStoredSession(),\n isTest: window.location.search.includes('test'),\n isMovSupported: IS_MOV_SUPPORTED,\n });\n })();\n});\n\naddReducer('setAuthPhoneNumber', (global, actions, payload) => {\n const { phoneNumber } = payload!;\n\n void callApi('provideAuthPhoneNumber', phoneNumber.replace(/[^\\d]/g, ''));\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('goToAuthQrCode', (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 { sessionData } = payload;\n\n if (sessionData) {\n storeSession(payload.sessionData, global.currentUserId);\n } else {\n clearStoredSession();\n }\n});\n\naddReducer('signOut', () => {\n (async () => {\n try {\n await unsubscribe();\n await callApi('destroy');\n await forceWebsync(false);\n } catch (err) {\n // Do nothing\n }\n\n getDispatch().reset();\n })();\n});\n\naddReducer('reset', () => {\n clearStoredSession();\n\n void cacheApi.clear(MEDIA_CACHE_NAME);\n void cacheApi.clear(MEDIA_CACHE_NAME_AVATARS);\n void cacheApi.clear(MEDIA_PROGRESSIVE_CACHE_NAME);\n void cacheApi.clear(CUSTOM_BG_CACHE_NAME);\n\n const langCachePrefix = LANG_CACHE_NAME.replace(/\\d+$/, '');\n const langCacheVersion = (LANG_CACHE_NAME.match(/\\d+$/) || [0])[0];\n for (let i = 0; i < langCacheVersion; i++) {\n void cacheApi.clear(`${langCachePrefix}${i === 0 ? '' : i}`);\n }\n\n void clearLegacySessions();\n\n updateAppBadge(0);\n\n getDispatch().init();\n});\n\naddReducer('disconnect', () => {\n (async () => {\n await callApi('disconnect');\n })();\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\naddReducer('setDeviceToken', (global, actions, deviceToken) => {\n setGlobal({\n ...global,\n push: {\n deviceToken,\n subscribedAt: Date.now(),\n },\n });\n});\n\naddReducer('deleteDeviceToken', (global) => {\n const newGlobal = { ...global };\n delete newGlobal.push;\n setGlobal(newGlobal);\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\nimport {\n ApiPrivacyKey, PrivacyVisibility, ProfileEditProgress, InputPrivacyRules, InputPrivacyContact,\n UPLOADING_WALLPAPER_SLUG,\n} from '../../../types';\n\nimport { COUNTRIES_WITH_12H_TIME_FORMAT } from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { subscribe, unsubscribe } from '../../../util/notifications';\nimport { setTimeFormat } from '../../../util/langProvider';\nimport { selectUser } from '../../selectors';\nimport {\n addUsers, addBlockedContact, updateChats, updateUser, removeBlockedContact, replaceSettings, updateNotifySettings,\n addNotifyExceptions,\n} from '../../reducers';\nimport { isUserId } 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');\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?.length) {\n newGlobal = addUsers(newGlobal, buildCollectionByKey(result.users, 'id'));\n }\n if (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, accessHash } = payload!;\n\n (async () => {\n const result = await callApi('blockContact', contactId, accessHash);\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 = isUserId(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('loadNotificationExceptions', (global) => {\n const { serverTimeOffset } = global;\n\n (async () => {\n const result = await callApi('fetchNotificationExceptions', { serverTimeOffset });\n if (!result) {\n return;\n }\n\n setGlobal(addNotifyExceptions(getGlobal(), result));\n })();\n});\n\naddReducer('loadNotificationSettings', (global) => {\n const { serverTimeOffset } = global;\n (async () => {\n const result = await callApi('fetchNotificationSettings', {\n serverTimeOffset,\n });\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), result));\n })();\n});\n\naddReducer('updateNotificationSettings', (global, actions, payload) => {\n const { peerType, isSilent, shouldShowPreviews } = payload!;\n\n (async () => {\n const result = await callApi('updateNotificationSettings', peerType, { isSilent, shouldShowPreviews });\n\n if (!result) {\n return;\n }\n\n setGlobal(updateNotifySettings(getGlobal(), peerType, isSilent, shouldShowPreviews));\n })();\n});\n\naddReducer('updateWebNotificationSettings', (global, actions, payload) => {\n (async () => {\n setGlobal(replaceSettings(getGlobal(), payload));\n const newGlobal = getGlobal();\n const { hasPushNotifications, hasWebNotifications } = newGlobal.settings.byKey;\n if (hasWebNotifications && hasPushNotifications) {\n await subscribe();\n } else {\n await unsubscribe();\n }\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: string[];\n deniedIds: string[];\n}): InputPrivacyRules {\n const {\n users: { byId: usersById },\n chats: { byId: chatsById },\n } = global;\n\n const rules: InputPrivacyRules = {\n visibility,\n };\n let users: InputPrivacyContact[];\n let chats: InputPrivacyContact[];\n\n const collectUsers = (userId: string) => {\n if (!isUserId(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: string) => {\n if (isUserId(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 InputPrivacyContact[];\n chats = allowedIds.map(collectChats).filter(Boolean) as InputPrivacyContact[];\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 InputPrivacyContact[];\n chats = deniedIds.map(collectChats).filter(Boolean) as InputPrivacyContact[];\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\naddReducer('updateIsOnline', (global, actions, payload) => {\n callApi('updateIsOnline', payload);\n});\n\naddReducer('loadContentSettings', () => {\n (async () => {\n const result = await callApi('fetchContentSettings');\n if (!result) return;\n\n setGlobal(replaceSettings(getGlobal(), result));\n })();\n});\n\naddReducer('updateContentSettings', (global, actions, payload) => {\n (async () => {\n setGlobal(replaceSettings(getGlobal(), { isSensitiveEnabled: payload }));\n\n const result = await callApi('updateContentSettings', payload);\n if (!result) {\n setGlobal(replaceSettings(getGlobal(), { isSensitiveEnabled: !payload }));\n }\n })();\n});\n\naddReducer('loadCountryList', (global, actions, payload = {}) => {\n let { langCode } = payload;\n if (!langCode) langCode = global.settings.byKey.language;\n\n (async () => {\n const countryList = await callApi('fetchCountryList', { langCode });\n if (!countryList) return;\n\n setGlobal({\n ...getGlobal(),\n countryList,\n });\n })();\n});\n\naddReducer('ensureTimeFormat', (global, actions) => {\n if (global.authNearestCountry) {\n const timeFormat = COUNTRIES_WITH_12H_TIME_FORMAT.has(global.authNearestCountry.toUpperCase()) ? '12h' : '24h';\n actions.setSettingOption({ timeFormat });\n setTimeFormat(timeFormat);\n }\n\n (async () => {\n if (getGlobal().settings.byKey.wasTimeFormatSetManually) {\n return;\n }\n\n const nearestCountryCode = await callApi('fetchNearestCountry');\n if (nearestCountryCode) {\n const timeFormat = COUNTRIES_WITH_12H_TIME_FORMAT.has(nearestCountryCode.toUpperCase()) ? '12h' : '24h';\n actions.setSettingOption({ timeFormat });\n setTimeFormat(timeFormat);\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 ApiUpdateSession,\n ApiUpdateCurrentUser, ApiUpdateServerTimeOffset,\n} from '../../../api/types';\nimport { DEBUG, SESSION_USER_KEY } from '../../../config';\nimport { subscribe } from '../../../util/notifications';\nimport { updateUser } from '../../reducers';\nimport { setLanguage } from '../../../util/langProvider';\nimport { selectNotifySettings } from '../../selectors';\nimport { forceWebsync } from '../../../util/websync';\nimport { getShippingError } from '../../../util/getReadableErrorText';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n if (DEBUG) {\n if (update['@type'] !== 'updateUserStatus' && update['@type'] !== 'updateServerTimeOffset') {\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 'updateSession':\n onUpdateSession(update);\n break;\n\n case 'updateServerTimeOffset':\n onUpdateServerTimeOffset(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 const paymentShippingError = getShippingError(update.error);\n if (paymentShippingError) {\n actions.addPaymentError({ error: paymentShippingError });\n } else if (actions.showDialog) {\n actions.showDialog({ data: { ...update.error, hasErrorKey: true } });\n }\n\n break;\n }\n }\n});\n\nfunction onUpdateApiReady(global: GlobalState) {\n const { hasWebNotifications, hasPushNotifications } = selectNotifySettings(global);\n if (hasWebNotifications && hasPushNotifications) {\n void subscribe();\n }\n void 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 void forceWebsync(false);\n\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 void forceWebsync(true);\n\n setGlobal({\n ...global,\n isLoggingOut: false,\n lastSyncTime: Date.now(),\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 onUpdateSession(update: ApiUpdateSession) {\n const { sessionData } = update;\n const { authRememberMe, authState } = getGlobal();\n const isEmpty = !sessionData || !sessionData.mainDcId;\n\n if (!authRememberMe || authState !== 'authorizationStateReady' || isEmpty) {\n return;\n }\n\n getDispatch().saveSession({ sessionData });\n}\n\nfunction onUpdateServerTimeOffset(update: ApiUpdateServerTimeOffset) {\n const global = getGlobal();\n\n if (global.serverTimeOffset === update.serverTimeOffset) {\n return;\n }\n\n setGlobal({\n ...global,\n serverTimeOffset: update.serverTimeOffset,\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 updateSessionUserId(currentUser.id);\n}\n\nfunction updateSessionUserId(currentUserId: string) {\n const sessionUserAuth = localStorage.getItem(SESSION_USER_KEY);\n if (!sessionUserAuth) return;\n\n const userAuth = JSON.parse(sessionUserAuth);\n userAuth.id = currentUserId;\n\n localStorage.setItem(SESSION_USER_KEY, JSON.stringify(userAuth));\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ANIMATION_LEVEL_MAX } from '../../../config';\nimport {\n IS_ANDROID, IS_IOS, IS_MAC_OS, IS_TOUCH_ENV,\n} from '../../../util/environment';\nimport { setLanguage } from '../../../util/langProvider';\nimport switchTheme from '../../../util/switchTheme';\nimport { selectTheme } from '../../selectors';\nimport { startWebsync } from '../../../util/websync';\n\nconst HISTORY_ANIMATION_DURATION = 450;\n\nsubscribeToSystemThemeChange();\n\naddReducer('init', (global) => {\n const { animationLevel, messageTextSize, language } = global.settings.byKey;\n const theme = selectTheme(global);\n\n void setLanguage(language, undefined, true);\n\n document.documentElement.style.setProperty(\n '--composer-text-size', `${Math.max(messageTextSize, IS_IOS ? 16 : 15)}px`,\n );\n document.documentElement.style.setProperty('--message-meta-height', `${Math.floor(messageTextSize * 1.3125)}px`);\n document.documentElement.style.setProperty('--message-text-size', `${messageTextSize}px`);\n document.documentElement.setAttribute('data-message-text-size', messageTextSize.toString());\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 === ANIMATION_LEVEL_MAX);\n startWebsync();\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 } else if (IS_MAC_OS) {\n document.body.classList.add('is-macos');\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\naddReducer('disableHistoryAnimations', () => {\n setTimeout(() => {\n setGlobal({\n ...getGlobal(),\n shouldSkipHistoryAnimations: false,\n });\n document.body.classList.remove('no-animate');\n }, HISTORY_ANIMATION_DURATION);\n\n setGlobal({\n ...getGlobal(),\n shouldSkipHistoryAnimations: true,\n }, true);\n});\n\nfunction subscribeToSystemThemeChange() {\n function handleSystemThemeChange() {\n const currentThemeMatch = document.documentElement.className.match(/theme-(\\w+)/);\n const currentTheme = currentThemeMatch ? currentThemeMatch[1] : 'light';\n const global = getGlobal();\n const nextTheme = selectTheme(global);\n const { animationLevel } = global.settings.byKey;\n\n if (nextTheme !== currentTheme) {\n switchTheme(nextTheme, animationLevel === ANIMATION_LEVEL_MAX);\n // Force-update component containers\n setGlobal({ ...global });\n }\n }\n\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\n if (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', handleSystemThemeChange);\n } else if (typeof mql.addListener === 'function') {\n mql.addListener(handleSystemThemeChange);\n }\n}\n","import { addReducer } from '../../../lib/teact/teactn';\nimport { ISettings, IThemeSettings, ThemeKey } from '../../../types';\nimport { replaceSettings, replaceThemeSettings } from '../../reducers';\n\naddReducer('setSettingOption', (global, actions, payload?: Partial) => {\n return replaceSettings(global, payload);\n});\n\naddReducer('setThemeSettings', (global, actions, payload: { theme: ThemeKey } & Partial) => {\n const { theme, ...settings } = payload;\n\n return replaceThemeSettings(global, theme, settings);\n});\n","import {\n ApiChat,\n ApiUser,\n ApiChatBannedRights,\n ApiChatAdminRights,\n ApiChatFolder,\n MAIN_THREAD_ID,\n} from '../../api/types';\n\nimport { NotifyException, NotifySettings } from '../../types';\nimport { LangFn } from '../../hooks/useLang';\n\nimport { ARCHIVED_FOLDER_ID, REPLIES_USER_ID } from '../../config';\nimport { orderBy } from '../../util/iteratees';\nimport { getUserFirstOrLastName } from './users';\nimport { formatDateToString, formatTime } from '../../util/dateFormat';\n\nconst FOREVER_BANNED_DATE = Date.now() / 1000 + 31622400; // 366 days\n\nconst VERIFIED_PRIORITY_BASE = 3e9;\nconst PINNED_PRIORITY_BASE = 3e8;\n\nexport function isUserId(entityId: string) {\n // Workaround for old-fashioned IDs stored locally\n if (typeof entityId === 'number') {\n return entityId > 0;\n }\n\n return !entityId.startsWith('-');\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 isChatWithRepliesBot(chatId: string) {\n return chatId === REPLIES_USER_ID;\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\n// TODO Get rid of `user`\nexport function getChatTitle(lang: LangFn, chat: ApiChat, user?: ApiUser, isSelf = false) {\n if (isSelf || (user && chat.id === user.id && user.isSelf)) {\n return lang('SavedMessages');\n }\n return chat.title || lang('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 if (username) {\n return `https://t.me/${username}`;\n }\n\n const { inviteLink } = chat.fullInfo || {};\n\n return inviteLink;\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?.[key])\n || (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 || isChatWithRepliesBot(chat.id)) {\n return false;\n }\n\n if (chat.isCreator) {\n return true;\n }\n\n if (isUserId(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')) && (!isUserId(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(\n lang: LangFn,\n currentUserBannedRights?: ApiChatBannedRights,\n defaultBannedRights?: ApiChatBannedRights,\n) {\n if (currentUserBannedRights?.sendMessages) {\n const { untilDate } = currentUserBannedRights;\n return untilDate && untilDate < FOREVER_BANNED_DATE\n ? lang(\n 'Channel.Persmission.Denied.SendMessages.Until',\n lang(\n 'formatDateAtTime',\n [formatDateToString(new Date(untilDate * 1000), lang.code), formatTime(untilDate * 1000, lang)],\n ),\n )\n : lang('Channel.Persmission.Denied.SendMessages.Forever');\n }\n\n if (defaultBannedRights?.sendMessages) {\n return lang('Channel.Persmission.Denied.SendMessages.DefaultRestrictedText');\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.draftDate || 0, chat.lastMessage?.date || 0);\n}\n\nexport function isChatArchived(chat: ApiChat) {\n return chat.folderId === ARCHIVED_FOLDER_ID;\n}\n\nexport function selectIsChatMuted(\n chat: ApiChat, notifySettings: NotifySettings, notifyExceptions: Record = {},\n) {\n // If this chat is in exceptions they take precedence\n if (notifyExceptions[chat.id] && notifyExceptions[chat.id].isMuted !== undefined) {\n return notifyExceptions[chat.id].isMuted;\n }\n\n return (\n chat.isMuted\n || (isUserId(chat.id) && !notifySettings.hasPrivateChatsNotifications)\n || (isChatChannel(chat) && !notifySettings.hasBroadcastNotifications)\n || (isChatGroup(chat) && !notifySettings.hasGroupNotifications)\n );\n}\n\nexport function selectShouldShowMessagePreview(\n chat: ApiChat, notifySettings: NotifySettings, notifyExceptions: Record = {},\n) {\n const {\n hasPrivateChatsMessagePreview = true,\n hasBroadcastMessagePreview = true,\n hasGroupMessagePreview = true,\n } = notifySettings;\n // If this chat is in exceptions they take precedence\n if (notifyExceptions[chat.id] && notifyExceptions[chat.id].shouldShowPreviews !== undefined) {\n return notifyExceptions[chat.id].shouldShowPreviews;\n }\n\n return (isUserId(chat.id) && hasPrivateChatsMessagePreview)\n || (isChatChannel(chat) && hasBroadcastMessagePreview)\n || (isChatGroup(chat) && hasGroupMessagePreview);\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 notifySettings: NotifySettings,\n notifyExceptions?: Record,\n chatIdsCache?: string[],\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))\n .filter((id) => {\n return filterChatFolder(\n chatsById[id],\n folder,\n usersById,\n notifySettings,\n notifyExceptions,\n excludedChatIds,\n includedChatIds,\n 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 notifySettings: NotifySettings,\n notifyExceptions?: Record,\n excludedChatIds?: Set,\n includedChatIds?: Set,\n pinnedChatIds?: Set,\n) {\n if (!chat.isListed) {\n return false;\n }\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 (folder.excludeMuted && !chat.unreadMentionsCount && selectIsChatMuted(chat, notifySettings, notifyExceptions)) {\n return false;\n }\n\n if (!chat.unreadCount && !chat.unreadMentionsCount && !chat.hasUnreadMark && folder.excludeRead) {\n return false;\n }\n\n if (isUserId(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: string[],\n orderedPinnedIds?: string[],\n folderType: 'all' | 'archived' | 'folder' = 'all',\n) {\n const listIdsSet = new Set(listIds);\n const orderedPinnedIdsSet = orderedPinnedIds ? new Set(orderedPinnedIds) : undefined;\n\n const pinnedChats = orderedPinnedIds?.reduce((acc, id) => {\n const chat = chatsById[id];\n\n if (chat && listIdsSet.has(chat.id) && chatFilter(chat, folderType)) {\n acc.push(chat);\n }\n\n return acc;\n }, [] as ApiChat[]) || [];\n\n const otherChats = listIds.reduce((acc, id) => {\n const chat = chatsById[id];\n\n if (chat && (!orderedPinnedIdsSet || !orderedPinnedIdsSet.has(chat.id)) && chatFilter(chat, folderType)) {\n acc.push(chat);\n }\n\n return acc;\n }, [] as ApiChat[]);\n const otherChatsOrdered = orderBy(otherChats, getChatOrder, 'desc');\n\n return {\n pinnedChats,\n otherChats: otherChatsOrdered,\n };\n}\n\nfunction chatFilter(chat: ApiChat, folderType: 'all' | 'archived' | 'folder') {\n if (!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\nexport function reduceChatList(\n chatArrays: { pinnedChats: ApiChat[]; otherChats: ApiChat[] },\n filteredIds: string[],\n) {\n const filteredIdsSet = new Set(filteredIds);\n\n return {\n pinnedChats: chatArrays.pinnedChats.filter(({ id }) => filteredIdsSet.has(id)),\n otherChats: chatArrays.otherChats.filter(({ id }) => filteredIdsSet.has(id)),\n };\n}\n\nexport function getFolderUnreadDialogs(\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n chatIdsCache: string[],\n notifySettings: NotifySettings,\n notifyExceptions?: Record,\n) {\n const [listIds] = prepareFolderListIds(chatsById, usersById, folder, notifySettings, notifyExceptions, chatIdsCache);\n\n const listedChats = listIds\n .map((id) => chatsById[id])\n .filter((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 || (!selectIsChatMuted(chat, notifySettings, notifyExceptions) && (chat.unreadCount || chat.hasUnreadMark))\n ));\n\n return {\n unreadDialogsCount,\n hasActiveDialogs,\n };\n}\n\nexport function getFolderDescriptionText(\n lang: LangFn,\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n chatIdsCache: string[],\n notifySettings: NotifySettings,\n notifyExceptions?: Record,\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?.length)\n || (includedChatIds?.length)\n ) {\n const length = getFolderChatsCount(chatsById, usersById, folder, chatIdsCache, notifySettings, notifyExceptions);\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: string[],\n notifySettings: NotifySettings,\n notifyExceptions?: Record,\n) {\n const [listIds, pinnedIds] = prepareFolderListIds(\n chatsById, usersById, folder, notifySettings, notifyExceptions, chatIdsCache,\n );\n const { pinnedChats, otherChats } = prepareChatList(chatsById, listIds, pinnedIds, 'folder');\n return pinnedChats.length + otherChats.length;\n}\n\nexport function getMessageSenderName(lang: LangFn, chatId: string, sender?: ApiUser) {\n if (!sender || isUserId(chatId)) {\n return undefined;\n }\n\n if (sender.isSelf) {\n return lang('FromYou');\n }\n\n return getUserFirstOrLastName(sender);\n}\n\nexport function sortChatIds(\n chatIds: string[],\n chatsById: Record,\n shouldPrioritizeVerified = false,\n priorityIds?: string[],\n) {\n return orderBy(chatIds, (id) => {\n const chat = chatsById[id];\n if (!chat) {\n return 0;\n }\n\n let priority = 0;\n\n if (chat.lastMessage) {\n priority += chat.lastMessage.date;\n }\n\n if (shouldPrioritizeVerified && chat.isVerified) {\n priority += VERIFIED_PRIORITY_BASE; // ~100 years in seconds\n }\n\n if (priorityIds && priorityIds.includes(id)) {\n priority = Date.now() + PINNED_PRIORITY_BASE + (priorityIds.length - priorityIds.indexOf(id));\n }\n\n return priority;\n }, 'desc');\n}\n","import {\n ApiChat, ApiMessage, ApiMessageEntityTypes, ApiUser,\n} from '../../api/types';\nimport { LangFn } from '../../hooks/useLang';\n\nimport { LOCAL_MESSAGE_ID_BASE, SERVICE_NOTIFICATIONS_USER_ID, RE_LINK_TEMPLATE } from '../../config';\nimport { getUserFullName } from './users';\nimport { isWebpSupported, IS_OPUS_SUPPORTED } from '../../util/environment';\nimport { getChatTitle, isUserId } from './chats';\nimport parseEmojiOnlyString from '../../components/common/helpers/parseEmojiOnlyString';\n\nconst CONTENT_NOT_SUPPORTED = 'The message is not supported on this version of Telegram';\nconst RE_LINK = new RegExp(RE_LINK_TEMPLATE, 'i');\nconst TRUNCATED_SUMMARY_LENGTH = 80;\n\nexport type MessageKey = `msg${string}-${number}`;\n\nexport function getMessageKey(message: ApiMessage): MessageKey {\n const { chatId, id } = message;\n\n return buildMessageKey(chatId, id);\n}\n\nexport function buildMessageKey(chatId: string, msgId: number): MessageKey {\n return `msg${chatId}-${msgId}`;\n}\n\nexport function parseMessageKey(key: MessageKey) {\n const match = key.match(/^msg(-?\\d+)-(\\d+)/)!;\n\n return { chatId: match[1], messageId: Number(match[2]) };\n}\n\nexport function getMessageOriginalId(message: ApiMessage) {\n return message.previousLocalId || message.id;\n}\n\nexport function getMessageSummaryText(lang: LangFn, message: ApiMessage, noEmoji = false) {\n const {\n text, photo, video, audio, voice, document, sticker, contact, poll, invoice,\n } = message.content;\n\n const truncatedText = text && text.text.substr(0, TRUNCATED_SUMMARY_LENGTH);\n\n if (message.groupedId) {\n return `${noEmoji ? '' : '🖼 '}${truncatedText || lang('lng_in_dlg_album')}`;\n }\n\n if (photo) {\n return `${noEmoji ? '' : '🖼 '}${truncatedText || lang('AttachPhoto')}`;\n }\n\n if (video) {\n return `${noEmoji ? '' : '📹 '}${truncatedText || lang(video.isGif ? 'AttachGif' : 'AttachVideo')}`;\n }\n\n if (sticker) {\n return `${sticker.emoji || ''} ${lang('AttachSticker')}`.trim();\n }\n\n if (audio) {\n return `${noEmoji ? '' : '🎧 '}${getMessageAudioCaption(message) || lang('AttachMusic')}`;\n }\n\n if (voice) {\n return `${noEmoji ? '' : '🎤 '}${truncatedText || lang('AttachAudio')}`;\n }\n\n if (document) {\n return `${noEmoji ? '' : '📎 '}${truncatedText || document.fileName}`;\n }\n\n if (contact) {\n return lang('AttachContact');\n }\n\n if (poll) {\n return `${noEmoji ? '' : '📊 '}${poll.summary.question}`;\n }\n\n if (invoice) {\n return 'Invoice';\n }\n\n if (text) {\n return truncatedText;\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?.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?.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 && Math.round(message.id) !== message.id;\n}\n\nexport function isAnonymousOwnMessage(message: ApiMessage) {\n return Boolean(message.senderId) && !isUserId(message.senderId!) && isOwnMessage(message);\n}\n\nexport function getSenderTitle(lang: LangFn, sender: ApiUser | ApiChat) {\n return isUserId(sender.id) ? getUserFullName(sender as ApiUser) : getChatTitle(lang, 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\nexport function getMessageAudioCaption(message: ApiMessage) {\n const { audio, text } = message.content;\n\n return (audio && [audio.title, audio.performer].filter(Boolean).join(' — ')) || (text?.text);\n}\n\nexport function getMessageContentFilename(message: ApiMessage) {\n const { content } = message;\n\n const video = content.webPage ? content.webPage.video : content.video;\n const photo = content.webPage ? content.webPage.photo : content.photo;\n const document = content.webPage ? content.webPage.document : content.document;\n if (document) {\n return document.fileName;\n }\n\n if (video) {\n return video.fileName;\n }\n\n if (content.sticker) {\n const extension = content.sticker.isAnimated ? 'tgs' : isWebpSupported() ? 'webp' : 'png';\n return `${content.sticker.id}.${extension}`;\n }\n\n if (content.audio) {\n return content.audio.fileName;\n }\n\n const baseFilename = getMessageKey(message);\n\n if (photo) {\n return `${baseFilename}.jpg`;\n }\n\n if (content.voice) {\n return IS_OPUS_SUPPORTED ? `${baseFilename}.ogg` : `${baseFilename}.wav`;\n }\n\n return baseFilename;\n}\n","import {\n ApiAudio, ApiMediaFormat, ApiMessage, ApiMessageSearchType, ApiPhoto, ApiVideo, ApiDimensions,\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\ntype Target =\n 'micro'\n | 'pictogram'\n | 'inline'\n | 'viewerPreview'\n | 'viewerFull'\n | 'download';\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?.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 isMessageDocumentPhoto(message: ApiMessage) {\n const document = getMessageDocument(message);\n return document ? document.mediaType === 'photo' : undefined;\n}\n\nexport function isMessageDocumentVideo(message: ApiMessage) {\n const document = getMessageDocument(message);\n return document ? document.mediaType === 'video' : undefined;\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 return getMessageWebPage(message)?.photo;\n}\n\nexport function getMessageWebPageDocument(message: ApiMessage) {\n return getMessageWebPage(message)?.document;\n}\n\nexport function getMessageWebPageVideo(message: ApiMessage): ApiVideo | undefined {\n return getMessageWebPage(message)?.video;\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 || getMessageWebPageVideo(message);\n\n if (!media) {\n return undefined;\n }\n\n return media.thumbnail;\n}\n\nexport function getMessageMediaThumbDataUri(message: ApiMessage) {\n return getMessageMediaThumbnail(message)?.dataUri;\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 const webPageVideo = getMessageWebPageVideo(message);\n\n const messageVideo = video || webPageVideo;\n const messagePhoto = photo || webPagePhoto;\n\n if (!(messagePhoto || messageVideo || sticker || audio || voice || document)) {\n return undefined;\n }\n\n const base = getMessageKey(message);\n\n if (messageVideo) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n return !hasMessageLocalBlobUrl(message) ? getVideoOrAudioBaseHash(messageVideo, base) : undefined;\n case 'viewerPreview':\n return `${base}?size=m`;\n case 'viewerFull':\n return getVideoOrAudioBaseHash(messageVideo, base);\n case 'download':\n return `${base}?download`;\n }\n }\n\n if (messagePhoto) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n return !hasMessageLocalBlobUrl(message) ? `${base}?size=x` : undefined;\n case 'viewerPreview':\n return `${base}?size=x`;\n case 'viewerFull':\n case 'download':\n return `${base}?size=z`;\n }\n }\n\n if (document) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n case 'inline':\n case 'viewerPreview':\n if (!getDocumentHasPreview(document) || hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n return `${base}?size=m`;\n case 'viewerFull':\n case 'download':\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 case 'inline':\n return base;\n case 'download':\n return `${base}?download`;\n }\n }\n\n if (audio) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return getAudioHasCover(audio) ? `${base}?size=m` : undefined;\n case 'inline':\n return getVideoOrAudioBaseHash(audio, base);\n case 'download':\n return `${base}?download`;\n }\n }\n\n if (voice) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return undefined;\n case 'inline':\n return base;\n case 'download':\n return `${base}?download`;\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 getAudioHasCover(media: ApiAudio) {\n return media.thumbnailSizes && media.thumbnailSizes.length > 0;\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 const fullVideo = video || getMessageWebPageVideo(message);\n\n if (sticker && target === 'inline' && sticker.isAnimated) {\n return ApiMediaFormat.Lottie;\n } else if (fullVideo && IS_PROGRESSIVE_SUPPORTED && (\n target === 'viewerFull' || target === 'inline'\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 getMessageFileName(message: ApiMessage) {\n const {\n photo, video, document,\n } = message.content;\n const webPagePhoto = getMessageWebPagePhoto(message);\n const webPageVideo = getMessageWebPageVideo(message);\n\n if (photo || webPagePhoto) {\n return `photo${message.date}.jpeg`;\n }\n\n const { fileName } = video || webPageVideo || document || {};\n\n return fileName;\n}\n\nexport function getMessageFileSize(message: ApiMessage) {\n const { video, document } = message.content;\n const webPageVideo = getMessageWebPageVideo(message);\n const { size } = video || webPageVideo || document || {};\n\n return size;\n}\n\nexport function hasMessageLocalBlobUrl(message: ApiMessage) {\n const { photo, video, document } = message.content;\n\n return (photo?.blobUrl) || (video?.blobUrl) || (document?.previewBlobUrl);\n}\n\nexport function getChatMediaMessageIds(\n messages: Record, listedIds: number[], isFromSharedMedia = false,\n) {\n const ids = getMessageContentIds(messages, listedIds, isFromSharedMedia ? 'media' : 'inlineMedia');\n\n return isFromSharedMedia ? ids.reverse() : ids;\n}\n\nexport function getPhotoFullDimensions(photo: ApiPhoto): ApiDimensions | 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): ApiDimensions | 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): ApiDimensions | undefined {\n if (video.width && video.height) {\n return video as ApiDimensions;\n }\n\n return undefined;\n}\n\nexport function getMediaTransferState(message: ApiMessage, progress?: number, isLoadNeeded = false) {\n const isUploading = isMessageLocal(message);\n const isTransferring = isUploading || isLoadNeeded;\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 | 'inlineMedia',\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 case 'voice':\n validator = (message: ApiMessage) => {\n const video = getMessageVideo(message);\n return getMessageVoice(message) || (video && video.isRound);\n };\n break;\n\n case 'inlineMedia':\n validator = (message: ApiMessage) => {\n const video = getMessageVideo(message);\n return (\n getMessagePhoto(message)\n || (video && !video.isRound && !video.isGif)\n || isMessageDocumentPhoto(message)\n || isMessageDocumentVideo(message)\n );\n };\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 || getMessageWebPageVideo(message);\n if (!media) {\n return undefined;\n }\n\n return media.duration;\n}\n","export function buildChatThreadKey(chatId: string, threadId: number) {\n return `${chatId}_${threadId}`;\n}\n","import { ApiFieldError } from '../../api/types';\n\nconst STRIPE_ERRORS: Record = {\n missing_payment_information: {\n field: 'cardNumber',\n message: 'Incorrect card number',\n },\n invalid_number: {\n field: 'cardNumber',\n message: 'Incorrect card number',\n },\n number: {\n field: 'cardNumber',\n message: 'Incorrect card number',\n },\n exp_year: {\n field: 'expiry',\n message: 'Incorrect year',\n },\n exp_month: {\n field: 'expiry',\n message: 'Incorrect month',\n },\n invalid_expiry_year: {\n field: 'expiry',\n message: 'Incorrect year',\n },\n invalid_expiry_month: {\n field: 'expiry',\n message: 'Incorrect month',\n },\n cvc: {\n field: 'cvv',\n message: 'Incorrect CVV',\n },\n invalid_cvc: {\n field: 'cvv',\n message: 'Incorrect CVV',\n },\n};\n\nexport function getStripeError(error: {\n code: string;\n message: string;\n param?: string;\n}) {\n const { message: description, code, param } = error;\n const { field, message } = param ? STRIPE_ERRORS[param] : STRIPE_ERRORS[code];\n\n return { field, message, description };\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';\nimport { getServerTime } from '../../util/serverTime';\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(lang: LangFn, user: ApiUser, serverTimeOffset: number) {\n if (user.id === SERVICE_NOTIFICATIONS_USER_ID) {\n return lang('ServiceNotifications').toLowerCase();\n }\n\n if (user.type && user.type === 'userTypeBot') {\n return lang('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(new Date().getTime() + serverTimeOffset * 1000);\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 const serverToday = new Date(today.getTime() + serverTimeOffset * 1000);\n if (wasOnlineDate > serverToday) {\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, lang));\n }\n\n // yesterday\n const yesterday = new Date();\n yesterday.setDate(now.getDate() - 1);\n yesterday.setHours(0, 0, 0, 0);\n const serverYesterday = new Date(yesterday.getTime() + serverTimeOffset * 1000);\n if (wasOnlineDate > serverYesterday) {\n return lang('LastSeen.YesterdayAt', formatTime(wasOnlineDate, lang));\n }\n\n return lang('LastSeen.AtDate', formatFullDate(lang, 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 getCanAddContact(user: ApiUser) {\n return !user.isContact && !isUserBot(user);\n}\n\nexport function sortUserIds(\n userIds: string[],\n usersById: Record,\n priorityIds?: string[],\n serverTimeOffset = 0,\n) {\n return orderBy(userIds, (id) => {\n const now = getServerTime(serverTimeOffset);\n\n if (priorityIds && priorityIds.includes(id)) {\n // Assuming that online status expiration date can't be as far as two days from now,\n // this should place prioritized on top of the list.\n // Then we subtract index of `id` in `priorityIds` to preserve selected order\n return now + (48 * 60 * 60) - (priorityIds.length - 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\nexport function getUserIdDividend(userId: string) {\n // Workaround for old-fashioned IDs stored locally\n if (typeof userId === 'number') {\n return Math.abs(userId);\n }\n\n return Math.abs(Number(userId));\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 ? getUserIdDividend(peer.id) % 7 : 0;\n\n return USER_COLOR_KEYS[index];\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiChat, ApiPhoto } from '../../api/types';\n\nimport { ARCHIVED_FOLDER_ID } from '../../config';\nimport { omit } from '../../util/iteratees';\nimport { selectChatListType } from '../selectors';\n\nexport function replaceChatListIds(\n global: GlobalState,\n type: 'active' | 'archived',\n newIds: string[] | 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: string[]): GlobalState {\n const { [type]: listIds } = global.chats.listIds;\n const newIds = 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\n// @optimization Don't spread/unspread global for each element, do it in a batch\nfunction getUpdatedChat(\n global: GlobalState, chatId: string, chatUpdate: Partial, photo?: ApiPhoto,\n): ApiChat {\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 ...(photo && { photos: [photo, ...(chat.photos || [])] }),\n };\n\n if (!updatedChat.id || !updatedChat.type) {\n return updatedChat;\n }\n\n return updatedChat;\n}\n\nexport function updateChat(\n global: GlobalState, chatId: string, chatUpdate: Partial, photo?: ApiPhoto,\n): GlobalState {\n const { byId } = global.chats;\n\n const updatedChat = getUpdatedChat(global, chatId, chatUpdate, photo);\n\n return replaceChats(global, {\n ...byId,\n [chatId]: updatedChat,\n });\n}\n\nexport function updateChats(global: GlobalState, updatedById: Record): GlobalState {\n const updatedChats = Object.keys(updatedById).reduce>((acc, id) => {\n const updatedChat = getUpdatedChat(global, id, updatedById[id]);\n if (updatedChat) {\n acc[id] = updatedChat;\n }\n return acc;\n }, {});\n\n global = replaceChats(global, {\n ...global.chats.byId,\n ...updatedChats,\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 let isAdded = false;\n\n const addedChats = Object.keys(addedById).reduce>((acc, id) => {\n if (!byId[id] || (byId[id].isMin && !addedById[id].isMin)) {\n const updatedChat = getUpdatedChat(global, id, addedById[id]);\n if (updatedChat) {\n acc[id] = updatedChat;\n\n if (!isAdded) {\n isAdded = true;\n }\n }\n }\n return acc;\n }, {});\n\n if (isAdded) {\n global = replaceChats(global, {\n ...global.chats.byId,\n ...addedChats,\n });\n }\n\n return global;\n}\n\nexport function updateChatListType(\n global: GlobalState,\n chatId: string,\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?: string[];\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\nexport function leaveChat(global: GlobalState, leftChatId: string): GlobalState {\n const listType = selectChatListType(global, leftChatId);\n if (!listType) {\n return global;\n }\n\n const { [listType]: listIds } = global.chats.listIds;\n\n if (listIds) {\n global = replaceChatListIds(global, listType, listIds.filter((listId) => listId !== leftChatId));\n }\n\n global = updateChat(global, leftChatId, { isNotJoined: true });\n\n return global;\n}\n","import {\n GlobalState, MessageList, MessageListType, Thread,\n} from '../../global/types';\nimport { ApiMessage, ApiThreadInfo, MAIN_THREAD_ID } from '../../api/types';\nimport { FocusDirection } from '../../types';\n\nimport {\n IS_TEST, MESSAGE_LIST_SLICE, MESSAGE_LIST_VIEWPORT_LIMIT, TMP_CHAT_ID,\n} 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: string | undefined,\n threadId: number = MAIN_THREAD_ID,\n type: MessageListType = 'thread',\n shouldReplaceHistory?: boolean,\n): GlobalState {\n const { messageLists } = global.messages;\n let newMessageLists: MessageList[] = messageLists;\n if (shouldReplaceHistory || IS_TEST) {\n newMessageLists = chatId ? [{ chatId, threadId, type }] : [];\n } else if (chatId) {\n const last = messageLists[messageLists.length - 1];\n if (!last || last.chatId !== chatId || last.threadId !== threadId || last.type !== type) {\n if (last && last.chatId === TMP_CHAT_ID) {\n newMessageLists = [...messageLists.slice(0, -1), { chatId, threadId, type }];\n } else {\n newMessageLists = [...messageLists, { chatId, threadId, type }];\n }\n }\n } else {\n newMessageLists = messageLists.slice(0, -1);\n }\n\n return {\n ...global,\n messages: {\n ...global.messages,\n messageLists: newMessageLists,\n },\n };\n}\n\nfunction replaceChatMessages(global: GlobalState, chatId: string, newById: Record): GlobalState {\n return updateMessageStore(global, chatId, {\n byId: newById,\n });\n}\n\nfunction updateThread(\n global: GlobalState, chatId: string, threadId: number, threadUpdate: Partial,\n): GlobalState {\n const current = global.messages.byChatId[chatId];\n\n return updateMessageStore(global, chatId, {\n threadsById: {\n ...(current?.threadsById),\n [threadId]: {\n ...(current?.threadsById[threadId]),\n ...threadUpdate,\n },\n },\n });\n}\n\nfunction updateMessageStore(\n global: GlobalState, chatId: string, 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: string, 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).forEach((chatId) => {\n global = addChatMessagesById(global, chatId, addedByChatId[chatId]);\n });\n\n return global;\n}\n\nexport function addChatMessagesById(\n global: GlobalState, chatId: string, 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: string, 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: string, 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 });\n}\n\nexport function deleteChatMessages(\n global: GlobalState,\n chatId: string,\n messageIds: number[],\n): GlobalState {\n const byId = selectChatMessages(global, chatId);\n if (!byId) {\n return global;\n }\n const newById = omit(byId, messageIds);\n const deletedForwardedPosts = Object.values(pickTruthy(byId, messageIds)).filter(\n ({ forwardInfo }) => forwardInfo?.isLinkedChannelPost,\n );\n\n const threadIds = Object.keys(global.messages.byChatId[chatId].threadsById).map(Number);\n threadIds.forEach((threadId) => {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n\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 let newMessageCount = threadInfo?.messagesCount;\n\n messageIds.forEach((messageId) => {\n if (listedIds && listedIds.includes(messageId)) {\n listedIds = listedIds.filter((id) => id !== messageId);\n if (newMessageCount !== undefined) newMessageCount -= 1;\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 if (threadInfo && newMessageCount !== undefined) {\n global = replaceThreadParam(global, chatId, threadId, 'threadInfo', {\n ...threadInfo,\n messagesCount: newMessageCount,\n });\n }\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?.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: string,\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);\n\n return global;\n}\n\nexport function updateListedIds(\n global: GlobalState,\n chatId: string,\n threadId: number,\n idsUpdate: number[],\n): GlobalState {\n const listedIds = selectListedIds(global, chatId, threadId);\n const newIds = 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: string,\n threadId: number,\n idsUpdate: number[],\n): GlobalState {\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n const newIds = 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: string,\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: string,\n threadId: number,\n newViewportIds: number[],\n): GlobalState {\n const currentIds = selectViewportIds(global, chatId, threadId) || [];\n const newIds = orderHistoryIds(newViewportIds);\n\n return replaceThreadParam(\n global,\n chatId,\n threadId,\n 'viewportIds',\n areSortedArraysEqual(currentIds, newIds) ? currentIds : newIds,\n );\n}\n\nexport function updateThreadInfo(\n global: GlobalState, chatId: string, 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: string, 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: string, newById: Record,\n): GlobalState {\n return updateScheduledMessages(global, chatId, {\n byId: newById,\n });\n}\n\nfunction updateScheduledMessages(\n global: GlobalState, chatId: string, update: Partial<{ byId: Record }>,\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?: string, messageId?: number, noHighlight = false, isResizingContainer = false,\n): GlobalState {\n return {\n ...global,\n focusedMessage: {\n ...global.focusedMessage,\n chatId,\n messageId,\n noHighlight,\n isResizingContainer,\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: string,\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: string,\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\nexport function updateThreadUnreadFromForwardedMessage(\n global: GlobalState,\n originMessage: ApiMessage,\n chatId: string,\n lastMessageId: number,\n isDeleting?: boolean,\n) {\n const { channelPostId, fromChatId } = originMessage.forwardInfo || {};\n if (channelPostId && fromChatId) {\n const threadInfoOld = selectThreadInfo(global, chatId, channelPostId);\n if (threadInfoOld) {\n global = replaceThreadParam(global, chatId, channelPostId, 'threadInfo', {\n ...threadInfoOld,\n lastMessageId,\n messagesCount: threadInfoOld.messagesCount + (isDeleting ? -1 : 1),\n });\n }\n }\n return global;\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: string,\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?: string,\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}\n\n// @optimization Don't spread/unspread global for each element, do it in a batch\nfunction getUpdatedUser(global: GlobalState, userId: string, userUpdate: Partial): ApiUser {\n const { byId } = global.users;\n const user = byId[userId];\n const shouldOmitMinInfo = userUpdate.isMin && user && !user.isMin;\n\n const updatedUser = {\n ...user,\n ...(shouldOmitMinInfo ? omit(userUpdate, ['isMin', 'accessHash']) : userUpdate),\n };\n\n if (!updatedUser.id || !updatedUser.type) {\n return user;\n }\n\n return updatedUser;\n}\n\nfunction updateContactList(global: GlobalState, updatedUsers: ApiUser[]): GlobalState {\n const { userIds: contactUserIds } = global.contactList || {};\n\n if (!contactUserIds) return global;\n\n const newContactUserIds = updatedUsers\n .filter((user) => user?.isContact && !contactUserIds.includes(user.id))\n .map((user) => user.id);\n\n if (newContactUserIds.length === 0) return global;\n\n return {\n ...global,\n contactList: {\n userIds: [\n ...newContactUserIds,\n ...contactUserIds,\n ],\n },\n };\n}\n\nexport function updateUser(global: GlobalState, userId: string, userUpdate: Partial): GlobalState {\n const { byId } = global.users;\n\n const updatedUser = getUpdatedUser(global, userId, userUpdate);\n\n global = updateContactList(global, [updatedUser]);\n\n return replaceUsers(global, {\n ...byId,\n [userId]: updatedUser,\n });\n}\n\nexport function updateUsers(global: GlobalState, updatedById: Record): GlobalState {\n const updatedUsers = Object.keys(updatedById).reduce>((acc, id) => {\n const updatedUser = getUpdatedUser(global, id, updatedById[id]);\n if (updatedUser) {\n acc[id] = updatedUser;\n }\n return acc;\n }, {});\n\n global = updateContactList(global, Object.values(updatedUsers));\n\n global = replaceUsers(global, {\n ...global.users.byId,\n ...updatedUsers,\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 let isAdded = false;\n\n const addedUsers = Object.keys(addedById).reduce>((acc, id) => {\n if (!byId[id] || (byId[id].isMin && !addedById[id].isMin)) {\n const updatedUser = getUpdatedUser(global, id, addedById[id]);\n if (updatedUser) {\n acc[id] = updatedUser;\n\n if (!isAdded) {\n isAdded = true;\n }\n }\n }\n return acc;\n }, {});\n\n if (isAdded) {\n global = replaceUsers(global, {\n ...global.users.byId,\n ...addedUsers,\n });\n\n global = updateContactList(global, Object.values(addedUsers));\n }\n\n return global;\n}\n\nexport function updateSelectedUserId(global: GlobalState, selectedId?: string): 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: string): GlobalState {\n const { byId } = global.users;\n const { userIds } = global.contactList || {};\n delete byId[userId];\n\n global = {\n ...global,\n contactList: {\n userIds: userIds ? userIds.filter((id) => id !== userId) : MEMO_EMPTY_ARRAY,\n },\n };\n\n return replaceUsers(global, byId);\n}\n\nexport function updateUserSearch(\n global: GlobalState,\n searchStatePartial: Partial,\n) {\n return {\n ...global,\n userSearch: {\n ...global.userSearch,\n ...searchStatePartial,\n },\n };\n}\n\nexport function updateUserSearchFetchingStatus(\n global: GlobalState, newState: boolean,\n) {\n return updateUserSearch(global, {\n fetchingStatus: newState,\n });\n}\n\nexport function updateUserBlockedState(global: GlobalState, userId: string, isBlocked: boolean) {\n const { byId } = global.users;\n const user = byId[userId];\n if (!user || !user.fullInfo) {\n return global;\n }\n\n return updateUser(global, userId, {\n ...user,\n fullInfo: {\n ...user.fullInfo,\n isBlocked,\n },\n });\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?.[type]?.foundIds;\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: string,\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: string,\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: string,\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?.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: string,\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: string,\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: string,\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: string,\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?.[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: string, 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 {\n ISettings, IThemeSettings, ThemeKey, NotifyException,\n} from '../../types';\nimport { ApiNotifyException } from '../../api/types';\nimport { updateUserBlockedState } from './users';\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 replaceThemeSettings(\n global: GlobalState, theme: ThemeKey, newSettings?: Partial,\n): GlobalState {\n return {\n ...global,\n settings: {\n ...global.settings,\n themes: {\n ...global.settings.themes,\n [theme]: {\n ...(global.settings.themes[theme] || {}),\n ...newSettings,\n },\n },\n },\n };\n}\n\nexport function addNotifyExceptions(\n global: GlobalState, notifyExceptions: ApiNotifyException[],\n): GlobalState {\n notifyExceptions.forEach((notifyException) => {\n const { chatId, ...exceptionData } = notifyException;\n global = addNotifyException(global, chatId, exceptionData);\n });\n\n return global;\n}\n\nexport function addNotifyException(\n global: GlobalState, id: string, notifyException: NotifyException,\n): GlobalState {\n return {\n ...global,\n settings: {\n ...global.settings,\n notifyExceptions: {\n ...global.settings.notifyExceptions,\n [id]: notifyException,\n },\n },\n };\n}\n\nexport function updateNotifySettings(\n global: GlobalState, peerType: 'contact' | 'group' | 'broadcast', isSilent?: boolean, shouldShowPreviews?: boolean,\n) {\n switch (peerType) {\n case 'contact':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasPrivateChatsNotifications: !isSilent }),\n ...(typeof shouldShowPreviews !== 'undefined' && { hasPrivateChatsMessagePreview: shouldShowPreviews }),\n });\n case 'group':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasGroupNotifications: !isSilent }),\n ...(typeof shouldShowPreviews !== 'undefined' && { hasGroupMessagePreview: shouldShowPreviews }),\n });\n case 'broadcast':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasBroadcastNotifications: !isSilent }),\n ...(typeof shouldShowPreviews !== 'undefined' && { hasBroadcastMessagePreview: shouldShowPreviews }),\n });\n\n default:\n return undefined;\n }\n}\n\nexport function addBlockedContact(global: GlobalState, contactId: string): GlobalState {\n global = updateUserBlockedState(global, contactId, true);\n\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: string): GlobalState {\n global = updateUserBlockedState(global, contactId, false);\n\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 requestId: 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 amount,\n currency,\n isTest,\n photoUrl,\n } = message.content.invoice;\n return {\n ...global,\n payment: {\n ...global.payment,\n invoiceContent: {\n title,\n text,\n photoUrl,\n amount,\n currency,\n isTest,\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 { ApiChat, MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalState } from '../../global/types';\n\nimport {\n getPrivateChatUserId, isChatChannel, isUserId, isHistoryClearMessage, isUserBot, isUserOnline, selectIsChatMuted,\n} from '../helpers';\nimport { selectUser } from './users';\nimport {\n ALL_FOLDER_ID, ARCHIVED_FOLDER_ID, MEMBERS_LOAD_SLICE, SERVICE_NOTIFICATIONS_USER_ID,\n} from '../../config';\nimport { selectNotifyExceptions, selectNotifySettings } from './settings';\n\nexport function selectChat(global: GlobalState, chatId: string): 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: string) {\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 (isUserId(chat.id) || isChatChannel(chat) || !chat.fullInfo) {\n return undefined;\n }\n\n if (!chat.fullInfo.members || chat.fullInfo.members.length === MEMBERS_LOAD_SLICE) {\n return chat.fullInfo.onlineCount;\n }\n\n return chat.fullInfo.members.reduce((onlineCount, { userId }) => {\n if (global.users.byId[userId] && isUserOnline(global.users.byId[userId]) && userId !== global.currentUserId) {\n return onlineCount + 1;\n }\n\n return onlineCount;\n }, 0);\n}\n\nexport function selectChatBot(global: GlobalState, chatId: string) {\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: string) {\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: string, 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: string): '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: string, 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\n// Slow, not to be used in `withGlobal`\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 const notifySettings = selectNotifySettings(global);\n const notifyExceptions = selectNotifyExceptions(global);\n\n return activeChatIds.reduce((acc, chatId) => {\n const chat = chats[chatId];\n\n if (\n chat\n && chat.unreadCount\n && chat.isListed\n && !chat.isNotJoined\n && !chat.isRestricted\n && (chat.unreadMentionsCount || !selectIsChatMuted(chat, notifySettings, notifyExceptions))\n ) {\n return acc + chat.unreadCount;\n }\n\n return acc;\n }, 0);\n}\n\nexport function selectIsServiceChatReady(global: GlobalState) {\n return Boolean(selectChat(global, SERVICE_NOTIFICATIONS_USER_ID));\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 selectStickerSetByShortName(global: GlobalState, shortName: string) {\n return Object.values(global.stickers.setsById).find((l) => l.shortName.toLowerCase() === shortName.toLowerCase());\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 // Some emojis (❤️ for example) with a service symbol 'VARIATION SELECTOR-16' are not recognized as animated\n const cleanedEmoji = emoji.replace('\\ufe0f', '');\n\n return animatedEmojis.stickers.find((sticker) => sticker.emoji === emoji || sticker.emoji === cleanedEmoji);\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, SERVICE_NOTIFICATIONS_USER_ID } from '../../config';\nimport {\n selectChat, selectIsChatWithBot, selectIsChatWithSelf,\n} from './chats';\nimport { selectIsUserOrChatContact, selectUser } from './users';\nimport {\n getSendingState,\n isChatChannel,\n isMessageLocal,\n isUserId,\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 getMessageWebPageVideo,\n getMessagePhoto,\n getMessageAudio,\n getMessageVoice,\n getMessageDocument,\n getMessageWebPagePhoto,\n} from '../helpers';\nimport { findLast } from '../../util/iteratees';\nimport { selectIsStickerFavorite } from './symbols';\nimport { getServerTime } from '../../util/serverTime';\nimport { MEMO_EMPTY_ARRAY } from '../../util/memo';\n\nconst MESSAGE_EDIT_ALLOWED_TIME = 172800; // 48 hours\n\nexport function selectCurrentMessageList(global: GlobalState) {\n const { messageLists } = global.messages;\n\n if (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: string) {\n return global.messages.byChatId[chatId]?.byId;\n}\n\nexport function selectScheduledMessages(global: GlobalState, chatId: string) {\n return global.scheduledMessages.byChatId[chatId]?.byId;\n}\n\nexport function selectThreadParam(\n global: GlobalState,\n chatId: string,\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: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'listedIds');\n}\n\nexport function selectOutlyingIds(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'outlyingIds');\n}\n\nexport function selectCurrentMessageIds(\n global: GlobalState, chatId: string, 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: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'viewportIds');\n}\n\nexport function selectPinnedIds(global: GlobalState, chatId: string) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'pinnedIds');\n}\n\nexport function selectScheduledIds(global: GlobalState, chatId: string) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds');\n}\n\nexport function selectScrollOffset(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'scrollOffset');\n}\n\nexport function selectReplyingToId(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'replyingToId');\n}\n\nexport function selectEditingId(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'editingId');\n}\n\nexport function selectEditingScheduledId(global: GlobalState, chatId: string) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'editingScheduledId');\n}\n\nexport function selectDraft(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'draft');\n}\n\nexport function selectNoWebPage(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'noWebPage');\n}\n\nexport function selectThreadInfo(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'threadInfo');\n}\n\nexport function selectFirstMessageId(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'firstMessageId');\n}\n\nexport function selectReplyStack(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'replyStack');\n}\n\nexport function selectThreadOriginChat(global: GlobalState, chatId: string, 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: string, 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: string, 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: string, 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: string, 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: string, messageId: number) {\n const chatMessages = selectChatMessages(global, chatId);\n\n return chatMessages ? chatMessages[messageId] : undefined;\n}\n\nexport function selectScheduledMessage(global: GlobalState, chatId: string, messageId: number) {\n const chatMessages = selectScheduledMessages(global, chatId);\n\n return chatMessages ? chatMessages[messageId] : undefined;\n}\n\nexport function selectEditingMessage(\n global: GlobalState, chatId: string, 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: string) {\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 isUserId(senderId) ? 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) || selectChat(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 = isUserId(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 isLocal = isMessageLocal(message);\n const isServiceNotification = isServiceNotificationMessage(message);\n const isOwn = isOwnMessage(message);\n const isAction = isActionMessage(message);\n const { content } = message;\n\n const canEditMessagesIndefinitely = isChatWithSelf\n || (isSuperGroup && getHasAdminRight(chat, 'pinMessages'))\n || (isChannel && getHasAdminRight(chat, 'editMessages'));\n const isMessageEditable = (\n (\n canEditMessagesIndefinitely\n || getServerTime(global.serverTimeOffset) - message.date < MESSAGE_EDIT_ALLOWED_TIME\n ) && !(\n content.sticker || content.contact || content.poll || content.action || content.audio\n || (content.video?.isRound)\n )\n && !isForwardedMessage(message)\n && !message.viaBotId\n );\n\n const canReply = !isLocal && !isServiceNotification && getCanPostInChat(chat, threadId);\n\n const hasPinPermission = isPrivate || (\n chat.isCreator\n || (!isChannel && !isUserRightBanned(chat, 'pinMessages'))\n || getHasAdminRight(chat, 'pinMessages')\n );\n\n let canPin = !isLocal && !isServiceNotification && !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 = !isLocal && !isServiceNotification && (\n isPrivate\n || isOwn\n || isBasicGroup\n || chat.isCreator\n || getHasAdminRight(chat, 'deleteMessages')\n );\n\n const canReport = !isPrivate && !isOwn;\n\n const canDeleteForAll = canDelete && (\n (isPrivate && !isChatWithSelf)\n || (isBasicGroup && (\n isOwn || getHasAdminRight(chat, 'deleteMessages') || chat.isCreator\n ))\n );\n\n const canEdit = !isLocal && !isAction && isMessageEditable && (\n isOwn\n || (isChannel && (chat.isCreator || getHasAdminRight(chat, 'editMessages')))\n );\n\n const canForward = !isLocal && !isAction;\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\n const canDownload = Boolean(content.webPage?.document || content.webPage?.video || content.webPage?.photo\n || content.audio || content.voice || content.photo || content.video || content.document || content.sticker);\n\n const noOptions = [\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canReport,\n canDelete,\n canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n canDownload,\n ].every((ability) => !ability);\n\n return {\n noOptions,\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canReport,\n canDelete,\n canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n canDownload,\n };\n}\n\n// This selector always returns a new object which can not be safely used in shallow-equal checks\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 selectCanReportSelectedMessages(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 false;\n }\n\n const messageActions = selectedMessageIds\n .map((id) => chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId))\n .filter(Boolean);\n\n return messageActions.every((actions) => actions.canReport);\n}\n\nexport function selectCanDownloadSelectedMessages(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 false;\n }\n\n const messageActions = selectedMessageIds\n .map((id) => chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId))\n .filter(Boolean);\n\n return messageActions.some((actions) => actions.canDownload);\n}\n\nexport function selectIsDownloading(global: GlobalState, message: ApiMessage) {\n const activeInChat = global.activeDownloads.byChatId[message.chatId];\n return activeInChat ? activeInChat.includes(message.id) : false;\n}\n\nexport function selectActiveDownloadIds(global: GlobalState, chatId: string) {\n return global.activeDownloads.byChatId[chatId] || MEMO_EMPTY_ARRAY;\n}\n\nexport function selectUploadProgress(global: GlobalState, message: ApiMessage) {\n return global.fileUploads.byMessageLocalId[message.previousLocalId || message.id]?.progress;\n}\n\nexport function selectRealLastReadId(global: GlobalState, chatId: string, 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 Math.min(threadInfo.lastReadInboxMessageId, threadInfo.lastMessageId || Infinity);\n }\n}\n\nexport function selectFirstUnreadId(global: GlobalState, chatId: string, threadId: number) {\n const chat = selectChat(global, chatId);\n\n if (threadId === MAIN_THREAD_ID) {\n if (!chat) {\n return undefined;\n }\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo\n || (threadInfo.lastMessageId !== undefined && 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 if (!lastReadId && chat && chat.isNotJoined) {\n return undefined;\n }\n\n const lastReadServiceNotificationId = chatId === SERVICE_NOTIFICATIONS_USER_ID\n ? global.serviceNotifications.reduce((max, notification) => {\n return !notification.isUnread && notification.id > max ? notification.id : max;\n }, -1)\n : -1;\n\n function findAfterLastReadId(listIds: number[]) {\n return listIds.find((id) => {\n return (\n (!lastReadId || id > lastReadId)\n && byId[id]\n && (!byId[id].isOutgoing || byId[id].isFromScheduled)\n && id > lastReadServiceNotificationId\n );\n });\n }\n\n if (outlyingIds) {\n const found = findAfterLastReadId(outlyingIds);\n if (found) {\n return found;\n }\n }\n\n if (listedIds) {\n const found = findAfterLastReadId(listedIds);\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 Object.keys(byChatId).find((chatId) => {\n const chat = selectChat(global, 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: string, 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: string, 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: string, 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: string,\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 selectCanAutoLoadMedia(global: GlobalState, message: ApiMessage) {\n const chat = selectChat(global, message.chatId);\n if (!chat) {\n return undefined;\n }\n\n const sender = selectSender(global, message);\n\n const isPhoto = Boolean(getMessagePhoto(message) || getMessageWebPagePhoto(message));\n const isVideo = Boolean(getMessageVideo(message) || getMessageWebPageVideo(message));\n const isFile = Boolean(getMessageAudio(message) || getMessageVoice(message) || getMessageDocument(message));\n\n const {\n canAutoLoadPhotoFromContacts,\n canAutoLoadPhotoInPrivateChats,\n canAutoLoadPhotoInGroups,\n canAutoLoadPhotoInChannels,\n canAutoLoadVideoFromContacts,\n canAutoLoadVideoInPrivateChats,\n canAutoLoadVideoInGroups,\n canAutoLoadVideoInChannels,\n canAutoLoadFileFromContacts,\n canAutoLoadFileInPrivateChats,\n canAutoLoadFileInGroups,\n canAutoLoadFileInChannels,\n } = global.settings.byKey;\n\n if (isPhoto) {\n return canAutoLoadMedia({\n global,\n chat,\n sender,\n canAutoLoadMediaFromContacts: canAutoLoadPhotoFromContacts,\n canAutoLoadMediaInPrivateChats: canAutoLoadPhotoInPrivateChats,\n canAutoLoadMediaInGroups: canAutoLoadPhotoInGroups,\n canAutoLoadMediaInChannels: canAutoLoadPhotoInChannels,\n });\n }\n\n if (isVideo) {\n return canAutoLoadMedia({\n global,\n chat,\n sender,\n canAutoLoadMediaFromContacts: canAutoLoadVideoFromContacts,\n canAutoLoadMediaInPrivateChats: canAutoLoadVideoInPrivateChats,\n canAutoLoadMediaInGroups: canAutoLoadVideoInGroups,\n canAutoLoadMediaInChannels: canAutoLoadVideoInChannels,\n });\n }\n\n if (isFile) {\n return canAutoLoadMedia({\n global,\n chat,\n sender,\n canAutoLoadMediaFromContacts: canAutoLoadFileFromContacts,\n canAutoLoadMediaInPrivateChats: canAutoLoadFileInPrivateChats,\n canAutoLoadMediaInGroups: canAutoLoadFileInGroups,\n canAutoLoadMediaInChannels: canAutoLoadFileInChannels,\n });\n }\n\n return true;\n}\n\nfunction canAutoLoadMedia({\n global,\n chat,\n sender,\n canAutoLoadMediaFromContacts,\n canAutoLoadMediaInPrivateChats,\n canAutoLoadMediaInGroups,\n canAutoLoadMediaInChannels,\n}: {\n global: GlobalState;\n chat: ApiChat;\n canAutoLoadMediaFromContacts: boolean;\n canAutoLoadMediaInPrivateChats: boolean;\n canAutoLoadMediaInGroups: boolean;\n canAutoLoadMediaInChannels: boolean;\n sender?: ApiChat | ApiUser;\n}) {\n const isMediaFromContact = Boolean(sender && (\n sender.id === global.currentUserId || selectIsUserOrChatContact(global, sender)\n ));\n\n return Boolean(\n (isMediaFromContact && canAutoLoadMediaFromContacts)\n || (!isMediaFromContact && canAutoLoadMediaInPrivateChats && isUserId(chat.id))\n || (canAutoLoadMediaInGroups && isChatGroup(chat))\n || (canAutoLoadMediaInChannels && isChatChannel(chat)),\n );\n}\n\nexport function selectCanAutoPlayMedia(global: GlobalState, message: ApiMessage) {\n const video = getMessageVideo(message) || getMessageWebPageVideo(message);\n if (!video) {\n return undefined;\n }\n\n const {\n canAutoPlayVideos,\n canAutoPlayGifs,\n } = global.settings.byKey;\n\n const asGif = video.isGif || video.isRound;\n\n return (canAutoPlayVideos && !asGif) || (canAutoPlayGifs && asGif);\n}\n\nexport function selectShouldLoopStickers(global: GlobalState) {\n return global.settings.byKey.shouldLoopStickers;\n}\n\nexport function selectLastServiceNotification(global: GlobalState) {\n const { serviceNotifications } = global;\n const maxId = Math.max(...serviceNotifications.map(({ id }) => id));\n\n return serviceNotifications.find(({ id }) => id === maxId);\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, isUserId } from '../helpers';\n\nexport function selectManagement(global: GlobalState, chatId: string) {\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 (isUserId(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 { NewChatMembersProgress, RightColumnContent } from '../../types';\n\nimport { getSystemTheme, IS_SINGLE_COLUMN_LAYOUT } 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 newChatMembersProgress,\n } = global;\n\n const isAddingChatMembersShown = newChatMembersProgress !== NewChatMembersProgress.Closed;\n const isPollResults = selectIsPollResultsOpen(global);\n const isSearch = Boolean(!IS_SINGLE_COLUMN_LAYOUT && 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 ) : isStickerSearch ? (\n RightColumnContent.StickerSearch\n ) : isGifSearch ? (\n RightColumnContent.GifSearch\n ) : isAddingChatMembersShown ? (\n RightColumnContent.AddingMembers\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\nexport function selectTheme(global: GlobalState) {\n const { theme, shouldUseSystemTheme } = global.settings.byKey;\n\n return shouldUseSystemTheme ? getSystemTheme() : theme;\n}\n","import { GlobalState } from '../../global/types';\n\nexport function selectCurrentGlobalSearchQuery(global: GlobalState) {\n return global.globalSearch.query;\n}\n","import { GlobalState } from '../../global/types';\n\nexport function selectPaymentChatId(global: GlobalState) {\n return global.payment.chatId;\n}\n\nexport function selectPaymentMessageId(global: GlobalState) {\n return global.payment.messageId;\n}\n\nexport function selectPaymentFormId(global: GlobalState) {\n return global.payment.formId;\n}\n\nexport function selectPaymentRequestId(global: GlobalState) {\n return global.payment.requestId;\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 { GlobalState } from '../../global/types';\n\nexport function selectNotifySettings(global: GlobalState) {\n return global.settings.byKey;\n}\n\nexport function selectNotifyExceptions(global: GlobalState) {\n return global.settings.notifyExceptions;\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiChat, ApiUser } from '../../api/types';\n\nexport function selectUser(global: GlobalState, userId: string): ApiUser | undefined {\n return global.users.byId[userId];\n}\n\nexport function selectIsUserBlocked(global: GlobalState, userId: string) {\n const user = selectUser(global, userId);\n\n return user?.fullInfo?.isBlocked;\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 {\n ApiBotInlineMediaResult, ApiBotInlineResult, ApiBotInlineSwitchPm,\n ApiLanguage, ApiMessage, ApiShippingAddress, ApiStickerSet,\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 type ThemeKey = 'light' | 'dark';\n\nexport interface IThemeSettings {\n background?: string;\n backgroundColor?: string;\n patternColor?: string;\n isBlurred?: boolean;\n}\n\nexport type NotifySettings = {\n hasPrivateChatsNotifications?: boolean;\n hasPrivateChatsMessagePreview?: boolean;\n hasGroupNotifications?: boolean;\n hasGroupMessagePreview?: boolean;\n hasBroadcastNotifications?: boolean;\n hasBroadcastMessagePreview?: boolean;\n hasContactJoinedNotifications?: boolean;\n hasWebNotifications: boolean;\n hasPushNotifications: boolean;\n notificationSoundVolume: number;\n};\n\nexport type LangCode = (\n 'en' | 'ar' | 'be' | 'ca' | 'nl' | 'fr' | 'de' | 'id' | 'it' | 'ko' | 'ms' | 'fa' | 'pl' | 'pt-br' | 'ru' | 'es'\n | 'tr' | 'uk' | 'uz'\n);\n\nexport type TimeFormat = '24h' | '12h';\n\nexport interface ISettings extends NotifySettings, Record {\n theme: ThemeKey;\n shouldUseSystemTheme: boolean;\n messageTextSize: number;\n animationLevel: 0 | 1 | 2;\n messageSendKeyCombo: 'enter' | 'ctrl-enter';\n canAutoLoadPhotoFromContacts: boolean;\n canAutoLoadPhotoInPrivateChats: boolean;\n canAutoLoadPhotoInGroups: boolean;\n canAutoLoadPhotoInChannels: boolean;\n canAutoLoadVideoFromContacts: boolean;\n canAutoLoadVideoInPrivateChats: boolean;\n canAutoLoadVideoInGroups: boolean;\n canAutoLoadVideoInChannels: boolean;\n canAutoLoadFileFromContacts: boolean;\n canAutoLoadFileInPrivateChats: boolean;\n canAutoLoadFileInGroups: boolean;\n canAutoLoadFileInChannels: boolean;\n autoLoadFileMaxSizeMb: number;\n canAutoPlayGifs: boolean;\n canAutoPlayVideos: boolean;\n shouldSuggestStickers: boolean;\n shouldLoopStickers: boolean;\n hasPassword?: boolean;\n languages?: ApiLanguage[];\n language: LangCode;\n isSensitiveEnabled?: boolean;\n canChangeSensitive?: boolean;\n timeFormat: TimeFormat;\n wasTimeFormatSetManually: boolean;\n}\n\nexport interface ApiPrivacySettings {\n visibility: PrivacyVisibility;\n allowUserIds: string[];\n allowChatIds: string[];\n blockUserIds: string[];\n blockChatIds: string[];\n}\n\nexport interface InputPrivacyContact {\n id: string;\n accessHash?: string;\n}\n\nexport interface InputPrivacyRules {\n visibility: PrivacyVisibility;\n allowedUsers?: InputPrivacyContact[];\n allowedChats?: InputPrivacyContact[];\n blockedUsers?: InputPrivacyContact[];\n blockedChats?: InputPrivacyContact[];\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 DataStorage,\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 FoldersEditFolderFromChatList,\n FoldersIncludedChats,\n FoldersIncludedChatsFromChatList,\n FoldersExcludedChats,\n FoldersExcludedChatsFromChatList,\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 StickerSearch,\n GifSearch,\n PollResults,\n AddingMembers,\n}\n\nexport enum MediaViewerOrigin {\n Inline,\n ScheduledInline,\n SharedMedia,\n ProfileAvatar,\n SettingsAvatar,\n MiddleHeaderAvatar,\n Album,\n ScheduledAlbum,\n SearchResult,\n}\n\nexport enum AudioOrigin {\n Inline,\n SharedMedia,\n Search,\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 enum NewChatMembersProgress {\n Closed,\n InProgress,\n Loading,\n}\n\nexport type ProfileTabType = 'members' | 'commonChats' | 'media' | 'documents' | 'links' | 'audio' | 'voice';\nexport type SharedMediaType = 'media' | 'documents' | 'links' | 'audio' | 'voice';\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\nexport type NotifyException = {\n isMuted: boolean;\n isSilent?: boolean;\n shouldShowPreviews?: boolean;\n};\n\nexport type EmojiKeywords = {\n isLoading?: boolean;\n version: number;\n keywords: Record;\n};\n\nexport type InlineBotSettings = {\n id: string;\n help?: string;\n query?: string;\n offset?: string;\n canLoadMore?: boolean;\n results?: (ApiBotInlineResult | ApiBotInlineMediaResult)[];\n isGallery?: boolean;\n switchPm?: ApiBotInlineSwitchPm;\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 { DEBUG } from '../config';\n\nexport function updateAppBadge(unreadCount: number) {\n if (typeof window.navigator.setAppBadge !== 'function') {\n return;\n }\n\n window.navigator.setAppBadge(unreadCount).catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n });\n}\n","export default function arePropsShallowEqual(currentProps: AnyLiteral, newProps: AnyLiteral) {\n if (currentProps === newProps) {\n return true;\n }\n\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 if (currentKeysLength === 0) {\n return true;\n }\n\n for (let i = 0; i < currentKeysLength; i++) {\n const prop = currentKeys[i];\n if (currentProps[prop] !== newProps[prop]) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function 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.reduce((res, prop) => {\n if (currentProps[prop] !== newProps[prop]) {\n res.push(`${prop}: ${currentProps[prop]} => ${newProps[prop]}`);\n }\n\n return res;\n }, [] as string[]);\n}\n","type Parts = (string | false | undefined)[];\n\nexport default (...parts: Parts) => {\n return parts.filter(Boolean).join(' ');\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(\n cacheName: string, key: string, type: Type, isHtmlAllowed = false,\n) {\n if (!cacheApi) {\n return undefined;\n }\n\n try {\n // To avoid the error \"Request scheme 'webdocument' is unsupported\"\n const request = new Request(key.replace(/:/g, '_'));\n const cache = await cacheApi.open(cacheName);\n const response = await cache.match(request);\n if (!response) {\n return undefined;\n }\n\n const contentType = response.headers.get('Content-Type');\n\n switch (type) {\n case Type.Text:\n return await response.text();\n case Type.Blob: {\n // Ignore deprecated data-uri avatars\n if (key.startsWith('avatar') && contentType && contentType.startsWith('text')) {\n return undefined;\n }\n\n const blob = await response.blob();\n\n // Safari does not return correct Content-Type header for webp images.\n if (key.startsWith('sticker')) {\n return new Blob([blob], { type: 'image/webp' });\n }\n\n const shouldRecreate = !blob.type || (!isHtmlAllowed && blob.type.includes('html'));\n // iOS Safari fails to preserve `type` in cache\n let resolvedType = blob.type || contentType;\n\n if (!(shouldRecreate && resolvedType)) {\n return blob;\n }\n\n // Prevent HTML-in-video attacks (for files that were cached before fix)\n if (!isHtmlAllowed) {\n resolvedType = resolvedType.replace(/html/gi, '');\n }\n\n return new Blob([blob], { type: resolvedType });\n }\n case Type.Json:\n return await response.json();\n default:\n return undefined;\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\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 try {\n const cacheData = typeof data === 'string' || data instanceof Blob ? data : JSON.stringify(data);\n // To avoid the error \"Request scheme 'webdocument' is unsupported\"\n const request = new Request(key.replace(/:/g, '_'));\n const response = new Response(cacheData);\n const cache = await cacheApi.open(cacheName);\n return await cache.put(request, response);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n\nexport async function clear(cacheName: string) {\n try {\n if (!cacheApi) {\n return undefined;\n }\n\n return await cacheApi.delete(cacheName);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n","import captureKeyboardListener from './captureKeyboardListeners';\n\ntype IHandlerFunction = () => void;\n\nexport default function captureEscKeyListener(handler: IHandlerFunction) {\n return captureKeyboardListener({ onEsc: handler });\n}\n","type HandlerName = 'onEnter' | 'onBackspace' | 'onDelete' | 'onEsc' | 'onUp' | 'onDown' | 'onLeft' | 'onRight'\n| '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 ArrowLeft: 'onLeft',\n ArrowRight: 'onRight',\n Tab: 'onTab',\n};\n\nconst handlers: Record = {\n onEnter: [],\n onDelete: [],\n onBackspace: [],\n onEsc: [],\n onUp: [],\n onDown: [],\n onLeft: [],\n onRight: [],\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","import { LangFn } from '../hooks/useLang';\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;\nexport const MILLISECONDS_IN_DAY = 24 * 60 * 60 * 1000;\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\n// @optimization `toLocaleTimeString` is avoided because of bad performance\nexport function formatTime(datetime: number | Date, lang: LangFn) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n const timeFormat = lang.timeFormat || '24h';\n\n let hours = date.getHours();\n let marker = '';\n if (timeFormat === '12h') {\n marker = hours >= 12 ? ' PM' : ' AM';\n hours = hours > 12 ? hours % 12 : hours;\n }\n\n return `${String(hours).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}${marker}`;\n}\n\nexport function formatPastTimeShort(lang: LangFn, 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, lang);\n }\n\n const weekAgo = new Date(today);\n weekAgo.setDate(today.getDate() - 7);\n if (date >= weekAgo) {\n return lang(`Weekday.Short${WEEKDAYS_FULL[date.getDay()]}`);\n }\n\n const withYear = date.getFullYear() !== today.getFullYear();\n const format = (\n lang(withYear ? 'formatDateScheduleYear' : 'formatDateSchedule')\n || (withYear ? 'd MMM yyyy' : 'd MMM')\n );\n\n return formatDate(lang, date, format);\n}\n\nexport function formatFullDate(lang: LangFn, datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n const format = lang('formatterYearMax') || 'dd.MM.yyyy';\n\n return formatDate(lang, date, format);\n}\n\nexport function formatMonthAndYear(lang: LangFn, date: Date, isShort = false) {\n const format = lang(isShort ? 'formatterMonthYear2' : 'formatterMonthYear') || 'MMM yyyy';\n\n return formatDate(lang, date, format);\n}\n\nexport function formatHumanDate(\n lang: LangFn,\n datetime: number | Date,\n isShort = false,\n noWeekdays = false,\n isUpperFirst?: boolean,\n) {\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 (isUpperFirst || !isShort ? upperFirst : lowerFirst)(lang('Weekday.Today'));\n }\n\n const yesterday = new Date(today);\n yesterday.setDate(today.getDate() - 1);\n if (toIsoString(date) === toIsoString(yesterday)) {\n return (isUpperFirst || !isShort ? upperFirst : lowerFirst)(lang('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 const weekDayString = isShort ? lang(`Weekday.Short${weekDay}`) : lang(`Weekday.${weekDay}`);\n\n return (isUpperFirst || !isShort ? upperFirst : lowerFirst)(weekDayString);\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 = lang(formatKey) || 'd MMMM yyyy';\n\n return (isUpperFirst || !isShort ? upperFirst : lowerFirst)(formatDate(lang, date, format));\n}\n\nfunction formatDate(lang: LangFn, date: Date, format: string) {\n const day = date.getDate();\n const monthIndex = date.getMonth();\n\n return format\n .replace('LLLL', lang(MONTHS_FULL[monthIndex]))\n .replace('MMMM', lang(`Month.Gen${MONTHS_FULL[monthIndex]}`))\n .replace('MMM', lang(`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(\n lang: LangFn,\n datetime: number | Date,\n isUpperFirst?: boolean,\n) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n return `${formatHumanDate(lang, date, true, undefined, isUpperFirst)}, ${formatTime(date, lang)}`;\n}\n\nexport function formatMediaDuration(duration: number, maxValue?: 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 const maxHours = maxValue ? Math.floor(maxValue / 3600) : 0;\n const maxMinutes = maxValue ? Math.floor((maxValue % 3600) / 60) : 0;\n let string = '';\n if (hours > 0 || maxHours > 0) {\n string += `${String(hours).padStart(2, '0')}:`;\n string += `${String(minutes).padStart(2, '0')}:`;\n } else if (maxMinutes >= 10) {\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, locale = 'en-US') {\n return date.toLocaleString(\n locale,\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 + MILLISECONDS_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 EMOJI_REGEX from '../lib/twemojiRegex';\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\nconst ISO_FLAGS_OFFSET = 127397;\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\n// Non-standard variations of emojis, used on some devices\nconst EMOJI_EXCEPTIONS: [string | RegExp, string][] = [\n [/\\u{1f3f3}\\u200d\\u{1f308}/gu, '\\u{1f3f3}\\ufe0f\\u200d\\u{1f308}'], // 🏳‍🌈\n [/\\u{1f3f3}\\u200d\\u26a7\\ufe0f/gu, '\\u{1f3f3}\\ufe0f\\u200d\\u26a7\\ufe0f'], // 🏳️‍⚧️\n [/\\u{1f937}\\u200d\\u2642/gu, '\\u{1f937}\\u200d\\u2642\\ufe0f'], // 🤷‍♂️\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 fixNonStandardEmoji(text: string) {\n // Non-standard sequences typically parsed as separate emojis, so no need to fix text without any\n if (!text.match(EMOJI_REGEX)) return text;\n // eslint-disable-next-line no-restricted-syntax\n for (const [regex, replacement] of EMOJI_EXCEPTIONS) {\n text = text.replace(regex, replacement);\n }\n\n return text;\n}\n\nexport function nativeToUnified(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][0])) {\n category.emojis.push(emojiRaw[1][0]);\n emojiData.emojis[emojiRaw[1][0]] = {\n id: emojiRaw[1][0],\n names: emojiRaw[1] as string[],\n native: unifiedToNative(emojiRaw[0] as string),\n image: (emojiRaw[0] as string).toLowerCase(),\n };\n }\n }\n\n emojiData.categories.push(category);\n }\n\n return emojiData;\n}\n\nexport function isoToEmoji(iso: string) {\n const code = iso.toUpperCase();\n\n if (!/^[A-Z]{2}$/.test(code)) return iso;\n const codePoints = [...code].map((c) => c.codePointAt(0)! + ISO_FLAGS_OFFSET);\n return String.fromCodePoint(...codePoints);\n}\n","export function ensureProtocol(url?: string) {\n if (!url) {\n return undefined;\n }\n\n // HTTP was chosen by default as a fix for https://bugs.telegram.org/c/10712.\n // It is also the default protocol in the official TDesktop client.\n return url.includes('://') ? url : `http://${url}`;\n}\n","let 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","import { ThemeKey } from '../types';\n\nlet systemThemeCache: ThemeKey = (\n window.matchMedia?.('(prefers-color-scheme: dark)').matches\n) ? 'dark' : 'light';\n\nexport function getSystemTheme() {\n return systemThemeCache;\n}\n\nfunction handleSystemThemeChange(e: MediaQueryListEventMap['change']) {\n systemThemeCache = e.matches ? 'dark' : 'light';\n}\n\nconst mql = window.matchMedia('(prefers-color-scheme: dark)');\nif (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', handleSystemThemeChange);\n} else if (typeof mql.addListener === 'function') {\n mql.addListener(handleSystemThemeChange);\n}\n","import {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT,\n MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH,\n IS_TEST,\n SUPPORTED_VIDEO_CONTENT_TYPES,\n VIDEO_MOV_TYPE,\n} from '../config';\n\nexport * from './environmentWebp';\n\nexport * from './environmentSystemTheme';\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: 'macOS' | 'iOS' | 'Windows' | 'Android' | 'Linux' | undefined;\n\n if (macosPlatforms.indexOf(platform) !== -1) {\n os = 'macOS';\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 === 'macOS';\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);\nexport const IS_PWA = window.matchMedia('(display-mode: standalone)').matches\n|| (window.navigator as any).standalone\n|| document.referrer.includes('android-app://');\n\nexport const IS_TOUCH_ENV = window.matchMedia('(pointer: coarse)').matches;\n// Keep in mind the landscape orientation\nexport const IS_SINGLE_COLUMN_LAYOUT = window.innerWidth <= MOBILE_SCREEN_MAX_WIDTH || (\n window.innerWidth <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH && window.innerHeight <= MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT\n);\n// Special layout, 1 column while chat opened, 2 columns while collapsed\nexport const IS_TABLET_COLUMN_LAYOUT = !IS_SINGLE_COLUMN_LAYOUT && (\n window.innerWidth <= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n);\nexport const IS_VOICE_RECORDING_SUPPORTED = Boolean(\n navigator.mediaDevices && 'getUserMedia' in navigator.mediaDevices && (\n window.AudioContext || (window as any).webkitAudioContext\n ),\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'));\nexport const IS_CANVAS_FILTER_SUPPORTED = (\n !IS_TEST && 'filter' in (document.createElement('canvas').getContext('2d') || {})\n);\nexport const IS_REQUEST_FULLSCREEN_SUPPORTED = 'requestFullscreen' in document.createElement('div');\nexport const ARE_CALLS_SUPPORTED = !navigator.userAgent.includes('Firefox');\nexport const LAYERS_ANIMATION_NAME = IS_ANDROID ? 'slide-fade' : IS_IOS ? 'slide-layers' : 'push-slide';\n\nconst TEST_VIDEO = document.createElement('video');\nexport const IS_MOV_SUPPORTED = Boolean(\n TEST_VIDEO.canPlayType(VIDEO_MOV_TYPE).replace('no', '')\n || IS_IOS, // IOS reports '', but still plays .mov files\n);\n\nif (IS_MOV_SUPPORTED) SUPPORTED_VIDEO_CONTENT_TYPES.add(VIDEO_MOV_TYPE);\n\nexport const DPR = window.devicePixelRatio || 1;\n\nexport const MASK_IMAGE_DISABLED = true;\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 if (!video.videoWidth || !video.videoHeight) {\n resolve(undefined);\n }\n\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","import { LangCode } from '../types';\n\nexport function formatCurrency(totalPrice: number, currency?: string, locale: LangCode = 'en') {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n }).format(currency === 'JPY' ? totalPrice : totalPrice / 100);\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 { ApiError, ApiFieldError } 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 MESSAGE_TOO_LONG: 'Message is too long',\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 MESSAGE_TOO_LONG_PLEASE_REMOVE_CHARACTERS: 'The provided message 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 SCHEDULE_DATE_INVALID: 'Invalid schedule date provided',\n WALLPAPER_DIMENSIONS_INVALID: 'The wallpaper dimensions are invalid, please select another file',\n};\n\nexport const SHIPPING_ERRORS: Record = {\n ADDRESS_STREET_LINE1_INVALID: {\n field: 'streetLine1',\n message: 'Incorrect street address',\n },\n ADDRESS_STREET_LINE2_INVALID: {\n field: 'streetLine2',\n message: 'Incorrect street address',\n },\n ADDRESS_CITY_INVALID: {\n field: 'city',\n message: 'Incorrect city',\n },\n ADDRESS_COUNTRY_INVALID: {\n field: 'countryIso2',\n message: 'Incorrect country',\n },\n ADDRESS_POSTCODE_INVALID: {\n field: 'postCode',\n message: 'Incorrect post code',\n },\n ADDRESS_STATE_INVALID: {\n field: 'state',\n message: 'Incorrect state',\n },\n REQ_INFO_NAME_INVALID: {\n field: 'fullName',\n message: 'Incorrect name',\n },\n REQ_INFO_PHONE_INVALID: {\n field: 'phone',\n message: 'Incorrect phone',\n },\n REQ_INFO_EMAIL_INVALID: {\n field: 'email',\n message: 'Incorrect email',\n },\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\nexport function getShippingError(error: ApiError): ApiFieldError | undefined {\n return SHIPPING_ERRORS[error.message];\n}\n","import { DEBUG_ALERT_MSG } 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;\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 (APP_ENV === 'development' || APP_ENV === 'staging') {\n throttledAlert(`${DEBUG_ALERT_MSG}\\n\\n${(err?.message) || err}\\n${err?.stack}`);\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 { getGlobal } from '../lib/teact/teactn';\n\nimport { ApiLangPack, ApiLangString } from '../api/types';\nimport { LangCode, TimeFormat } from '../types';\n\nimport {\n DEFAULT_LANG_CODE, DEFAULT_LANG_PACK, LANG_CACHE_NAME, LANG_PACKS,\n} from '../config';\nimport * as cacheApi from './cacheApi';\nimport { callApi } from '../api/gramjs';\nimport { createCallbackManager } from './callbacks';\nimport { formatInteger } from './textFormat';\n\ninterface LangFn {\n (key: string, value?: any, format?: 'i'): any;\n\n isRtl?: boolean;\n code?: LangCode;\n timeFormat?: TimeFormat;\n}\n\nconst SUBSTITUTION_REGEX = /%\\d?\\$?[sdf@]/g;\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 | undefined;\nlet fallbackLangPack: ApiLangPack | undefined;\n\nconst {\n addCallback,\n removeCallback,\n runCallbacks,\n} = createCallbackManager();\n\nexport { addCallback, removeCallback };\n\nlet currentLangCode: string | undefined;\nlet currentTimeFormat: TimeFormat | undefined;\n\nexport const getTranslation: LangFn = (key: string, value?: any, format?: 'i') => {\n if (value !== undefined) {\n const cacheValue = Array.isArray(value) ? JSON.stringify(value) : value;\n const cached = cache.get(`${key}_${cacheValue}_${format}`);\n if (cached) {\n return cached;\n }\n }\n\n if (!langPack && !fallbackLangPack) {\n return key;\n }\n\n const langString = (langPack?.[key]) || (fallbackLangPack?.[key]);\n if (!langString) {\n if (!fallbackLangPack) {\n void importFallbackLangPack();\n }\n\n return key;\n }\n\n return processTranslation(langString, key, value, format);\n};\n\nexport async function getTranslationForLangString(langCode: string, key: string) {\n let translateString: ApiLangString | undefined = await cacheApi.fetch(\n LANG_CACHE_NAME,\n `${DEFAULT_LANG_PACK}_${langCode}_${key}`,\n cacheApi.Type.Json,\n );\n\n if (!translateString) {\n translateString = await fetchRemoteString(DEFAULT_LANG_PACK, langCode, key);\n }\n\n return processTranslation(translateString, key);\n}\n\nexport async function setLanguage(langCode: LangCode, callback?: NoneToVoidFunction, withFallback = false) {\n if (langPack && langCode === currentLangCode) {\n if (callback) {\n callback();\n }\n\n return;\n }\n\n let newLangPack = await cacheApi.fetch(LANG_CACHE_NAME, langCode, cacheApi.Type.Json);\n if (!newLangPack) {\n if (withFallback) {\n await importFallbackLangPack();\n }\n\n newLangPack = await fetchRemote(langCode);\n if (!newLangPack) {\n return;\n }\n }\n\n cache.clear();\n\n currentLangCode = langCode;\n langPack = newLangPack;\n document.documentElement.lang = langCode;\n\n const { languages, timeFormat } = getGlobal().settings.byKey;\n const langInfo = languages?.find((l) => l.langCode === langCode);\n getTranslation.isRtl = Boolean(langInfo?.rtl);\n getTranslation.code = langCode;\n getTranslation.timeFormat = timeFormat;\n\n if (callback) {\n callback();\n }\n\n runCallbacks();\n}\n\nexport function setTimeFormat(timeFormat: TimeFormat) {\n if (timeFormat && timeFormat === currentTimeFormat) {\n return;\n }\n\n currentTimeFormat = timeFormat;\n getTranslation.timeFormat = timeFormat;\n\n runCallbacks();\n}\n\nasync function importFallbackLangPack() {\n if (fallbackLangPack) {\n return;\n }\n\n fallbackLangPack = (await import('./fallbackLangPack')).default;\n runCallbacks();\n}\n\nasync function fetchRemote(langCode: string): Promise {\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\nasync function fetchRemoteString(\n remoteLangPack: typeof LANG_PACKS[number], langCode: string, key: string,\n): Promise {\n const remote = await callApi('fetchLangStrings', {\n langPack: remoteLangPack,\n langCode,\n keys: [key],\n });\n\n if (remote?.length) {\n await cacheApi.save(LANG_CACHE_NAME, `${remoteLangPack}_${langCode}_${key}`, remote[0]);\n\n return remote[0];\n }\n\n return undefined;\n}\n\nfunction getPluralOption(amount: number) {\n const langCode = currentLangCode || DEFAULT_LANG_CODE;\n const optionIndex = PLURAL_RULES[langCode as keyof typeof PLURAL_RULES]\n ? PLURAL_RULES[langCode as keyof typeof PLURAL_RULES](amount)\n : 0;\n\n return PLURAL_OPTIONS[optionIndex];\n}\n\nfunction processTemplate(template: string, value: any) {\n value = Array.isArray(value) ? value : [value];\n const translationSlices = template.split(SUBSTITUTION_REGEX);\n const initialValue = translationSlices.shift();\n\n return translationSlices.reduce((result, str, index) => {\n return `${result}${String(value[index] || '')}${str}`;\n }, initialValue || '');\n}\n\nfunction processTranslation(langString: ApiLangString | undefined, key: string, value?: any, format?: 'i') {\n const template = langString ? langString[typeof value === 'number' ? getPluralOption(value) : 'value'] : undefined;\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 const cacheValue = Array.isArray(value) ? JSON.stringify(value) : value;\n cache.set(`${key}_${cacheValue}_${format}`, result);\n return result;\n }\n\n return template;\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","const 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: Worker | undefined = new Worker(\n new URL('opus-recorder/dist/decoderWorker.min.js', import.meta.url),\n );\n let wavWorker: Worker | undefined = new Worker(new URL('opus-recorder/dist/waveWorker.min.js', import.meta.url));\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.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>();\nconst progressCallbacks = new Map>();\nconst cancellableCallbacks = new Map();\n\nexport function fetch(\n url: string,\n mediaFormat: T,\n isHtmlAllowed = false,\n onProgress?: ApiOnProgress,\n callbackUniqueId?: string,\n): Promise> {\n if (mediaFormat === ApiMediaFormat.Progressive) {\n return (\n IS_PROGRESSIVE_SUPPORTED\n ? getProgressive(url)\n : fetch(url, ApiMediaFormat.BlobUrl, isHtmlAllowed, onProgress, callbackUniqueId)\n ) as Promise>;\n }\n\n if (!fetchPromises.has(url)) {\n const promise = fetchFromCacheOrRemote(url, mediaFormat, isHtmlAllowed)\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 progressCallbacks.delete(url);\n cancellableCallbacks.delete(url);\n });\n\n fetchPromises.set(url, promise);\n }\n\n if (onProgress && callbackUniqueId) {\n let activeCallbacks = progressCallbacks.get(url);\n if (!activeCallbacks) {\n activeCallbacks = new Map();\n progressCallbacks.set(url, activeCallbacks);\n }\n activeCallbacks.set(callbackUniqueId, onProgress);\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 progressCallbacks.forEach((map, url) => {\n map.forEach((callback) => {\n if (callback === progressCallback) {\n const parentCallback = cancellableCallbacks.get(url);\n if (!parentCallback) return;\n\n cancelApiProgress(parentCallback);\n cancellableCallbacks.delete(url);\n progressCallbacks.delete(url);\n }\n });\n });\n}\n\nexport function removeCallback(url: string, callbackUniqueId: string) {\n const callbacks = progressCallbacks.get(url);\n if (!callbacks) return;\n callbacks.delete(callbackUniqueId);\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(\n url: string, mediaFormat: ApiMediaFormat, isHtmlAllowed: boolean,\n) {\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]!, isHtmlAllowed);\n\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 const onProgress = makeOnProgress(url, mediaSource, sourceBuffer);\n cancellableCallbacks.set(url, onProgress);\n\n void callApi('downloadMedia', { url, mediaFormat }, onProgress);\n });\n\n memoryCache.set(url, streamUrl);\n return streamUrl;\n }\n\n const onProgress = makeOnProgress(url);\n cancellableCallbacks.set(url, onProgress);\n\n const remote = await callApi('downloadMedia', { url, mediaFormat, isHtmlAllowed }, onProgress);\n if (!remote) {\n throw new Error(`Failed to fetch media ${url}`);\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 = media.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 }\n }\n\n memoryCache.set(url, prepared);\n\n return prepared;\n}\n\nfunction makeOnProgress(url: string, mediaSource?: MediaSource, sourceBuffer?: SourceBuffer) {\n const onProgress: ApiOnProgress = (progress: number, arrayBuffer: ArrayBuffer) => {\n progressCallbacks.get(url)?.forEach((callback) => {\n callback(progress);\n if (callback.isCanceled) onProgress.isCanceled = true;\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 return onProgress;\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","export const MEMO_EMPTY_ARRAY = [];\n","import { DEBUG } from '../config';\n\nexport enum Bundles {\n Auth,\n Main,\n Extra,\n Calls,\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 [Bundles.Calls]: typeof import('../bundles/calls');\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 case Bundles.Calls:\n LOAD_PROMISES[Bundles.Calls] = import('../bundles/calls');\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","import { callApi } from '../api/gramjs';\nimport {\n ApiChat, ApiMediaFormat, ApiMessage, ApiUser,\n} from '../api/types';\nimport { renderActionMessageText } from '../components/common/helpers/renderActionMessageText';\nimport { DEBUG, IS_TEST } from '../config';\nimport { getDispatch, getGlobal, setGlobal } from '../lib/teact/teactn';\nimport {\n getChatAvatarHash,\n getChatTitle,\n getMessageAction,\n getMessageSenderName,\n getMessageSummaryText,\n getPrivateChatUserId,\n isActionMessage,\n isChatChannel,\n selectIsChatMuted, selectShouldShowMessagePreview,\n} from '../modules/helpers';\nimport { getTranslation } from './langProvider';\nimport { addNotifyExceptions, replaceSettings } from '../modules/reducers';\nimport {\n selectChatMessage, selectNotifyExceptions, selectNotifySettings, selectUser,\n} from '../modules/selectors';\nimport { IS_SERVICE_WORKER_SUPPORTED } from './environment';\nimport * as mediaLoader from './mediaLoader';\nimport { debounce } from './schedulers';\n\nfunction getDeviceToken(subscription: PushSubscription) {\n const data = subscription.toJSON();\n return JSON.stringify({\n endpoint: data.endpoint,\n keys: data.keys,\n });\n}\n\nfunction checkIfPushSupported() {\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.warn('[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.warn('[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.warn('[PUSH] Push messaging isn\\'t supported.');\n }\n return false;\n }\n return true;\n}\n\nfunction checkIfNotificationsSupported() {\n // Let's check if the browser supports notifications\n if (!('Notification' in window)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] This browser does not support desktop notification');\n }\n return false;\n }\n\n if (Notification.permission === 'denied' as NotificationPermission) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] The user has blocked push notifications.');\n }\n return false;\n }\n return true;\n}\n\nconst expirationTime = 12 * 60 * 60 * 1000; // 12 hours\n// Notification id is removed from soundPlayed cache after 3 seconds\nconst soundPlayedDelay = 3 * 1000;\nconst soundPlayedIds = new Set();\n\nexport async function playNotifySound(id?: string, volume?: number) {\n if (id !== undefined && soundPlayedIds.has(id)) return;\n const { notificationSoundVolume } = selectNotifySettings(getGlobal());\n const currentVolume = volume ? volume / 10 : notificationSoundVolume / 10;\n if (currentVolume === 0) return;\n\n const audio = new Audio('./notification.mp3');\n audio.volume = currentVolume;\n audio.setAttribute('mozaudiochannel', 'notification');\n if (id !== undefined) {\n audio.addEventListener('ended', () => {\n soundPlayedIds.add(id);\n }, { once: true });\n\n setTimeout(() => {\n soundPlayedIds.delete(id);\n }, soundPlayedDelay);\n }\n\n try {\n await audio.play();\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] Unable to play notification sound');\n }\n }\n}\n\nexport const playNotifySoundDebounced = debounce(playNotifySound, 1000, true, false);\n\nfunction checkIfShouldResubscribe(subscription: PushSubscription | null) {\n const global = getGlobal();\n if (!global.push || !subscription) return true;\n if (getDeviceToken(subscription) !== global.push.deviceToken) return true;\n return Date.now() - global.push.subscribedAt > expirationTime;\n}\n\nasync function requestPermission() {\n if (!('Notification' in window)) return;\n if (!['granted', 'denied'].includes(Notification.permission)) {\n await Notification.requestPermission();\n }\n}\n\nasync function unsubscribeFromPush(subscription: PushSubscription | null) {\n const global = getGlobal();\n const dispatch = getDispatch();\n if (subscription) {\n try {\n const deviceToken = getDeviceToken(subscription);\n await callApi('unregisterDevice', deviceToken);\n await subscription.unsubscribe();\n dispatch.deleteDeviceToken();\n return;\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 if (global.push) {\n await callApi('unregisterDevice', global.push.deviceToken);\n dispatch.deleteDeviceToken();\n }\n}\n\nexport async function unsubscribe() {\n if (!checkIfPushSupported()) return;\n const serviceWorkerRegistration = await navigator.serviceWorker.ready;\n const subscription = await serviceWorkerRegistration.pushManager.getSubscription();\n await unsubscribeFromPush(subscription);\n}\n\n// Indicates if notification settings are loaded from the api\nlet areSettingsLoaded = false;\n\n// Load notification settings from the api\nasync function loadNotificationSettings() {\n if (areSettingsLoaded) return selectNotifySettings(getGlobal());\n const [resultSettings, resultExceptions] = await Promise.all([\n callApi('fetchNotificationSettings', {\n serverTimeOffset: getGlobal().serverTimeOffset,\n }),\n callApi('fetchNotificationExceptions', {\n serverTimeOffset: getGlobal().serverTimeOffset,\n }),\n ]);\n if (!resultSettings) return selectNotifySettings(getGlobal());\n\n let global = replaceSettings(getGlobal(), resultSettings);\n if (resultExceptions) {\n global = addNotifyExceptions(global, resultExceptions);\n }\n setGlobal(global);\n areSettingsLoaded = true;\n return selectNotifySettings(global);\n}\n\nexport async function subscribe() {\n if (!checkIfPushSupported()) {\n // Ask for notification permissions only if service worker notifications are not supported\n // As pushManager.subscribe automatically triggers permission popup\n await requestPermission();\n return;\n }\n const serviceWorkerRegistration = await navigator.serviceWorker.ready;\n let subscription = await serviceWorkerRegistration.pushManager.getSubscription();\n if (!checkIfShouldResubscribe(subscription)) return;\n await unsubscribeFromPush(subscription);\n try {\n 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 getDispatch()\n .setDeviceToken(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.warn('[PUSH] The user has blocked push notifications.');\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 // Request permissions and fall back to local notifications\n // if pushManager.subscribe was aborted due to invalid VAPID key.\n if (error.code === DOMException.ABORT_ERR) {\n await requestPermission();\n }\n }\n }\n}\n\nfunction checkIfShouldNotify(chat: ApiChat) {\n if (!areSettingsLoaded) return false;\n const global = getGlobal();\n const isMuted = selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global));\n if (isMuted || chat.isNotJoined || !chat.isListed) {\n return false;\n }\n\n return !document.hasFocus();\n}\n\nfunction getNotificationContent(chat: ApiChat, message: ApiMessage) {\n const global = getGlobal();\n const {\n senderId,\n replyToMessageId,\n } = message;\n\n const messageSender = senderId ? selectUser(global, senderId) : undefined;\n const messageAction = getMessageAction(message as ApiMessage);\n const actionTargetMessage = messageAction && replyToMessageId\n ? selectChatMessage(global, chat.id, replyToMessageId)\n : undefined;\n const {\n targetUserIds: actionTargetUserIds,\n targetChatId: actionTargetChatId,\n } = messageAction || {};\n\n const actionTargetUsers = actionTargetUserIds\n ? actionTargetUserIds.map((userId) => selectUser(global, userId))\n .filter(Boolean as any)\n : undefined;\n const privateChatUserId = getPrivateChatUserId(chat);\n const privateChatUser = privateChatUserId ? selectUser(global, privateChatUserId) : undefined;\n\n let body: string;\n if (selectShouldShowMessagePreview(chat, selectNotifySettings(global), selectNotifyExceptions(global))) {\n if (isActionMessage(message)) {\n const actionOrigin = chat && (isChatChannel(chat) || message.senderId === message.chatId)\n ? chat\n : messageSender;\n body = renderActionMessageText(\n getTranslation,\n message,\n actionOrigin,\n actionTargetUsers,\n actionTargetMessage,\n actionTargetChatId,\n { asPlain: true },\n ) as string;\n } else {\n const senderName = getMessageSenderName(getTranslation, chat.id, messageSender);\n const summary = getMessageSummaryText(getTranslation, message);\n\n body = senderName ? `${senderName}: ${summary}` : summary;\n }\n } else {\n body = 'New message';\n }\n\n return {\n title: getChatTitle(getTranslation, chat, privateChatUser),\n body,\n };\n}\n\nasync function getAvatar(chat: ApiChat) {\n const imageHash = getChatAvatarHash(chat);\n if (!imageHash) return undefined;\n let mediaData = mediaLoader.getFromMemory(imageHash);\n if (!mediaData) {\n await mediaLoader.fetch(imageHash, ApiMediaFormat.BlobUrl);\n mediaData = mediaLoader.getFromMemory(imageHash);\n }\n return mediaData;\n}\n\nexport async function notifyAboutNewMessage({\n chat,\n message,\n}: { chat: ApiChat; message: Partial }) {\n const { hasWebNotifications } = await loadNotificationSettings();\n if (!checkIfShouldNotify(chat)) return;\n const areNotificationsSupported = checkIfNotificationsSupported();\n if (!hasWebNotifications || !areNotificationsSupported) {\n // only play sound if web notifications are disabled\n playNotifySoundDebounced(String(message.id) || chat.id);\n return;\n }\n if (!areNotificationsSupported) return;\n if (!message.id) return;\n\n const {\n title,\n body,\n } = getNotificationContent(chat, message as ApiMessage);\n\n const icon = await getAvatar(chat);\n\n if (checkIfPushSupported()) {\n if (navigator.serviceWorker?.controller) {\n // notify service worker about new message notification\n navigator.serviceWorker.controller.postMessage({\n type: 'newMessageNotification',\n payload: {\n title,\n body,\n icon,\n chatId: chat.id,\n messageId: message.id,\n },\n });\n }\n } else {\n const dispatch = getDispatch();\n const options: NotificationOptions = {\n body,\n icon,\n badge: icon,\n tag: String(message.id),\n };\n\n if ('vibrate' in navigator) {\n options.vibrate = [200, 100, 200];\n }\n\n const notification = new Notification(title, options);\n\n notification.onclick = () => {\n notification.close();\n dispatch.focusMessage({\n chatId: chat.id,\n messageId: message.id,\n });\n if (window.focus) {\n window.focus();\n }\n };\n\n // Play sound when notification is displayed\n notification.onshow = () => {\n playNotifySoundDebounced(String(message.id) || chat.id);\n };\n }\n}\n\nexport function closeMessageNotifications(payload: { chatId: string; lastReadInboxMessageId?: number }) {\n if (IS_TEST || !navigator.serviceWorker?.controller) return;\n navigator.serviceWorker.controller.postMessage({\n type: 'closeMessageNotifications',\n payload,\n });\n}\n\n// Notify service worker that client is fully loaded\nexport function notifyClientReady() {\n if (!navigator.serviceWorker?.controller) return;\n navigator.serviceWorker.controller.postMessage({\n type: 'clientReady',\n });\n}\n","import { ApiCountryCode } from '../api/types';\nimport { flatten } from './iteratees';\n\nconst PATTERN_PLACEHOLDER = 'X';\nconst DEFAULT_PATTERN = 'XXX XXX XXX XXX';\n\nexport function getCountryCodesByIso(phoneCodeList: ApiCountryCode[], iso: string) {\n return phoneCodeList.filter((country) => country.iso2 === iso);\n}\n\nexport function getCountryFromPhoneNumber(phoneCodeList: ApiCountryCode[], input = '') {\n let phoneNumber = input.replace(/[^\\d+]+/g, '');\n if (phoneNumber.startsWith('+')) {\n phoneNumber = phoneNumber.substr(1);\n }\n\n const possibleCountries = phoneCodeList\n .filter((country) => phoneNumber.startsWith(country.countryCode));\n const codesWithPrefix: { code: string; country: ApiCountryCode }[] = flatten(possibleCountries\n .map((country) => (country.prefixes || ['']).map((prefix) => {\n return {\n code: `${country.countryCode}${prefix}`,\n country,\n };\n })));\n\n const bestMatches = codesWithPrefix\n .filter(({ code }) => phoneNumber.startsWith(code))\n .sort((a, b) => a.code.length - b.code.length);\n\n return bestMatches[bestMatches.length - 1]?.country;\n}\n\nexport function formatPhoneNumber(input: string, country?: ApiCountryCode) {\n let phoneNumber = input.replace(/[^\\d]+/g, '');\n if (country) {\n phoneNumber = phoneNumber.substr(country.countryCode.length);\n } else if (input.startsWith('+')) {\n return input;\n }\n const pattern = getBestPattern(phoneNumber, country?.patterns);\n\n const result: string[] = []; // Result character array\n let j = 0; // Position inside pattern\n for (let i = 0; i < phoneNumber.length; i++) {\n while (pattern[j] !== PATTERN_PLACEHOLDER && j < pattern.length) {\n result.push(pattern[j]);\n if (pattern[j] === phoneNumber[i]) { // If pattern contains digits, move input position too\n i++;\n if (i === phoneNumber.length) break; // But don't overdo it, or it will insert full pattern unexpectedly\n }\n j++;\n }\n\n result.push(phoneNumber[i]); // For placeholder characters, setting current input digit\n j++;\n }\n\n return result.join('');\n}\n\nfunction getBestPattern(numberWithoutCode: string, patterns?: string[]) {\n if (!patterns || patterns.length === 0) return DEFAULT_PATTERN;\n if (patterns.length === 1) return patterns[0];\n\n const defaultPattern = patterns.find((pattern) => pattern.startsWith(PATTERN_PLACEHOLDER)) || DEFAULT_PATTERN;\n\n const bestMatches = patterns.filter((pattern) => {\n const stripped = pattern.replace(/[^\\dX]+/g, '');\n if (stripped.startsWith(PATTERN_PLACEHOLDER)) return false; // Don't consider default number format here\n for (let i = 0; i < numberWithoutCode.length; i++) {\n if (i > stripped.length - 1 || (stripped[i] !== PATTERN_PLACEHOLDER && stripped[i] !== numberWithoutCode[i])) {\n return false;\n }\n }\n return true;\n });\n\n // Playing it safe: if not sure, use default for that region\n return bestMatches.length === 1 ? bestMatches[0] : defaultPattern;\n}\n\nexport function formatPhoneNumberWithCode(phoneCodeList: ApiCountryCode[], phoneNumber: string) {\n const numberWithPlus = phoneNumber.startsWith('+') ? phoneNumber : `+${phoneNumber}`;\n const country = getCountryFromPhoneNumber(phoneCodeList, numberWithPlus);\n if (!country) {\n return numberWithPlus;\n }\n return `+${country.countryCode} ${formatPhoneNumber(numberWithPlus, country)}`;\n}\n","import { MessageList, MessageListType } from '../global/types';\nimport { MAIN_THREAD_ID } from '../api/types';\n\nexport const createMessageHash = (messageList: MessageList): string => (\n messageList.chatId.toString()\n + (messageList.type !== 'thread' ? `_${messageList.type}`\n : (messageList.threadId !== -1 ? `_${messageList.threadId}` : ''))\n);\n\nexport const parseLocationHash = (value: string): MessageList | undefined => {\n if (!value) return undefined;\n\n const [chatId, typeOrThreadId] = value.replace(/^#/, '').split('_');\n\n if (!chatId) return undefined;\n\n const isType = ['thread', 'pinned', 'scheduled'].includes(typeOrThreadId);\n\n return {\n chatId,\n type: !!typeOrThreadId && isType ? (typeOrThreadId as MessageListType) : 'thread',\n threadId: !!typeOrThreadId && !isType ? Number(typeOrThreadId) : MAIN_THREAD_ID,\n };\n};\n","type Scheduler =\n typeof requestAnimationFrame\n | typeof onTickEnd\n | 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(fastRafPrimary, 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 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 fastRaf(resolve);\n });\n}\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\nlet fastRafPrimaryCallbacks: NoneToVoidFunction[] | undefined;\n\n// May result in an immediate execution if called from another `requestAnimationFrame` callback\nexport function fastRaf(callback: NoneToVoidFunction, isPrimary = false) {\n if (!fastRafCallbacks) {\n fastRafCallbacks = isPrimary ? [] : [callback];\n fastRafPrimaryCallbacks = isPrimary ? [callback] : [];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n const currentPrimaryCallbacks = fastRafPrimaryCallbacks!;\n fastRafCallbacks = undefined;\n fastRafPrimaryCallbacks = undefined;\n currentPrimaryCallbacks.forEach((cb) => cb());\n currentCallbacks.forEach((cb) => cb());\n });\n } else if (isPrimary) {\n fastRafPrimaryCallbacks!.push(callback);\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nexport function fastRafPrimary(callback: NoneToVoidFunction) {\n fastRaf(callback, true);\n}\n\nlet onTickEndCallbacks: NoneToVoidFunction[] | undefined;\nlet onTickEndPrimaryCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function onTickEnd(callback: NoneToVoidFunction, isPrimary = false) {\n if (!onTickEndCallbacks) {\n onTickEndCallbacks = isPrimary ? [] : [callback];\n onTickEndPrimaryCallbacks = isPrimary ? [callback] : [];\n\n Promise.resolve().then(() => {\n const currentCallbacks = onTickEndCallbacks!;\n const currentPrimaryCallbacks = onTickEndPrimaryCallbacks!;\n onTickEndCallbacks = undefined;\n onTickEndPrimaryCallbacks = undefined;\n currentPrimaryCallbacks.forEach((cb) => cb());\n currentCallbacks.forEach((cb) => cb());\n });\n } else if (isPrimary) {\n onTickEndPrimaryCallbacks!.push(callback);\n } else {\n onTickEndCallbacks.push(callback);\n }\n}\n\nexport function onTickEndPrimary(callback: NoneToVoidFunction) {\n onTickEnd(callback, true);\n}\n\nlet beforeUnloadCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function onBeforeUnload(callback: NoneToVoidFunction, isLast = false) {\n if (!beforeUnloadCallbacks) {\n beforeUnloadCallbacks = [];\n // eslint-disable-next-line no-restricted-globals\n self.addEventListener('beforeunload', () => {\n beforeUnloadCallbacks!.forEach((cb) => cb());\n });\n }\n\n if (isLast) {\n beforeUnloadCallbacks.push(callback);\n } else {\n beforeUnloadCallbacks.unshift(callback);\n }\n\n return () => {\n beforeUnloadCallbacks = beforeUnloadCallbacks!.filter((cb) => cb !== callback);\n };\n}\n","let RE_NOT_LETTER: RegExp;\n\ntry {\n RE_NOT_LETTER = new RegExp('[^\\\\p{L}\\\\p{M}]+', 'ui');\n} catch (e) {\n // Support for older versions of firefox\n RE_NOT_LETTER = new RegExp('[^\\\\wа-яё]+', 'i');\n}\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","export const getServerTime = (serverTimeOffset: number) => {\n return Math.floor(Date.now() / 1000) + serverTimeOffset;\n};\n","import safariFix from 'safari-14-idb-fix';\n\nfunction promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n const dbp = safariFix().then(() => {\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n return promisifyRequest(request);\n });\n return (txMode, callback) => dbp.then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(customStore, callback) {\n return customStore('readonly', (store) => {\n // This would be store.getAllKeys(), but it isn't supported by Edge or Safari.\n // And openKeyCursor isn't supported by Safari.\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n const items = [];\n return eachCursor(customStore, (cursor) => items.push(cursor.key)).then(() => items);\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n const items = [];\n return eachCursor(customStore, (cursor) => items.push(cursor.value)).then(() => items);\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n const items = [];\n return eachCursor(customStore, (cursor) => items.push([cursor.key, cursor.value])).then(() => items);\n}\n\nexport { clear, createStore, del, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","/**\n * https://bugs.webkit.org/show_bug.cgi?id=226547\n * Safari has a horrible bug where IDB requests can hang while the browser is starting up.\n * The only solution is to keep nudging it until it's awake.\n * This probably creates garbage, but garbage is better than totally failing.\n */\nfunction idbReady() {\n const isSafari = !navigator.userAgentData &&\n /Safari\\//.test(navigator.userAgent) &&\n !/Chrom(e|ium)\\//.test(navigator.userAgent);\n // No point putting other browsers or older versions of Safari through this mess.\n if (!isSafari || !indexedDB.databases)\n return Promise.resolve();\n let intervalId;\n return new Promise((resolve) => {\n const tryIdb = () => indexedDB.databases().finally(resolve);\n intervalId = setInterval(tryIdb, 100);\n tryIdb();\n }).finally(() => clearInterval(intervalId));\n}\n\nexport default idbReady;\n","import * as idb from 'idb-keyval';\n\nimport { ApiSessionData } from '../api/types';\n\nimport { DEBUG, LEGACY_SESSION_KEY, SESSION_USER_KEY } from '../config';\nimport * as cacheApi from './cacheApi';\n\nconst DC_IDS = [1, 2, 3, 4, 5];\n\nexport function hasStoredSession(withLegacy = false) {\n if (withLegacy && localStorage.getItem(LEGACY_SESSION_KEY)) {\n return true;\n }\n\n const userAuthJson = localStorage.getItem(SESSION_USER_KEY);\n if (!userAuthJson) return false;\n\n try {\n const userAuth = JSON.parse(userAuthJson);\n return Boolean(userAuth && userAuth.id && userAuth.dcID);\n } catch (err) {\n // Do nothing.\n return false;\n }\n}\n\nexport function storeSession(sessionData: ApiSessionData, currentUserId?: string) {\n const { mainDcId, keys, hashes } = sessionData;\n\n localStorage.setItem(SESSION_USER_KEY, JSON.stringify({ dcID: mainDcId, id: currentUserId }));\n localStorage.setItem('dc', String(mainDcId));\n Object.keys(keys).map(Number).forEach((dcId) => {\n localStorage.setItem(`dc${dcId}_auth_key`, JSON.stringify(keys[dcId]));\n });\n\n if (hashes) {\n Object.keys(hashes).map(Number).forEach((dcId) => {\n localStorage.setItem(`dc${dcId}_hash`, JSON.stringify(hashes[dcId]));\n });\n }\n}\n\nexport function clearStoredSession() {\n [\n SESSION_USER_KEY,\n 'dc',\n ...DC_IDS.map((dcId) => `dc${dcId}_auth_key`),\n ...DC_IDS.map((dcId) => `dc${dcId}_hash`),\n ].forEach((key) => {\n localStorage.removeItem(key);\n });\n}\n\nexport function loadStoredSession(): ApiSessionData | undefined {\n if (!hasStoredSession()) {\n return undefined;\n }\n\n const userAuth = JSON.parse(localStorage.getItem(SESSION_USER_KEY)!);\n const mainDcId = Number(userAuth.dcID);\n const keys: Record = {};\n const hashes: Record = {};\n\n DC_IDS.forEach((dcId) => {\n try {\n const key = localStorage.getItem(`dc${dcId}_auth_key`);\n if (key) {\n keys[dcId] = JSON.parse(key);\n }\n\n const hash = localStorage.getItem(`dc${dcId}_hash`);\n if (hash) {\n hashes[dcId] = JSON.parse(hash);\n }\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('Failed to load stored session', err);\n }\n // Do nothing.\n }\n });\n\n if (!Object.keys(keys).length) return undefined;\n\n return {\n mainDcId,\n keys,\n hashes,\n };\n}\n\nexport async function importLegacySession() {\n const sessionId = localStorage.getItem(LEGACY_SESSION_KEY);\n if (!sessionId) return;\n\n const sessionJson = await idb.get(`GramJs:${sessionId}`);\n try {\n const sessionData = JSON.parse(sessionJson) as ApiSessionData;\n storeSession(sessionData);\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('Failed to load legacy session', err);\n }\n // Do nothing.\n }\n}\n\n// Remove previously created IndexedDB and cache API sessions\nexport async function clearLegacySessions() {\n localStorage.removeItem(LEGACY_SESSION_KEY);\n\n const idbKeys = await idb.keys();\n\n await Promise.all>([\n cacheApi.clear('GramJs'),\n ...idbKeys\n .filter((k) => typeof k === 'string' && k.startsWith('GramJs:GramJs-session-'))\n .map((k) => idb.del(k)),\n ]);\n}\n\nexport function importTestSession() {\n const sessionJson = process.env.TEST_SESSION!;\n try {\n const sessionData = JSON.parse(sessionJson) as ApiSessionData & { userId: string };\n storeSession(sessionData, sessionData.userId);\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('Failed to load test session', err);\n }\n // Do nothing.\n }\n}\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;\nconst RGB_VARIABLES = new Set([\n '--color-primary-shade',\n '--color-text-secondary',\n]);\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('no-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('no-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 if (RGB_VARIABLES.has(property)) {\n document.documentElement.style.setProperty(`${property}-rgb`, `${r},${g},${b}`);\n }\n });\n}\n","import EMOJI_REGEX from '../lib/twemojiRegex';\nimport { fixNonStandardEmoji } from './emoji';\n\nexport 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) => {\n if (!word.length) return '';\n word = fixNonStandardEmoji(word);\n const emojis = word.match(EMOJI_REGEX);\n if (emojis && word.startsWith(emojis[0])) {\n return emojis[0];\n }\n return word.match(/./u)![0].toUpperCase();\n })\n .join('');\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 { isWebpSupported } from './environment';\nimport { dataUriToBlob, blobToDataUri } from './files';\nimport { pause } from './schedulers';\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, dataUri: string): Promise {\n if (isWebpSupported() || dataUri.substr(0, 15) !== 'data:image/webp') {\n return dataUri;\n }\n\n initWebpWorker();\n\n const pngBlob = await webpToPng(key, dataUriToBlob(dataUri));\n\n if (!pngBlob) {\n throw new Error(`Can't convert webp to png. Url: ${dataUri}`);\n }\n\n return blobToDataUri(pngBlob);\n}\n\nfunction initWebpWorker() {\n if (!worker) {\n worker = new Worker(new URL('../lib/webp/webp_wasm.worker.js', import.meta.url)) 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 if (!worker.requests) {\n worker.requests = new Map();\n }\n\n worker.requests.set(url, resolve);\n worker.postMessage({ id: url, blob });\n });\n}\n","import { APP_VERSION, DEBUG } from '../config';\nimport { getGlobal } from '../lib/teact/teactn';\nimport { hasStoredSession } from './sessions';\n\nconst WEBSYNC_URLS = [\n 't.me',\n 'telegram.me',\n].map((domain) => `//${domain}/_websync_?`);\nconst WEBSYNC_VERSION = `${APP_VERSION} Z`;\nconst WEBSYNC_KEY = 'tgme_sync';\nconst WEBSYNC_TIMEOUT = 86400;\n\nconst getTs = () => {\n return Math.floor(Number(new Date()) / 1000);\n};\n\nconst saveSync = (authed: boolean) => {\n const ts = getTs();\n localStorage.setItem(WEBSYNC_KEY, JSON.stringify({\n canRedirect: authed,\n ts,\n }));\n};\n\nlet lastTimeout: NodeJS.Timeout | undefined;\n\nexport const forceWebsync = (authed: boolean) => {\n const currentTs = getTs();\n\n const { canRedirect, ts } = JSON.parse(localStorage.getItem(WEBSYNC_KEY) || '{}');\n\n if (canRedirect !== authed || ts + WEBSYNC_TIMEOUT <= currentTs) {\n return Promise.all(WEBSYNC_URLS.map((url) => {\n return new Promise((resolve, reject) => {\n const script = document.createElement('script');\n\n const removeElement = () => !!document.body.removeChild(script);\n\n script.src = url + new URLSearchParams({\n authed: Number(authed).toString(),\n version: WEBSYNC_VERSION,\n });\n\n document.body.appendChild(script);\n\n script.onload = () => {\n saveSync(authed);\n removeElement();\n if (lastTimeout) {\n clearTimeout(lastTimeout);\n lastTimeout = undefined;\n }\n startWebsync();\n resolve();\n };\n\n script.onerror = () => {\n removeElement();\n reject();\n };\n });\n }));\n } else {\n return Promise.resolve();\n }\n};\n\nexport function startWebsync() {\n if (DEBUG) {\n return;\n }\n\n if (lastTimeout !== undefined) return;\n const currentTs = getTs();\n\n const { ts } = JSON.parse(localStorage.getItem(WEBSYNC_KEY) || '{}');\n\n const timeout = WEBSYNC_TIMEOUT - (currentTs - ts);\n\n lastTimeout = setTimeout(() => {\n const { authState } = getGlobal();\n\n const authed = authState === 'authorizationStateReady' || hasStoredSession(true);\n forceWebsync(authed);\n }, Math.max(0, timeout * 1000));\n}\n","import { throttle } from './schedulers';\nimport {\n MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT,\n MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH,\n MOBILE_SCREEN_MAX_WIDTH,\n} from '../config';\nimport { IS_IOS, IS_SINGLE_COLUMN_LAYOUT } from './environment';\n\ntype IDimensions = {\n width: number;\n height: number;\n};\n\nconst IS_LANDSCAPE = IS_SINGLE_COLUMN_LAYOUT && isLandscape();\n\nconst initialHeight = window.innerHeight;\nlet windowSize = updateSizes();\nlet isRefreshDisabled = false;\n\nfunction disableRefresh() {\n isRefreshDisabled = true;\n}\n\nfunction enableRefresh() {\n isRefreshDisabled = false;\n}\n\nconst handleResize = throttle(() => {\n windowSize = updateSizes();\n\n if (!isRefreshDisabled && (\n isMobileScreen() !== IS_SINGLE_COLUMN_LAYOUT\n || (IS_SINGLE_COLUMN_LAYOUT && IS_LANDSCAPE !== isLandscape())\n )) {\n window.location.reload();\n }\n}, 250, true);\n\nwindow.addEventListener('orientationchange', handleResize);\nif (IS_IOS) {\n window.visualViewport.addEventListener('resize', handleResize);\n} else {\n window.addEventListener('resize', handleResize);\n}\n\nexport function updateSizes(): IDimensions {\n let height: number;\n if (IS_IOS) {\n height = window.visualViewport.height + window.visualViewport.pageTop;\n } else {\n height = window.innerHeight;\n }\n const vh = height * 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\nfunction isMobileScreen() {\n return windowSize.width <= MOBILE_SCREEN_MAX_WIDTH || (\n windowSize.width <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH && windowSize.height <= MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT\n );\n}\n\nfunction isLandscape() {\n if (IS_IOS) {\n return window.matchMedia('(orientation: landscape)').matches;\n }\n\n // eslint-disable-next-line max-len\n // Source: https://web.archive.org/web/20160509220835/http://blog.abouthalf.com/development/orientation-media-query-challenges-in-android-browsers/\n // Feature is marked as deprecated now, but it is still supported\n // https://developer.mozilla.org/en-US/docs/Web/CSS/@media/device-aspect-ratio#browser_compatibility\n return window.matchMedia('screen and (min-device-aspect-ratio: 1/1) and (orientation: landscape)').matches;\n}\n\nexport default {\n get: () => windowSize,\n getIsKeyboardVisible: () => initialHeight > windowSize.height,\n disableRefresh,\n enableRefresh,\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + {\"99\":\"f03a947e6e336feffec8\",\"133\":\"48263fce9542c3e0b864\",\"161\":\"286d0207d962142ad548\",\"211\":\"1fd3812a4d5830a98eb6\",\"354\":\"5a81437dab6fff49c131\",\"472\":\"21e5264f606f2b525030\",\"501\":\"72ce4b6e27f459e194cd\",\"524\":\"85ca6db6bb78d08e40d5\",\"536\":\"55dc7dd4ab42a2c9f037\",\"701\":\"f1f158c205e1345450d1\",\"745\":\"9316c5c2b711c39a20a5\",\"757\":\"e669f135f9dce66de020\",\"824\":\"99496e45ca79e9811441\",\"884\":\"6755b1740504dc00dac9\",\"915\":\"13af1c4ab9a00d84ac23\",\"927\":\"15e315c28998f346b75d\",\"941\":\"aad13fbc78f9d63ec948\",\"943\":\"33a4b193ecb893d99436\",\"993\":\"f0aad9f6787f211b4e51\"}[chunkId] + \".js\";\n};","// This function allow to reference all chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + {\"133\":\"48263fce9542c3e0b864\",\"211\":\"1fd3812a4d5830a98eb6\",\"472\":\"21e5264f606f2b525030\",\"701\":\"f1f158c205e1345450d1\",\"757\":\"e669f135f9dce66de020\",\"943\":\"33a4b193ecb893d99436\"}[chunkId] + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t179: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\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\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkIds[i]] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunktelegram_t\"] = self[\"webpackChunktelegram_t\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","import { DEBUG } from '../config';\nimport { getDispatch } from '../lib/teact/teactn';\nimport { IS_ANDROID, IS_IOS, IS_SERVICE_WORKER_SUPPORTED } from './environment';\nimport { notifyClientReady, playNotifySoundDebounced } from './notifications';\n\ntype WorkerAction = {\n type: string;\n payload: Record;\n};\n\nfunction handleWorkerMessage(e: MessageEvent) {\n const action: WorkerAction = e.data;\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] Message from worker', action);\n }\n if (!action.type) return;\n const dispatch = getDispatch();\n switch (action.type) {\n case 'focusMessage':\n if (dispatch.focusMessage) {\n dispatch.focusMessage(action.payload);\n }\n break;\n case 'playNotificationSound':\n playNotifySoundDebounced(action.payload.id);\n break;\n }\n}\n\nfunction subscribeToWorker() {\n navigator.serviceWorker.removeEventListener('message', handleWorkerMessage);\n navigator.serviceWorker.addEventListener('message', handleWorkerMessage);\n // Notify web worker that client is ready to receive messages\n notifyClientReady();\n}\n\nif (IS_SERVICE_WORKER_SUPPORTED) {\n window.addEventListener('load', async () => {\n try {\n await navigator.serviceWorker.register(new URL('../serviceWorker.ts', import.meta.url));\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] 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('[SW] ServiceWorker ready');\n }\n subscribeToWorker();\n } else {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('[SW] ServiceWorker not available');\n }\n\n if (!IS_IOS && !IS_ANDROID) {\n getDispatch().showDialog({ data: { message: 'SERVICE_WORKER_DISABLED', hasErrorKey: true } });\n }\n }\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('[SW] ServiceWorker registration failed: ', err);\n }\n }\n });\n window.addEventListener('focus', async () => {\n await navigator.serviceWorker.ready;\n subscribeToWorker();\n });\n}\n","import { GlobalState } from './types';\nimport { NewChatMembersProgress } from '../types';\n\nimport {\n ANIMATION_LEVEL_DEFAULT, DARK_THEME_PATTERN_COLOR, DEFAULT_MESSAGE_TEXT_SIZE_PX, DEFAULT_PATTERN_COLOR,\n DEFAULT_PLAYBACK_RATE,\n DEFAULT_VOLUME,\n IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX, MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX,\n} from '../config';\nimport { IS_IOS, IS_MAC_OS } from '../util/environment';\n\nexport const INITIAL_STATE: GlobalState = {\n isLeftColumnShown: true,\n isChatInfoShown: false,\n newChatMembersProgress: NewChatMembersProgress.Closed,\n uiReadyState: 0,\n serverTimeOffset: 0,\n\n authRememberMe: true,\n countryList: {\n phoneCodes: [],\n general: [],\n },\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 messageLists: [],\n },\n\n groupCalls: {\n byId: {},\n },\n\n scheduledMessages: {\n byChatId: {},\n },\n\n chatFolders: {\n byId: {},\n activeChatFolder: 0,\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 greeting: {\n stickers: [],\n },\n featured: {\n setIds: [],\n },\n search: {},\n forEmoji: {},\n },\n\n emojiKeywords: {},\n\n gifs: {\n saved: {},\n search: {},\n },\n\n inlineBots: {\n isLoading: false,\n byUsername: {},\n },\n\n globalSearch: {},\n\n userSearch: {},\n\n localTextSearch: {\n byChatThreadKey: {},\n },\n\n localMediaSearch: {\n byChatId: {},\n },\n\n management: {\n byChatId: {},\n },\n\n topPeers: {},\n\n topInlineBots: {},\n\n mediaViewer: {},\n\n audioPlayer: {\n volume: DEFAULT_VOLUME,\n playbackRate: DEFAULT_PLAYBACK_RATE,\n isMuted: false,\n },\n\n forwardMessages: {},\n\n pollResults: {},\n\n payment: {},\n\n notifications: [],\n\n dialogs: [],\n\n activeSessions: [],\n\n settings: {\n byKey: {\n theme: 'light',\n shouldUseSystemTheme: true,\n messageTextSize: IS_IOS\n ? IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX\n : (IS_MAC_OS ? MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX : DEFAULT_MESSAGE_TEXT_SIZE_PX),\n animationLevel: ANIMATION_LEVEL_DEFAULT,\n messageSendKeyCombo: 'enter',\n canAutoLoadPhotoFromContacts: true,\n canAutoLoadPhotoInPrivateChats: true,\n canAutoLoadPhotoInGroups: true,\n canAutoLoadPhotoInChannels: true,\n canAutoLoadVideoFromContacts: true,\n canAutoLoadVideoInPrivateChats: true,\n canAutoLoadVideoInGroups: true,\n canAutoLoadVideoInChannels: true,\n canAutoLoadFileFromContacts: false,\n canAutoLoadFileInPrivateChats: false,\n canAutoLoadFileInGroups: false,\n canAutoLoadFileInChannels: false,\n autoLoadFileMaxSizeMb: 10,\n hasWebNotifications: true,\n hasPushNotifications: true,\n notificationSoundVolume: 5,\n canAutoPlayGifs: true,\n canAutoPlayVideos: true,\n shouldSuggestStickers: true,\n shouldLoopStickers: true,\n language: 'en',\n timeFormat: '24h',\n wasTimeFormatSetManually: false,\n },\n themes: {\n light: {\n isBlurred: true,\n patternColor: DEFAULT_PATTERN_COLOR,\n },\n dark: {\n isBlurred: true,\n patternColor: DARK_THEME_PATTERN_COLOR,\n },\n },\n privacy: {},\n notifyExceptions: {},\n },\n\n twoFaSettings: {},\n\n shouldShowContextMenuHint: true,\n\n activeDownloads: {\n byChatId: {},\n },\n\n serviceNotifications: [],\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 { onBeforeUnload, 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 MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n GLOBAL_STATE_CACHE_USER_LIST_LIMIT,\n DEFAULT_VOLUME,\n DEFAULT_PLAYBACK_RATE,\n} from '../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../util/environment';\nimport { ANIMATION_END_EVENT, ANIMATION_START_EVENT } from '../hooks/useHeavyAnimationCheck';\nimport { pick } from '../util/iteratees';\nimport { selectCurrentMessageList } from '../modules/selectors';\nimport { hasStoredSession } from '../util/sessions';\nimport { INITIAL_STATE } from './initial';\nimport { parseLocationHash } from '../util/routing';\nimport { LOCATION_HASH } from '../hooks/useHistoryBack';\nimport { isUserId } from '../modules/helpers';\n\nconst UPDATE_THROTTLE = 5000;\n\nconst updateCacheThrottled = throttle(() => onIdle(updateCache), UPDATE_THROTTLE, false);\n\nlet isCaching = false;\nlet isHeavyAnimating = false;\nlet unsubscribeFromBeforeUnload: NoneToVoidFunction | undefined;\n\nsetupHeavyAnimationListeners();\n\nexport function initCache() {\n if (GLOBAL_STATE_CACHE_DISABLED) {\n return;\n }\n\n addReducer('saveSession', () => {\n if (isCaching) {\n return;\n }\n\n setupCaching();\n });\n\n addReducer('reset', () => {\n localStorage.removeItem(GLOBAL_STATE_CACHE_KEY);\n\n if (!isCaching) {\n return;\n }\n\n clearCaching();\n });\n}\n\nexport function loadCache(initialState: GlobalState): GlobalState | undefined {\n if (GLOBAL_STATE_CACHE_DISABLED) {\n return undefined;\n }\n\n if (hasStoredSession(true)) {\n setupCaching();\n\n return readCache(initialState);\n } else {\n clearCaching();\n\n return undefined;\n }\n}\n\nfunction setupCaching() {\n isCaching = true;\n unsubscribeFromBeforeUnload = onBeforeUnload(updateCache, true);\n window.addEventListener('blur', updateCache);\n addCallback(updateCacheThrottled);\n}\n\nfunction clearCaching() {\n isCaching = false;\n removeCallback(updateCacheThrottled);\n window.removeEventListener('blur', updateCache);\n if (unsubscribeFromBeforeUnload) {\n unsubscribeFromBeforeUnload();\n }\n}\n\nfunction readCache(initialState: GlobalState): 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 migrateCache(cached, initialState);\n }\n\n const newState = {\n ...initialState,\n ...cached,\n };\n\n const parsedMessageList = !IS_SINGLE_COLUMN_LAYOUT ? parseLocationHash(LOCATION_HASH) : undefined;\n\n return {\n ...newState,\n messages: {\n ...newState.messages,\n messageLists: parsedMessageList ? [parsedMessageList] : [],\n },\n };\n}\n\nfunction migrateCache(cached: GlobalState, initialState: GlobalState) {\n if ('shouldAutoDownloadMediaFromContacts' in cached.settings.byKey) {\n const {\n shouldAutoDownloadMediaFromContacts,\n shouldAutoDownloadMediaInPrivateChats,\n shouldAutoDownloadMediaInGroups,\n shouldAutoDownloadMediaInChannels,\n shouldAutoPlayVideos,\n shouldAutoPlayGifs,\n ...rest\n } = cached.settings.byKey;\n\n cached.settings.byKey = {\n ...rest,\n canAutoLoadPhotoFromContacts: shouldAutoDownloadMediaFromContacts,\n canAutoLoadVideoFromContacts: shouldAutoDownloadMediaFromContacts,\n canAutoLoadPhotoInPrivateChats: shouldAutoDownloadMediaInPrivateChats,\n canAutoLoadVideoInPrivateChats: shouldAutoDownloadMediaInPrivateChats,\n canAutoLoadPhotoInGroups: shouldAutoDownloadMediaInGroups,\n canAutoLoadVideoInGroups: shouldAutoDownloadMediaInGroups,\n canAutoLoadPhotoInChannels: shouldAutoDownloadMediaInChannels,\n canAutoLoadVideoInChannels: shouldAutoDownloadMediaInChannels,\n canAutoPlayVideos: shouldAutoPlayVideos,\n canAutoPlayGifs: shouldAutoPlayGifs,\n };\n }\n\n cached.settings.byKey = {\n ...initialState.settings.byKey,\n ...cached.settings.byKey,\n };\n\n cached.settings.themes = {\n ...initialState.settings.themes,\n ...cached.settings.themes,\n };\n\n cached.chatFolders = {\n ...initialState.chatFolders,\n ...cached.chatFolders,\n };\n\n if (!cached.stickers.greeting) {\n cached.stickers.greeting = initialState.stickers.greeting;\n }\n\n if (!cached.activeDownloads) {\n cached.activeDownloads = {\n byChatId: {},\n };\n }\n\n if (!cached.serviceNotifications) {\n cached.serviceNotifications = [];\n }\n\n if (cached.audioPlayer.volume === undefined) {\n cached.audioPlayer.volume = DEFAULT_VOLUME;\n }\n\n if (cached.audioPlayer.playbackRate === undefined) {\n cached.audioPlayer.playbackRate = DEFAULT_PLAYBACK_RATE;\n }\n\n if (cached.groupCalls === undefined) {\n cached.groupCalls = initialState.groupCalls;\n }\n}\n\nfunction updateCache() {\n if (!isCaching || isHeavyAnimating) {\n return;\n }\n\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 'authNearestCountry',\n 'currentUserId',\n 'contactList',\n 'topPeers',\n 'topInlineBots',\n 'recentEmojis',\n 'push',\n 'shouldShowContextMenuHint',\n 'leftColumnWidth',\n 'serviceNotifications',\n ]),\n audioPlayer: {\n volume: global.audioPlayer.volume,\n playbackRate: global.audioPlayer.playbackRate,\n isMuted: global.audioPlayer.isMuted,\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 chatFolders: reduceChatFolders(global),\n };\n\n const json = JSON.stringify(reducedGlobal);\n localStorage.setItem(GLOBAL_STATE_CACHE_KEY, json);\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(isUserId),\n ...Object.keys(byId),\n ].slice(0, GLOBAL_STATE_CACHE_USER_LIST_LIMIT);\n\n return {\n byId: pick(byId, idsToSave),\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 return {\n byChatId,\n messageLists: [],\n };\n}\n\nfunction reduceSettings(global: GlobalState): GlobalState['settings'] {\n const { byKey, themes } = global.settings;\n\n return {\n byKey,\n themes,\n privacy: {},\n notifyExceptions: {},\n };\n}\n\nfunction reduceChatFolders(global: GlobalState): GlobalState['chatFolders'] {\n return {\n ...global.chatFolders,\n activeChatFolder: 0,\n };\n}\n\nfunction setupHeavyAnimationListeners() {\n document.addEventListener(ANIMATION_START_EVENT, () => {\n isHeavyAnimating = true;\n });\n document.addEventListener(ANIMATION_END_EVENT, () => {\n isHeavyAnimating = false;\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';\n\ninitCache();\n\naddReducer('init', () => {\n const initial = cloneDeep(INITIAL_STATE);\n return loadCache(initial) || initial;\n});\n","const STORAGE_KEY = 'tt-active-tab';\nconst INTERVAL = 2000;\n\nconst tabKey = String(Date.now() + Math.random());\n\nlocalStorage.setItem(STORAGE_KEY, tabKey);\n\nlet callback: NoneToVoidFunction;\n\nconst interval = window.setInterval(() => {\n if (callback && localStorage.getItem(STORAGE_KEY) !== tabKey) {\n callback();\n clearInterval(interval);\n }\n}, INTERVAL);\n\nexport function addActiveTabChangeListener(_callback: NoneToVoidFunction) {\n callback = _callback;\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","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, selectTheme } 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 hasCustomBackgroundColor: boolean;\n isRightColumnShown?: boolean;\n leftColumnWidth?: number;\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.BlobUrl);\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 hasCustomBackgroundColor,\n isRightColumnShown,\n shouldSkipHistoryAnimations,\n leftColumnWidth,\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 const safePreload = async () => {\n try {\n await preloadTasks[page]();\n } catch (err) {\n // Do nothing\n }\n };\n\n Promise.race([\n pause(MAX_PRELOAD_DELAY),\n safePreload(),\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 && !shouldSkipHistoryAnimations && (\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 const theme = selectTheme(global);\n const { background, backgroundColor } = global.settings.themes[theme] || {};\n\n return {\n shouldSkipHistoryAnimations: global.shouldSkipHistoryAnimations,\n uiReadyState: global.uiReadyState,\n hasCustomBackground: Boolean(background),\n hasCustomBackgroundColor: Boolean(backgroundColor),\n isRightColumnShown: selectIsRightColumnShown(global),\n leftColumnWidth: global.leftColumnWidth,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setIsUiReady']),\n)(UiLoader);\n","import * as langProvider from '../util/langProvider';\nimport { useState } from '../lib/teact/teact';\n\nexport default (langCode: string | undefined, key: string): string | undefined => {\n const [translation, setTranslation] = useState();\n\n if (langCode) {\n langProvider\n .getTranslationForLangString(langCode, key)\n .then(setTranslation);\n }\n\n return translation;\n};\n","import { LangCode } from '../../../types';\n\nexport function getSuggestedLanguage() {\n let suggestedLanguage = navigator.language;\n\n if (suggestedLanguage && suggestedLanguage !== 'pt-br') {\n suggestedLanguage = suggestedLanguage.substr(0, 2);\n }\n\n return suggestedLanguage as LangCode;\n}\n","import React, {\n FC, useState, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiCountryCode } from '../../api/types';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport searchWords from '../../util/searchWords';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport { isoToEmoji } from '../../util/emoji';\nimport useOnChange from '../../hooks/useOnChange';\n\nimport DropdownMenu from '../ui/DropdownMenu';\nimport MenuItem from '../ui/MenuItem';\nimport Spinner from '../ui/Spinner';\n\nimport './CountryCodeInput.scss';\n\ntype StateProps = {\n phoneCodeList: ApiCountryCode[];\n};\n\ntype OwnProps = {\n id: string;\n value?: ApiCountryCode;\n isLoading?: boolean;\n onChange: (value: ApiCountryCode) => 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 phoneCodeList,\n}) => {\n const lang = useLang();\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([]);\n\n const updateFilter = useCallback((filterValue?: string) => {\n setFilter(filterValue);\n setFilteredList(getFilteredList(phoneCodeList, filterValue));\n }, [phoneCodeList]);\n\n useOnChange(([prevPhoneCodeList]) => {\n if (prevPhoneCodeList?.length === 0 && phoneCodeList.length > 0) {\n updateFilter(filter);\n }\n }, [phoneCodeList, updateFilter]);\n\n const handleChange = useCallback((country: ApiCountryCode) => {\n onChange(country);\n\n setTimeout(() => updateFilter(undefined), MENU_HIDING_DURATION);\n }, [onChange, updateFilter]);\n\n const handleInput = useCallback((e: React.FormEvent) => {\n updateFilter(e.currentTarget.value);\n }, [updateFilter]);\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, updateFilter, 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 handleCodeInput = (e: React.FormEvent) => {\n handleInput(e);\n handleTrigger();\n };\n\n const inputValue = filter ?? (value?.name || value?.defaultName || '');\n\n return (\n
\n \n \n {isLoading ? (\n \n ) : (\n \n )}\n
\n );\n };\n\n return (\n \n {filteredList\n .map((country: ApiCountryCode) => (\n handleChange(country)}\n >\n {renderText(isoToEmoji(country.iso2), ['hq_emoji'])}\n {country.name || country.defaultName}\n {country.countryCode}\n \n ))}\n {!filteredList.length && (\n \n {lang('lng_country_none')}\n \n )}\n \n );\n};\n\nfunction getFilteredList(countryList: ApiCountryCode[], filter = ''): ApiCountryCode[] {\n const filtered = filter.length\n ? countryList.filter((country) => (\n searchWords(country.defaultName, filter) || (country.name && searchWords(country.name, filter))\n )) : countryList;\n return filtered;\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { countryList: { phoneCodes: phoneCodeList } } = global;\n return {\n phoneCodeList,\n };\n },\n)(CountryCodeInput));\n","import { ChangeEvent } from 'react';\n\n// @ts-ignore\nimport monkeyPath from '../../assets/monkey.svg';\n\nimport React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { LangCode } from '../../types';\nimport { ApiCountryCode } from '../../api/types';\n\nimport { IS_SAFARI, IS_TOUCH_ENV } from '../../util/environment';\nimport { preloadImage } from '../../util/files';\nimport preloadFonts from '../../util/fonts';\nimport { pick } from '../../util/iteratees';\nimport { formatPhoneNumber, getCountryCodesByIso, getCountryFromPhoneNumber } from '../../util/phoneNumber';\nimport { setLanguage } from '../../util/langProvider';\nimport useLang from '../../hooks/useLang';\nimport useFlag from '../../hooks/useFlag';\nimport useLangString from '../../hooks/useLangString';\nimport { getSuggestedLanguage } from './helpers/getSuggestedLanguage';\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 & {\n language?: LangCode;\n phoneCodeList: ApiCountryCode[];\n};\ntype DispatchProps = Pick;\n\nconst MIN_NUMBER_LENGTH = 7;\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 phoneCodeList,\n language,\n setAuthPhoneNumber,\n setAuthRememberMe,\n loadNearestCountry,\n loadCountryList,\n clearAuthError,\n goToAuthQrCode,\n setSettingOption,\n}) => {\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const suggestedLanguage = getSuggestedLanguage();\n\n const continueText = useLangString(suggestedLanguage, 'ContinueOnThisLanguage');\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 const [isLoading, markIsLoading, unmarkIsLoading] = useFlag();\n\n const fullNumber = country ? `+${country.countryCode} ${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 (connectionState === 'connectionStateReady') {\n loadCountryList({ langCode: language });\n }\n }, [connectionState, language, loadCountryList]);\n\n useEffect(() => {\n if (authNearestCountry && phoneCodeList && !country && !isTouched) {\n setCountry(getCountryCodesByIso(phoneCodeList, authNearestCountry)[0]);\n }\n }, [country, authNearestCountry, isTouched, phoneCodeList]);\n\n const parseFullNumber = useCallback((newFullNumber: string) => {\n if (!newFullNumber.length) {\n setPhoneNumber('');\n }\n\n const suggestedCountry = phoneCodeList && getCountryFromPhoneNumber(phoneCodeList, newFullNumber);\n\n // Any phone numbers should be allowed, in some cases ignoring formatting\n const selectedCountry = !country\n || (suggestedCountry && suggestedCountry.iso2 !== country.iso2)\n || (!suggestedCountry && newFullNumber.length)\n ? suggestedCountry\n : country;\n\n if (!country || !selectedCountry || (selectedCountry && selectedCountry.iso2 !== country.iso2)) {\n setCountry(selectedCountry);\n }\n setPhoneNumber(formatPhoneNumber(newFullNumber, selectedCountry));\n }, [phoneCodeList, country]);\n\n const handleLangChange = useCallback(() => {\n markIsLoading();\n\n void setLanguage(suggestedLanguage, () => {\n unmarkIsLoading();\n\n setSettingOption({ language: suggestedLanguage });\n });\n }, [markIsLoading, setSettingOption, suggestedLanguage, unmarkIsLoading]);\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 const isJustPastedRef = useRef(false);\n const handlePaste = useCallback(() => {\n isJustPastedRef.current = true;\n requestAnimationFrame(() => {\n isJustPastedRef.current = false;\n });\n }, []);\n\n const handleCountryChange = useCallback((value: ApiCountryCode) => {\n setCountry(value);\n setPhoneNumber('');\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 void 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\n const shouldFixSafariAutoComplete = (\n IS_SAFARI && country && fullNumber !== undefined\n && value.length - fullNumber.length > 1 && !isJustPastedRef.current\n );\n parseFullNumber(shouldFixSafariAutoComplete ? `${country!.countryCode} ${value}` : value);\n }, [authError, clearAuthError, country, fullNumber, 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

Telegram

\n

{lang('StartText')}

\n
\n \n \n \n {canSubmit && (\n isAuthReady ? (\n \n ) : (\n \n )\n )}\n {isAuthReady && (\n \n )}\n {suggestedLanguage && suggestedLanguage !== language && continueText && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n settings: { byKey: { language } },\n countryList: { phoneCodes: phoneCodeList },\n } = global;\n\n return {\n ...pick(global, [\n 'connectionState',\n 'authState',\n 'authPhoneNumber',\n 'authIsLoading',\n 'authIsLoadingQrCode',\n 'authError',\n 'authRememberMe',\n 'authNearestCountry',\n ]),\n language,\n phoneCodeList,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setAuthPhoneNumber',\n 'setAuthRememberMe',\n 'clearAuthError',\n 'loadNearestCountry',\n 'loadCountryList',\n 'goToAuthQrCode',\n 'setSettingOption',\n ]),\n)(AuthPhoneNumber));\n","import React, { FC, memo } 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 memo(AuthCodeAsync);\n","import React, { FC, memo } 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 memo(AuthPasswordAsync);\n","import React, { FC, memo } 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 memo(AuthRegisterAsync);\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 & {\n language?: LangCode;\n};\ntype DispatchProps = Pick;\n\nconst DATA_PREFIX = 'tg://login?token=';\n\nconst AuthCode: FC = ({\n connectionState,\n authState,\n authQrCode,\n language,\n returnToAuthPhoneNumber,\n setSettingOption,\n}) => {\n const suggestedLanguage = getSuggestedLanguage();\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const qrCodeRef = useRef(null);\n const continueText = useLangString(suggestedLanguage, 'ContinueOnThisLanguage');\n const [isLoading, markIsLoading, unmarkIsLoading] = useFlag();\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\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 const handleLangChange = useCallback(() => {\n markIsLoading();\n\n void setLanguage(suggestedLanguage, () => {\n unmarkIsLoading();\n\n setSettingOption({ language: suggestedLanguage });\n });\n }, [markIsLoading, setSettingOption, suggestedLanguage, unmarkIsLoading]);\n\n const isAuthReady = authState === 'authorizationStateWaitQrCode';\n\n return (\n
\n
\n {authQrCode ? (\n
\n ) : (\n
\n )}\n

{lang('Login.QR.Title')}

\n
    \n
  1. {lang('Login.QR.Help1')}
  2. \n
  3. {renderText(lang('Login.QR.Help2'), ['simple_markdown'])}
  4. \n
  5. {lang('Login.QR.Help3')}
  6. \n
\n {isAuthReady && (\n \n )}\n {suggestedLanguage && suggestedLanguage !== language && continueText && (\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n connectionState, authState, authQrCode, settings: { byKey: { language } },\n } = global;\n\n return {\n connectionState,\n authState,\n authQrCode,\n language,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'returnToAuthPhoneNumber', 'setSettingOption',\n ]),\n)(AuthCode));\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';\nimport { PLATFORM_ENV } from '../../util/environment';\nimport windowSize from '../../util/windowSize';\nimport useHistoryBack from '../../hooks/useHistoryBack';\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';\n\nimport './Auth.scss';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst Auth: FC = ({\n authState, reset, initApi, returnToAuthPhoneNumber, goToAuthQrCode,\n}) => {\n useEffect(() => {\n reset();\n initApi();\n }, [reset, initApi]);\n\n const isMobile = PLATFORM_ENV === 'iOS' || PLATFORM_ENV === 'Android';\n\n const handleChangeAuthorizationMethod = () => {\n if (!isMobile) {\n goToAuthQrCode();\n } else {\n returnToAuthPhoneNumber();\n }\n };\n\n useHistoryBack(\n (!isMobile && authState === 'authorizationStateWaitPhoneNumber')\n || (isMobile && authState === 'authorizationStateWaitQrCode'), handleChangeAuthorizationMethod,\n );\n\n // Prevent refresh when rotating device\n useEffect(() => {\n windowSize.disableRefresh();\n\n return () => {\n windowSize.enableRefresh();\n };\n }, []);\n\n switch (authState) {\n case 'authorizationStateWaitCode':\n return ;\n case 'authorizationStateWaitPassword':\n return ;\n case 'authorizationStateWaitRegistration':\n return ;\n case 'authorizationStateWaitPhoneNumber':\n return ;\n case 'authorizationStateWaitQrCode':\n return ;\n default:\n return isMobile\n ? \n : ;\n }\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authState']),\n (global, actions): DispatchProps => pick(actions, ['reset', 'initApi', 'returnToAuthPhoneNumber', 'goToAuthQrCode']),\n)(Auth));\n","import React, { FC, memo } 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 memo(MainAsync);\n","import React, { FC } from '../../lib/teact/teact';\n\nimport Button from '../ui/Button';\n\nimport appInactivePath from '../../assets/app-inactive.png';\nimport './AppInactive.scss';\n\nconst AppInactive: FC = () => {\n const handleReload = () => {\n window.location.reload();\n };\n\n return (\n
\n
\n \"\"\n

Such error, many tabs

\n
\n Telegram supports only one active tab with the app.\n
\n Please reload this page to continue using this tab or close it.\n
\n
\n \n
\n
\n
\n );\n};\n\nexport default AppInactive;\n","import { FC, useEffect } from './lib/teact/teact';\nimport React, { withGlobal } from './lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from './global/types';\n\nimport { INACTIVE_MARKER, PAGE_TITLE } from './config';\nimport { pick } from './util/iteratees';\nimport { updateSizes } from './util/windowSize';\nimport { addActiveTabChangeListener } from './util/activeTabMonitor';\nimport useFlag from './hooks/useFlag';\n\nimport Auth from './components/auth/Auth';\nimport UiLoader from './components/common/UiLoader';\nimport Main from './components/main/Main.async';\nimport AppInactive from './components/main/AppInactive';\nimport { hasStoredSession } from './util/sessions';\n// import Test from './components/test/TestNoRedundancy';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst App: FC = ({ authState, disconnect }) => {\n const [isInactive, markInactive] = useFlag(false);\n\n useEffect(() => {\n updateSizes();\n addActiveTabChangeListener(() => {\n disconnect();\n document.title = `${PAGE_TITLE}${INACTIVE_MARKER}`;\n\n markInactive();\n });\n }, [disconnect, markInactive]);\n\n // return ;\n\n if (isInactive) {\n return ;\n }\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 hasStoredSession(true) ? renderMain() : ;\n};\n\nfunction renderMain() {\n return (\n \n
\n \n );\n}\n\nexport default withGlobal(\n (global): StateProps => pick(global, ['authState']),\n (setGlobal, actions): DispatchProps => pick(actions, ['disconnect']),\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.warn('GLOBAL STATE', getGlobal());\n});\n"],"names":["leafPrototypes","getProto","inProgress","dataWebpackPrefix","loadStylesheet","installedCssChunks","worker","requestStates","Map","requestStatesByCallback","initApi","onUpdate","initialArgs","DEBUG","console","log","Worker","URL","addEventListener","data","type","update","requestState","get","messageId","error","reject","resolve","response","callback","callbackArgs","subscribeToWorker","platform","window","async","Promise","race","makeRequest","pause","then","Error","err","Date","now","startedAt","location","reload","args","callApi","fnName","name","warn","cancelApiProgress","progressCallback","isCanceled","postMessage","message","generateIdFor","payload","promise","Object","assign","pop","set","catch","finally","delete","ApiMediaFormat","ApiMessageEntityTypes","MAIN_THREAD_ID","MESSAGE_DELETED","base","maxint","adapt","delta","numpoints","firsttime","k","Math","floor","decode","input","preserveCase","output","case_flags","input_length","length","n","out","i","bias","basic","j","ic","oldi","w","digit","t","len","lastIndexOf","charCodeAt","RangeError","push","cp","splice","String","fromCharCode","toUpperCase","value","join","utf16","getDomain","url","href","ensureProtocol","decodedHref","decodeURI","match","domain","replace","domain_array","split","s","slice","convertPunycode","memo","text","className","children","isRtl","toggleSafeLinkModal","openTelegramLink","getDispatch","content","isNotSafe","handleClick","useCallback","e","ctrlKey","altKey","shiftKey","metaKey","RE_TME_LINK","RE_TG_LINK","preventDefault","classNames","buildClassName","title","target","rel","onClick","dir","getFileSizeString","bytes","ONE_GIGABYTE","toFixed","ONE_MEGABYTE","getDocumentExtension","document","fileName","mimeType","getFileExtension","indexOf","getColorFromExtension","extension","getDocumentHasPreview","Boolean","previewBlobUrl","thumbnail","RE_EMOJI_ONLY","RegExp","twemojiRegex","DETECT_UP_TO","emojiCount","withGlobal","undefined","setGlobal","actions","pick","sender","openUserInfo","id","Link","focusMessage","handleMessageClick","chatId","openChat","groupCall","joinGroupCall","accessHash","renderActionMessageText","lang","actionOrigin","targetUsers","targetMessage","targetChatId","options","action","translationValues","amount","currency","call","textOptions","maxTextLength","processed","unprocessed","includes","processPlaceholder","formatCurrency","code","isEmbedded","origin","asPlain","isUserId","renderUserContent","chat","trimText","getChatTitle","renderText","renderChatContent","renderOriginContent","map","user","filter","getMessageSummaryText","photo","video","sticker","getMessageContent","showQuotes","messageText","isGif","renderMessageContent","invoice","renderProductContent","renderMigratedContent","trim","renderGroupCallContent","getUserFullName","placeholder","replaceValue","placeholderPosition","substring","Array","isArray","forEach","index","RE_LETTER_OR_DIGIT","SIMPLE_MARKDOWN_REGEX","part","filters","params","reduce","textParts","divEl","createElement","result","innerText","innerHTML","escapeHtml","EMOJI_REGEX","replaceEmojis","addLineBreaks","highlight","lowerCaseText","toLowerCase","queryPosition","nextSymbol","newParts","links","RE_LINK","nextLink","shift","lastIndex","startsWith","username","endsWith","addLinks","replaceSimpleMarkdown","size","IS_EMOJI_SUPPORTED","parts","fixNonStandardEmoji","emojis","emojiResult","emoji","nativeToUnified","removeVS16s","src","alt","line","source","trimmedLine","trimLeft","indentLength","repeat","RE_LINK_TEMPLATE","RE_MENTION_TEMPLATE","entities","entityResult","entity","preventMessageInputBlur","withBubbling","IS_IOS","activeElement","EDITABLE_INPUT_ID","currentTarget","preventMessageInputBlurWithBubbling","global","userId","userOrChat","selectUser","openChatByUsername","ref","onContextMenu","onMouseDown","onMouseEnter","onMouseLeave","onFocus","color","backgroundImage","round","pill","fluid","isText","isLoading","ariaLabel","download","disabled","ripple","faded","tabIndex","withClickPropagation","elementRef","useRef","isClicked","setIsClicked","useState","fullClassName","setTimeout","handleMouseDown","style","label","subLabel","checked","blocking","onChange","onCheck","useLang","handleChange","event","trigger","positionX","positionY","footer","forceOpen","onOpen","onClose","menuRef","dropdownRef","isOpen","setIsOpen","onKeyDown","menu","current","keyCode","focusedElement","elementChildren","from","focus","onTrigger","containerRef","autoClose","shouldSkipTransition","success","readOnly","autoComplete","inputMode","maxLength","onInput","onKeyPress","onBlur","onPaste","labelText","htmlFor","withBackground","menuStyle","noCloseOnBackdrop","onCloseAnimationEnd","backdropContainerRef","transitionClassNames","useShowTransition","useEffect","captureEscKeyListener","useHistoryBack","useEffectWithPrevDeps","prevIsOpen","dispatchHeavyAnimationEvent","handleKeyDown","useKeyboardListNavigation","useVirtualBackdrop","bubbleClassName","props","icon","destructive","stopPropagation","role","ripples","setRipples","cleanUpDebounced","useMemo","debounce","button","container","position","getBoundingClientRect","rippleSize","offsetWidth","x","clientX","y","clientY","requestAnimationFrame","PAGE_TITLE","INACTIVE_MARKER","APP_NAME","process","APP_VERSION","DEBUG_MORE","IS_TEST","DEBUG_ALERT_MSG","SESSION_USER_KEY","LEGACY_SESSION_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","AUTODOWNLOAD_FILESIZE_MB_LIMITS","isBigScreen","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","MEMBERS_SLICE","MEMBERS_LOAD_SLICE","PROFILE_SENSITIVE_AREA","TOP_CHAT_MESSAGES_PRELOAD_LIMIT","ALL_CHATS_PRELOAD_DISABLED","DEFAULT_VOLUME","DEFAULT_PLAYBACK_RATE","ANIMATION_LEVEL_MIN","ANIMATION_LEVEL_MAX","ANIMATION_LEVEL_DEFAULT","DEFAULT_MESSAGE_TEXT_SIZE_PX","IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX","MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX","DRAFT_DEBOUNCE","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","TMP_CHAT_ID","ANIMATION_END_DELAY","FAST_SMOOTH_MAX_DISTANCE","FAST_SMOOTH_MIN_DURATION","FAST_SMOOTH_MAX_DURATION","FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE","STICKER_SIZE_INLINE_DESKTOP_FACTOR","Set","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","STICKER_SIZE_INLINE_BOT_RESULT","MEMOJI_STICKER_ID","BASE_EMOJI_KEYWORD_LANG","MENU_TRANSITION_DURATION","SLIDE_TRANSITION_DURATION","VIDEO_MOV_TYPE","SUPPORTED_IMAGE_CONTENT_TYPES","SUPPORTED_VIDEO_CONTENT_TYPES","CONTENT_TYPES_WITH_PREVIEW","COUNTRIES_WITH_12H_TIME_FORMAT","SERVICE_NOTIFICATIONS_USER_ID","REPLIES_USER_ID","ALL_FOLDER_ID","ARCHIVED_FOLDER_ID","MAX_MEDIA_FILES_FOR_ALBUM","MAX_ACTIVE_PINNED_CHATS","SCHEDULED_WHEN_ONLINE","DEFAULT_LANG_CODE","DEFAULT_LANG_PACK","LANG_PACKS","TIPS_USERNAME","LOCALIZED_TIPS","FEEDBACK_URL","LIGHT_THEME_BG_COLOR","DARK_THEME_BG_COLOR","DARK_THEME_PATTERN_COLOR","DEFAULT_PATTERN_COLOR","GROUP_CALL_VOLUME_MULTIPLIER","GROUP_CALL_DEFAULT_VOLUME","ENABLE_THUMBNAIL_VIDEO","cb","dependencies","debugKey","prevDeps","usePrevious","initial","setValue","setTrigger","ANIMATION_START_EVENT","ANIMATION_END_EVENT","timeout","isAnimating","duration","dispatchEvent","Event","clearTimeout","handleAnimationStart","handleAnimationEnd","removeEventListener","LOCATION_HASH","hash","PATH_BASE","pathname","search","historyState","currentIndex","nextStateIndexToReplace","isHistoryAltered","isDisabled","isEdge","currentIndexes","disableHistoryBack","handleTouchEnd","isActive","onBack","onForward","currentState","shouldReplaceNext","hashes","indexRef","isForward","prevIsActive","isClosed","indexHashRef","prevHashes","isHashChangedFromEvent","isForceClose","prev","history","pushState","state","last","realDelta","indexLast","findIndex","l","go","replaceState","back","handlePopState","currIndex","disableHistoryAnimations","hasChanged","areSortedArraysEqual","forceClose","touches","pageX","innerWidth","onSelectWithEnter","itemSelector","noCaptureFocus","focusedIndex","setFocusedIndex","element","querySelectorAll","newIndex","item","forceUpdate","useForceUpdate","useOnChange","langProvider","bundleName","moduleName","noLoad","autoUpdate","module","getModuleFromMemory","addLoadListener","loadModule","some","d","next","shouldSkipUndefined","onCloseTransitionEnd","noOpenTransition","noCloseTransition","setIsClosed","closeTimeoutRef","hasOpenClassName","setHasOpenClassName","shouldHaveOpenClassName","isClosing","shouldRender","handleEvent","contains","classList","NON_BUBBLEABLE_EVENTS","delegationRegistry","delegatedEventsByElement","documentEventCounters","propName","handler","asCapture","eventName","resolveEventName","canUseEventDelegation","resolveDelegationRegistryForName","existing","newSet","resolveDelegatedEventsForElement","add","addDelegatedListener","removeDelegatedListener","tagName","realEventName","has","removeAllDelegatedListeners","eventNames","realEvent","events","furtherCallsPrevented","Proxy","p","Reflect","body","parentNode","FILTERED_ATTRIBUTES","HTML_ATTRIBUTES","MAPPED_ATTRIBUTES","autoPlay","headsByElement","renderWithVirtual","parentEl","$current","$new","$parent","skipComponentUpdate","forceIndex","fragment","moveDirection","isComponentElement","hasElementChanged","componentInstance","renderComponent","updateComponent","isMounted","setupComponentUpdateListener","initComponent","node","createNode","setTarget","childNodes","insertBefore","appendChild","removeChild","getTarget","unmountTree","replaceChild","areComponents","isRealElement","nextSibling","currentKeys","keys","newKeys","key","currentValue","newValue","cssText","removeAttribute","setAttribute","updateAttributes","currentEl","teactFastList","$newChild","currentRemainingIndex","remainingByKey","acc","$currentChild","newChildKey","$element","order","teactOrderKey","fragmentQueue","fragmentIndex","newChildren","currentPreservedIndex","currentChildInfo","concat","flushFragmentQueue","shouldMoveNode","isMovingDown","renderFastListChildren","max","createDocumentFragment","renderChildren","mountComponent","$firstChild","isEmptyElement","createTextNode","isTextElement","tag","$child","$fragmentChild","__html","render","headId","getAttribute","$head","VirtualElementTypesEnum","Fragment","Symbol","renderingInstance","Empty","Text","isTagElement","Tag","Component","flatten","parsedChildren","hooks","cursor","byCursor","effects","memos","buildComponentElement","createComponentInstance","dropEmptyTail","buildChildElement","buildTagElement","isEmptyPlaceholder","child","DEBUG_components","newRenderedValue","DEBUG_startAt","componentName","renderCount","renderTimes","performance","renderTime","handleError","renderedValue","newChild","$old","hook","cleanup","effect","nextValue","setter","helpGc","prepareComponentForFrame","prepareForFrame","throttleWithPrimaryRaf","throttleWithRaf","forceUpdateComponent","currentElement","DEBUG_contentComponentName","useLayoutEffectBase","schedulerFn","primarySchedulerFn","execCleanup","exec","dependency","causedBy","res","prevValue","fastRaf","fastRafPrimary","useLayoutEffect","onTickEnd","onTickEndPrimary","resolver","getUnequalProps","newCallback","areEqual","arePropsShallowEqual","propsRef","renderedRef","orderBy","values","React","currentGlobal","reducers","callbacks","containers","mapStateToProps","mapReducersToProps","ownProps","mappedProps","newMappedProps","Number","isNaN","DEBUG_componentName","areMappedPropsChanged","DEBUG_updates","updateTime","runCallbacks","runCallbacksThrottled","newGlobal","noThrottle","getGlobal","addReducer","reducer","onDispatch","addCallback","removeCallback","TeactNContainer","vs16RegExp","zeroWidthJoiner","rawEmoji","importLegacySession","clearLegacySessions","apiUpdate","userAgent","navigator","PLATFORM_ENV","sessionData","loadStoredSession","isTest","isMovSupported","IS_MOV_SUPPORTED","phoneNumber","authIsLoading","authError","password","file","firstName","lastName","authIsLoadingQrCode","storeSession","currentUserId","clearStoredSession","unsubscribe","forceWebsync","reset","cacheApi","langCachePrefix","langCacheVersion","updateAppBadge","init","connectionState","authNearestCountry","deviceToken","subscribedAt","buildInputPrivacyRules","visibility","allowedIds","deniedIds","users","byId","usersById","chats","chatsById","rules","collectUsers","collectChats","allowedUsers","allowedChats","blockedUsers","blockedChats","bio","about","profileEdit","progress","ProfileEditProgress","currentUser","updateUser","fullInfo","isUsernameAvailable","settings","loadedWallpapers","wallpapers","createObjectURL","slug","UPLOADING_WALLPAPER_SLUG","wallpaper","firstWallpaper","withLocalMedia","addUsers","buildCollectionByKey","updateChats","blocked","ids","blockedIds","totalCount","contactId","addBlockedContact","removeBlockedContact","activeSessions","session","isCurrent","serverTimeOffset","addNotifyExceptions","replaceSettings","peerType","isSilent","shouldShowPreviews","updateNotifySettings","hasPushNotifications","hasWebNotifications","byKey","subscribe","hasContactJoinedNotifications","languages","phoneNumberSettings","lastSeenSettings","profilePhotoSettings","forwardsSettings","chatInviteSettings","all","privacy","lastSeen","profilePhoto","forwards","chatInvite","privacyKey","allowUserIds","allowChatIds","blockUserIds","blockChatIds","isAllowList","contactsIds","isSensitiveEnabled","langCode","language","countryList","timeFormat","setSettingOption","setTimeFormat","wasTimeFormatSetManually","nearestCountryCode","selectNotifySettings","setLanguage","onUpdateApiReady","wasAuthReady","authState","authorizationState","isLoggingOut","authIsCodeViaApp","isCodeViaApp","authHint","hint","authQrCode","qrCode","lastSyncTime","onUpdateAuthorizationState","onUpdateAuthorizationError","sync","signOut","onUpdateConnectionState","authRememberMe","isEmpty","mainDcId","saveSession","onUpdateSession","onUpdateServerTimeOffset","sessionUserAuth","localStorage","getItem","userAuth","JSON","parse","setItem","stringify","updateSessionUserId","onUpdateCurrentUser","paymentShippingError","getShippingError","addPaymentError","showDialog","hasErrorKey","handleSystemThemeChange","currentThemeMatch","documentElement","currentTheme","nextTheme","selectTheme","animationLevel","switchTheme","mql","matchMedia","addListener","subscribeToSystemThemeChange","messageTextSize","theme","setProperty","toString","IS_TOUCH_ENV","startWebsync","IS_ANDROID","IS_MAC_OS","uiReadyState","remove","authPhoneNumber","shouldSkipHistoryAnimations","replaceThemeSettings","FOREVER_BANNED_DATE","entityId","isChatGroup","isChatBasicGroup","isChatSuperGroup","isChatChannel","isCommonBoxChat","isChatWithRepliesBot","getChatTypeString","getPrivateChatUserId","isSelf","getChatDescription","getChatLink","inviteLink","getChatAvatarHash","owner","avatarHash","isChatSummaryOnly","lastMessage","isChatAdmin","adminRights","getHasAdminRight","isUserRightBanned","currentUserBannedRights","defaultBannedRights","getCanPostInChat","threadId","isRestricted","migratedTo","isNotJoined","isCreator","getAllowedAttachmentOptions","isChatWithBot","canAttachMedia","canAttachPolls","canSendStickers","canSendGifs","canAttachEmbedLinks","isAdmin","getMessageSendingRestrictionReason","sendMessages","untilDate","formatDateToString","formatTime","getChatSlowModeOptions","slowMode","getChatOrder","joinDate","draftDate","date","isChatArchived","folderId","selectIsChatMuted","notifySettings","notifyExceptions","isMuted","hasPrivateChatsNotifications","hasBroadcastNotifications","hasGroupNotifications","selectShouldShowMessagePreview","hasPrivateChatsMessagePreview","hasBroadcastMessagePreview","hasGroupMessagePreview","getCanDeleteChat","prepareFolderListIds","folder","chatIdsCache","excludedChatIds","includedChatIds","pinnedChatIds","isListed","excludeArchived","excludeMuted","unreadMentionsCount","unreadCount","hasUnreadMark","excludeRead","privateChatUser","bots","contacts","isContact","nonContacts","groups","channels","filterChatFolder","prepareChatList","listIds","orderedPinnedIds","folderType","listIdsSet","orderedPinnedIdsSet","pinnedChats","chatFilter","otherChats","reduceChatList","chatArrays","filteredIds","filteredIdsSet","getFolderUnreadDialogs","listedChats","unreadDialogsCount","total","hasActiveDialogs","getFolderDescriptionText","emoticon","description","pinnedIds","getFolderChatsCount","getMessageSenderName","getUserFirstOrLastName","sortChatIds","chatIds","shouldPrioritizeVerified","priorityIds","priority","isVerified","CONTENT_NOT_SUPPORTED","getMessageKey","msgId","buildMessageKey","parseMessageKey","getMessageOriginalId","previousLocalId","noEmoji","audio","voice","contact","poll","truncatedText","substr","groupedId","performer","getMessageAudioCaption","summary","question","getMessageText","webPage","getMessageCustomShape","isRound","parseEmojiOnlyString","getMessageSingleEmoji","getFirstLinkInMessage","link","find","offset","isOwnMessage","isOutgoing","isReplyMessage","replyToMessageId","isForwardedMessage","forwardInfo","isActionMessage","isServiceNotificationMessage","isAnonymousOwnMessage","senderId","getSenderTitle","getSendingState","sendingState","isMessageLocal","isHistoryClearMessage","getMessageContentFilename","isAnimated","isWebpSupported","baseFilename","IS_OPUS_SUPPORTED","hasMessageMedia","getMessagePhoto","getMessageVideo","getMessageDocument","getMessageSticker","getMessageContact","getMessagePoll","getMessageAction","getMessageAudio","getMessageVoice","getMessageRoundVideo","isMessageDocumentPhoto","mediaType","isMessageDocumentVideo","getMessageInvoice","getMessageWebPage","getMessageWebPagePhoto","getMessageWebPageVideo","getMessageMediaThumbDataUri","media","getMessageMediaThumbnail","dataUri","getMessageMediaHash","webPagePhoto","webPageVideo","messageVideo","messagePhoto","hasMessageLocalBlobUrl","getVideoOrAudioBaseHash","getAudioHasCover","IS_PROGRESSIVE_SUPPORTED","IS_SAFARI","thumbnailSizes","getMessageMediaFormat","fullVideo","getMessageFileName","getMessageFileSize","blobUrl","getChatMediaMessageIds","messages","listedIds","isFromSharedMedia","getMessageContentIds","reverse","getPhotoFullDimensions","sizes","getPhotoInlineDimensions","getVideoDimensions","width","height","getMediaTransferState","isLoadNeeded","isUploading","isTransferring","transferProgress","messageIds","contentType","validator","matchLinkInMessageText","getMediaDuration","buildChatThreadKey","STRIPE_ERRORS","missing_payment_information","field","invalid_number","number","exp_year","exp_month","invalid_expiry_year","invalid_expiry_month","cvc","invalid_cvc","getStripeError","param","USER_COLOR_KEYS","isDeletedUser","getUserStatus","status","wasOnline","getTime","wasOnlineDate","diff","today","setHours","yesterday","setDate","getDate","formatFullDate","isUserOnline","isUserBot","getCanAddContact","sortUserIds","userIds","getServerTime","expires","getUserIdDividend","abs","getUserColorKey","peer","replaceChatListIds","newIds","updateChatListIds","idsUpdate","replaceChats","newById","getUpdatedChat","chatUpdate","shouldOmitMinInfo","isMin","updatedChat","omit","photos","updateChat","updatedById","updatedChats","addChats","addedById","isAdded","addedChats","updateChatListType","listType","currentListIds","listTypeKey","currentFolderList","updateChatListSecondaryInfo","info","totalCountKey","totalChatCount","isFullyLoaded","leaveChat","leftChatId","selectChatListType","listId","updateCurrentMessageList","shouldReplaceHistory","messageLists","newMessageLists","replaceChatMessages","updateMessageStore","byChatId","threadsById","replaceThreadParam","paramName","threadUpdate","updateThread","addMessages","addedByChatId","messagesByChatId","addChatMessagesById","selectChatMessages","every","newId","updateChatMessage","messageUpdate","updatedMessage","updateScheduledMessage","selectScheduledMessages","replaceScheduledMessages","deleteChatMessages","deletedForwardedPosts","pickTruthy","isLinkedChannelPost","threadInfo","selectThreadInfo","selectListedIds","outlyingIds","selectOutlyingIds","viewportIds","selectViewportIds","selectPinnedIds","newMessageCount","messagesCount","currentMessageList","selectCurrentMessageList","canDeleteCurrentThread","currentThreadId","fromChatId","fromMessageId","originalPost","selectChatMessage","deleteChatScheduledMessages","scheduledIds","selectScheduledIds","updateListedIds","orderHistoryIds","updateOutlyingIds","sort","a","b","addViewportId","safeReplaceViewportIds","newViewportIds","currentIds","updateThreadInfo","newThreadInfo","updateThreadInfos","updates","scheduledMessages","updateScheduledMessages","updateFocusedMessage","noHighlight","isResizingContainer","focusedMessage","updateFocusDirection","direction","enterMessageSelectMode","selectedMessages","prototype","toggleMessageSelection","messageListType","childMessageIds","withShift","oldSelectedMessages","selectMessageIdsByGroupId","selectedMessageIds","newMessageIds","newSelectedMessageIds","selectCurrentMessageIds","prevIndex","min","to","unique","exitMessageSelectMode","updateThreadUnreadFromForwardedMessage","originMessage","lastMessageId","isDeleting","channelPostId","threadInfoOld","updateStickerSets","category","sets","resultIds","updatedSets","stickerSet","stickers","setsById","setIds","updateStickerSet","stickerSetId","currentStickerSet","updateGifSearch","isNew","results","nextOffset","currentResults","gifs","newResults","gif","replaceAnimatedEmojis","animatedEmojis","updateStickersForEmoji","remoteStickers","allStickers","selectStickersForEmoji","uniqueIds","forEmoji","rebuildStickersForEmoji","replaceUsers","getUpdatedUser","userUpdate","updatedUser","updateContactList","updatedUsers","contactUserIds","contactList","newContactUserIds","updateUsers","addedUsers","updateSelectedUserId","selectedId","deleteUser","MEMO_EMPTY_ARRAY","updateUserSearch","searchStatePartial","userSearch","updateUserSearchFetchingStatus","newState","fetchingStatus","updateUserBlockedState","isBlocked","getComplexKey","updateGlobalSearch","globalSearch","updateGlobalSearchContent","currentContent","updateGlobalSearchResults","newFoundMessages","nextRate","resultsByType","newFoundMessagesById","foundIdsForType","foundIds","updateGlobalSearchFetchingStatus","prevFoundIds","newFoundIds","foundOrPrevFoundIds","nextOffsetId","replaceLocalTextSearch","chatThreadKey","searchParams","localTextSearch","byChatThreadKey","updateLocalTextSearch","query","replaceLocalTextSearchResults","updateLocalTextSearchResults","orderFoundIds","replaceLocalMediaSearch","localMediaSearch","updateLocalMediaSearchType","currentType","updateLocalMediaSearchResults","replaceLocalMediaSearchResults","updateManagementProgress","management","updateManagement","newSettings","themes","notifyException","exceptionData","addNotifyException","updateTwoFaSettings","twoFaSettings","updateShippingOptions","shippingOptions","payment","setRequestInfoId","requestId","setPaymentStep","step","setInvoiceMessageInfo","photoUrl","invoiceContent","setStripeCardInfo","cardInfo","stripeCredentials","setPaymentForm","form","setReceipt","receipt","messageInvoice","clearPayment","closeInvoice","isPaymentModalOpen","selectChat","selectChatUser","selectIsChatWithSelf","selectIsChatWithBot","selectSupportChat","isSupport","selectChatOnlineCount","members","onlineCount","selectChatBot","selectIsChatBotNotStarted","bot","messageInfo","selectAreActiveChatsLoaded","active","selectIsChatListed","targetList","list","selectChatFolder","chatFolders","selectIsChatPinned","archived","chatFoldersById","selectChatByUsername","usernameLowered","selectCountNotMutedUnread","activeChatIds","selectNotifyExceptions","selectIsServiceChatReady","selectCurrentStickerSearch","selectCurrentGifSearch","selectStickerSet","selectStickerSetByShortName","shortName","stickerSets","stickersForEmoji","packs","selectAnimatedEmoji","cleanedEmoji","selectCurrentChat","selectThreadParam","thread","selectScrollOffset","selectReplyingToId","selectEditingId","selectEditingScheduledId","selectDraft","selectNoWebPage","selectFirstMessageId","selectReplyStack","selectThreadOriginChat","originChannelId","selectThreadTopMessageId","topMessageId","selectThreadByMessage","replyToTopMessageId","isMessageInCurrentMessageList","selectIsViewportNewest","chatMessages","selectScheduledMessage","selectEditingMessage","selectChatMessageByPollId","pollId","messageWithPoll","selectFocusedMessageId","focusedChatId","selectIsMessageFocused","focusedId","selectOutgoingStatus","isScheduledList","lastReadOutboxMessageId","selectIsMessageUnread","selectSender","selectForwardedSender","isChannelPost","senderUserId","selectAllowedMessageActions","isPrivate","isChatWithSelf","isBasicGroup","isSuperGroup","isChannel","isLocal","isServiceNotification","isOwn","isAction","isMessageEditable","viaBotId","canReply","hasPinPermission","canPin","canUnpin","pinnedMessageIds","canDelete","canReport","canDeleteForAll","canEdit","canForward","hasSticker","hasFavoriteSticker","favorite","selectIsStickerFavorite","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","canDownload","noOptions","ability","selectCanDeleteSelectedMessages","messageActions","selectCanReportSelectedMessages","selectCanDownloadSelectedMessages","selectIsDownloading","activeInChat","activeDownloads","selectActiveDownloadIds","selectUploadProgress","fileUploads","byMessageLocalId","selectRealLastReadId","lastReadInboxMessageId","Infinity","selectFirstUnreadId","lastReadId","lastReadServiceNotificationId","serviceNotifications","notification","isUnread","findAfterLastReadId","isFromScheduled","found","selectIsForwardModalOpen","forwardMessages","isModalShown","selectCommonBoxChatId","fromLastMessage","selectIsInSelectMode","selectIsMessageSelected","selectForwardedMessageIdsByGroupId","selectIsDocumentGroupSelected","selectedIds","groupIds","selectSelectedMessagesCount","selectNewestMessageWithBotKeyboardButtons","findLast","keyboardButtons","replyHideMessageId","shouldHideKeyboardButtons","selectCanAutoLoadMedia","isPhoto","isVideo","isFile","canAutoLoadPhotoFromContacts","canAutoLoadPhotoInPrivateChats","canAutoLoadPhotoInGroups","canAutoLoadPhotoInChannels","canAutoLoadVideoFromContacts","canAutoLoadVideoInPrivateChats","canAutoLoadVideoInGroups","canAutoLoadVideoInChannels","canAutoLoadFileFromContacts","canAutoLoadFileInPrivateChats","canAutoLoadFileInGroups","canAutoLoadFileInChannels","canAutoLoadMedia","canAutoLoadMediaFromContacts","canAutoLoadMediaInPrivateChats","canAutoLoadMediaInGroups","canAutoLoadMediaInChannels","isMediaFromContact","selectIsUserOrChatContact","selectCanAutoPlayMedia","canAutoPlayVideos","canAutoPlayGifs","asGif","selectShouldLoopStickers","shouldLoopStickers","selectLastServiceNotification","maxId","selectCurrentTextSearch","currentSearch","selectCurrentMediaSearchPeerId","currentProfileUserId","selectCurrentMediaSearch","peerId","selectManagement","selectCurrentManagementType","selectIsMediaViewerOpen","mediaViewer","avatarOwnerId","selectRightColumnContentKey","isChatInfoShown","newChatMembersProgress","isAddingChatMembersShown","NewChatMembersProgress","isPollResults","pollResults","selectIsPollResultsOpen","isSearch","IS_SINGLE_COLUMN_LAYOUT","isManagement","currentManagement","selectCurrentManagement","isStickerSearch","isGifSearch","currentChatId","areActiveChatsLoaded","isUserInfo","isChatInfo","RightColumnContent","selectIsRightColumnShown","shouldUseSystemTheme","getSystemTheme","selectCurrentGlobalSearchQuery","selectPaymentChatId","selectPaymentMessageId","selectPaymentFormId","formId","selectPaymentRequestId","selectProviderPublishableKey","nativeParams","publishableKey","selectStripeCredentials","selectIsUserBlocked","LoadMoreDirection","FocusDirection","SettingsScreens","LeftColumnContent","GlobalSearchContent","MediaViewerOrigin","AudioOrigin","ChatCreationProgress","ManagementProgress","ProfileState","PaymentStep","ManagementScreens","currentInstance","animateSingle","tick","instance","isCancelled","animate","setAppBadge","currentProps","newProps","currentKeysLength","prop","self","caches","Type","fetch","cacheName","isHtmlAllowed","request","Request","cache","open","headers","Blob","blob","shouldRecreate","resolvedType","Json","json","save","cacheData","Response","put","clear","captureKeyboardListener","onEsc","keyToHandlerName","Enter","Backspace","Delete","Esc","Escape","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Tab","handlers","onEnter","onDelete","onBackspace","onUp","onDown","onLeft","onRight","onTab","captureKeyboardListeners","hasActiveHandlers","handlerName","currentEventHandlers","releaseKeyboardListener","keyHandlers","WEEKDAYS_FULL","MONTHS_FULL","MONTHS_FULL_LOWERCASE","month","getDayStart","datetime","getDayStartAt","toYearMonth","timestamp","getFullYear","getMonth","toIsoString","hours","getHours","marker","padStart","getMinutes","formatPastTimeShort","weekAgo","getDay","withYear","format","formatDate","formatMonthAndYear","isShort","formatHumanDate","noWeekdays","isUpperFirst","upperFirst","lowerFirst","weekAhead","weekDay","day","monthIndex","formatMediaDateTime","formatMediaDuration","maxValue","minutes","seconds","maxHours","maxMinutes","string","formatVoiceRecordDuration","durationInMs","milliseconds","locale","toLocaleString","year","isValidDate","MAX_MONTH_IN_YEAR","parseDateString","matchStringDate","matchEuropeStringDate","matchNumberDate","dateParts","timestampPlusDay","MILLISECONDS_IN_DAY","str","EXCLUDE_EMOJIS","EMOJI_EXCEPTIONS","unifiedToNative","unified","codePoints","parseInt","fromCodePoint","regex","replacement","pairs","uncompressEmoji","emojiData","categories","emojiRaw","names","native","image","isoToEmoji","iso","test","c","codePointAt","isWebpSupportedCache","webp","Image","handleLoadOrError","onload","onerror","hasWebp","systemThemeCache","matches","os","getPlatform","IS_PWA","standalone","referrer","IS_TABLET_COLUMN_LAYOUT","IS_VOICE_RECORDING_SUPPORTED","mediaDevices","AudioContext","webkitAudioContext","IS_SERVICE_WORKER_SUPPORTED","Audio","canPlayType","IS_CANVAS_FILTER_SUPPORTED","getContext","IS_REQUEST_FULLSCREEN_SUPPORTED","ARE_CALLS_SUPPORTED","LAYERS_ANIMATION_NAME","TEST_VIDEO","DPR","devicePixelRatio","MASK_IMAGE_DISABLED","dataUriToBlob","arr","mime","bstr","atob","u8arr","Uint8Array","blobToDataUri","reader","FileReader","readAsDataURL","blobToFile","File","lastModified","preloadImage","img","preloadVideo","volume","onloadedmetadata","createPosterForVideo","onseeked","videoWidth","videoHeight","canvas","drawImage","toDataURL","currentTime","fetchBlob","imgToCanvas","constructor","fileBits","rest","super","this","totalPrice","Intl","NumberFormat","store","random","hasOwnProperty","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","MESSAGE_TOO_LONG","SERVICE_WORKER_DISABLED","MESSAGE_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","SCHEDULE_DATE_INVALID","WALLPAPER_DIMENSIONS_INVALID","SHIPPING_ERRORS","getReadableErrorText","isSlowMode","textParams","extraPartIndex","errorMessage","handleErrorEvent","ErrorEvent","reason","throttle","alert","collection","member","mapValues","newByKey","object","stringKeys","orderKey","mode","mode1","mode2","orderKey1","orderKey2","aValue1","bValue1","aValue2","bValue2","aValue","bValue","array","compact","array1","array2","areSortedArraysIntersecting","findIntersectionWithSet","chunkSize","cloneDeep","predicate","SUBSTITUTION_REGEX","PLURAL_OPTIONS","PLURAL_RULES","en","ar","ca","de","es","fa","fr","it","ko","ms","nl","pl","pt_BR","ru","tr","uk","uz","langPack","fallbackLangPack","createCallbackManager","currentLangCode","currentTimeFormat","getTranslation","cacheValue","cached","langString","processTranslation","importFallbackLangPack","getTranslationForLangString","translateString","remoteLangPack","remote","fetchRemoteString","withFallback","newLangPack","sourceLangPacks","fetchRemote","langInfo","rtl","default","template","optionIndex","getPluralOption","translationSlices","initialValue","processTemplate","formatInteger","SAMPLE_RATE","oggToWav","opusData","arrayBuffer","typedArray","decoderWorker","wavWorker","onmessage","command","buffers","buffer","page","terminate","wavBitDepth","wavSampleRate","decoderSampleRate","outputBufferSampleRate","pages","asCacheApiType","memoryCache","fetchPromises","progressCallbacks","cancellableCallbacks","mediaFormat","onProgress","callbackUniqueId","progressiveUrl","getProgressive","mediaPng","webpToPng","prepared","prepareMedia","mediaSource","MediaSource","streamUrl","sourceBuffer","addSourceBuffer","makeOnProgress","revokeObjectURL","fetchFromCacheOrRemote","activeCallbacks","getFromMemory","cancelProgress","parentCallback","endOfStream","appendBuffer","mediaData","serviceWorker","fullSize","controller","Bundles","LOAD_PROMISES","MEMORY_CACHE","Auth","Main","Extra","Calls","handleBundleLoad","bundle","listeners","listener","getDeviceToken","subscription","toJSON","endpoint","checkIfPushSupported","ServiceWorkerRegistration","Notification","permission","soundPlayedIds","playNotifySound","notificationSoundVolume","currentVolume","once","play","playNotifySoundDebounced","requestPermission","unsubscribeFromPush","dispatch","deleteDeviceToken","serviceWorkerRegistration","ready","pushManager","getSubscription","areSettingsLoaded","checkIfShouldResubscribe","userVisibleOnly","setDeviceToken","DOMException","ABORT_ERR","notifyAboutNewMessage","resultSettings","resultExceptions","loadNotificationSettings","hasFocus","checkIfShouldNotify","areNotificationsSupported","messageSender","messageAction","actionTargetMessage","targetUserIds","actionTargetUserIds","actionTargetChatId","actionTargetUsers","privateChatUserId","senderName","getNotificationContent","imageHash","mediaLoader","getAvatar","badge","vibrate","onclick","close","onshow","closeMessageNotifications","notifyClientReady","PATTERN_PLACEHOLDER","DEFAULT_PATTERN","getCountryCodesByIso","phoneCodeList","country","iso2","getCountryFromPhoneNumber","possibleCountries","countryCode","bestMatches","prefixes","prefix","formatPhoneNumber","pattern","numberWithoutCode","patterns","defaultPattern","stripped","getBestPattern","formatPhoneNumberWithCode","numberWithPlus","createMessageHash","messageList","parseLocationHash","typeOrThreadId","isType","fn","shouldRunFirst","shouldRunLast","waitingTimeout","interval","isPending","_args","setInterval","clearInterval","throttleWith","waiting","onIdle","requestIdleCallback","rafPromise","fastRafCallbacks","fastRafPrimaryCallbacks","onTickEndCallbacks","onTickEndPrimaryCallbacks","beforeUnloadCallbacks","isPrimary","currentCallbacks","currentPrimaryCallbacks","onBeforeUnload","isLast","unshift","RE_NOT_LETTER","searchWords","haystack","needle","haystackWords","needleWord","haystackWord","promisifyRequest","oncomplete","onsuccess","onabort","defaultGetStoreFunc","defaultGetStore","dbName","storeName","dbp","userAgentData","indexedDB","databases","intervalId","tryIdb","onupgradeneeded","createObjectStore","txMode","db","transaction","objectStore","createStore","DC_IDS","hasStoredSession","withLegacy","userAuthJson","dcID","dcId","removeItem","sessionId","sessionJson","customStore","idb","idbKeys","items","openCursor","continue","eachCursor","isInitialized","HEX_COLOR_REGEX","RGB_VARIABLES","lerp","start","end","interpolationRatio","colors","themeColors","property","hexToRgb","withAnimation","isDarkTheme","shouldAnimate","startIndex","endIndex","startAt","themeColorTag","querySelector","applyColorAnimationStep","transition","hex","r","g","propertyColors","formatFixedNumber","formatIntegerCompact","views","getFirstLetters","phrase","count","word","EMPTY_IMAGE_DATA_URI","initWebpWorker","wasmReady","requests","getDecodePromise","ImageData","putImageData","toBlob","createPng","webpToPngBase64","pngBlob","handleLibWebpMessage","WEBSYNC_URLS","WEBSYNC_VERSION","WEBSYNC_KEY","getTs","lastTimeout","authed","currentTs","canRedirect","ts","script","removeElement","URLSearchParams","version","saveSync","IS_LANDSCAPE","isLandscape","initialHeight","windowSize","updateSizes","isRefreshDisabled","handleResize","visualViewport","pageTop","vh","getIsKeyboardVisible","disableRefresh","enableRefresh","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","__webpack_modules__","m","getter","__esModule","getPrototypeOf","obj","ns","create","def","getOwnPropertyNames","definition","o","defineProperty","enumerable","f","chunkId","promises","u","miniCssF","globalThis","Function","done","needAttach","scripts","getElementsByTagName","charset","nc","onScriptComplete","doneFns","bind","head","toStringTag","scriptUrl","importScripts","currentScript","fullhref","existingLinkTags","dataHref","existingStyleTags","findStylesheet","linkTag","errorType","realHref","createStylesheet","miniCss","baseURI","installedChunks","installedChunkData","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","chunkLoadingGlobal","handleWorkerMessage","register","INITIAL_STATE","isLeftColumnShown","phoneCodes","general","groupCalls","activeChatFolder","recentEmojis","added","recent","greeting","featured","emojiKeywords","saved","inlineBots","byUsername","topPeers","topInlineBots","audioPlayer","playbackRate","notifications","dialogs","messageSendKeyCombo","autoLoadFileMaxSizeMb","shouldSuggestStickers","light","isBlurred","patternColor","dark","shouldShowContextMenuHint","updateCacheThrottled","updateCache","unsubscribeFromBeforeUnload","isCaching","isHeavyAnimating","setupCaching","clearCaching","reducedGlobal","reduceShowChatInfo","reduceUsers","reduceChats","reduceMessages","recentlyFoundChatIds","reduceSettings","reduceChatFolders","idsToSave","chatIdsToSave","mainThread","initialState","time","timeEnd","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","shouldAutoPlayVideos","shouldAutoPlayGifs","migrateCache","parsedMessageList","readCache","loadCache","STORAGE_KEY","tabKey","SITE_FONTS","preloadFonts","font","fonts","load","preloadAvatars","preloadTasks","main","telegramLogoPath","authCode","monkeyPath","authPassword","background","backgroundColor","hasCustomBackground","hasCustomBackgroundColor","isRightColumnShown","leftColumnWidth","setIsUiReady","isReady","markReady","useFlag","shouldRenderMask","safePreload","translation","setTranslation","getSuggestedLanguage","suggestedLanguage","MENU_HIDING_DURATION","inputRef","setFilter","filteredList","setFilteredList","updateFilter","filterValue","defaultName","getFilteredList","prevPhoneCodeList","handleInput","handleInputKeyDown","DropdownMenu","handleTrigger","select","formEl","getElementById","scrollTo","top","scrollHeight","behavior","inputValue","Spinner","MenuItem","isPreloadInitiated","setAuthPhoneNumber","setAuthRememberMe","loadNearestCountry","loadCountryList","clearAuthError","goToAuthQrCode","continueText","useLangString","setCountry","setPhoneNumber","isTouched","setIsTouched","lastSelection","setLastSelection","markIsLoading","unmarkIsLoading","fullNumber","canSubmit","parseFullNumber","newFullNumber","suggestedCountry","selectedCountry","handleLangChange","setSelectionRange","isJustPastedRef","handlePaste","handleCountryChange","handlePhoneNumberChange","selectionStart","selectionEnd","shouldFixSafariAutoComplete","handleKeepSessionChange","isAuthReady","onSubmit","InputText","Checkbox","Button","Loading","AuthCode","useModuleLoader","AuthPassword","AuthRegister","G","H","B","QrCreator","h","J","level","O","C","lineTo","arcTo","moveTo","z","v","N","K","P","fillStyle","fillRect","left","beginPath","q","D","E","R","I","F","fill","colorStops","createLinearGradient","apply","createRadialGradient","addColorStop","A","minVersion","maxVersion","ecLevel","radius","quiet","HTMLCanvasElement","clearRect","write","S","multiply","L","M","Q","returnToAuthPhoneNumber","qrCodeRef","token","isMobile","AuthQrCode","appInactivePath","renderMain","disconnect","isInactive","markInactive","TeactDOM"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/main.c92a96f8daed1b315a1e.js b/dist/main.c92a96f8daed1b315a1e.js new file mode 100644 index 000000000..3e0db31fb --- /dev/null +++ b/dist/main.c92a96f8daed1b315a1e.js @@ -0,0 +1,2 @@ +(()=>{"use strict";var e,t,n,r,o,d,a={1226:(e,t,n)=>{n.d(t,{t9:()=>c,u3:()=>l,g8:()=>i});var r=n(3716),o=n(6926),d=n(9118);let a;const u=new Map,s=new Map;function i(e,t){return a||(r.eM&&console.log(">>> START LOAD WORKER"),a=new Worker(new URL(n.p+n.u(927),n.b)),function(e){a.addEventListener("message",(({data:t})=>{if("update"===t.type)e(t.update);else if("methodResponse"===t.type){const e=u.get(t.messageId);e&&(t.error?e.reject(t.error):e.resolve(t.response))}else if("methodCallback"===t.type){var n,r;null===(n=u.get(t.messageId))||void 0===n||null===(r=n.callback)||void 0===r||r.call(n,...t.callbackArgs)}else if("unhandledError"===t.type)throw t.error}))}(e),"iOS"===t.platform&&window.addEventListener("focus",(async()=>{try{await Promise.race([f({type:"ping"}),(0,d.wO)(150).then((()=>Promise.reject(new Error("HEALTH_CHECK_TIMEOUT"))))])}catch(e){console.error(e),Date.now()-h>=5e3&&window.location.reload()}}))),f({type:"initApi",args:[t]})}function c(e,...t){if(a)return f({type:"callMethod",name:e,args:t});r.eM&&console.warn("API is not initialized")}function l(e){e.isCanceled=!0;const{messageId:t}=s.get(e)||{};t&&a.postMessage({type:"cancelProgress",messageId:t})}function f(e){const t=(0,o.Z)(u),n={messageId:t,...e},r={messageId:t},d=new Promise(((e,t)=>{Object.assign(r,{resolve:e,reject:t})}));if("args"in n&&"function"==typeof n.args[1]){const e=n.args.pop();r.callback=e,s.set(e,r)}return u.set(t,r),d.catch((()=>{})).finally((()=>{u.delete(t),r.callback&&s.delete(r.callback)})),a.postMessage(n),d}const h=Date.now()},6137:(e,t,n)=>{n.d(t,{Vv:()=>r.Vv,_f:()=>r._f,_Q:()=>r._Q,IU:()=>o.I});var r=n(4746),o=n(9077)},9077:(e,t,n)=>{let r;n.d(t,{I:()=>r}),function(e){e[e.BlobUrl=0]="BlobUrl",e[e.Lottie=1]="Lottie",e[e.Progressive=2]="Progressive",e[e.Stream=3]="Stream"}(r||(r={}))},4746:(e,t,n)=>{let r;n.d(t,{Vv:()=>r,_f:()=>o,_Q:()=>d}),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 o=-1,d="MESSAGE_DELETED"},88:(e,t,n)=>{n.d(t,{Z:()=>h});var r=n(4050),o=n(5116);const d=36,a=2147483647;function u(e,t,n){let r;for(e=n?Math.floor(e/700):e>>1,e+=Math.floor(e/t),r=0;e>455;r+=d)e=Math.floor(e/35);return Math.floor(r+36*e/(e+38))}function s(e,t){const n=[],r=[],o=e.length;let s,i,c,l,f,h,m,p,g,y,v,b,w;for(s=128,c=0,l=72,f=e.lastIndexOf("-"),f<0&&(f=0),h=0;h=128)throw new RangeError("Illegal input >= 0x80");n.push(e.charCodeAt(h))}for(m=f>0?f+1:0;m=o)throw RangeError("punycode_bad_input(1)");if(v=(I=e.charCodeAt(m++))-48<10?I-22:I-65<26?I-65:I-97<26?I-97:d,v>=d)throw RangeError("punycode_bad_input(2)");if(v>Math.floor((a-c)/g))throw RangeError("punycode_overflow(1)");if(c+=v*g,b=y<=l?1:y>=l+26?26:y-l,vMath.floor(a/(d-b)))throw RangeError("punycode_overflow(2)");g*=d-b}if(i=n.length+1,l=u(c-p,i,0===p),Math.floor(c/i)>a-s)throw RangeError("punycode_overflow(3)");s+=Math.floor(c/i),c%=i,t&&r.splice(c,0,e.charCodeAt(m-1)-65<26),n.splice(c,0,s),c++}var I;if(t)for(c=0,w=n.length;c{const t=[];let n=0;const r=e.length;let o;for(;n65535&&(o-=65536,t.push(String.fromCharCode(o>>>10&1023|55296)),o=56320|1023&o),t.push(String.fromCharCode(o))}return t.join("")})(n)}var i=n(3716),c=n(6752),l=n(1396);function f(e){if(!e)return;const t=(0,l.X)(e);if(t)try{let e=decodeURI(t);const n=e.match(/^https?:\/\/([^/:?#]+)(?:[/:?#]|$)/i);if(!n)return;const r=n[1];return e=e.replace(r,function(e){const t=e.split("."),n=[];for(let e=0;e{const{toggleSafeLinkModal:u,openTelegramLink:s}=(0,o.uC)(),h=d||t,m=e!==h,p=(0,r.I4)((t=>t.ctrlKey||t.altKey||t.shiftKey||t.metaKey||!e||!e.match(i.FS)&&!e.match(i.g$)?!m||(u({url:e}),t.preventDefault(),!1):(t.preventDefault(),s({url:e}),!1)),[m,s,u,e]);if(!e)return;const g=(0,c.Z)(n||"text-entity-link",t.length>50&&"long-word-break-all");return r.ZP.createElement("a",{href:(0,l.X)(e),title:f(e),target:"_blank",rel:"noopener noreferrer",className:g,onClick:p,dir:a?"rtl":"auto"},h)}))},5376:(e,t,n)=>{n.d(t,{yW:()=>r,K2:()=>o,mD:()=>d,Oh:()=>a,v6:()=>u});function r(e){return e>536870912?`${(e/1073741824).toFixed(1)} GB`:e>524288?`${(e/1048576).toFixed(1)} MB`:`${(e/1024).toFixed(1)} KB`}function o(e){const{fileName:t,mimeType:n}=e;return d(t,n)}function d(e,t){return e&&-1!==e.indexOf(".")?e.split(".").pop():t.split("/").pop()}function a(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 u(e){return Boolean(e.previewBlobUrl||e.thumbnail)}},4784:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(3681);const o=new RegExp(`^(?:${r.Z.source})+$`,""),d=e=>{if(e.length>24)return!1;if(!Boolean(e.match(o)))return!1;let t=0;for(;r.Z.exec(e);)if(t++,t>3)return r.Z.lastIndex=0,!1;return t}},8005:(e,t,n)=>{n.d(t,{D:()=>g});var r=n(4050),o=n(2858),d=n(8035),a=n(9937),u=n(2340),s=n(5116),i=n(782),c=n(6752),l=n(8033);const f=(0,s.c$)(void 0,((e,t)=>(0,i.ei)(t,["openUserInfo"])))((({className:e,sender:t,openUserInfo:n,children:o})=>{const d=(0,r.I4)((()=>{t&&n({id:t.id})}),[t,n]);return t?r.ZP.createElement(l.Z,{className:(0,c.Z)("UserLink",e),onClick:d},o):o})),h=(0,s.c$)(void 0,((e,t)=>(0,i.ei)(t,["focusMessage"])))((({className:e,message:t,children:n,focusMessage:o})=>{const d=(0,r.I4)((()=>{t&&o({chatId:t.chatId,messageId:t.id})}),[o,t]);return t?r.ZP.createElement(l.Z,{className:(0,c.Z)("MessageLink",e),onClick:d},n):n})),m=(0,s.c$)(void 0,((e,t)=>(0,i.ei)(t,["openChat"])))((({className:e,chatId:t,openChat:n,children:o})=>{const d=(0,r.I4)((()=>{t&&n({id:t})}),[t,n]);return t?r.ZP.createElement(l.Z,{className:(0,c.Z)("ChatLink",e),onClick:d},o):o})),p=(0,s.c$)(void 0,((e,t)=>(0,i.ei)(t,["joinGroupCall"])))((({className:e,groupCall:t,joinGroupCall:n,children:o})=>{const d=(0,r.I4)((()=>{t&&n({id:t.id,accessHash:t.accessHash})}),[t,n]);return t?r.ZP.createElement(l.Z,{className:(0,c.Z)("GroupCallLink",e),onClick:d},o):o}));function g(e,t,n,s,i,c,l={}){if(!t.content.action)return[];const{text:f,translationValues:g,amount:b,currency:w,call:I}=t.content.action,C=[],S={...l,maxTextLength:32};let E,P=e("Chat.Service.Group.UpdatedPinnedMessage1"!==f||i?f:"Message.PinnedGenericMessage",g&&g.length?g:void 0);return P.includes("%payment_amount%")&&(E=v(P,"%payment_amount%",(0,a.x)(b,w,e.code)),P=E.pop(),C.push(...E)),E=v(P,"%action_origin%",n?!l.isEmbedded&&function(e,t,n){return(0,o.YC)(t.id)?y(t,n):function(e,t,n){const a=(0,d.Z)((0,o.U)(e,t));return n?a:r.ZP.createElement(m,{className:"action-link",chatId:t.id},t&&(0,u.Z)(a))}(e,t,n)}(e,n,l.asPlain)||" ":"User"),P=E.pop(),C.push(...E),E=v(P,"%target_user%",s?s.map((e=>y(e,l.asPlain))).filter(Boolean):"User"),P=E.pop(),C.push(...E),E=v(P,"%message%",i?function(e,t,n={}){const a=(0,o.MK)(e,t),{photo:s,video:i,document:c,sticker:l}=(0,o.qp)(t),{maxTextLength:f,isEmbedded:m,asPlain:p}=n,g=m&&a&&!s&&!i&&!c&&!l;let y=(0,d.Z)(a,f);return m&&(s?y="a photo":i?y=i.isGif?"a GIF":"a video":c?y="a document":l&&(y=a)),p?g?`«${y}»`:y:g?r.ZP.createElement("span",null,"«",r.ZP.createElement(h,{className:"action-link",message:t},(0,u.Z)(y)),"»"):r.ZP.createElement(h,{className:"action-link",message:t},(0,u.Z)(y))}(e,i,S):"a message"),P=E.pop(),C.push(...E),E=v(P,"%product%",i?function(e){return e.content&&e.content.invoice?e.content.invoice.title:"a product"}(i):"a product"),P=E.pop(),C.push(...E),E=v(P,"%target_chat%",c?function(e,t){const n="another chat";return t?n:r.ZP.createElement(m,{className:"action-link",chatId:e},n)}(c,l.asPlain):"another chat"),C.push(...E),l.asPlain?C.join("").trim():I?function(e,t){return r.ZP.createElement(p,{groupCall:e},t)}(I,C):C}function y(e,t){const n=(0,d.Z)((0,o.Js)(e));return t?n:r.ZP.createElement(f,{className:"action-link",sender:e},e&&(0,u.Z)(n))}function v(e,t,n){const r=e.indexOf(t);if(r<0||!n)return[e];const o=[];return o.push(e.substring(0,r)),Array.isArray(n)?n.forEach(((e,t)=>{o.push(e),t+1{n.d(t,{Z:()=>h});var r=n(4050),o=n(3681),d=n(3716),a=n(7361),u=n(4284),s=n(6752),i=n(7373),c=n(88);const l=/^[\d\wа-яё]$/i,f=/(\*\*|__).+?\1/g;function h(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 o.Z.lastIndex=0,m(e,"big","jsx");case"emoji":return o.Z.lastIndex=0,m(e,"small","jsx");case"emoji_html":return o.Z.lastIndex=0,m(e,"small","html");case"br":return p(e,"jsx");case"br_html":return p(e,"html");case"highlight":return d=e,a=n.highlight,d.reduce(((e,t)=>{if("string"!=typeof t||!a)return[...e,t];const n=t.toLowerCase(),o=n.indexOf(a.toLowerCase()),d=n[o+a.length];if(o<0||d&&d.match(l))return[...e,t];const u=[];return u.push(t.substring(0,o)),u.push(r.ZP.createElement("span",{className:"matching-text-highlight"},t.substring(o,o+a.length))),u.push(t.substring(o+a.length)),[...e,...u]}),[]);case"links":return function(e){return e.reduce(((e,t)=>{if("string"!=typeof t)return[...e,t];const n=t.match(g);if(!n||!n.length)return[...e,t];const o=[];let d=n.shift(),a=0;for(;d;){const e=t.indexOf(d,a);o.push(t.substring(a,e)),d.startsWith("@")?o.push(r.ZP.createElement(i.Z,{username:d},d)):(d.endsWith("?")&&(d=d.slice(0,d.length-1)),o.push(r.ZP.createElement(c.Z,{text:d,url:d}))),a=e+d.length,d=n.shift()}return o.push(t.substring(a)),[...e,...o]}),[])}(e);case"simple_markdown":return y(e,"jsx");case"simple_markdown_html":return y(e,"html")}var d,a;return e}),[e])}function m(e,t,n){return a.op?e:e.reduce(((e,d)=>{if("string"!=typeof d)return[...e,d];const a=(d=(0,u.g6)(d)).split(o.Z),i=d.match(o.Z)||[];return e.push(a[0]),i.reduce(((e,d,i)=>{const c=(0,u.U_)((0,o.l)(d));if(!c)return e;const l=(0,s.Z)("emoji","small"===t&&"emoji-small");"jsx"===n&&e.push(r.ZP.createElement("img",{className:l,src:`./img-apple-${"big"===t?"160":"64"}/${c}.png`,alt:d})),"html"===n&&e.push(`${d}`);const f=2*i+2;return a[f]&&e.push(a[f]),e}),e)}),[])}function p(e,t){return e.reduce(((e,n)=>"string"!=typeof n?[...e,n]:[...e,...n.split(/\r\n|\r|\n/g).reduce(((e,n,o,d)=>{const a=n.trimLeft(),u=n.length-a.length;return e.push(String.fromCharCode(160).repeat(u)+a),o!==d.length-1&&e.push("jsx"===t?r.ZP.createElement("br",null):"
"),e}),[])]),[])}const g=new RegExp(`${d.FM}|${d.uW}`,"ig");function y(e,t){return e.reduce(((e,n)=>{if("string"!=typeof n)return[...e,n];const o=n.split(f),d=n.match(f)||[];return e.push(o[0]),d.reduce(((e,n,d)=>{"jsx"===t?e.push(n.startsWith("**")?r.ZP.createElement("b",null,n.replace(/\*\*/g,"")):r.ZP.createElement("i",null,n.replace(/__/g,""))):e.push(n.startsWith("**")?`${n.replace(/\*\*/g,"")}`:`${n.replace(/__/g,"")}`);const a=2*d+2;return o[a]&&e.push(o[a]),e}),e)}),[])}},386:(e,t,n)=>{n.d(t,{q:()=>d,b:()=>a});var r=n(3716),o=n(7361);function d(e,t=!1){o.cj||!document.activeElement||document.activeElement.id!==r.R2||!t&&e.target!==e.currentTarget||e.preventDefault()}function a(e){d(e,!0)}},7373:(e,t,n)=>{n.d(t,{Z:()=>u});var r=n(4050),o=n(5116),d=n(782),a=n(1638);const u=(0,o.c$)(((e,{userId:t})=>({userOrChat:t?(0,a.dy)(e,t):void 0})),((e,t)=>(0,d.ei)(t,["openChat","openChatByUsername"])))((({username:e,userOrChat:t,children:n,openChat:o,openChatByUsername:d})=>r.ZP.createElement("a",{onClick:()=>{t?o({id:t.id}):e&&d({username:e.substring(1)})},className:"text-entity-link",dir:"auto"},n)))},231:(e,t,n)=>{n.d(t,{Z:()=>u});var r=n(4050),o=n(6752),d=n(9204),a=n(8512);const u=({ref:e,type:t="button",onClick:n,onContextMenu:u,onMouseDown:s,onMouseEnter:i,onMouseLeave:c,onFocus:l,children:f,size:h="default",color:m="primary",backgroundImage:p,className:g,round:y,pill:v,fluid:b,isText:w,isLoading:I,ariaLabel:C,href:S,download:E,disabled:P,ripple:M,faded:A,tabIndex:k,isRtl:T,withClickPropagation:N})=>{let L=(0,r.sO)(null);e&&(L=e);const[R,D]=(0,r.eJ)(!1),Z=(0,o.Z)("Button",g,h,m,y&&"round",v&&"pill",b&&"fluid",P&&"disabled",w&&"text",I&&"loading",M&&"has-ripple",A&&"faded",R&&"clicked",p&&"with-image"),O=(0,r.I4)((e=>{!P&&n&&n(e),D(!0),setTimeout((()=>{D(!1)}),400)}),[P,n]),x=(0,r.I4)((e=>{N||e.preventDefault(),!P&&s&&s(e)}),[s,P,N]);return S?r.ZP.createElement("a",{ref:L,className:Z,href:S,title:C,download:E,tabIndex:k,dir:T?"rtl":void 0},f,!P&&M&&r.ZP.createElement(a.Z,null)):r.ZP.createElement("button",{ref:L,type:t,className:Z,onClick:O,onContextMenu:u,onMouseDown:x,onMouseEnter:i&&!P?i:void 0,onMouseLeave:c&&!P?c:void 0,onFocus:l&&!P?l:void 0,"aria-label":C,title:C,tabIndex:k,dir:T?"rtl":void 0,style:p?`background-image: url(${p})`:void 0},I?r.ZP.createElement("div",null,r.ZP.createElement("span",{dir:T?"auto":void 0},"Please wait..."),r.ZP.createElement(d.Z,{color:w?"blue":"white"})):f,!P&&M&&r.ZP.createElement(a.Z,null))}},4605:(e,t,n)=>{n.d(t,{Z:()=>s});var r=n(4050),o=n(6752),d=n(9107),a=n(2340),u=n(9204);const s=(0,r.X$)((({id:e,name:t,value:n,label:s,subLabel:i,checked:c,disabled:l,round:f,blocking:h,isLoading:m,onChange:p,onCheck:g})=>{const y=(0,d.Z)(),v=(0,r.I4)((e=>{p&&p(e),g&&g(e.currentTarget.checked)}),[p,g]),b=(0,o.Z)("Checkbox",l&&"disabled",f&&"round",m&&"loading",h&&"blocking");return r.ZP.createElement("label",{className:b,dir:y.isRtl?"rtl":void 0},r.ZP.createElement("input",{type:"checkbox",id:e,name:t,value:n,checked:c,disabled:l,onChange:v}),r.ZP.createElement("div",{className:"Checkbox-main"},r.ZP.createElement("span",{className:"label",dir:"auto"},(0,a.Z)(s)),i&&r.ZP.createElement("span",{className:"subLabel",dir:"auto"},(0,a.Z)(i))),m&&r.ZP.createElement(u.Z,null))}))},3106:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(4050),o=n(2328);const d=({trigger:e,className:t,children:n,positionX:d="left",positionY:a="top",footer:u,forceOpen:s,onOpen:i,onClose:c})=>{const l=(0,r.sO)(null),f=(0,r.sO)(null),[h,m]=(0,r.eJ)(!1);return r.ZP.createElement("div",{ref:f,className:`DropdownMenu ${t||""}`,onKeyDown:e=>{const t=l.current;if(!h||40!==e.keyCode||!t)return;const n=document.activeElement,r=Array.from(t.children);n&&-1!==r.indexOf(n)||r[0].focus()}},e({onTrigger:()=>{m(!h),h?c&&c():i&&i()},isOpen:h}),r.ZP.createElement(o.Z,{ref:l,containerRef:f,isOpen:h||!!s,className:t||"",positionX:d,positionY:a,footer:u,autoClose:!0,onClose:()=>{m(!1),c&&c()},shouldSkipTransition:s},n))}},7687:(e,t,n)=>{n.d(t,{Z:()=>a});var r=n(4050),o=n(6752),d=n(9107);const a=(0,r.X$)((({ref:e,id:t,className:n,value:a,label:u,error:s,success:i,disabled:c,readOnly:l,placeholder:f,autoComplete:h,inputMode:m,maxLength:p,onChange:g,onInput:y,onKeyPress:v,onKeyDown:b,onBlur:w,onPaste:I})=>{const C=(0,d.Z)(),S=s||i||u,E=(0,o.Z)("input-group",a&&"touched",s?"error":i&&"success",c&&"disabled",l&&"disabled",S&&"with-label",n);return r.ZP.createElement("div",{className:E,dir:C.isRtl?"rtl":void 0},r.ZP.createElement("input",{ref:e,className:"form-control",type:"text",id:t,dir:"auto",value:a||"",placeholder:f,maxLength:p,autoComplete:h,inputMode:m,disabled:c,readOnly:l,onChange:g,onInput:y,onKeyPress:v,onKeyDown:b,onBlur:w,onPaste:I}),S&&r.ZP.createElement("label",{htmlFor:t},S))}))},8033:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(4050),o=n(6752);const d=({children:e,className:t,isRtl:n,onClick:d})=>{const a=(0,r.I4)((e=>{e.preventDefault(),d(e)}),[d]);return r.ZP.createElement("a",{href:"#",className:(0,o.Z)("Link",t),dir:n?"rtl":"auto",onClick:d?a:void 0},e)}},4288:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(4050),o=n(9204);const d=(0,r.X$)((({color:e="blue"})=>r.ZP.createElement("div",{className:"Loading"},r.ZP.createElement(o.Z,{color:e,withBackground:"white"===e}))))},2328:(e,t,n)=>{n.d(t,{Z:()=>h});var r=n(4050),o=n(1212),d=n(2313),a=n(8758),u=n(274),s=n(3989),i=n(6752),c=n(8674),l=n(6590),f=n(386);const h=({ref:e,containerRef:t,isOpen:n,className:h,style:m,menuStyle:p,children:g,positionX:y="left",positionY:v="top",autoClose:b=!1,footer:w,noCloseOnBackdrop:I=!1,onCloseAnimationEnd:C,onClose:S,onMouseEnter:E,onMouseLeave:P,shouldSkipTransition:M})=>{let A=(0,r.sO)(null);e&&(A=e);const k=t||A,{transitionClassNames:T}=(0,o.Z)(n,C,M,void 0,M);(0,r.d4)((()=>n&&S?(0,s.Z)(S):void 0),[n,S]),(0,l.ZP)(n,S,void 0,void 0,b),(0,u.Z)((([e])=>{void 0!==e&&(0,c.YW)(200)}),[n]);const N=(0,d.Z)(A,n,b?S:void 0,void 0,!0);(0,a.Z)(n,k,I?void 0:S);const L=(0,i.Z)("bubble menu-container custom-scroll",v,y,w&&"with-footer",T);return r.ZP.createElement("div",{className:(0,i.Z)("Menu no-selection",h),onKeyDown:n?N:void 0,onMouseEnter:E,onMouseLeave:n?P:void 0,style:m},n&&r.ZP.createElement("div",{className:"backdrop",onMouseDown:f.b}),r.ZP.createElement("div",{ref:A,className:L,style:`transform-origin: ${v} ${y};${p||""}`,onClick:b?S:void 0},g,w&&r.ZP.createElement("div",{className:"footer"},w)))}},8964:(e,t,n)=>{n.d(t,{Z:()=>a});var r=n(4050),o=n(6752),d=n(9107);const a=e=>{const{icon:t,className:n,children:a,onClick:u,href:s,download:i,disabled:c,destructive:l,ariaLabel:f}=e,h=(0,d.Z)(),m=(0,r.I4)((e=>{if(c||!u)return e.stopPropagation(),void e.preventDefault();u(e)}),[c,u]),p=(0,r.I4)((e=>{if(13===e.keyCode||32===e.keyCode)return c||!u?(e.stopPropagation(),void e.preventDefault()):void u(e)}),[c,u]),g=(0,o.Z)("MenuItem",n,c&&"disabled",l&&"destructive"),y=r.ZP.createElement(r.ZP.Fragment,null,t&&r.ZP.createElement("i",{className:`icon-${t}`,"data-char":t.startsWith("char-")?t.replace("char-",""):void 0}),a);return s?r.ZP.createElement("a",{tabIndex:0,className:g,href:s,download:i,"aria-label":f,title:f,target:s.startsWith(window.location.origin)?"_self":"_blank",rel:"noopener noreferrer",dir:h.isRtl?"rtl":void 0,onClick:u},y):r.ZP.createElement("div",{role:"button",tabIndex:0,className:g,onClick:m,onKeyDown:p,"aria-label":f,title:f,dir:h.isRtl?"rtl":void 0},y)}},8512:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(4050),o=n(9118);const d=(0,r.X$)((()=>{const[e,t]=(0,r.eJ)([]),n=(0,r.Ye)((()=>(0,o.Ds)((()=>{t([])}),700,!1)),[]),d=(0,r.I4)((r=>{if(0!==r.button)return;const o=r.currentTarget,d=o.getBoundingClientRect(),a=o.offsetWidth/2;t([...e,{x:r.clientX-d.x-a/2,y:r.clientY-d.y-a/2,size:a}]),requestAnimationFrame((()=>{n()}))}),[e,n]);return r.ZP.createElement("div",{className:"ripple-container",onMouseDown:d},e.map((({x:e,y:t,size:n})=>r.ZP.createElement("span",{style:`left: ${e}px; top: ${t}px; width: ${n}px; height: ${n}px;`}))))}))},9204:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(4050),o=n(6752);const d=({color:e="blue",withBackground:t})=>r.ZP.createElement("div",{className:(0,o.Z)("Spinner",e,t&&"with-background")},r.ZP.createElement("div",null))},3716:(e,t,n)=>{n.d(t,{Ti:()=>r,ou:()=>o,iC:()=>d,Ji:()=>a,eM:()=>u,ZT:()=>s,Cg:()=>i,S:()=>c,b_:()=>l,Vx:()=>f,sd:()=>h,Uh:()=>m,gJ:()=>p,lO:()=>g,Cy:()=>y,lW:()=>v,SG:()=>b,lF:()=>w,fo:()=>I,ee:()=>C,by:()=>S,lo:()=>P,gZ:()=>M,hT:()=>A,YQ:()=>k,rS:()=>T,t_:()=>N,Ov:()=>L,EN:()=>R,pn:()=>D,Hk:()=>Z,Vk:()=>O,mo:()=>x,qU:()=>_,ul:()=>F,NM:()=>B,Qx:()=>$,mw:()=>U,oB:()=>j,zy:()=>W,CX:()=>G,xS:()=>V,b6:()=>H,AR:()=>z,r_:()=>Q,R2:()=>K,nY:()=>J,QU:()=>q,jT:()=>Y,_m:()=>X,ks:()=>ee,l3:()=>te,u_:()=>ne,rO:()=>re,AE:()=>oe,AJ:()=>de,fK:()=>ae,V$:()=>ue,bK:()=>se,ck:()=>ie,xn:()=>ce,K7:()=>le,w7:()=>fe,z7:()=>he,qp:()=>me,Q:()=>pe,Mw:()=>ge,DC:()=>ye,Y7:()=>ve,yK:()=>be,K2:()=>we,bM:()=>Ie,ku:()=>Ce,zq:()=>Se,n:()=>Ee,pR:()=>Pe,kU:()=>Me,Y:()=>Ae,Ng:()=>ke,oG:()=>Te,wG:()=>Ne,dI:()=>Le,FM:()=>Re,uW:()=>De,g$:()=>Ze,FS:()=>Oe,FD:()=>xe,aw:()=>_e,FV:()=>Fe,Nf:()=>Be,WS:()=>$e,DU:()=>Ue,EG:()=>je,t4:()=>We,sR:()=>Ge,$O:()=>Ve,Bg:()=>He,vi:()=>ze,Db:()=>Qe,mU:()=>Ke,p3:()=>Je,It:()=>qe,Vv:()=>Ye,g:()=>Xe,Ro:()=>et,aC:()=>tt,LH:()=>nt});const r="Telegram",o=" [Inactive]",d="Telegram WebZ",a="1.23.2",u=!1,s=!1,i=!1,c="Shoot!\nSomething went wrong, please see the error details in Dev Tools Console.",l="user_auth",f="GramJs:sessionId",h=!1,m="tt-global-state",p=30,g=5e3,y=!1,v="tt-media",b="tt-media-avatars",w="tt-media-progressive",I="tt-custom-bg",C="tt-lang-packs-v6",S=[1,5,10,50,100,500],E="undefined"!=typeof window&&window.innerHeight>=900,P=1,M=750,A=E?60:40,k=2*A,T=72,N=E?30:25,L=100,R=42,D=42,Z=20,O=30,x=200,_=500,F=20,B=!1,$=1,U=1,j=0,W=2,G=W,V=16,H=17,z=15,Q=1e4,K="editable-message-text",J="editable-message-text-modal",q=1440,Y=1150,X=1275,ee=925,te=600,ne=950,re=450,oe=1e9,de="0",ae=100,ue=1500,se=250,ie=600,ce=500,le=(Math.round((se+ie)/2),new Set(["newMessage","newScheduledMessage","deleteMessages","deleteScheduledMessages","deleteHistory"]),13),fe=11,he=160,me=120,pe=64,ge=48,ye=32,ve=64,be=64,we=160,Ie=140,Ce=80,Se=100,Ee="MEMOJI_STICKER",Pe="en",Me=200,Ae=450,ke="video/quicktime",Te=new Set(["image/png","image/gif","image/jpeg"]),Ne=new Set(["video/mp4"]),Le=new Set([...Te,...Ne]),Re="((ftp|https?):\\/\\/)?((www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,63})\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)",De="(@[\\w\\d_-]+)",Ze=/^tg:(\/\/)?([?=&\d\w_-]+)?/gm,Oe=/^(?:https?:\/\/)?(?:t\.me\/)/gm,xe=new Set(["AU","BD","CA","CO","EG","HN","IE","IN","JO","MX","MY","NI","NZ","PH","PK","SA","SV","US"]),_e="777000",Fe="1271266957",Be=0,$e=1,Ue=10,je=5,We=2147483646,Ge="en",Ve="android",He=["android","ios","tdesktop","macos"],ze="TelegramTips",Qe=["ar","pt-br","id","it","ko","ms","pl","es","tr"],Ke="https://bugs.telegram.org/?tag_ids=41&sort=time",Je="#A2AF8E",qe="#0F0F0F",Ye="#0a0a0a8c",Xe="rgba(90, 110, 70, 0.6)",et=100,tt=100*et,nt=!1},274:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(4050),o=n(7204);const d=(e,t,n)=>{const d=(0,o.Z)(t);return(0,r.d4)((()=>e(d||[])),t,n)}},706:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(4050);const o=(e=!1)=>{const[t,n]=(0,r.eJ)(e);return[t,(0,r.I4)((()=>{n(!0)}),[]),(0,r.I4)((()=>{n(!1)}),[])]}},5326:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(4050);const o=()=>{const[,e]=(0,r.eJ)(!1);return(0,r.I4)((()=>{e((e=>!e))}),[])}},8674:(e,t,n)=>{n.d(t,{_L:()=>o,OV:()=>d,YW:()=>s,ZP:()=>i});var r=n(4050);const o="tt-event-heavy-animation-start",d="tt-event-heavy-animation-end";let a,u=!1;const s=e=>(u||(u=!0,document.dispatchEvent(new Event(o))),a&&(clearTimeout(a),a=void 0),e&&(a=window.setTimeout((()=>{u=!1,document.dispatchEvent(new Event(d)),a=void 0}),e)),()=>{u=!1,document.dispatchEvent(new Event(d))}),i=(e,t)=>{(0,r.d4)((()=>(u&&e(),document.addEventListener(o,e),document.addEventListener(d,t),()=>{document.removeEventListener(d,t),document.removeEventListener(o,e)})),[t,e])}},6590:(e,t,n)=>{n.d(t,{Oy:()=>s,Wv:()=>l,ZP:()=>h});var r=n(4050),o=n(7361),d=n(7204),a=n(5116),u=n(782);const s=window.location.hash,i=`${window.location.pathname}${window.location.search}`,c={currentIndex:0,nextStateIndexToReplace:-1,isHistoryAltered:!1,isDisabled:!1,isEdge:!1,currentIndexes:[]},l=()=>{c.isDisabled=!0},f=()=>{c.isEdge&&setTimeout((()=>{c.isEdge=!1}),350)};function h(e,t,n,o,s=!1,l){const f=(0,r.sO)(-1),h=(0,r.sO)(!1),m=(0,d.Z)(e),p=(0,r.sO)(!0),g=(0,r.sO)([]),y=(0,d.Z)(l),v=(0,r.sO)(!1),b=(0,r.I4)(((t=!1)=>{if(l){const e=y||[];if(e.length{const e=++c.currentIndex;c.currentIndexes.push(e),window.history.pushState({index:e,state:o},"",`#${l[l.length-1]}`),g.current.push({index:e,hash:l[l.length-1]})}),0);else{const t=e.length-l.length;if(v.current)v.current=!1;else{if(l.length!==g.current.length&&t>0){const e=g.current[g.current.length-t-1];let n=t;if(e){const t=c.currentIndexes.findIndex((t=>t===e.index));n=c.currentIndexes.length-t-1}c.isHistoryAltered=!0,window.history.go(-n),g.current.splice(g.current.length-t-1,t).forEach((({index:e})=>{c.currentIndexes.splice(c.currentIndexes.indexOf(e),1)}))}l.length>0&&setTimeout((()=>{const e=++c.currentIndex;c.currentIndexes[c.currentIndexes.length-1]=e,window.history.replaceState({index:e,state:o},"",`${i}#${l[l.length-1]}`),g.current[g.current.length-1]={index:e,hash:l[l.length-1]}}),0)}}}else e&&!t&&(p.current=!1,h.current?(h.current=!1,c.currentIndexes.push(f.current)):setTimeout((()=>{const e=++c.currentIndex;c.currentIndexes.push(e),window.history[c.currentIndexes.includes(c.nextStateIndexToReplace-1)&&0!==window.history.state.index&&c.nextStateIndexToReplace===e&&!s?"replaceState":"pushState"]({index:e,state:o},""),f.current=e,s&&(c.nextStateIndexToReplace=c.currentIndex+1)}),0)),!t&&e||p.current||(f.current!==c.currentIndex&&s||(c.isHistoryAltered=!0,window.history.back(),setTimeout((()=>{c.nextStateIndexToReplace=-1}),400)),c.currentIndexes.splice(c.currentIndexes.indexOf(f.current),1),p.current=!0)}),[o,l,e,y,s]);return(0,r.d4)((()=>{const r=e=>{if(c.isHistoryAltered)return void setTimeout((()=>{c.isHistoryAltered=!1}),0);const{index:r}=e.state,o=r||0;try{const r=l?g.current[g.current.length-1].index:f.current,d=c.currentIndexes[c.currentIndexes.indexOf(r)-1];if(c.isDisabled)return;!p.current&&(0===o||o===d)||l&&(0===o||o===d)?(l&&(v.current=!0,g.current.pop()),c.currentIndexes.splice(c.currentIndexes.indexOf(r),1),t&&(c.isEdge&&(0,a.uC)().disableHistoryAnimations(),t(!c.isEdge),p.current=!0)):o===r&&p.current&&n&&!l&&(h.current=!0,c.isEdge&&(0,a.uC)().disableHistoryAnimations(),n(e.state.state))}catch(e){}},o=l?!y||!(0,u.et)(y,l):m!==e;return!c.isDisabled&&o&&b(),window.addEventListener("popstate",r),()=>window.removeEventListener("popstate",r)}),[o,b,l,e,t,n,y,m,s]),{forceClose:()=>b(!0)}}o.cj&&(window.addEventListener("touchstart",(e=>{const t=e.touches[0].pageX;(t<=300||t>=window.innerWidth-300)&&(c.isEdge=!0)})),window.addEventListener("touchend",f),window.addEventListener("popstate",f)),window.history.replaceState({index:c.currentIndex},"",i)},2313:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(4050);const o=(e,t,n,o,d)=>{const[a,u]=(0,r.eJ)(-1);return(0,r.d4)((()=>{u(-1);const n=e.current;t&&n&&!d&&(n.tabIndex=-1,n.focus())}),[e,t,d]),(0,r.I4)((t=>{const r=e.current;if(!r)return;if(13===t.keyCode&&n)return void n(a);if(38!==t.keyCode&&40!==t.keyCode)return;const d=document.activeElement,s=Array.from(o?r.querySelectorAll(o):r.children);let i=d&&s.indexOf(d)||a;if(38===t.keyCode&&i>0)i--;else if(40===t.keyCode&&i{n.d(t,{Z:()=>a});var r=n(663),o=n(5326),d=n(9290);const a=()=>{const e=(0,o.Z)();return(0,d.Z)((()=>r.ll(e)),[e]),r.i0}},8778:(e,t,n)=>{n.d(t,{Z:()=>a});var r=n(4050),o=n(9203),d=n(5326);const a=(e,t,n=!1,a=!1)=>{const u=(0,o.o5)(e,t),s=(0,d.Z)();return a&&(0,o.Qt)(s),(0,r.d4)((()=>{n||u||(0,o.$y)(e,t).then(s)}),[e,s,u,t,n]),u}},9290:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(7204);const o=(e,t)=>{const n=(0,r.Z)(t);n&&!t.some(((e,t)=>e!==n[t]))||e(n||[])}},7204:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(4050);const o=function(e,t){const n=(0,r.sO)(),{current:o}=n;return t&&void 0===e||(n.current=e),o}},1212:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(4050),o=n(6752);const d=(e=!1,t,n=!1,d="fast",a=!1)=>{const[u,s]=(0,r.eJ)(!e),i=(0,r.sO)(),[c,l]=(0,r.eJ)(e&&n);e?(s(!1),l(!0),i.current&&(window.clearTimeout(i.current),i.current=void 0)):(l(!1),u||i.current||(i.current=window.setTimeout((()=>{s(!0),t&&t(),i.current=void 0}),a?0:350)));const f=c&&!(a&&!e),h=Boolean(i.current),m=e||h;return{shouldRender:m,transitionClassNames:(0,o.Z)(d&&"opacity-transition",d,f&&"open",m&&"shown",h&&"closing")}}},8758:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(4050);function o(e,t,n){(0,r.d4)((()=>{const r=e=>{const r=t.current,o=e.target;r&&o&&(r.contains(e.target)&&!o.classList.contains("backdrop")||(e.preventDefault(),e.stopPropagation(),n&&n()))};return e&&n&&document.addEventListener("mousedown",r),()=>{document.removeEventListener("mousedown",r)}}),[e,t,n])}},5247:(e,t,n)=>{n.d(t,{Oo:()=>s,xg:()=>i,lQ:()=>h});var r=n(3716);const o=new Set(["scroll","mouseenter","mouseleave"]),d={},a=new Map,u={};function s(e,t,n,r=!1){const o=c(t,e);l(o,e,r)?function(e,t,n){u[e]||(u[e]=0,document.addEventListener(e,m)),function(e){return d[e]||(d[e]=new Map),d[e]}(e).set(t,n),function(e){const t=a.get(e);if(t)return t;const n=new Set;return a.set(e,n),n}(t).add(e),u[e]++}(o,e,n):e.addEventListener(o,n,r)}function i(e,t,n,r=!1){const o=c(t,e);l(o,e,r)?f(o,e):e.removeEventListener(o,n,r)}function c(e,t){const n=e.replace(/^on/,"").replace(/Capture$/,"").toLowerCase();return"change"===n&&"SELECT"!==t.tagName?"input":"doubleclick"===n?"dblclick":"focus"===n?"focusin":"blur"===n?"focusout":n}function l(e,t,n){return!n&&!o.has(e)&&"VIDEO"!==t.tagName&&"IFRAME"!==t.tagName}function f(e,t){u[e]--,u[e]||document.removeEventListener(e,m),d[e].delete(t),a.get(t).delete(e)}function h(e){const t=a.get(e);t&&(t.forEach((t=>f(t,e))),a.delete(e))}function m(e){const t=d[e.type];if(t){let n=!1,r=e.target;const o=()=>{n=!0},d=()=>{e.preventDefault()},a=new Proxy(e,{get:(e,t)=>"currentTarget"===t?r:"stopPropagation"===t||"stopImmediatePropagation"===t?o:"preventDefault"===t?d:Reflect.get(e,t)});for(;r&&r!==document.body;){const e=t.get(r);if(e&&(e(a),n))return;r=r.parentNode}}}r.eM&&document.addEventListener("dblclick",(()=>{console.log("DELEGATED EVENTS",{delegationRegistry:d,delegatedEventsByElement:a,documentEventCounters:u})}))},2916:(e,t,n)=>{n.d(t,{Z:()=>y});var r=n(4050),o=n(6926),d=n(3716),a=n(5247);const u=new Set(["key","ref","teactFastList","teactOrderKey"]),s=new Set(["dir"]),i={autoPlay:"autoplay",autoComplete:"autocomplete"},c={};function l(e,t,n,o,c,{skipComponentUpdate:y=!1,forceIndex:v=!1,fragment:b,moveDirection:w}={}){if(!y&&t&&n&&(0,r.op)(t)&&(0,r.op)(n)&&!(0,r.k)(t,n)&&(n=function(e,t){return e.componentInstance.props=t.componentInstance.props,(0,r.SO)(e.componentInstance)}(t,n)),!y&&n&&(0,r.op)(n)&&n.componentInstance.isMounted&&h(n,o,c,e),t===n)return n;if(!t&&n){(0,r.op)(n)&&(n=f(n,o,c,e));const t=m(n);(0,r.CD)(n,t),v&&e.childNodes[c]?e.insertBefore(t,e.childNodes[c]):(b||e).appendChild(t)}else if(t&&!n)e.removeChild((0,r.U9)(t)),(0,r.Zb)(t);else if(t&&n)if((0,r.k)(t,n)){(0,r.op)(n)&&(n=f(n,o,c,e));const d=m(n);(0,r.CD)(n,d),e.replaceChild(d,(0,r.U9)(t)),(0,r.Zb)(t)}else{const o=(0,r.op)(t)&&(0,r.op)(n);if(o||(0,r.CD)(n,(0,r.U9)(t)),(0,r.O_)(t)&&(0,r.O_)(n)){if(w){const n=(0,r.U9)(t),o=e.childNodes["up"===w?c:c+1];o?e.insertBefore(n,o):(b||e).appendChild(n)}o||function(e,t,n){const r=Object.keys(e.props),o=Object.keys(t.props);r.forEach((r=>{const o=e.props[r],d=t.props[r];void 0!==o&&(void 0===d||o!==d&&r.startsWith("on"))&&function(e,t,n){"className"===t?e.className="":"value"===t?e.value="":"style"===t?e.style.cssText="":"dangerouslySetInnerHTML"===t?e.innerHTML="":t.startsWith("on")?(0,a.xg)(e,t,n,t.endsWith("Capture")):t.startsWith("data-")||s.has(t)?e.removeAttribute(t):u.has(t)||delete e[i[t]||t]}(n,r,o)})),o.forEach((r=>{const o=e.props[r],d=t.props[r];void 0!==d&&d!==o&&g(n,r,d)}))}(t,n,(0,r.U9)(t)),n.children=function(e,t,n){if(t.props.teactFastList)return function(e,t,n){const o=new Set(t.children.map((e=>{const t="props"in e&&e.props.key;return d.eM&&(0,r.O_)(e)&&!t&&console.warn("Missing `key` in `teactFastList`"),t})));let a=0;const u=e.children.reduce(((e,r,d)=>{let u="props"in r?r.props.key:void 0;if(u&&!o.has(u))return l(n,r,void 0,t,-1),e;if(!u){const o=t.children[d],a=o&&"props"in o?o.props.key:void 0;if(!o||a)return l(n,r,void 0,t,-1),e;u=`__indexKey#${d}`}return e[u]={$element:r,index:a++,order:"props"in r?r.props.teactOrderKey:void 0},e}),{});let s,i,c=[],f=0;return t.children.forEach(((e,r)=>{const o="props"in e?e.props.key:`__indexKey#${r}`,d=u[o];if(!d)return s||(s=[],i=r),void s.push(e);s&&(c=c.concat(p(s,i,n,t)),i=void 0,s=void 0);const a="props"in e?e.props.teactOrderKey:void 0,h=d.index!==f&&d.order!==a,m=h&&f>d.index;h&&!m||f++,c.push(l(n,d.$element,e,t,r,{forceIndex:!0,...h&&{moveDirection:m?"down":"up"}}))})),s&&(c=c.concat(p(s,i,n,t))),c}(e,t,n);const o=Math.max(e.children.length,t.children.length),a=[],u=t.children.length>e.children.length+1?document.createDocumentFragment():void 0;for(let r=0;r=e.children.length?{fragment:u}:void 0);o&&a.push(o)}return u&&n.appendChild(u),a}(t,n,o?e:(0,r.U9)(t))}}return n}function f(e,t,n,o){if(!(0,r.op)(e))return e;const{componentInstance:d}=e;if(!d.isMounted){h(e=(0,r.Hb)(d),t,n,o);const a=e.children[0];(0,r.op)(a)&&(e.children=[f(a,e,0,o)]),d.isMounted=!0}return e}function h(e,t,n,r){const{componentInstance:o}=e;o.onUpdate=()=>{t.children[n]=l(r,t.children[n],o.$element,t,n,{skipComponentUpdate:!0})}}function m(e){if((0,r.V2)(e))return document.createTextNode("");if((0,r.iB)(e))return document.createTextNode(e.value);if((0,r.op)(e))return m(e.children[0]);const{tag:t,props:n,children:o=[]}=e,d=document.createElement(t);return"object"==typeof n.ref&&(n.ref.current=d),Object.keys(n).forEach((e=>{void 0!==n[e]&&g(d,e,n[e])})),e.children=o.map(((t,n)=>l(d,void 0,t,e,n))),d}function p(e,t,n,r){if(1===e.length)return[l(n,void 0,e[0],r,t,{forceIndex:!0})];if(e.length>1){const o=document.createDocumentFragment(),d=e.map((e=>l(n,void 0,e,r,t,{fragment:o})));return n.childNodes[t]?n.insertBefore(o,n.childNodes[t]):n.appendChild(o),d}throw new Error("Unexpected input")}function g(e,t,n){"className"===t?e.className=n:"value"===t?e.value=n:"style"===t?e.style.cssText=n:"dangerouslySetInnerHTML"===t?e.innerHTML=n.__html:t.startsWith("on")?(0,a.Oo)(e,t,n,t.endsWith("Capture")):t.startsWith("data-")||s.has(t)?e.setAttribute(t,n):u.has(t)||(e[i[t]||t]=n)}const y={render:function(e,t){if(!t)return;let n=t.getAttribute("data-teact-head-id");n||(n=(0,o.Z)(c),c[n]={children:[]},t.setAttribute("data-teact-head-id",n));const r=c[n];r.children=[l(t,r.children[0],e,r,0)]}}},4050:(e,t,n)=>{n.d(t,{V2:()=>f,iB:()=>h,op:()=>p,O_:()=>g,SO:()=>S,k:()=>E,Zb:()=>P,Hb:()=>M,U9:()=>T,CD:()=>N,eJ:()=>L,d4:()=>D,bt:()=>Z,Ye:()=>O,I4:()=>x,sO:()=>_,X$:()=>F,ZP:()=>B});var r=n(3716),o=n(9118),d=n(782),a=n(275),u=n(3592),s=n(5247);let i;!function(e){e[e.Empty=0]="Empty",e[e.Text=1]="Text",e[e.Tag=2]="Tag",e[e.Component=3]="Component"}(i||(i={}));const c=Symbol("Fragment");let l;function f(e){return e.type===i.Empty}function h(e){return e.type===i.Text}function m(e){return e.type===i.Tag}function p(e){return e.type===i.Component}function g(e){return m(e)||p(e)}function y(e,t,...n){return t||(t={}),n=(0,d.xH)(n),e===c?n:"function"==typeof e?function(e,t,n){let r;0===n.length?r=void 0:1===n.length?[r]=n:r=n;const o={$element:{},Component:e,name:e.name,props:{...t,...r&&{children:r}},isMounted:!1,hooks:{state:{cursor:0,byCursor:[]},effects:{cursor:0,byCursor:[]},memos:{cursor:0,byCursor:[]}}};return o.$element=v(o),o.$element}(e,t,n):function(e,t,n){return{type:i.Tag,tag:e,props:t,children:b(n).map(I)}}(e,t,n)}function v(e,t=[]){const{props:n}=e;return{componentInstance:e,type:i.Component,props:n,children:t}}function b(e){let t=e.length-1;for(;t>=0&&w(e[t]);t--);return t+17&&console.warn(`[Teact] Slow component render: ${n}, ${Math.round(t)} ms`),C[n].renderTimes.push(t),C[n].renderCount++}}catch(t){(0,u.S)(t),o=e.renderedValue}if(e.isMounted&&o===e.renderedValue)return e.$element;e.renderedValue=o;const d=I(o);return e.$element=v(e,[d]),e.$element}function E(e,t){return typeof e!=typeof t||e.type!==t.type||(h(e)&&h(t)?e.value!==t.value:m(e)&&m(t)?e.tag!==t.tag||e.props.key!==t.props.key:!(!p(e)||!p(t)||e.componentInstance.Component===t.componentInstance.Component&&e.props.key===t.props.key))}function P(e){var t;g(e)&&(p(e)?(t=e.componentInstance).isMounted&&(t.hooks.memos.byCursor.forEach((e=>{e.current=null})),t.hooks.effects.byCursor.forEach((({cleanup:e})=>{if("function"==typeof e)try{e()}catch(e){(0,u.S)(e)}})),t.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.renderedValue=null,e.Component=null,e.props=null,e.forceUpdate=null,e.onUpdate=null}(t)):e.target&&((0,s.lQ)(e.target),e.target=null),e.children.forEach(P))}function M(e){return S(e),e.isMounted=!0,e.$element}function A(e){e.isMounted&&(e.hooks.state.byCursor.forEach((e=>{e.value=e.nextValue})),e.prepareForFrame=(0,o.wT)((()=>A(e))),e.forceUpdate=(0,o.mS)((()=>k(e))))}function k(e){if(!e.isMounted||!e.onUpdate)return;const t=e.$element;S(e),e.$element!==t&&e.onUpdate()}function T(e){return p(e)?T(e.children[0]):e.target}function N(e,t){p(e)?N(e.children[0],t):e.target=t}function L(e){const{cursor:t,byCursor:n}=l.hooks.state;var d;return void 0===n[t]&&(n[t]={value:e,nextValue:e,setter:(d=l,e=>{n[t].nextValue!==e&&(n[t].nextValue="function"==typeof e?e(n[t].value):e,d.prepareForFrame&&d.forceUpdate||(d.prepareForFrame=(0,o.wT)((()=>A(d))),d.forceUpdate=(0,o.mS)((()=>k(d)))),d.prepareForFrame(),d.forceUpdate(),r.ZT&&"TeactNContainer"!==d.name&&console.log("[Teact.useState]",d.name,d.Component&&d.Component.DEBUG_contentComponentName?`> ${d.Component.DEBUG_contentComponentName}`:"",`Forced update at cursor #${t}, next value: `,n[t].nextValue))})}),l.hooks.state.cursor++,[n[t].value,n[t].setter]}function R(e,t,n,r,o){const{cursor:d,byCursor:a}=l.hooks.effects,s=l;function i(){if(!s.isMounted)return;const{cleanup:e}=a[d];if("function"==typeof e)try{e()}catch(e){(0,u.S)(e)}}function c(){s.isMounted&&(a[d].cleanup=n())}if(void 0!==a[d]&&r&&a[d].dependencies){if(r.some(((e,t)=>e!==a[d].dependencies[t]))){if(o){const e=r.reduce(((e,t,n)=>{const r=a[d].dependencies[n];return t!==r&&e.push(`${n}: ${r} => ${t}`),e}),[]);console.log("[Teact]",o,"Effect caused by dependencies.",e.join(", "))}t(i),e(c)}}else t(i),e(c);a[d]={effect:n,dependencies:r,cleanup:a[d]?a[d].cleanup:void 0},l.hooks.effects.cursor++}function D(e,t,n){return R(o.T2,o.D0,e,t,n)}function Z(e,t,n){return R(o.R3,o.zD,e,t,n)}function O(e,t,n){const{cursor:o,byCursor:d}=l.hooks.memos;let{current:u}=d[o]||{};return(void 0===d[o]||t.some(((e,t)=>e!==d[o].dependencies[t])))&&(r.eM&&n&&console.log(`[Teact.useMemo] ${l.name} (${n}): Update is caused by:`,d[o]?(0,a.c)(t,d[o].dependencies).join(", "):"[first render]"),u=e()),d[o]={current:u,dependencies:t},l.hooks.memos.cursor++,u}function x(e,t,n){return O((()=>e),t,n)}function _(e){return O((()=>({current:e})),[])}function F(e,t=a.Z,n){return function(o){const d=_(o),u=_();return(!u.current||d.current&&!t(d.current,o))&&(r.eM&&n&&console.log(`[Teact.memo] ${e.name} (${n}): Update is caused by:`,(0,a.c)(d.current,o).join(", ")),d.current=o,u.current=y(e,o)),u.current}}document.addEventListener("dblclick",(()=>{console.log("COMPONENTS",(0,d.Xo)(Object.values(C),"renderCount","desc"))}));const B={createElement:y,Fragment:c}},5116:(e,t,n)=>{n.d(t,{ZP:()=>f,R3:()=>w,Rd:()=>I,uC:()=>C,Q6:()=>S,ll:()=>E,Iq:()=>P,c$:()=>M});var r=n(4050),o=n(3716),d=n(5326),a=n(6926),u=n(9118),s=n(275),i=n(782),c=n(3592);function l(){return(l=Object.assign||function(e){for(var t=1;t7&&console.warn(`[TeactN] Slow containers update: ${Math.round(t)} ms`)}}],g={},y=new Map;function v(){p.forEach((e=>e(h)))}const b=(0,u.mS)(v);function w(e,t=!1){"object"==typeof e&&e!==h&&(h=e,t?v():b())}function I(){return h}function C(){return g}function S(e,t){m[e]||(m[e]=[],g[e]=(t,n=!1)=>{!function(e,t,n){m[e]&&m[e].forEach((e=>{const r=e(h,g,t);r&&w(r,n)}))}(e,t,n)}),m[e].push(t)}function E(e){p.push(e)}function P(e){const t=p.indexOf(e);-1!==t&&p.splice(t,1)}function M(e=(()=>({})),t=(()=>({}))){return n=>function o(u){o.DEBUG_contentComponentName=n.name;const[i]=(0,r.eJ)((0,a.Z)(y)),f=(0,d.Z)();(0,r.d4)((()=>()=>{y.delete(i)}),[i]);let m=y.get(i);if(m||(m={mapStateToProps:e,mapReducersToProps:t,ownProps:u,areMappedPropsChanged:!1,forceUpdate:f,DEBUG_updates:0,DEBUG_componentName:n.name},y.set(i,m)),m.areMappedPropsChanged&&(m.areMappedPropsChanged=!1),!m.mappedProps||!(0,s.Z)(m.ownProps,u)){m.ownProps=u;try{m.mappedProps={...e(h,u),...t(w,g)}}catch(e){(0,c.S)(e)}}return r.ZP.createElement(n,l({},m.mappedProps,u))}}o.eM&&(window.getGlobal=I,document.addEventListener("dblclick",(()=>{console.log("GLOBAL CONTAINERS",(0,i.Xo)(Array.from(y.values()).map((({DEBUG_componentName:e,DEBUG_updates:t})=>({DEBUG_componentName:e,DEBUG_updates:t}))),"DEBUG_updates","desc"))})))},3681:(e,t,n)=>{n.d(t,{l:()=>d,Z:()=>a});const r=/\uFE0F/g,o=String.fromCharCode(8205);function d(e){return e.indexOf(o)<0?e.replace(r,""):e}const a=/(?:\ud83d\udc68\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffc-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb\udffd-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb-\udffd\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb-\udffe]|\ud83d\udc68\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc68\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc68\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\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\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\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\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\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\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\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\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\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\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffc-\udfff]|\ud83e\uddd1\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb\udffd-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb-\udffd\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d[\udc68\udc69]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d[\udc68\udc69]|\ud83e\uddd1\u200d\ud83e\udd1d\u200d\ud83e\uddd1|\ud83d\udc6b\ud83c[\udffb-\udfff]|\ud83d\udc6c\ud83c[\udffb-\udfff]|\ud83d\udc6d\ud83c[\udffb-\udfff]|\ud83d\udc8f\ud83c[\udffb-\udfff]|\ud83d\udc91\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d\udc8f\udc91])|(?:\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\uddd4\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?\u200d[\u2640\u2642]\ufe0f|(?:\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\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\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\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|\ud83d\ude36\u200d\ud83c\udf2b\ufe0f|\u2764\ufe0f\u200d\ud83d\udd25|\u2764\ufe0f\u200d\ud83e\ude79|\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|\ud83d\ude2e\u200d\ud83d\udca8|\ud83d\ude35\u200d\ud83d\udcab|\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-\udc8e\udc90\udc92-\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},1363:(e,t,n)=>{var r=n(5116),o=n(1226),d=n(3716),a=n(7361),u=n(8406),s=n(9524),i=n(7358),c=n(4688),l=n(1622);(0,r.Q6)("initApi",((e,t)=>{(async()=>{d.Cg||(await(0,c.Qw)(),(0,c.f3)()),(0,o.g8)(t.apiUpdate,{userAgent:navigator.userAgent,platform:a.Lt,sessionData:(0,c.K8)(),isTest:window.location.search.includes("test"),isMovSupported:a.pA})})()})),(0,r.Q6)("setAuthPhoneNumber",((e,t,n)=>{const{phoneNumber:r}=n;return(0,o.t9)("provideAuthPhoneNumber",r.replace(/[^\d]/g,"")),{...e,authIsLoading:!0,authError:void 0}})),(0,r.Q6)("setAuthCode",((e,t,n)=>{const{code:r}=n;return(0,o.t9)("provideAuthCode",r),{...e,authIsLoading:!0,authError:void 0}})),(0,r.Q6)("setAuthPassword",((e,t,n)=>{const{password:r}=n;return(0,o.t9)("provideAuthPassword",r),{...e,authIsLoading:!0,authError:void 0}})),(0,r.Q6)("uploadProfilePhoto",((e,t,n)=>{const{file:r}=n;(0,o.t9)("uploadProfilePhoto",r)})),(0,r.Q6)("signUp",((e,t,n)=>{const{firstName:r,lastName:d}=n;return(0,o.t9)("provideAuthRegistration",{firstName:r,lastName:d}),{...e,authIsLoading:!0,authError:void 0}})),(0,r.Q6)("returnToAuthPhoneNumber",(e=>((0,o.t9)("restartAuth"),{...e,authError:void 0}))),(0,r.Q6)("goToAuthQrCode",(e=>((0,o.t9)("restartAuthWithQr"),{...e,authIsLoadingQrCode:!0,authError:void 0}))),(0,r.Q6)("saveSession",((e,t,n)=>{const{sessionData:r}=n;r?(0,c.wX)(n.sessionData,e.currentUserId):(0,c.jv)()})),(0,r.Q6)("signOut",(()=>{(async()=>{try{await(0,u.r1)(),await(0,o.t9)("destroy"),await(0,l.I)(!1)}catch(e){}(0,r.uC)().reset()})()})),(0,r.Q6)("reset",(()=>{(0,c.jv)(),s.clear(d.lW),s.clear(d.SG),s.clear(d.lF),s.clear(d.fo);const e=d.ee.replace(/\d+$/,""),t=(d.ee.match(/\d+$/)||[0])[0];for(let n=0;n{(async()=>{await(0,o.t9)("disconnect")})()})),(0,r.Q6)("loadNearestCountry",(e=>{"connectionStateReady"===e.connectionState&&(async()=>{const e=await(0,o.t9)("fetchNearestCountry");(0,r.R3)({...(0,r.Rd)(),authNearestCountry:e})})()})),(0,r.Q6)("setDeviceToken",((e,t,n)=>{(0,r.R3)({...e,push:{deviceToken:n,subscribedAt:Date.now()}})})),(0,r.Q6)("deleteDeviceToken",(e=>{const t={...e};delete t.push,(0,r.R3)(t)}))},9667:(e,t,n)=>{var r=n(5116),o=n(1713),d=n(3716),a=n(1226),u=n(782),s=n(8406),i=n(663),c=n(1638),l=n(307),f=n(2858);function h(e,{visibility:t,allowedIds:n,deniedIds:r}){const{users:{byId:o},chats:{byId:d}}=e,a={visibility:t};let u,s;const i=e=>{if(!(0,f.YC)(e))return;const{id:t,accessHash:n}=o[e]||{};return t?{id:t,accessHash:n}:void 0},c=e=>{if((0,f.YC)(e))return;const t=d[e];return t?{id:t.id}:void 0};return"contacts"!==t&&"nobody"!==t||(u=n.map(i).filter(Boolean),s=n.map(c).filter(Boolean),u.length>0&&(a.allowedUsers=u),s.length>0&&(a.allowedChats=s)),"everybody"!==t&&"contacts"!==t||(u=r.map(i).filter(Boolean),s=r.map(c).filter(Boolean),u.length>0&&(a.blockedUsers=u),s.length>0&&(a.blockedChats=s)),a}(0,r.Q6)("updateProfile",((e,t,n)=>{const{photo:d,firstName:u,lastName:s,bio:i,username:f}=n;(async()=>{const{currentUserId:t}=e;if(t){if((0,r.R3)({...(0,r.Rd)(),profileEdit:{progress:o.rN.InProgress}}),d&&await(0,a.t9)("updateProfilePhoto",d),(u||s||i)&&await(0,a.t9)("updateProfile",{firstName:u,lastName:s,about:i})){e=(0,r.Rd)();const n=t&&(0,c.dy)(e,t);n&&(0,r.R3)((0,l.Nq)(e,n.id,{firstName:u,lastName:s,fullInfo:{...n.fullInfo,bio:i}}))}f&&await(0,a.t9)("updateUsername",f)&&t&&(0,r.R3)((0,l.Nq)((0,r.Rd)(),t,{username:f})),(0,r.R3)({...(0,r.Rd)(),profileEdit:{progress:o.rN.Complete}})}})()})),(0,r.Q6)("checkUsername",((e,t,n)=>{const{username:d}=n;(async()=>{if(e.profileEdit&&e.profileEdit.progress===o.rN.InProgress)return;(0,r.R3)({...e,profileEdit:{progress:e.profileEdit?e.profileEdit.progress:o.rN.Idle,isUsernameAvailable:void 0}});const t=await(0,a.t9)("checkUsername",d);e=(0,r.Rd)(),(0,r.R3)({...e,profileEdit:{...e.profileEdit,isUsernameAvailable:t}})})()})),(0,r.Q6)("loadWallpapers",(()=>{(async()=>{const e=await(0,a.t9)("fetchWallpapers");if(!e)return;const t=(0,r.Rd)();(0,r.R3)({...t,settings:{...t.settings,loadedWallpapers:e.wallpapers}})})()})),(0,r.Q6)("uploadWallpaper",((e,t,n)=>{const d=n,u=URL.createObjectURL(d);(0,r.R3)({...e,settings:{...e.settings,loadedWallpapers:[{slug:o.mp,document:{fileName:"",size:d.size,mimeType:d.type,previewBlobUrl:u}},...e.settings.loadedWallpapers||[]]}}),(async()=>{const t=await(0,a.t9)("uploadWallpaper",d);if(!t)return;const{wallpaper:n}=t;if(!(e=(0,r.Rd)()).settings.loadedWallpapers)return;const s=e.settings.loadedWallpapers[0];if(!s||s.slug!==o.mp)return;const i={...n,document:{...n.document,previewBlobUrl:u}};(0,r.R3)({...e,settings:{...e.settings,loadedWallpapers:[i,...e.settings.loadedWallpapers.slice(1)]}})})()})),(0,r.Q6)("loadBlockedContacts",(()=>{(async()=>{var e,t;const n=await(0,a.t9)("fetchBlockedContacts");if(!n)return;let o=(0,r.Rd)();null!==(e=n.users)&&void 0!==e&&e.length&&(o=(0,l.Sh)(o,(0,u.ee)(n.users,"id"))),null!==(t=n.chats)&&void 0!==t&&t.length&&(o=(0,l.GL)(o,(0,u.ee)(n.chats,"id"))),o={...o,blocked:{...o.blocked,ids:[...o.blocked.ids||[],...n.blockedIds],totalCount:n.totalCount}},(0,r.R3)(o)})()})),(0,r.Q6)("blockContact",((e,t,n)=>{const{contactId:o,accessHash:d}=n;(async()=>{if(!await(0,a.t9)("blockContact",o,d))return;const e=(0,r.Rd)();(0,r.R3)((0,l.O4)(e,o))})()})),(0,r.Q6)("unblockContact",((e,t,n)=>{const{contactId:o}=n;let d;if((0,f.YC)(o)){const t=(0,c.dy)(e,o);if(!t)return;d=t.accessHash}(async()=>{if(!await(0,a.t9)("unblockContact",o,d))return;const e=(0,r.Rd)();(0,r.R3)((0,l.rB)(e,o))})()})),(0,r.Q6)("loadAuthorizations",(()=>{(async()=>{const e=await(0,a.t9)("fetchAuthorizations");e&&(0,r.R3)({...(0,r.Rd)(),activeSessions:e})})()})),(0,r.Q6)("terminateAuthorization",((e,t,n)=>{const{hash:o}=n;(async()=>{if(!await(0,a.t9)("terminateAuthorization",o))return;const e=(0,r.Rd)();(0,r.R3)({...e,activeSessions:e.activeSessions.filter((e=>e.hash!==o))})})()})),(0,r.Q6)("terminateAllAuthorizations",(()=>{(async()=>{if(!await(0,a.t9)("terminateAllAuthorizations"))return;const e=(0,r.Rd)();(0,r.R3)({...e,activeSessions:e.activeSessions.filter((e=>e.isCurrent))})})()})),(0,r.Q6)("loadNotificationExceptions",(e=>{const{serverTimeOffset:t}=e;(async()=>{const e=await(0,a.t9)("fetchNotificationExceptions",{serverTimeOffset:t});e&&(0,r.R3)((0,l.aJ)((0,r.Rd)(),e))})()})),(0,r.Q6)("loadNotificationSettings",(e=>{const{serverTimeOffset:t}=e;(async()=>{const e=await(0,a.t9)("fetchNotificationSettings",{serverTimeOffset:t});e&&(0,r.R3)((0,l.BI)((0,r.Rd)(),e))})()})),(0,r.Q6)("updateNotificationSettings",((e,t,n)=>{const{peerType:o,isSilent:d,shouldShowPreviews:u}=n;(async()=>{await(0,a.t9)("updateNotificationSettings",o,{isSilent:d,shouldShowPreviews:u})&&(0,r.R3)((0,l.HN)((0,r.Rd)(),o,d,u))})()})),(0,r.Q6)("updateWebNotificationSettings",((e,t,n)=>{(async()=>{(0,r.R3)((0,l.BI)((0,r.Rd)(),n));const e=(0,r.Rd)(),{hasPushNotifications:t,hasWebNotifications:o}=e.settings.byKey;o&&t?await(0,s.Ld)():await(0,s.r1)()})()})),(0,r.Q6)("updateContactSignUpNotification",((e,t,n)=>{const{isSilent:o}=n;(async()=>{await(0,a.t9)("updateContactSignUpNotification",o)&&(0,r.R3)((0,l.BI)((0,r.Rd)(),{hasContactJoinedNotifications:!o}))})()})),(0,r.Q6)("loadLanguages",(()=>{(async()=>{const e=await(0,a.t9)("fetchLanguages");e&&(0,r.R3)((0,l.BI)((0,r.Rd)(),{languages:e}))})()})),(0,r.Q6)("loadPrivacySettings",(()=>{(async()=>{const[e,t,n,o,d]=await Promise.all([(0,a.t9)("fetchPrivacySettings","phoneNumber"),(0,a.t9)("fetchPrivacySettings","lastSeen"),(0,a.t9)("fetchPrivacySettings","profilePhoto"),(0,a.t9)("fetchPrivacySettings","forwards"),(0,a.t9)("fetchPrivacySettings","chatInvite")]);if(!(e&&t&&n&&o&&d))return;const u=(0,r.Rd)();u.settings.privacy.phoneNumber=e,u.settings.privacy.lastSeen=t,u.settings.privacy.profilePhoto=n,u.settings.privacy.forwards=o,u.settings.privacy.chatInvite=d,(0,r.R3)(u)})()})),(0,r.Q6)("setPrivacyVisibility",((e,t,n)=>{const{privacyKey:o,visibility:d}=n,{privacy:{[o]:u}}=e.settings;if(!u)return;const s=h(e,{visibility:d,allowedIds:[...u.allowUserIds,...u.allowChatIds],deniedIds:[...u.blockUserIds,...u.blockChatIds]});(async()=>{const e=await(0,a.t9)("setPrivacySettings",o,s);if(e){const t=(0,r.Rd)();t.settings.privacy[o]=e,(0,r.R3)(t)}})()})),(0,r.Q6)("setPrivacySettings",((e,t,n)=>{const{privacyKey:o,isAllowList:d,contactsIds:u}=n,{privacy:{[o]:s}}=e.settings;if(!s)return;const i=h(e,{visibility:s.visibility,allowedIds:d?u:[...s.allowUserIds,...s.allowChatIds],deniedIds:d?[...s.blockUserIds,...s.blockChatIds]:u});(async()=>{const e=await(0,a.t9)("setPrivacySettings",o,i);if(e){const t=(0,r.Rd)();t.settings.privacy[o]=e,(0,r.R3)(t)}})()})),(0,r.Q6)("updateIsOnline",((e,t,n)=>{(0,a.t9)("updateIsOnline",n)})),(0,r.Q6)("loadContentSettings",(()=>{(async()=>{const e=await(0,a.t9)("fetchContentSettings");e&&(0,r.R3)((0,l.BI)((0,r.Rd)(),e))})()})),(0,r.Q6)("updateContentSettings",((e,t,n)=>{(async()=>{(0,r.R3)((0,l.BI)((0,r.Rd)(),{isSensitiveEnabled:n})),await(0,a.t9)("updateContentSettings",n)||(0,r.R3)((0,l.BI)((0,r.Rd)(),{isSensitiveEnabled:!n}))})()})),(0,r.Q6)("loadCountryList",((e,t,n={})=>{let{langCode:o}=n;o||(o=e.settings.byKey.language),(async()=>{const e=await(0,a.t9)("fetchCountryList",{langCode:o});e&&(0,r.R3)({...(0,r.Rd)(),countryList:e})})()})),(0,r.Q6)("ensureTimeFormat",((e,t)=>{if(e.authNearestCountry){const n=d.FD.has(e.authNearestCountry.toUpperCase())?"12h":"24h";t.setSettingOption({timeFormat:n}),(0,i.qf)(n)}(async()=>{if((0,r.Rd)().settings.byKey.wasTimeFormatSetManually)return;const e=await(0,a.t9)("fetchNearestCountry");if(e){const n=d.FD.has(e.toUpperCase())?"12h":"24h";t.setSettingOption({timeFormat:n}),(0,i.qf)(n)}})()}))},4907:(e,t,n)=>{var r=n(5116),o=n(3716),d=n(8406),a=n(307),u=n(663),s=n(1638),i=n(1622),c=n(1947);(0,r.Q6)("apiUpdate",((e,t,n)=>{switch(o.eM&&"updateUserStatus"!==n["@type"]&&"updateServerTimeOffset"!==n["@type"]&&console.log("[GramJs] UPDATE",n["@type"],{update:n}),n["@type"]){case"updateApiReady":!function(e){const{hasWebNotifications:t,hasPushNotifications:n}=(0,s.dZ)(e);t&&n&&(0,d.Ld)(),(0,u.m0)(e.settings.byKey.language)}(e);break;case"updateAuthorizationState":!function(e){let t=(0,r.Rd)();const n="authorizationStateReady"===t.authState,o=e.authorizationState;switch((0,r.R3)({...t,authState:o,authIsLoading:!1}),t=(0,r.Rd)(),o){case"authorizationStateLoggingOut":(0,i.I)(!1),(0,r.R3)({...t,isLoggingOut:!0});break;case"authorizationStateWaitCode":(0,r.R3)({...t,authIsCodeViaApp:e.isCodeViaApp});break;case"authorizationStateWaitPassword":(0,r.R3)({...t,authHint:e.hint});break;case"authorizationStateWaitQrCode":(0,r.R3)({...t,authIsLoadingQrCode:!1,authQrCode:e.qrCode});break;case"authorizationStateReady":if(n)break;(0,i.I)(!0),(0,r.R3)({...t,isLoggingOut:!1,lastSyncTime:Date.now()})}}(n);break;case"updateAuthorizationError":!function(e){(0,r.R3)({...(0,r.Rd)(),authError:e.message})}(n);break;case"updateConnectionState":!function(e){const{connectionState:t}=e,n=(0,r.Rd)();(0,r.R3)({...n,connectionState:t}),"connectionStateReady"===t&&"authorizationStateReady"===n.authState?(0,r.uC)().sync():"connectionStateBroken"===t&&(0,r.uC)().signOut()}(n);break;case"updateSession":!function(e){const{sessionData:t}=e,{authRememberMe:n,authState:o}=(0,r.Rd)(),d=!t||!t.mainDcId;n&&"authorizationStateReady"===o&&!d&&(0,r.uC)().saveSession({sessionData:t})}(n);break;case"updateServerTimeOffset":!function(e){const t=(0,r.Rd)();t.serverTimeOffset!==e.serverTimeOffset&&(0,r.R3)({...t,serverTimeOffset:e.serverTimeOffset})}(n);break;case"updateCurrentUser":!function(e){const{currentUser:t}=e;(0,r.R3)({...(0,a.Nq)((0,r.Rd)(),t.id,t),currentUserId:t.id}),function(e){const t=localStorage.getItem(o.b_);if(!t)return;const n=JSON.parse(t);n.id=e,localStorage.setItem(o.b_,JSON.stringify(n))}(t.id)}(n);break;case"error":{"SESSION_REVOKED"===n.error.message&&t.signOut();const e=(0,c.J_)(n.error);e?t.addPaymentError({error:e}):t.showDialog&&t.showDialog({data:{...n.error,hasErrorKey:!0}});break}}}))},7895:(e,t,n)=>{var r=n(5116),o=n(3716),d=n(7361),a=n(663),u=n(6917),s=n(1638),i=n(1622);!function(){function e(){const e=document.documentElement.className.match(/theme-(\w+)/),t=e?e[1]:"light",n=(0,r.Rd)(),d=(0,s.Pu)(n),{animationLevel:a}=n.settings.byKey;d!==t&&((0,u.Z)(d,a===o.zy),(0,r.R3)({...n}))}const t=window.matchMedia("(prefers-color-scheme: dark)");"function"==typeof t.addEventListener?t.addEventListener("change",e):"function"==typeof t.addListener&&t.addListener(e)}(),(0,r.Q6)("init",(e=>{const{animationLevel:t,messageTextSize:n,language:r}=e.settings.byKey,c=(0,s.Pu)(e);(0,a.m0)(r,void 0,!0),document.documentElement.style.setProperty("--composer-text-size",`${Math.max(n,d.cj?16:15)}px`),document.documentElement.style.setProperty("--message-meta-height",`${Math.floor(1.3125*n)}px`),document.documentElement.style.setProperty("--message-text-size",`${n}px`),document.documentElement.setAttribute("data-message-text-size",n.toString()),document.body.classList.add("initial"),document.body.classList.add(`animation-level-${t}`),document.body.classList.add(d.$b?"is-touch-env":"is-pointer-env"),(0,u.Z)(c,t===o.zy),(0,i.p)(),d.cj?document.body.classList.add("is-ios"):d.wZ?document.body.classList.add("is-android"):d.jm&&document.body.classList.add("is-macos")})),(0,r.Q6)("setIsUiReady",((e,t,n)=>{const{uiReadyState:r}=n;return 2===r&&document.body.classList.remove("initial"),{...e,uiReadyState:r}})),(0,r.Q6)("setAuthPhoneNumber",((e,t,n)=>{const{phoneNumber:r}=n;return{...e,authPhoneNumber:r}})),(0,r.Q6)("setAuthRememberMe",((e,t,n)=>({...e,authRememberMe:Boolean(n)}))),(0,r.Q6)("clearAuthError",(e=>({...e,authError:void 0}))),(0,r.Q6)("disableHistoryAnimations",(()=>{setTimeout((()=>{(0,r.R3)({...(0,r.Rd)(),shouldSkipHistoryAnimations:!1}),document.body.classList.remove("no-animate")}),450),(0,r.R3)({...(0,r.Rd)(),shouldSkipHistoryAnimations:!0},!0)}))},3781:(e,t,n)=>{var r=n(5116),o=n(307);(0,r.Q6)("setSettingOption",((e,t,n)=>(0,o.BI)(e,n))),(0,r.Q6)("setThemeSettings",((e,t,n)=>{const{theme:r,...d}=n;return(0,o.lr)(e,r,d)}))},8332:(e,t,n)=>{n.d(t,{YC:()=>i,Bf:()=>c,G9:()=>l,ZV:()=>f,eA:()=>h,Ru:()=>m,pK:()=>p,l6:()=>g,zX:()=>y,U:()=>v,GM:()=>b,hu:()=>w,RT:()=>I,Hp:()=>C,Nl:()=>S,VE:()=>E,Mg:()=>P,Qm:()=>M,H5:()=>A,q8:()=>k,Hd:()=>T,OE:()=>N,pE:()=>L,i4:()=>R,Sm:()=>D,cc:()=>Z,P4:()=>O,O:()=>x,wG:()=>F,Fu:()=>B,SB:()=>$,zF:()=>U,ih:()=>j});var r=n(6137),o=n(3716),d=n(782),a=n(5527),u=n(790);const s=Date.now()/1e3+31622400;function i(e){return"number"==typeof e?e>0:!e.startsWith("-")}function c(e){return l(e)||f(e)}function l(e){return"chatTypeBasicGroup"===e.type}function f(e){return"chatTypeSuperGroup"===e.type}function h(e){return"chatTypeChannel"===e.type}function m(e){return"chatTypePrivate"===e.type||"chatTypeBasicGroup"===e.type}function p(e){return e===o.FV}function g(e){switch(e.type){case"chatTypePrivate":return"PrivateChat";case"chatTypeBasicGroup":case"chatTypeSuperGroup":return"AccDescrGroup";case"chatTypeChannel":return"AccDescrChannel";default:return"Chat"}}function y(e){if("chatTypePrivate"===e.type||"chatTypeSecret"===e.type)return e.id}function v(e,t,n,r=!1){return r||n&&t.id===n.id&&n.isSelf?e("SavedMessages"):t.title||e("HiddenName")}function b(e){if(e.fullInfo)return e.fullInfo.about}function w(e){const{username:t}=e;if(t)return`https://t.me/${t}`;const{inviteLink:n}=e.fullInfo||{};return n}function I(e,t="normal"){if(e.avatarHash)switch(t){case"big":return`profile${e.id}?${e.avatarHash}`;default:return`avatar${e.id}?${e.avatarHash}`}}function C(e){return!e.lastMessage}function S(e){return Boolean(e.adminRights)}function E(e,t){return!!e.adminRights&&e.adminRights[t]}function P(e,t){var n,r;return Boolean((null===(n=e.currentUserBannedRights)||void 0===n?void 0:n[t])||(null===(r=e.defaultBannedRights)||void 0===r?void 0:r[t]))}function M(e,t){return t!==r._f||!(e.isRestricted||e.migratedTo||e.isNotJoined||p(e.id))&&(!!e.isCreator||!!i(e.id)||(h(e)?E(e,"postMessages"):S(e)||!P(e,"sendMessages")))}function A(e,t=!1){if(!e)return{canAttachMedia:!1,canAttachPolls:!1,canSendStickers:!1,canSendGifs:!1,canAttachEmbedLinks:!1};const n=S(e);return{canAttachMedia:n||!P(e,"sendMedia"),canAttachPolls:(n||!P(e,"sendPolls"))&&(!i(e.id)||t),canSendStickers:n||!P(e,"sendStickers"),canSendGifs:n||!P(e,"sendGifs"),canAttachEmbedLinks:n||!P(e,"embedLinks")}}function k(e,t,n){if(null!=t&&t.sendMessages){const{untilDate:n}=t;return n&&nfunction(e,t,n,r,o,d,a,u){if(!e.isListed)return!1;if(d&&d.has(e.id))return!1;if(a&&a.has(e.id))return!0;if(u&&u.has(e.id))return!0;if(L(e)&&t.excludeArchived)return!1;if(t.excludeMuted&&!e.unreadMentionsCount&&R(e,r,o))return!1;if(!e.unreadCount&&!e.unreadMentionsCount&&!e.hasUnreadMark&&t.excludeRead)return!1;if(i(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(c(e))return!!t.groups;if(h(e))return!!t.channels}return!1}(e[d],n,t,r,o,a,u,s))),n.pinnedChatIds]}function x(e,t,n,r="all"){const o=new Set(t),a=n?new Set(n):void 0,u=(null==n?void 0:n.reduce(((t,n)=>{const d=e[n];return d&&o.has(d.id)&&_(d,r)&&t.push(d),t}),[]))||[],s=t.reduce(((t,n)=>{const o=e[n];return!o||a&&a.has(o.id)||!_(o,r)||t.push(o),t}),[]);return{pinnedChats:u,otherChats:(0,d.Xo)(s,N,"desc")}}function _(e,t){if(!e.lastMessage||e.migratedTo)return!1;switch(t){case"all":if(L(e))return!1;break;case"archived":if(!L(e))return!1}return!e.isRestricted&&!e.isNotJoined}function F(e,t){const n=new Set(t);return{pinnedChats:e.pinnedChats.filter((({id:e})=>n.has(e))),otherChats:e.otherChats.filter((({id:e})=>n.has(e)))}}function B(e,t,n,r,o,d){const[a]=O(e,t,n,o,d,r),u=a.map((t=>e[t])).filter((e=>(null==e?void 0:e.lastMessage)&&!e.isRestricted&&!e.isNotJoined));return{unreadDialogsCount:u.reduce(((e,t)=>t.unreadCount||t.hasUnreadMark?e+1:e),0),hasActiveDialogs:u.some((e=>e.unreadMentionsCount||!R(e,o,d)&&(e.unreadCount||e.hasUnreadMark)))}}function $(e,t,n,r,o,d,a){const{id:u,title:s,emoticon:i,description:c,pinnedChatIds:l,excludedChatIds:f,includedChatIds:h,excludeArchived:m,excludeMuted:p,excludeRead:g,...y}=r;return Object.values(y).filter(Boolean).length>1||null!=f&&f.length||null!=h&&h.length?e("Chats",function(e,t,n,r,o,d){const[a,u]=O(e,t,n,o,d,r),{pinnedChats:s,otherChats:i}=x(e,a,u,"folder");return s.length+i.length}(t,n,r,o,d,a)):y.bots?e("FilterBots"):y.groups?e("FilterGroups"):y.channels?e("FilterChannels"):y.contacts?e("FilterContacts"):y.nonContacts?e("FilterNonContacts"):void 0}function U(e,t,n){if(n&&!i(t))return n.isSelf?e("FromYou"):(0,a.Vl)(n)}function j(e,t,n=!1,r){return(0,d.Xo)(e,(e=>{const o=t[e];if(!o)return 0;let d=0;return o.lastMessage&&(d+=o.lastMessage.date),n&&o.isVerified&&(d+=3e9),r&&r.includes(e)&&(d=Date.now()+3e8+(r.length-r.indexOf(e))),d}),"desc")}},2858:(e,t,n)=>{n.d(t,{uw:()=>ie,H5:()=>o.H5,MR:()=>q,kw:()=>r.kw,cc:()=>o.cc,Qm:()=>o.Qm,RT:()=>o.RT,GM:()=>o.GM,hu:()=>o.hu,N0:()=>ne,OE:()=>o.OE,Hd:()=>o.Hd,U:()=>o.U,l6:()=>o.l6,T7:()=>v,SB:()=>o.SB,Fu:()=>o.Fu,VE:()=>o.VE,XV:()=>se,Sc:()=>ae,N5:()=>x,oP:()=>_,qp:()=>L,w6:()=>T,R5:()=>ue,$D:()=>g,aE:()=>$,ep:()=>X,c0:()=>ee,eO:()=>G,Tp:()=>l,kG:()=>Y,Ti:()=>K,DH:()=>Q,KK:()=>h,O$:()=>D,t9:()=>W,Y5:()=>O,zF:()=>o.zF,q8:()=>o.q8,_O:()=>y,bf:()=>B,MK:()=>m,UD:()=>p,b7:()=>Z,kd:()=>F,s1:()=>V,F$:()=>H,Cg:()=>z,bV:()=>re,HV:()=>oe,zX:()=>o.zX,OU:()=>P,RI:()=>M,Ow:()=>le,Rs:()=>r.Rs,Vl:()=>r.Vl,Js:()=>r.Js,db:()=>r.db,Tq:()=>r.Tq,jC:()=>de,BM:()=>te,u8:()=>R,Lo:()=>C,Ul:()=>E,Nl:()=>o.Nl,pE:()=>o.pE,G9:()=>o.G9,eA:()=>o.eA,Bf:()=>o.Bf,Hp:()=>o.Hp,ZV:()=>o.ZV,pK:()=>o.pK,Ru:()=>o.Ru,NB:()=>r.NB,MF:()=>I,CD:()=>k,rl:()=>U,hC:()=>j,CI:()=>A,B4:()=>b,ss:()=>w,jM:()=>S,cS:()=>r.cS,YC:()=>o.YC,kM:()=>r.kM,Mg:()=>o.Mg,Ak:()=>f,O:()=>o.O,P4:()=>o.P4,wG:()=>o.wG,i4:()=>o.i4,Sm:()=>o.Sm,ih:()=>o.ih,Z0:()=>r.Z0});var r=n(5527),o=n(8332),d=n(6137),a=n(3716),u=n(7361),s=n(4784);const i="The message is not supported on this version of Telegram",c=new RegExp(a.FM,"i");function l(e){const{chatId:t,id:n}=e;return function(e,t){return`msg${e}-${t}`}(t,n)}function f(e){const t=e.match(/^msg(-?\d+)-(\d+)/);return{chatId:t[1],messageId:Number(t[2])}}function h(e){return e.previousLocalId||e.id}function m(e,t,n=!1){const{text:r,photo:o,video:d,audio:a,voice:u,document:s,sticker:c,contact:l,poll:f,invoice:h}=t.content,m=r&&r.text.substr(0,80);return t.groupedId?`${n?"":"🖼 "}${m||e("lng_in_dlg_album")}`:o?`${n?"":"🖼 "}${m||e("AttachPhoto")}`:d?`${n?"":"📹 "}${m||e(d.isGif?"AttachGif":"AttachVideo")}`:c?`${c.emoji||""} ${e("AttachSticker")}`.trim():a?`${n?"":"🎧 "}${function(e){const{audio:t,text:n}=e.content;return t&&[t.title,t.performer].filter(Boolean).join(" — ")||(null==n?void 0:n.text)}(t)||e("AttachMusic")}`:u?`${n?"":"🎤 "}${m||e("AttachAudio")}`:s?`${n?"":"📎 "}${m||s.fileName}`:l?e("AttachContact"):f?`${n?"":"📊 "}${f.summary.question}`:h?"Invoice":r?m:i}function p(e){const{text:t,sticker:n,photo:r,video:o,audio:d,voice:a,document:u,poll:s,webPage:c,contact:l,invoice:f}=e.content;return t?t.text:n||r||o||d||a||u||l||s||c||f?void 0:i}function g(e){const{text:t,sticker:n,photo:r,video:o,audio:d,voice:a,document:u,poll:i,webPage:c,contact:l}=e.content;return!!(n||null!=o&&o.isRound)||!(!t||r||o||d||a||u||i||c||l)&&((0,s.Z)(t.text)||!1)}function y(e){const{text:t}=e.content;if(t&&t.text.length<=6&&1===g(e))return t.text}function v(e){const{text:t}=e.content;let n;if(null!=t&&t.entities){let e=t.entities.find((e=>e.type===d.Vv.TextUrl));if(e&&(n=e.url.match(c)),!n&&(e=t.entities.find((e=>e.type===d.Vv.Url)),e)){const{offset:r,length:o}=e;n=t.text.substring(r,r+o).match(c)}}if(!n&&t&&(n=t.text.match(c)),n)return{url:n[0],domain:n[3]}}function b(e){return e.isOutgoing}function w(e){return Boolean(e.replyToMessageId)}function I(e){return Boolean(e.forwardInfo)}function C(e){return!!e.content.action}function S(e){return e.chatId===a.aw&&Math.round(e.id)!==e.id}function E(e){return Boolean(e.senderId)&&!(0,o.YC)(e.senderId)&&b(e)}function P(e,t){return(0,o.YC)(t.id)?(0,r.Js)(t):(0,o.U)(e,t)}function M(e){return e.sendingState?"messageSendingStateFailed"===e.sendingState?"failed":"pending":"succeeded"}function A(e){return e.id>=a.AE}function k(e){return e.content.action&&"historyClear"===e.content.action.type}function T(e){const{content:t}=e,n=t.webPage?t.webPage.video:t.video,r=t.webPage?t.webPage.photo:t.photo,o=t.webPage?t.webPage.document:t.document;if(o)return o.fileName;if(n)return n.fileName;if(t.sticker){const e=t.sticker.isAnimated?"tgs":(0,u.on)()?"webp":"png";return`${t.sticker.id}.${e}`}if(t.audio)return t.audio.fileName;const d=l(e);return r?`${d}.jpg`:t.voice?u.m5?`${d}.ogg`:`${d}.wav`:d}var N=n(5376);function L(e){return e.content}function R(e){return Boolean(D(e)||Z(e)||$(e)||B(e)||function(e){return e.content.contact}(e)||W(e)||x(e)||_(e)||F(e))}function D(e){return e.content.photo}function Z(e){return e.content.video}function O(e){const{video:t}=e.content;return null!=t&&t.isRound?t:void 0}function x(e){return e.content.action}function _(e){return e.content.audio}function F(e){return e.content.voice}function B(e){return e.content.sticker}function $(e){return e.content.document}function U(e){const t=$(e);return t?"photo"===t.mediaType:void 0}function j(e){const t=$(e);return t?"video"===t.mediaType:void 0}function W(e){return e.content.poll}function G(e){return e.content.invoice}function V(e){return e.content.webPage}function H(e){var t;return null===(t=V(e))||void 0===t?void 0:t.photo}function z(e){var t;return null===(t=V(e))||void 0===t?void 0:t.video}function Q(e){var t;return null===(t=function(e){const t=D(e)||Z(e)||$(e)||B(e)||H(e)||z(e);if(t)return t.thumbnail}(e))||void 0===t?void 0:t.dataUri}function K(e,t){const{photo:n,video:r,sticker:o,audio:d,voice:a,document:u}=e.content,s=H(e),i=z(e),c=r||i,f=n||s;if(!(f||c||o||d||a||u))return;const h=l(e);if(c)switch(t){case"micro":case"pictogram":return`${h}?size=m`;case"inline":return te(e)?void 0:J(c,h);case"viewerPreview":return`${h}?size=m`;case"viewerFull":return J(c,h);case"download":return`${h}?download`}if(f)switch(t){case"micro":case"pictogram":return`${h}?size=m`;case"inline":return te(e)?void 0:`${h}?size=x`;case"viewerPreview":return`${h}?size=x`;case"viewerFull":case"download":return`${h}?size=z`}if(u)switch(t){case"micro":case"pictogram":case"inline":case"viewerPreview":if(!(0,N.v6)(u)||te(e))return;return`${h}?size=m`;case"viewerFull":case"download":return h}if(o)switch(t){case"micro":return;case"pictogram":return`${h}?size=m`;case"inline":return h;case"download":return`${h}?download`}if(d)switch(t){case"micro":case"pictogram":return q(d)?`${h}?size=m`:void 0;case"inline":return J(d,h);case"download":return`${h}?download`}if(a)switch(t){case"micro":case"pictogram":return;case"inline":return h;case"download":return`${h}?download`}}function J(e,t){return u.I_&&u.s$?`${t}?fileSize=${e.size}&mimeType=${e.mimeType}`:t}function q(e){return e.thumbnailSizes&&e.thumbnailSizes.length>0}function Y(e,t){const{sticker:n,video:r,audio:o,voice:a}=e.content,s=r||z(e);return n&&"inline"===t&&n.isAnimated?d.IU.Lottie:s&&u.I_&&("viewerFull"===t||"inline"===t)?d.IU.Progressive:o||a?a&&!u.m5?d.IU.BlobUrl:d.IU.Progressive:d.IU.BlobUrl}function X(e){const{photo:t,video:n,document:r}=e.content,o=H(e),d=z(e);if(t||o)return`photo${e.date}.jpeg`;const{fileName:a}=n||d||r||{};return a}function ee(e){const{video:t,document:n}=e.content,r=z(e),{size:o}=t||r||n||{};return o}function te(e){const{photo:t,video:n,document:r}=e.content;return(null==t?void 0:t.blobUrl)||(null==n?void 0:n.blobUrl)||(null==r?void 0:r.previewBlobUrl)}function ne(e,t,n=!1){const r=ue(e,t,n?"media":"inlineMedia");return n?r.reverse():r}function re(e){return e.sizes.find((e=>"z"===e.type))||e.sizes.find((e=>"y"===e.type))||oe(e)}function oe(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 de(e){if(e.width&&e.height)return e}function ae(e,t,n=!1){const r=A(e);return{isUploading:r,isTransferring:r||n,transferProgress:Number(t)}}function ue(e,t,n){let r;switch(n){case"media":r=e=>{const t=Z(e);return D(e)||t&&!t.isRound&&!t.isGif};break;case"documents":r=$;break;case"links":r=e=>V(e)||function(e){const{text:t}=e.content,n=t&&t.text.match(c);if(n)return{url:n[0],domain:n[3]}}(e);break;case"audio":r=_;break;case"voice":r=e=>{const t=Z(e);return F(e)||t&&t.isRound};break;case"inlineMedia":r=e=>{const t=Z(e);return D(e)||t&&!t.isRound&&!t.isGif||U(e)||j(e)};break;default:return[]}return t.reduce(((t,n)=>(e[n]&&r(e[n])&&t.push(n),t)),[])}function se(e){const{audio:t,voice:n,video:r}=L(e),o=t||n||r||z(e);if(o)return o.duration}function ie(e,t){return`${e}_${t}`}const ce={missing_payment_information:{field:"cardNumber",message:"Incorrect card number"},invalid_number:{field:"cardNumber",message:"Incorrect card number"},number:{field:"cardNumber",message:"Incorrect card number"},exp_year:{field:"expiry",message:"Incorrect year"},exp_month:{field:"expiry",message:"Incorrect month"},invalid_expiry_year:{field:"expiry",message:"Incorrect year"},invalid_expiry_month:{field:"expiry",message:"Incorrect month"},cvc:{field:"cvv",message:"Incorrect CVV"},invalid_cvc:{field:"cvv",message:"Incorrect CVV"}};function le(e){const{message:t,code:n,param:r}=e,{field:o,message:d}=r?ce[r]:ce[n];return{field:o,message:d,description:t}}},5527:(e,t,n)=>{n.d(t,{Vl:()=>s,Js:()=>i,Tq:()=>c,kM:()=>l,NB:()=>f,cS:()=>h,kw:()=>m,Z0:()=>p,db:()=>g,Rs:()=>y});var r=n(3716),o=n(790),d=n(782),a=n(2267);const u=[1,8,5,2,7,4,6];function s(e){if(e)switch(e.type){case"userTypeBot":case"userTypeRegular":return e.firstName||e.lastName;case"userTypeDeleted":case"userTypeUnknown":return"Deleted";default:return}}function i(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 c(e,t,n){if(t.id===r.aw)return e("ServiceNotifications").toLowerCase();if(t.type&&"userTypeBot"===t.type)return e("Bot");if(!t.status)return"";switch(t.status.type){case"userStatusEmpty":return e("ALongTimeAgo");case"userStatusLastMonth":return e("WithinAMonth");case"userStatusLastWeek":return e("WithinAWeek");case"userStatusOffline":{const{wasOnline:r}=t.status;if(!r)return e("LastSeen.Offline");const d=new Date((new Date).getTime()+1e3*n),a=new Date(1e3*r);if(a>=d)return e("LastSeen.JustNow");const u=new Date(d.getTime()-a.getTime());if(u.getTime()/1e3<60)return e("LastSeen.JustNow");if(u.getTime()/1e3<3600)return e("LastSeen.MinutesAgo",Math.floor(u.getTime()/1e3/60));const s=new Date;if(s.setHours(0,0,0,0),a>new Date(s.getTime()+1e3*n))return u.getTime()/1e3<21600?e("LastSeen.HoursAgo",Math.floor(u.getTime()/1e3/60/60)):e("LastSeen.TodayAt",(0,o.mr)(a,e));const i=new Date;return i.setDate(d.getDate()-1),i.setHours(0,0,0,0),a>new Date(i.getTime()+1e3*n)?e("LastSeen.YesterdayAt",(0,o.mr)(a,e)):e("LastSeen.AtDate",(0,o.Tu)(e,a))}case"userStatusOnline":return e("Online");case"userStatusRecently":return e("Lately");default:return}}function l(e){const{id:t,status:n,type:o}=e;return!!n&&t!==r.aw&&"userStatusOnline"===n.type&&"userTypeBot"!==o}function f(e){return!(!e.status||"userTypeBot"===e.type||e.id===r.aw||"userTypeDeleted"!==e.type&&"userTypeUnknown"!==e.type)}function h(e){return"userTypeBot"===e.type}function m(e){return!e.isContact&&!h(e)}function p(e,t,n,r=0){return(0,d.Xo)(e,(e=>{const o=(0,a.b)(r);if(n&&n.includes(e))return o+172800-(n.length-n.indexOf(e));const d=t[e];if(!d||!d.status)return 0;if("userStatusOnline"===d.status.type)return d.status.expires;if("userStatusOffline"===d.status.type&&d.status.wasOnline)return d.status.wasOnline;switch(d.status.type){case"userStatusRecently":return o-86400;case"userStatusLastWeek":return o-604800;case"userStatusLastMonth":return o-18144e3;default:return 0}}),"desc")}function g(e){return"number"==typeof e?Math.abs(e):Math.abs(Number(e))}function y(e){const t=e?g(e.id)%7:0;return u[t]}},6788:(e,t,n)=>{n.d(t,{Mg:()=>a,B1:()=>u,SL:()=>s,a4:()=>c,GL:()=>l,fZ:()=>f,Pi:()=>h,vv:()=>m,Dd:()=>p});var r=n(3716),o=n(782),d=n(1638);function a(e,t,n){return{...e,chats:{...e.chats,listIds:{...e.chats.listIds,[t]:n}}}}function u(e,t,n){const{[t]:r}=e.chats.listIds,o=null!=r&&r.length?n.filter((e=>!r.includes(e))):n;return r&&!o.length?e:a(e,t,[...r||[],...o])}function s(e,t){return{...e,chats:{...e.chats,byId:t}}}function i(e,t,n,r){const{byId:d}=e.chats,a=d[t],u=n.isMin&&a&&!a.isMin,s={...a,...u?(0,o.CE)(n,["isMin","accessHash"]):n,...r&&{photos:[r,...a.photos||[]]}};return s.id&&s.type,s}function c(e,t,n,r){const{byId:o}=e.chats;return s(e,{...o,[t]:i(e,t,n,r)})}function l(e,t){const n=Object.keys(t).reduce(((n,r)=>{const o=i(e,r,t[r]);return o&&(n[r]=o),n}),{});return e=s(e,{...e.chats.byId,...n})}function f(e,t){const{byId:n}=e.chats;let r=!1;const o=Object.keys(t).reduce(((o,d)=>{if(!n[d]||n[d].isMin&&!t[d].isMin){const n=i(e,d,t[d]);n&&(o[d]=n,r||(r=!0))}return o}),{});return r&&(e=s(e,{...e.chats.byId,...o})),e}function h(e,t,n){const o=n===r.WS?"archived":"active";let d=e.chats.listIds;return Object.keys(d).forEach((e=>{const n=d[e]||[];e!==o||n.includes(t)?e!==o&&n.includes(t)&&(d={...d,[e]:n.filter((e=>e!==t))}):d={...d,[e]:[...n,t]}})),c(e={...e,chats:{...e.chats,listIds:d}},t,{folderId:n||void 0})}function m(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}}}}function p(e,t){const n=(0,d.Ek)(e,t);if(!n)return e;const{[n]:r}=e.chats.listIds;return r&&(e=a(e,n,r.filter((e=>e!==t)))),c(e,t,{isNotJoined:!0})}},307:(e,t,n)=>{n.d(t,{O4:()=>ye,c_:()=>h,fZ:()=>r.fZ,m6:()=>f,aK:()=>pe,aJ:()=>me,Sh:()=>G,$S:()=>I,bp:()=>Ae,WY:()=>ke,K4:()=>g,bV:()=>y,h8:()=>H,M6:()=>k,i9:()=>N,Dd:()=>r.Dd,vy:()=>_,rB:()=>ve,g_:()=>O,Mg:()=>r.Mg,SL:()=>r.SL,Pb:()=>oe,w3:()=>P,BI:()=>fe,lr:()=>he,pf:()=>l,s5:()=>B,y9:()=>C,nA:()=>Se,_7:()=>Pe,Q$:()=>Ce,Dq:()=>Me,vT:()=>Ie,QH:()=>Ee,Ob:()=>T,a4:()=>r.a4,B1:()=>r.B1,vv:()=>r.vv,Pi:()=>r.Pi,cY:()=>m,GL:()=>r.GL,Wy:()=>s,wV:()=>A,cq:()=>M,rq:()=>Z,No:()=>q,Og:()=>Y,xv:()=>ee,px:()=>X,xj:()=>v,c1:()=>se,z5:()=>ue,qr:()=>re,dx:()=>de,fw:()=>le,H9:()=>ce,HN:()=>ge,ff:()=>b,P4:()=>p,x1:()=>V,TM:()=>we,Rg:()=>D,z3:()=>R,IM:()=>x,Xg:()=>S,j6:()=>E,lG:()=>L,IE:()=>be,Nq:()=>j,Lm:()=>z,Q3:()=>Q,eD:()=>W});var r=n(6788),o=n(6137),d=n(3716),a=n(1638),u=n(782);function s(e,t,n=o._f,r="thread",a){const{messageLists:u}=e.messages;let s=u;if(a||d.Cg)s=t?[{chatId:t,threadId:n,type:r}]:[];else if(t){const e=u[u.length-1];e&&e.chatId===t&&e.threadId===n&&e.type===r||(s=e&&e.chatId===d.AJ?[...u.slice(0,-1),{chatId:t,threadId:n,type:r}]:[...u,{chatId:t,threadId:n,type:r}])}else s=u.slice(0,-1);return{...e,messages:{...e.messages,messageLists:s}}}function i(e,t,n){return c(e,t,{byId:n})}function c(e,t,n){const r=e.messages.byChatId[t]||{byId:{},threadsById:{}};return{...e,messages:{...e.messages,byChatId:{...e.messages.byChatId,[t]:{...r,...n}}}}}function l(e,t,n,r,o){return function(e,t,n,r){const o=e.messages.byChatId[t];return c(e,t,{threadsById:{...null==o?void 0:o.threadsById,[n]:{...null==o?void 0:o.threadsById[n],...r}}})}(e,t,n,{[r]:o})}function f(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).forEach((t=>{e=h(e,t,n[t])})),e}function h(e,t,n){const r=(0,a.Zw)(e,t);return r&&Object.keys(n).every((e=>Boolean(r[Number(e)])))?e:i(e,t,{...n,...r})}function m(e,t,n,r){const o=(0,a.Zw)(e,t)||{},d={...o[n],...r};return d.id?i(e,t,{...o,[n]:d}):e}function p(e,t,n,r){const o=(0,a.Fn)(e,t)||{},d={...o[n],...r};return d.id?P(e,t,{...o,[n]:d}):e}function g(e,t,n){const r=(0,a.Zw)(e,t);if(!r)return e;const o=(0,u.CE)(r,n),d=Object.values((0,u.q0)(r,n)).filter((({forwardInfo:e})=>null==e?void 0:e.isLinkedChannelPost));if(Object.keys(e.messages.byChatId[t].threadsById).map(Number).forEach((r=>{const o=(0,a.tZ)(e,t,r);let d=(0,a.gb)(e,t,r),u=(0,a.qC)(e,t,r),s=(0,a.Cb)(e,t,r),i=(0,a.KB)(e,t),c=null==o?void 0:o.messagesCount;n.forEach((e=>{d&&d.includes(e)&&(d=d.filter((t=>t!==e)),void 0!==c&&(c-=1)),u&&u.includes(e)&&(u=u.filter((t=>t!==e))),s&&s.includes(e)&&(s=s.filter((t=>t!==e))),i&&i.includes(e)&&(i=i.filter((t=>t!==e)))})),e=l(e,t,r,"listedIds",d),e=l(e,t,r,"outlyingIds",u),e=l(e,t,r,"viewportIds",s),e=l(e,t,r,"pinnedIds",i),o&&void 0!==c&&(e=l(e,t,r,"threadInfo",{...o,messagesCount:c}))})),d.length){const n=(0,a.Bt)(e),r=n&&n.chatId===t&&"thread"===n.type,o=null==n?void 0:n.threadId;d.forEach((n=>{const{fromChatId:d,fromMessageId:u}=n.forwardInfo,i=(0,a.hj)(e,d,u);r&&o===u&&(e=s(e,t)),i&&(e=m(e,d,u,{threadInfo:void 0}))}))}return e=i(e,t,o)}function y(e,t,n){const r=(0,a.Fn)(e,t);if(!r)return e;const d=(0,u.CE)(r,n);let s=(0,a.qy)(e,t);return s&&(n.forEach((e=>{s.includes(e)&&(s=s.filter((t=>t!==e)))})),e=l(e,t,o._f,"scheduledIds",s)),P(e,t,d)}function v(e,t,n,r){const o=(0,a.gb)(e,t,n),d=null!=o&&o.length?r.filter((e=>!o.includes(e))):r;return o&&!d.length?e:l(e,t,n,"listedIds",w([...o||[],...d]))}function b(e,t,n,r){const o=(0,a.qC)(e,t,n),d=null!=o&&o.length?r.filter((e=>!o.includes(e))):r;return o&&!d.length?e:l(e,t,n,"outlyingIds",w([...o||[],...d]))}function w(e){return e.sort(((e,t)=>e-t))}function I(e,t,n,r){const o=(0,a.Cb)(e,t,n)||[];return o.includes(r)?e:l(e,t,n,"viewportIds",w([...o.length{e=S(e,t.chatId,t.threadId,t)})),e}function P(e,t,n){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})}function M(e,t,n,r=!1,o=!1){return{...e,focusedMessage:{...e.focusedMessage,chatId:t,messageId:n,noHighlight:r,isResizingContainer:o}}}function A(e,t){return{...e,focusedMessage:{...e.focusedMessage,direction:t}}}function k(e,t,n){return{...e,selectedMessages:{chatId:t,messageIds:n?Array.prototype.concat([],n):[]}}}function T(e,t,n,r,o,d,s,i=!1){const{selectedMessages:c}=e;d&&(s=(0,a.xH)(e,t,d));const l=s||[o];if(!c)return k(e,t,l);const{messageIds:f}=c;let h;const m=l.filter((e=>!f.includes(e)));if(m&&!m.length)h=f.filter((e=>!l.includes(e)));else if(i&&f.length){const d=(0,a.$W)(e,t,n,r),s=d.indexOf(f[f.length-1]),i=d.indexOf(o),c=Math.min(s,i),l=Math.max(s,i),m=d.slice(c,l+1);h=(0,u.Tw)([...f,...m])}else h=[...f,...m];return h.length?{...e,selectedMessages:{...c,messageIds:h}}:N(e)}function N(e){return{...e,selectedMessages:void 0}}function L(e,t,n,r,o){const{channelPostId:d,fromChatId:u}=t.forwardInfo||{};if(d&&u){const t=(0,a.tZ)(e,n,d);t&&(e=l(e,n,d,"threadInfo",{...t,lastMessageId:r,messagesCount:t.messagesCount+(o?-1:1)}))}return e}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,...(0,u.ee)(d,"id")},[t]:{...e.stickers[t],hash:n,..."search"===t?{resultIds:o}:{setIds:r.map((({id:e})=>e))}}}}}function D(e,t,n){const r=e.stickers.setsById[t]||{};return{...e,stickers:{...e.stickers,setsById:{...e.stickers.setsById,[t]:{...r,...n}}}}}function Z(e,t,n,r){const{results:o}=e.gifs.search;let d;if(t||!o)d=n;else{const e=new Set(o.map((e=>e.id)));d=[...o,...n.filter((t=>!e.has(t.id)))]}return{...e,gifs:{...e.gifs,search:{...e.gifs.search,offset:r,results:d}}}}function O(e,t){return{...e,animatedEmojis:t}}function x(e,t,n,r){const o=[...(0,a.Pk)(e,t),...n||[]],d=(0,u.Tw)(o.map((({id:e})=>e))),s=(0,u.ee)(o,"id"),i=d.map((e=>s[e]));return{...e,stickers:{...e.stickers,forEmoji:{emoji:t,stickers:i,hash:r}}}}function _(e){const{emoji:t,stickers:n,hash:r}=e.stickers.forEmoji||{};return t?x(e,t,n,r):e}var F=n(735);function B(e,t){return{...e,users:{...e.users,byId:t}}}function $(e,t,n){const{byId:r}=e.users,o=r[t],d=n.isMin&&o&&!o.isMin,a={...o,...d?(0,u.CE)(n,["isMin","accessHash"]):n};return a.id&&a.type?a:o}function U(e,t){const{userIds:n}=e.contactList||{};if(!n)return e;const r=t.filter((e=>(null==e?void 0:e.isContact)&&!n.includes(e.id))).map((e=>e.id));return 0===r.length?e:{...e,contactList:{userIds:[...r,...n]}}}function j(e,t,n){const{byId:r}=e.users,o=$(e,t,n);return B(e=U(e,[o]),{...r,[t]:o})}function W(e,t){const n=Object.keys(t).reduce(((n,r)=>{const o=$(e,r,t[r]);return o&&(n[r]=o),n}),{});return e=B(e=U(e,Object.values(n)),{...e.users.byId,...n})}function G(e,t){const{byId:n}=e.users;let r=!1;const o=Object.keys(t).reduce(((o,d)=>{if(!n[d]||n[d].isMin&&!t[d].isMin){const n=$(e,d,t[d]);n&&(o[d]=n,r||(r=!0))}return o}),{});return r&&(e=U(e=B(e,{...e.users.byId,...o}),Object.values(o))),e}function V(e,t){return e.users.selectedId===t?e:{...e,users:{...e.users,selectedId:t}}}function H(e,t){const{byId:n}=e.users,{userIds:r}=e.contactList||{};return delete n[t],B(e={...e,contactList:{userIds:r?r.filter((e=>e!==t)):F.D}},n)}function z(e,t){return{...e,userSearch:{...e.userSearch,...t}}}function Q(e,t){return z(e,{fetchingStatus:t})}function K(e,t,n){const{byId:r}=e.users,o=r[t];return o&&o.fullInfo?j(e,t,{...o,fullInfo:{...o.fullInfo,isBlocked:n}}):e}const J=e=>`${e.chatId}_${e.id}`;function q(e,t){return{...e,globalSearch:{...e.globalSearch,...t}}}function Y(e,t){return q(e,{currentContent:t})}function X(e,t,n,r,o){var d;const{resultsByType:a}=e.globalSearch||{},s=t.reduce(((e,t)=>(e[J(t)]=t,e)),{}),i=null==a||null===(d=a[r])||void 0===d?void 0:d.foundIds;if(void 0!==i&&Object.keys(s).every((e=>i.includes(J(s[e])))))return ee(e,{messages:!1});const c=i||[],l=t.map((e=>J(e))),f=Array.prototype.concat(c,l),h=(0,u.et)(c,f)?c:f;return q(e=ee(e,{messages:!1}),{resultsByType:{...(e.globalSearch||{}).resultsByType,[r]:{totalCount:n,nextOffsetId:o,foundIds:h}}})}function ee(e,t){return q(e,{fetchingStatus:{...e.globalSearch.fetchingStatus,...t}})}var te=n(2858);function ne(e,t,n){return{...e,localTextSearch:{byChatThreadKey:{...e.localTextSearch.byChatThreadKey,[t]:n}}}}function re(e,t,n,r,o){const d=(0,te.uw)(t,n);return ne(e,d,{...e.localTextSearch.byChatThreadKey[d],isActive:r,query:o})}function oe(e,t,n,r,o,d){const a=(0,te.uw)(t,n);return ne(e,a,{...e.localTextSearch.byChatThreadKey[a],results:{foundIds:r,totalCount:o,nextOffsetId:d}})}function de(e,t,n,r,o,d){const a=(0,te.uw)(t,n),{results:s}=e.localTextSearch.byChatThreadKey[a]||{},i=(null==s?void 0:s.foundIds)||[],c=ie((0,u.Tw)(Array.prototype.concat(i,r)));return oe(e,t,n,(0,u.et)(i,c)?i:c,o,d)}function ae(e,t,n){return{...e,localMediaSearch:{byChatId:{...e.localMediaSearch.byChatId,[t]:n}}}}function ue(e,t,n){return ae(e,t,{...e.localMediaSearch.byChatId[t],currentType:n})}function se(e,t,n,r,o,d){const{resultsByType:a}=e.localMediaSearch.byChatId[t]||{},s=null!=a&&a[n]?a[n].foundIds:[],i=ie((0,u.Tw)(Array.prototype.concat(s,r)));return function(e,t,n,r,o,d){return ae(e,t,{...e.localMediaSearch.byChatId[t],resultsByType:{...(e.localMediaSearch.byChatId[t]||{}).resultsByType,[n]:{foundIds:r,totalCount:o,nextOffsetId:d}}})}(e,t,n,(0,u.et)(s,i)?s:i,o,d)}function ie(e){return e.sort(((e,t)=>e-t))}function ce(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 fe(e,t){return{...e,settings:{...e.settings,byKey:{...e.settings.byKey,...t}}}}function he(e,t,n){return{...e,settings:{...e.settings,themes:{...e.settings.themes,[t]:{...e.settings.themes[t]||{},...n}}}}}function me(e,t){return t.forEach((t=>{const{chatId:n,...r}=t;e=pe(e,n,r)})),e}function pe(e,t,n){return{...e,settings:{...e.settings,notifyExceptions:{...e.settings.notifyExceptions,[t]:n}}}}function ge(e,t,n,r){switch(t){case"contact":return fe(e,{...void 0!==n&&{hasPrivateChatsNotifications:!n},...void 0!==r&&{hasPrivateChatsMessagePreview:r}});case"group":return fe(e,{...void 0!==n&&{hasGroupNotifications:!n},...void 0!==r&&{hasGroupMessagePreview:r}});case"broadcast":return fe(e,{...void 0!==n&&{hasBroadcastNotifications:!n},...void 0!==r&&{hasBroadcastMessagePreview:r}});default:return}}function ye(e,t){return e=K(e,t,!0),{...e,blocked:{...e.blocked,ids:[t,...e.blocked.ids],totalCount:e.blocked.totalCount+1}}}function ve(e,t){return e=K(e,t,!1),{...e,blocked:{...e.blocked,ids:e.blocked.ids.filter((e=>e!==t)),totalCount:e.blocked.totalCount-1}}}function be(e,t){return{...e,twoFaSettings:{...e.twoFaSettings,...t}}}function we(e,t){return{...e,payment:{...e.payment,shippingOptions:t}}}function Ie(e,t){return{...e,payment:{...e.payment,requestId:t}}}function Ce(e,t){return{...e,payment:{...e.payment,step:t}}}function Se(e,t){if(!t.content||!t.content.invoice)return e;const{title:n,text:r,amount:o,currency:d,isTest:a,photoUrl:u}=t.content.invoice;return{...e,payment:{...e.payment,invoiceContent:{title:n,text:r,photoUrl:u,amount:o,currency:d,isTest:a}}}}function Ee(e,t){return{...e,payment:{...e.payment,stripeCredentials:{...t}}}}function Pe(e,t){return{...e,payment:{...e.payment,...t}}}function Me(e,t,n){if(!t||!n)return{...e,payment:{...e.payment,receipt:void 0}};const{invoice:r}=n.content,{photoUrl:o,text:d,title:a}=r||{};return{...e,payment:{...e.payment,receipt:{...t,photoUrl:o,text:d,title:a}}}}function Ae(e){return{...e,payment:{}}}function ke(e){return{...e,payment:{...e.payment,isPaymentModalOpen:!1}}}},8857:(e,t,n)=>{n.d(t,{Z1:()=>s,Dg:()=>i,FM:()=>c,xo:()=>l,P_:()=>f,YK:()=>h,IK:()=>m,pk:()=>p,g4:()=>g,N:()=>y,Ek:()=>v,Mw:()=>b,ep:()=>w,DI:()=>I,A1:()=>C,UW:()=>S});var r=n(6137),o=n(2858),d=n(6376),a=n(3716),u=n(2913);function s(e,t){return e.chats.byId[t]}function i(e,t){const n=(0,o.zX)(t);return!!n&&(0,d.dy)(e,n)}function c(e,t){return t===e.currentUserId}function l(e,t){const n=i(e,t);return n&&(0,o.cS)(n)}function f(e){return Object.values(e.chats.byId).find((({isSupport:e})=>e))}function h(e,t){if(!(0,o.YC)(t.id)&&!(0,o.eA)(t)&&t.fullInfo)return t.fullInfo.members&&t.fullInfo.members.length!==a.mo?t.fullInfo.members.reduce(((t,{userId:n})=>e.users.byId[n]&&(0,o.kM)(e.users.byId[n])&&n!==e.currentUserId?t+1:t),0):t.fullInfo.onlineCount}function m(e,t){const n=s(e,t),r=n&&(0,o.zX)(n),a=r&&(0,d.dy)(e,r);if(a&&(0,o.cS)(a))return a}function p(e,t){const n=s(e,t),d=m(e,t);if(!n||!d)return!1;if(n.lastMessage&&(0,o.CD)(n.lastMessage))return!0;const a=e.messages.byChatId[t];if(!a)return!1;const{listedIds:u}=a.threadsById[r._f]||{};return u&&!u.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=s(e,t);if(n&&y(e,t))return n.folderId===a.WS?"archived":"active"}function b(e,t){return e.chatFolders.byId[t]}function w(e,t,n=a.Nf){const{active:r,archived:o}=e.chats.orderedPinnedIds;if(n===a.Nf)return!!r&&r.includes(t);if(n===a.WS)return!!o&&o.includes(t);const{byId:d}=e.chatFolders,{pinnedChatIds:u}=d[n]||{};return!!u&&u.includes(t)}function I(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,r=(0,u.d)(e),d=(0,u.N)(e);return t.reduce(((e,t)=>{const a=n[t];return!(a&&a.unreadCount&&a.isListed)||a.isNotJoined||a.isRestricted||!a.unreadMentionsCount&&(0,o.i4)(a,r,d)?e:e+a.unreadCount}),0)}function S(e){return Boolean(s(e,a.aw))}},1638:(e,t,n)=>{n.d(t,{hg:()=>j,xs:()=>oe,_k:()=>X,zB:()=>g,g4:()=>u.g4,bH:()=>ye,__:()=>be,xl:()=>ee,Nu:()=>ne,nB:()=>te,Z1:()=>u.Z1,IK:()=>u.IK,DI:()=>u.DI,Mw:()=>u.Mw,Ek:()=>u.Ek,hj:()=>G,ZB:()=>z,Zw:()=>I,YK:()=>u.YK,Dg:()=>u.Dg,X5:()=>ie,A1:()=>u.A1,jr:()=>w,yN:()=>f,JX:()=>Le,pP:()=>Me,we:()=>Ee,og:()=>Se,$W:()=>M,Bt:()=>b,y5:()=>l,n5:()=>Ce,Ms:()=>Z,_$:()=>R,kK:()=>H,wU:()=>D,yZ:()=>_,It:()=>ue,G$:()=>Q,y8:()=>fe,cv:()=>Y,pk:()=>u.pk,N:()=>u.N,ep:()=>u.ep,xo:()=>u.xo,FM:()=>u.FM,a6:()=>me,te:()=>re,Ev:()=>se,CA:()=>ce,zQ:()=>Ae,_X:()=>K,vk:()=>le,Jf:()=>Te,UW:()=>u.UW,s4:()=>s.s4,b9:()=>W,VF:()=>Ie,gb:()=>E,aW:()=>Pe,xH:()=>he,FT:()=>ge,tV:()=>O,NJ:()=>Fe.N,dZ:()=>Fe.d,dT:()=>J,qC:()=>P,gx:()=>Re,eh:()=>Ze,Mz:()=>De,sp:()=>Oe,KB:()=>k,$$:()=>xe,rd:()=>ae,p9:()=>F,Yy:()=>L,Wq:()=>ke,qy:()=>T,Tm:()=>V,Fn:()=>C,Vt:()=>N,D7:()=>pe,Ur:()=>q,yB:()=>we,Ny:()=>h,E_:()=>m,Pk:()=>p,i3:()=>_e,P_:()=>u.P_,Pu:()=>Ne,Db:()=>U,tZ:()=>x,Cm:()=>B,qS:()=>$,uZ:()=>de,dy:()=>s.dy,Cb:()=>A});var r=n(1713),o=n(7361),d=n(6137),a=n(3716),u=n(8857),s=n(6376),i=n(2858),c=n(782);function l(e){return e.stickers.search}function f(e){return e.gifs.search}function h(e,t){return e.stickers.setsById[t]}function m(e,t){return Object.values(e.stickers.setsById).find((e=>e.shortName.toLowerCase()===t.toLowerCase()))}function p(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 g(e,t){const{animatedEmojis:n}=e;if(!n||!n.stickers)return;const r=t.replace("️","");return n.stickers.find((e=>e.emoji===t||e.emoji===r))}var y=n(2267),v=n(735);function b(e){const{messageLists:t}=e.messages;if(t.length)return t[t.length-1]}function w(e){const{chatId:t}=b(e)||{};return t?(0,u.Z1)(e,t):void 0}function I(e,t){var n;return null===(n=e.messages.byChatId[t])||void 0===n?void 0:n.byId}function C(e,t){var n;return null===(n=e.scheduledMessages.byChatId[t])||void 0===n?void 0:n.byId}function S(e,t,n,r){const o=e.messages.byChatId[t];if(!o)return;const d=o.threadsById[n];return d?d[r]:void 0}function E(e,t,n){return S(e,t,n,"listedIds")}function P(e,t,n){return S(e,t,n,"outlyingIds")}function M(e,t,n,r){switch(r){case"thread":return A(e,t,n);case"pinned":return k(e,t);case"scheduled":return T(e,t)}}function A(e,t,n){return S(e,t,n,"viewportIds")}function k(e,t){return S(e,t,d._f,"pinnedIds")}function T(e,t){return S(e,t,d._f,"scheduledIds")}function N(e,t,n){return S(e,t,n,"scrollOffset")}function L(e,t,n){return S(e,t,n,"replyingToId")}function R(e,t,n){return S(e,t,n,"editingId")}function D(e,t){return S(e,t,d._f,"editingScheduledId")}function Z(e,t,n){return S(e,t,n,"draft")}function O(e,t,n){return S(e,t,n,"noWebPage")}function x(e,t,n){return S(e,t,n,"threadInfo")}function _(e,t,n){return S(e,t,n,"firstMessageId")}function F(e,t,n){return S(e,t,n,"replyStack")}function B(e,t,n){if(n===d._f)return(0,u.Z1)(e,t);const r=x(e,t,n);return r?(0,u.Z1)(e,r.originChannelId||t):void 0}function $(e,t,n){if(n===d._f)return;const r=x(e,t,n);return r?r.topMessageId:void 0}function U(e,t,n){const r=e.messages.byChatId[t];if(!r)return;const{replyToMessageId:o,replyToTopMessageId:d}=n;return o||d?Object.values(r.threadsById).find((e=>e.threadInfo&&(o&&o===e.threadInfo.topMessageId||d&&d===e.threadInfo.topMessageId))):void 0}function j(e,t,n){const r=b(e);if(!r)return!1;const{threadInfo:o}=U(e,t,n)||{};return t===r.chatId&&(r.threadId===d._f||o&&r.threadId===o.threadId)}function W(e,t,n){const r=A(e,t,n);if(!r||!r.length)return!0;let o;if(n===d._f){const n=(0,u.Z1)(e,t);if(!n||!n.lastMessage)return!0;o=n.lastMessage.id}else{const r=x(e,t,n);if(!r||!r.lastMessageId)return;o=r.lastMessageId}return o>=a.AE&&!G(e,t,o)||r[r.length-1]>=o}function G(e,t,n){const r=I(e,t);return r?r[n]:void 0}function V(e,t,n){const r=C(e,t);return r?r[n]:void 0}function H(e,t,n,r){if("scheduled"===r){const n=D(e,t);return n?V(e,t,n):void 0}{const r=R(e,t,n);return r?G(e,t,r):void 0}}function z(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 Q(e,t){const{chatId:n,messageId:r}=e.focusedMessage||{};return n===t?r:void 0}function K(e,t){const n=Q(e,t.chatId);return!!n&&(n===t.id||n===t.previousLocalId)}function J(e,t,n=!1){return function(e,t){const{lastReadOutboxMessageId:n}=(0,u.Z1)(e,t.chatId)||{};return(0,i.CI)(t)||!n||ne===t.id))}(e,t.content.sticker),O=!b&&D&&!Z,x=!b&&Z,_=!b,F=!b&&(m||h),B=!b,$=Boolean((null===(o=w.webPage)||void 0===o?void 0:o.document)||(null===(d=w.webPage)||void 0===d?void 0:d.video)||(null===(a=w.webPage)||void 0===a?void 0:a.photo)||w.audio||w.voice||w.photo||w.video||w.document||w.sticker);return{noOptions:[C,L,E,P,T,A,N,R,O,x,_,F,B,$].every((e=>!e)),canReply:C,canEdit:L,canPin:E,canUnpin:P,canReport:T,canDelete:A,canDeleteForAll:N,canForward:R,canFaveSticker:O,canUnfaveSticker:x,canCopy:_,canCopyLink:F,canSelect:B,canDownload:$}}function ee(e){const{messageIds:t}=e.selectedMessages||{},{chatId:n,threadId:r}=b(e)||{},o=n&&I(e,n);if(!o||!t||!r)return{};const d=t.map((t=>o[t]&&X(e,o[t],r))).filter(Boolean);return{canDelete:d.every((e=>e.canDelete)),canDeleteForAll:d.every((e=>e.canDeleteForAll))}}function te(e){const{messageIds:t}=e.selectedMessages||{},{chatId:n,threadId:r}=b(e)||{},o=n&&I(e,n);return!!(o&&t&&r)&&t.map((t=>o[t]&&X(e,o[t],r))).filter(Boolean).every((e=>e.canReport))}function ne(e){const{messageIds:t}=e.selectedMessages||{},{chatId:n,threadId:r}=b(e)||{},o=n&&I(e,n);return!!(o&&t&&r)&&t.map((t=>o[t]&&X(e,o[t],r))).filter(Boolean).some((e=>e.canDownload))}function re(e,t){const n=e.activeDownloads.byChatId[t.chatId];return!!n&&n.includes(t.id)}function oe(e,t){return e.activeDownloads.byChatId[t]||v.D}function de(e,t){var n;return null===(n=e.fileUploads.byMessageLocalId[t.previousLocalId||t.id])||void 0===n?void 0:n.progress}function ae(e,t,n){if(n===d._f){const n=(0,u.Z1)(e,t);if(!n)return;if(!n.lastReadInboxMessageId)return;return n.lastMessage?(0,i.CI)(n.lastMessage)?n.lastMessage.id:Math.min(n.lastMessage.id,n.lastReadInboxMessageId):n.lastReadInboxMessageId}{const r=x(e,t,n);if(!r)return;return r.lastReadInboxMessageId?Math.min(r.lastReadInboxMessageId,r.lastMessageId||1/0):r.topMessageId}}function ue(e,t,n){const r=(0,u.Z1)(e,t);if(n===d._f){if(!r)return}else{const r=x(e,t,n);if(!r||void 0!==r.lastMessageId&&r.lastMessageId===r.lastReadInboxMessageId)return}const o=P(e,t,n),s=E(e,t,n),i=I(e,t);if(!i||!o&&!s)return;const c=ae(e,t,n);if(!c&&r&&r.isNotJoined)return;const l=t===a.aw?e.serviceNotifications.reduce(((e,t)=>!t.isUnread&&t.id>e?t.id:e),-1):-1;function f(e){return e.find((e=>(!c||e>c)&&i[e]&&(!i[e].isOutgoing||i[e].isFromScheduled)&&e>l))}if(o){const e=f(o);if(e)return e}if(s){const e=f(s);if(e)return e}}function se(e){const{forwardMessages:t}=e;return Boolean(t.isModalShown)}function ie(e,t){const n=Object.values(e.chats.byId).find((e=>(0,i.Ru)(e)&&e.lastMessage&&e.lastMessage.id===t));if(n)return n.id;const{byChatId:r}=e.messages;return Object.keys(r).find((n=>{const o=(0,u.Z1)(e,n);return o&&(0,i.Ru)(o)&&r[o.id].byId[t]}))}function ce(e){const{selectedMessages:t}=e;return Boolean(t)}function le(e,t){const{messageIds:n}=e.selectedMessages||{};return!!n&&n.includes(t)}function fe(e,t,n){const r=I(e,t);if(r)return Object.values(r).filter((e=>e.groupedId===n&&e.forwardInfo)).map((({forwardInfo:e})=>e.fromMessageId))}function he(e,t,n){const r=I(e,t);if(r)return Object.keys(r).map(Number).filter((e=>r[e].groupedId===n))}function me(e,t,n){const{messageIds:r}=e.selectedMessages||{};if(!r)return!1;const o=he(e,t,n);return o&&o.every((e=>r.includes(e)))}function pe(e){const{messageIds:t}=e.selectedMessages||{};return t?t.length:0}function ge(e,t){const n=(0,u.Z1)(e,t);if(!n)return;if(!(0,u.xo)(e,n))return;const r=I(e,t),o=A(e,t,d._f);if(!r||!o)return;const a=(0,c.dF)(o,(e=>!r[e].isOutgoing&&Boolean(r[e].keyboardButtons))),s=(0,c.dF)(o,(e=>Boolean(r[e].shouldHideKeyboardButtons)));return a&&s&&s>a?void 0:a?r[a]:void 0}function ye(e,t){const n=(0,u.Z1)(e,t.chatId);if(!n)return;const r=q(e,t),o=Boolean((0,i.O$)(t)||(0,i.F$)(t)),d=Boolean((0,i.b7)(t)||(0,i.Cg)(t)),a=Boolean((0,i.oP)(t)||(0,i.kd)(t)||(0,i.aE)(t)),{canAutoLoadPhotoFromContacts:s,canAutoLoadPhotoInPrivateChats:c,canAutoLoadPhotoInGroups:l,canAutoLoadPhotoInChannels:f,canAutoLoadVideoFromContacts:h,canAutoLoadVideoInPrivateChats:m,canAutoLoadVideoInGroups:p,canAutoLoadVideoInChannels:g,canAutoLoadFileFromContacts:y,canAutoLoadFileInPrivateChats:v,canAutoLoadFileInGroups:b,canAutoLoadFileInChannels:w}=e.settings.byKey;return o?ve({global:e,chat:n,sender:r,canAutoLoadMediaFromContacts:s,canAutoLoadMediaInPrivateChats:c,canAutoLoadMediaInGroups:l,canAutoLoadMediaInChannels:f}):d?ve({global:e,chat:n,sender:r,canAutoLoadMediaFromContacts:h,canAutoLoadMediaInPrivateChats:m,canAutoLoadMediaInGroups:p,canAutoLoadMediaInChannels:g}):!a||ve({global:e,chat:n,sender:r,canAutoLoadMediaFromContacts:y,canAutoLoadMediaInPrivateChats:v,canAutoLoadMediaInGroups:b,canAutoLoadMediaInChannels:w})}function ve({global:e,chat:t,sender:n,canAutoLoadMediaFromContacts:r,canAutoLoadMediaInPrivateChats:o,canAutoLoadMediaInGroups:d,canAutoLoadMediaInChannels:a}){const u=Boolean(n&&(n.id===e.currentUserId||(0,s.nM)(e,n)));return Boolean(u&&r||!u&&o&&(0,i.YC)(t.id)||d&&(0,i.Bf)(t)||a&&(0,i.eA)(t))}function be(e,t){const n=(0,i.b7)(t)||(0,i.Cg)(t);if(!n)return;const{canAutoPlayVideos:r,canAutoPlayGifs:o}=e.settings.byKey,d=n.isGif||n.isRound;return r&&!d||o&&d}function we(e){return e.settings.byKey.shouldLoopStickers}function Ie(e){const{serviceNotifications:t}=e,n=Math.max(...t.map((({id:e})=>e)));return t.find((({id:e})=>e===n))}function Ce(e){const{chatId:t,threadId:n}=b(e)||{};if(!t||!n)return;const r=(0,i.uw)(t,n),o=e.localTextSearch.byChatThreadKey[r];return o&&o.isActive?o:void 0}function Se(e){const{byChatId:t}=e.localMediaSearch,{chatId:n}=b(e)||{},r=e.users.selectedId;return r&&t[r]?r:n}function Ee(e){const t=Se(e);if(t)return e.localMediaSearch.byChatId[t]}function Pe(e,t){return e.management.byChatId[t]}function Me(e){const{chatId:t,threadId:n}=b(e)||{};if(!t||!n)return;if((0,i.YC)(t))return"user";const r=(0,u.Z1)(e,t);return r?(0,i.Bf)(r)?"group":"channel":void 0}function Ae(e){const{mediaViewer:t}=e;return Boolean(t.messageId||t.avatarOwnerId)}function ke(e){const{users:t,isChatInfoShown:n,newChatMembersProgress:d}=e,a=d!==r.WB.Closed,s=function(e){const{pollResults:t}=e;return Boolean(t.messageId)}(e),i=Boolean(!o.wB&&Ce(e)),c=function(e){const{chatId:t,threadId:n}=b(e)||{};if(!t||!n)return;const r=e.management.byChatId[t];return r&&r.isActive?r:void 0}(e),h=void 0!==l(e).query,m=void 0!==f(e).query,{chatId:p}=b(e)||{},g=t.selectedId,y=(0,u.g4)(e),v=Boolean(g&&y),w=Boolean(p&&y)&&n;return s?r.qt.PollResults:i?r.qt.Search:c?r.qt.Management:h?r.qt.StickerSearch:m?r.qt.GifSearch:a?r.qt.AddingMembers:v?r.qt.UserInfo:w?r.qt.ChatInfo:void 0}function Te(e){return void 0!==ke(e)}function Ne(e){const{theme:t,shouldUseSystemTheme:n}=e.settings.byKey;return n?(0,o.vn)():t}function Le(e){return e.globalSearch.query}function Re(e){return e.payment.chatId}function De(e){return e.payment.messageId}function Ze(e){return e.payment.formId}function Oe(e){return e.payment.requestId}function xe(e){return e.payment.nativeParams?e.payment.nativeParams.publishableKey:void 0}function _e(e){return e.payment.stripeCredentials}var Fe=n(2913)},2913:(e,t,n)=>{function r(e){return e.settings.byKey}function o(e){return e.settings.notifyExceptions}n.d(t,{d:()=>r,N:()=>o})},6376:(e,t,n)=>{function r(e,t){return e.users.byId[t]}function o(e,t){var n;const o=r(e,t);return null==o||null===(n=o.fullInfo)||void 0===n?void 0:n.isBlocked}function d(e,t){return e.contactList&&e.contactList.userIds.includes(t.id)}n.d(t,{dy:()=>r,s4:()=>o,nM:()=>d})},1713:(e,t,n)=>{let r,o,d,a,u,s,i,c,l,f,h,m,p,g;n.d(t,{Uq:()=>r,fo:()=>o,MT:()=>d,du:()=>a,nJ:()=>u,qt:()=>s,bZ:()=>i,Cr:()=>c,Nh:()=>l,rN:()=>f,wv:()=>h,WB:()=>m,vi:()=>p,KB:()=>g,mp:()=>y,u1:()=>v}),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"}(o||(o={})),function(e){e[e.Main=0]="Main",e[e.EditProfile=1]="EditProfile",e[e.Notifications=2]="Notifications",e[e.DataStorage=3]="DataStorage",e[e.Language=4]="Language",e[e.General=5]="General",e[e.GeneralChatBackground=6]="GeneralChatBackground",e[e.GeneralChatBackgroundColor=7]="GeneralChatBackgroundColor",e[e.Privacy=8]="Privacy",e[e.PrivacyPhoneNumber=9]="PrivacyPhoneNumber",e[e.PrivacyLastSeen=10]="PrivacyLastSeen",e[e.PrivacyProfilePhoto=11]="PrivacyProfilePhoto",e[e.PrivacyForwarding=12]="PrivacyForwarding",e[e.PrivacyGroupChats=13]="PrivacyGroupChats",e[e.PrivacyPhoneNumberAllowedContacts=14]="PrivacyPhoneNumberAllowedContacts",e[e.PrivacyPhoneNumberDeniedContacts=15]="PrivacyPhoneNumberDeniedContacts",e[e.PrivacyLastSeenAllowedContacts=16]="PrivacyLastSeenAllowedContacts",e[e.PrivacyLastSeenDeniedContacts=17]="PrivacyLastSeenDeniedContacts",e[e.PrivacyProfilePhotoAllowedContacts=18]="PrivacyProfilePhotoAllowedContacts",e[e.PrivacyProfilePhotoDeniedContacts=19]="PrivacyProfilePhotoDeniedContacts",e[e.PrivacyForwardingAllowedContacts=20]="PrivacyForwardingAllowedContacts",e[e.PrivacyForwardingDeniedContacts=21]="PrivacyForwardingDeniedContacts",e[e.PrivacyGroupChatsAllowedContacts=22]="PrivacyGroupChatsAllowedContacts",e[e.PrivacyGroupChatsDeniedContacts=23]="PrivacyGroupChatsDeniedContacts",e[e.PrivacyActiveSessions=24]="PrivacyActiveSessions",e[e.PrivacyBlockedUsers=25]="PrivacyBlockedUsers",e[e.Folders=26]="Folders",e[e.FoldersCreateFolder=27]="FoldersCreateFolder",e[e.FoldersEditFolder=28]="FoldersEditFolder",e[e.FoldersEditFolderFromChatList=29]="FoldersEditFolderFromChatList",e[e.FoldersIncludedChats=30]="FoldersIncludedChats",e[e.FoldersIncludedChatsFromChatList=31]="FoldersIncludedChatsFromChatList",e[e.FoldersExcludedChats=32]="FoldersExcludedChats",e[e.FoldersExcludedChatsFromChatList=33]="FoldersExcludedChatsFromChatList",e[e.TwoFaDisabled=34]="TwoFaDisabled",e[e.TwoFaNewPassword=35]="TwoFaNewPassword",e[e.TwoFaNewPasswordConfirm=36]="TwoFaNewPasswordConfirm",e[e.TwoFaNewPasswordHint=37]="TwoFaNewPasswordHint",e[e.TwoFaNewPasswordEmail=38]="TwoFaNewPasswordEmail",e[e.TwoFaNewPasswordEmailCode=39]="TwoFaNewPasswordEmailCode",e[e.TwoFaEnabled=40]="TwoFaEnabled",e[e.TwoFaChangePasswordCurrent=41]="TwoFaChangePasswordCurrent",e[e.TwoFaChangePasswordNew=42]="TwoFaChangePasswordNew",e[e.TwoFaChangePasswordConfirm=43]="TwoFaChangePasswordConfirm",e[e.TwoFaChangePasswordHint=44]="TwoFaChangePasswordHint",e[e.TwoFaTurnOff=45]="TwoFaTurnOff",e[e.TwoFaRecoveryEmailCurrentPassword=46]="TwoFaRecoveryEmailCurrentPassword",e[e.TwoFaRecoveryEmail=47]="TwoFaRecoveryEmail",e[e.TwoFaRecoveryEmailCode=48]="TwoFaRecoveryEmailCode",e[e.TwoFaCongratulations=49]="TwoFaCongratulations"}(d||(d={})),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"}(a||(a={})),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"}(u||(u={})),function(e){e[e.ChatInfo=0]="ChatInfo",e[e.UserInfo=1]="UserInfo",e[e.Search=2]="Search",e[e.Management=3]="Management",e[e.StickerSearch=4]="StickerSearch",e[e.GifSearch=5]="GifSearch",e[e.PollResults=6]="PollResults",e[e.AddingMembers=7]="AddingMembers"}(s||(s={})),function(e){e[e.Inline=0]="Inline",e[e.ScheduledInline=1]="ScheduledInline",e[e.SharedMedia=2]="SharedMedia",e[e.ProfileAvatar=3]="ProfileAvatar",e[e.SettingsAvatar=4]="SettingsAvatar",e[e.MiddleHeaderAvatar=5]="MiddleHeaderAvatar",e[e.Album=6]="Album",e[e.ScheduledAlbum=7]="ScheduledAlbum",e[e.SearchResult=8]="SearchResult"}(i||(i={})),function(e){e[e.Inline=0]="Inline",e[e.SharedMedia=1]="SharedMedia",e[e.Search=2]="Search"}(c||(c={})),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.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"}(h||(h={})),function(e){e[e.Closed=0]="Closed",e[e.InProgress=1]="InProgress",e[e.Loading=2]="Loading"}(m||(m={})),function(e){e[e.Profile=0]="Profile",e[e.SharedMedia=1]="SharedMedia",e[e.MemberList=2]="MemberList"}(p||(p={})),function(e){e[e.ShippingInfo=0]="ShippingInfo",e[e.Shipping=1]="Shipping",e[e.PaymentInfo=2]="PaymentInfo",e[e.Checkout=3]="Checkout"}(g||(g={}));const y="UPLOADING_WALLPAPER_SLUG";let v;!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"}(v||(v={}))},9933:(e,t,n)=>{n.d(t,{c:()=>d,j:()=>a});var r=n(9118);let o;function d(e,t){t||(o&&!o.isCancelled&&(o.isCancelled=!0),o=t={isCancelled:!1}),(0,r.T2)((()=>{!t.isCancelled&&e()&&d(e,t)}))}function a(e){(0,r.T2)((()=>{e()&&a(e)}))}},7358:(e,t,n)=>{n.d(t,{w:()=>o});var r=n(3716);function o(e){"function"==typeof window.navigator.setAppBadge&&window.navigator.setAppBadge(e).catch((e=>{r.eM&&console.error(e)}))}},275:(e,t,n)=>{function r(e,t){if(e===t)return!0;const n=Object.keys(e),r=n.length;if(r!==Object.keys(t).length)return!1;if(0===r)return!0;for(let o=0;o(e[r]!==t[r]&&n.push(`${r}: ${e[r]} => ${t[r]}`),n)),[])}n.d(t,{Z:()=>r,c:()=>o})},6752:(e,t,n)=>{n.d(t,{Z:()=>r});const r=(...e)=>e.filter(Boolean).join(" ")},9524:(e,t,n)=>{n.d(t,{Type:()=>o,fetch:()=>d,save:()=>a,clear:()=>u});const r=self.caches;let o;async function d(e,t,n,d=!1){if(r)try{const a=new Request(t.replace(/:/g,"_")),u=await r.open(e),s=await u.match(a);if(!s)return;const i=s.headers.get("Content-Type");switch(n){case o.Text:return await s.text();case o.Blob:{if(t.startsWith("avatar")&&i&&i.startsWith("text"))return;const e=await s.blob();if(t.startsWith("sticker"))return new Blob([e],{type:"image/webp"});const n=!e.type||!d&&e.type.includes("html");let r=e.type||i;return n&&r?(d||(r=r.replace(/html/gi,"")),new Blob([e],{type:r})):e}case o.Json:return await s.json();default:return}}catch(e){return void console.warn(e)}}async function a(e,t,n){if(r)try{const o="string"==typeof n||n instanceof Blob?n:JSON.stringify(n),d=new Request(t.replace(/:/g,"_")),a=new Response(o),u=await r.open(e);return await u.put(d,a)}catch(e){return void console.warn(e)}}async function u(e){try{if(!r)return;return await r.delete(e)}catch(e){return void console.warn(e)}}!function(e){e[e.Text=0]="Text",e[e.Blob=1]="Blob",e[e.Json=2]="Json"}(o||(o={}))},3989:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(517);function o(e){return(0,r.Z)({onEsc:e})}},517:(e,t,n)=>{n.d(t,{Z:()=>d});const r={Enter:"onEnter",Backspace:"onBackspace",Delete:"onDelete",Esc:"onEsc",Escape:"onEsc",ArrowUp:"onUp",ArrowDown:"onDown",ArrowLeft:"onLeft",ArrowRight:"onRight",Tab:"onTab"},o={onEnter:[],onDelete:[],onBackspace:[],onEsc:[],onUp:[],onDown:[],onLeft:[],onRight:[],onTab:[]};function d(e){return a()||document.addEventListener("keydown",u,!0),Object.keys(e).forEach((t=>{const n=e[t];if(!n)return;const r=o[t];r&&r.push(n)})),()=>{!function(e){Object.keys(e).forEach((t=>{const n=e[t],r=o[t];if(r){const e=r.findIndex((e=>e===n));-1!==e&&r.splice(e,1)}})),a()||document.removeEventListener("keydown",u,!1)}(e)}}function a(){return Object.values(o).some((e=>Boolean(e.length)))}function u(e){const t=r[e.key];if(!t)return;const{length:n}=o[t];n&&(e.stopPropagation(),(0,o[t][n-1])(e))}},790:(e,t,n)=>{n.d(t,{$Y:()=>a,_F:()=>u,kj:()=>s,mr:()=>c,VX:()=>l,Tu:()=>f,np:()=>h,j1:()=>m,ZK:()=>g,k9:()=>y,rM:()=>v,xH:()=>b,xk:()=>I,IS:()=>C});const r=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],o=["January","February","March","April","May","June","July","August","September","October","November","December"],d=o.map((e=>e.toLowerCase()));function a(e){const t=new Date(e);return t.setHours(0,0,0,0),t}function u(e){return a(e).getTime()}function s(e){const t=new Date(1e3*e);return`${t.getFullYear()}-${t.getMonth()}`}function i(e){return`${e.getFullYear()}-${e.getMonth()+1}-${e.getDate()}`}function c(e,t){const n="number"==typeof e?new Date(e):e,r=t.timeFormat||"24h";let o=n.getHours(),d="";return"12h"===r&&(d=o>=12?" PM":" AM",o=o>12?o%12:o),`${String(o).padStart(2,"0")}:${String(n.getMinutes()).padStart(2,"0")}${d}`}function l(e,t){const n="number"==typeof t?new Date(t):t,o=a(new Date);if(n>=o)return c(n,e);const d=new Date(o);if(d.setDate(o.getDate()-7),n>=d)return e(`Weekday.Short${r[n.getDay()]}`);const u=n.getFullYear()!==o.getFullYear(),s=e(u?"formatDateScheduleYear":"formatDateSchedule")||(u?"d MMM yyyy":"d MMM");return p(e,n,s)}function f(e,t){const n="number"==typeof t?new Date(t):t,r=e("formatterYearMax")||"dd.MM.yyyy";return p(e,n,r)}function h(e,t,n=!1){const r=e(n?"formatterMonthYear2":"formatterMonthYear")||"MMM yyyy";return p(e,t,r)}function m(e,t,n=!1,o=!1,d){const u="number"==typeof t?new Date(t):t,s=a(new Date);if(!o){if(i(u)===i(s))return(d||!n?E:S)(e("Weekday.Today"));const t=new Date(s);if(t.setDate(s.getDate()-1),i(u)===i(t))return(d||!n?E:S)(e("Weekday.Yesterday"));const o=new Date(s),a=new Date(s);if(o.setDate(s.getDate()-7),a.setDate(s.getDate()+7),u>=o&&u<=a){const t=r[u.getDay()];return(d||!n?E:S)(e(n?`Weekday.Short${t}`:`Weekday.${t}`))}}const c=u.getFullYear()!==s.getFullYear(),l=e(n?c?"formatDateScheduleYear":"formatDateSchedule":c?"chatFullDate":"chatDate")||"d MMMM yyyy";return(d||!n?E:S)(p(e,u,l))}function p(e,t,n){const r=t.getDate(),d=t.getMonth();return n.replace("LLLL",e(o[d])).replace("MMMM",e(`Month.Gen${o[d]}`)).replace("MMM",e(`Month.Short${o[d]}`)).replace("MM",String(d+1).padStart(2,"0")).replace("dd",String(r).padStart(2,"0")).replace("d",String(r)).replace("yyyy",String(t.getFullYear()))}function g(e,t,n){const r="number"==typeof t?new Date(t):t;return`${m(e,r,!0,void 0,n)}, ${c(r,e)}`}function y(e,t){const n=Math.floor(e/3600),r=Math.floor(e%3600/60),o=Math.floor(e%3600%60),d=t?Math.floor(t/3600):0,a=t?Math.floor(t%3600/60):0;let u="";return n>0||d>0?(u+=`${String(n).padStart(2,"0")}:`,u+=`${String(r).padStart(2,"0")}:`):u+=a>=10?`${String(r).padStart(2,"0")}:`:`${String(r)}:`,u+=String(o).padStart(2,"0"),u}function v(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 o=(e=Math.floor(e/60))%60;e-=o;const d=(e=Math.floor(e/60))%60;return d>0&&t.push(String(d).padStart(2,"0")),t.push(String(o).padStart(d>0?2:1,"0")),t.push(String(r).padStart(2,"0")),`${t.join(":")},${String(n).padStart(2,"0")}`}function b(e,t="en-US"){return e.toLocaleString(t,{year:"numeric",month:"short",day:"numeric"})}function w(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 I(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||!w(t,n-1,r||void 0)?void 0:`${r?`${r}-`:""}${String(n).padStart(2,"0")}-${String(t).padStart(2,"0")}`}const o=e.split(" "),a=t?o[0]:o[1],u=(t?o[1]:o[0]).toLowerCase(),s=d.findIndex((e=>e.startsWith(u)));return-1!==s&&w(Number(a),s)?`${String(s+1).padStart(2,"0")}-${String(a).padStart(2,"0")}`:void 0}function C(e){return e+86400}function S(e){return`${e[0].toLowerCase()}${e.slice(1)}`}function E(e){return`${e[0].toUpperCase()}${e.slice(1)}`}},4284:(e,t,n)=>{n.d(t,{g6:()=>u,U_:()=>s,NM:()=>i,Wg:()=>c});var r=n(3681);const o=["female_sign","male_sign","medical_symbol"],d=[[/\u{1f3f3}\u200d\u{1f308}/gu,"🏳️‍🌈"],[/\u{1f3f3}\u200d\u26a7\ufe0f/gu,"🏳️‍⚧️"],[/\u{1f937}\u200d\u2642/gu,"🤷‍♂️"]];function a(e){const t=e.split("-").map((e=>parseInt(e,16)));return String.fromCodePoint(...t)}function u(e){if(!e.match(r.Z))return e;for(const[t,n]of d)e=e.replace(t,n);return e}function s(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 i(e){const t={categories:[],emojis:{}};for(let n=0;ne.codePointAt(0)+127397));return String.fromCodePoint(...n)}},1396:(e,t,n)=>{function r(e){if(e)return e.includes("://")?e:`http://${e}`}n.d(t,{X:()=>r})},7361:(e,t,n)=>{n.d(t,{Bi:()=>k,cL:()=>R,wZ:()=>p,vX:()=>M,op:()=>C,cj:()=>m,jm:()=>h,pA:()=>L,m5:()=>P,I_:()=>E,fl:()=>y,t0:()=>A,s$:()=>g,Mc:()=>S,wB:()=>b,p7:()=>w,$b:()=>v,mh:()=>I,s0:()=>T,aZ:()=>D,Lt:()=>f,vn:()=>i,on:()=>d});var r=n(3716);let o;function d(){return Boolean(o)}var a,u;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=>{o=e}));let s=null!==(a=(u=window).matchMedia)&&void 0!==a&&a.call(u,"(prefers-color-scheme: dark)").matches?"dark":"light";function i(){return s}function c(e){s=e.matches?"dark":"light"}const l=window.matchMedia("(prefers-color-scheme: dark)");"function"==typeof l.addEventListener?l.addEventListener("change",c):"function"==typeof l.addListener&&l.addListener(c);const f=function(){const{userAgent:e,platform:t}=window.navigator;let n;return-1!==["Macintosh","MacIntel","MacPPC","Mac68K"].indexOf(t)?n="macOS":-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}(),h="macOS"===f,m="iOS"===f,p="Android"===f,g=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),y=window.matchMedia("(display-mode: standalone)").matches||window.navigator.standalone||document.referrer.includes("android-app://"),v=window.matchMedia("(pointer: coarse)").matches,b=window.innerWidth<=r.l3||window.innerWidth<=r.u_&&window.innerHeight<=r.rO,w=!b&&window.innerWidth<=r.ks,I=Boolean(navigator.mediaDevices&&"getUserMedia"in navigator.mediaDevices&&(window.AudioContext||window.webkitAudioContext)),C=(document.documentElement.style,f&&(h||m)),S="serviceWorker"in navigator,E=S,P=(window,Boolean((new Audio).canPlayType("audio/ogg; codecs=opus"))),M=!r.Cg&&"filter"in(document.createElement("canvas").getContext("2d")||{}),A="requestFullscreen"in document.createElement("div"),k=!navigator.userAgent.includes("Firefox"),T=p?"slide-fade":m?"slide-layers":"push-slide",N=document.createElement("video"),L=Boolean(N.canPlayType(r.Ng).replace("no","")||m);L&&r.wG.add(r.Ng);const R=window.devicePixelRatio||1,D=!0},1394:(e,t,n)=>{n.d(t,{A9:()=>d,YJ:()=>a,hl:()=>u,pt:()=>s,jj:()=>i,ud:()=>c,gm:()=>l,dc:()=>f,ao:()=>h});var r=n(9118);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function d(e){const t=e.split(","),n=t[0].match(/:(.*?);/)[1],r=atob(t[1]);let o=r.length;const d=new Uint8Array(o);for(;o--;)d[o]=r.charCodeAt(o);return new Blob([d],{type:n})}function a(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 u(e,t){return new File([e],t,{lastModified:Date.now(),type:e.type})}function s(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 c(e){const t=await i(e);return Promise.race([(0,r.wO)(2e3),new Promise(((e,n)=>{t.onseeked=()=>{t.videoWidth&&t.videoHeight||e(void 0);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 l(e){return(await fetch(e)).blob()}async function f(e,t){return u(await l(e),t)}function h(e){const t=document.createElement("canvas");return t.width=e.width,t.height=e.height,t.getContext("2d").drawImage(e,0,0),t}"undefined"==typeof File&&(self.File=class extends Blob{constructor(e,t,n){if(n){const{type:t,...r}=n;super(e,{type:t}),o(this,"name",void 0),Object.assign(this,r)}else super(e),o(this,"name",void 0);this.name=t}})},9937:(e,t,n)=>{function r(e,t,n="en"){return new Intl.NumberFormat(n,{style:"currency",currency:t}).format("JPY"===t?e:e/100)}n.d(t,{x:()=>r})},6926:(e,t,n)=>{n.d(t,{Z:()=>r});const r=e=>{let t;do{t=String(Math.random()).replace("0.","id")}while(e.hasOwnProperty(t));return t}},1947:(e,t,n)=>{n.d(t,{ZP:()=>d,J_:()=>a});const r={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",MESSAGE_TOO_LONG:"Message is too long",SERVICE_WORKER_DISABLED:"Service Worker is disabled. Please reload the page without holding key.",MESSAGE_TOO_LONG_PLEASE_REMOVE_CHARACTERS:"The provided message 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",SCHEDULE_DATE_INVALID:"Invalid schedule date provided",WALLPAPER_DIMENSIONS_INVALID:"The wallpaper dimensions are invalid, please select another file"},o={ADDRESS_STREET_LINE1_INVALID:{field:"streetLine1",message:"Incorrect street address"},ADDRESS_STREET_LINE2_INVALID:{field:"streetLine2",message:"Incorrect street address"},ADDRESS_CITY_INVALID:{field:"city",message:"Incorrect city"},ADDRESS_COUNTRY_INVALID:{field:"countryIso2",message:"Incorrect country"},ADDRESS_POSTCODE_INVALID:{field:"postCode",message:"Incorrect post code"},ADDRESS_STATE_INVALID:{field:"state",message:"Incorrect state"},REQ_INFO_NAME_INVALID:{field:"fullName",message:"Incorrect name"},REQ_INFO_PHONE_INVALID:{field:"phone",message:"Incorrect phone"},REQ_INFO_EMAIL_INVALID:{field:"email",message:"Incorrect email"}};function d(e){const{message:t,isSlowMode:n,textParams:o}=e;if(n){const e=t.indexOf(" (caused by");return e>0?t.substring(0,e):t}let d=r[t];return d&&o&&(d=Object.keys(o).reduce(((e,t)=>e.replace(t,o[t])),d)),d}function a(e){return o[e.message]}},3592:(e,t,n)=>{n.d(t,{S:()=>d}),n(3716);var r=n(9118);function o(e){e.preventDefault(),d(e instanceof ErrorEvent?e.error:e.reason)}function d(e){console.error(e)}window.addEventListener("error",o),window.addEventListener("unhandledrejection",o),(0,r.P2)(window.alert,1e3)},782:(e,t,n)=>{function r(e,t){return e.reduce(((e,n)=>(e[n[t]]=n,e)),{})}function o(e,t){return Object.keys(e).reduce(((n,r,o)=>(n[r]=t(e[r],r,o,e),n)),{})}function d(e,t){return t.reduce(((t,n)=>(t[n]=e[n],t)),{})}function a(e,t){return t.reduce(((t,n)=>(e[n]&&(t[n]=e[n]),t)),{})}function u(e,t){const n=new Set(t.map(String));return d(e,Object.keys(e).filter((e=>!n.has(e))))}function s(e,t,n="asc"){return e.sort(((e,r)=>{if(Array.isArray(t)){const[o,d]=Array.isArray(n)?n:[n,n],[a,u]=t;let s,i;if("function"==typeof a?(s=a(e)||0,i=a(r)||0):"string"==typeof a&&(s=e[a]||0,i=r[a]||0),s!==i)return"asc"===o?s-i:i-s;{let t,n;return"function"==typeof u?(t=u(e)||0,n=u(r)||0):"string"==typeof u&&(t=e[u]||0,n=r[u]||0),"asc"===d?t-n:n-t}}let o,d;return"function"==typeof t?(o=t(e)||0,d=t(r)||0):"string"==typeof t&&(o=e[t]||0,d=r[t]||0),"asc"===n?o-d:d-o}))}function i(e){return e.reduce(((e,t)=>Array.isArray(t)?e.concat(t):(e.push(t),e)),[])}function c(e){return Array.from(new Set(e))}function l(e){return e.filter(Boolean)}function f(e,t){return e.length===t.length&&e.every(((e,n)=>e===t[n]))}function h(e,t){return e[0]<=t[t.length-1]&&e[e.length-1]>=t[0]}function m(e,t){return e.filter((e=>t.has(e)))}function p(e,t){const n=[];for(let r=0;r(t[n]=g(e[n]),t)),{})}function y(e,t){let n=e.length;for(;n--;)if(t(e[n],n,e))return e[n]}n.d(t,{ee:()=>r,Q8:()=>o,ei:()=>d,q0:()=>a,CE:()=>u,Xo:()=>s,xH:()=>i,Tw:()=>c,oA:()=>l,et:()=>f,YE:()=>h,eL:()=>m,Vl:()=>p,Xh:()=>g,dF:()=>y})},663:(e,t,n)=>{n.d(t,{ll:()=>m,i0:()=>b,Pn:()=>w,m0:()=>I,qf:()=>C});var r=n(5116),o=n(3716),d=n(9524),a=n(1226),u=n(2155);const s=/%\d?\$?[sdf@]/g,i=["value","zeroValue","oneValue","twoValue","fewValue","manyValue","otherValue"],c={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},l=new Map;let f,h;const{addCallback:m,removeCallback:p,runCallbacks:g}=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 y,v;const b=(e,t,n)=>{var r,o;if(void 0!==t){const r=Array.isArray(t)?JSON.stringify(t):t,o=l.get(`${e}_${r}_${n}`);if(o)return o}if(!f&&!h)return e;const d=(null===(r=f)||void 0===r?void 0:r[e])||(null===(o=h)||void 0===o?void 0:o[e]);return d?E(d,e,t,n):(h||S(),e)};async function w(e,t){let n=await d.fetch(o.ee,`${o.$O}_${e}_${t}`,d.Type.Json);return n||(n=await async function(e,t,n){const r=await(0,a.t9)("fetchLangStrings",{langPack:e,langCode:t,keys:[n]});if(null!=r&&r.length)return await d.save(o.ee,`${e}_${t}_${n}`,r[0]),r[0]}(o.$O,e,t)),E(n,t)}async function I(e,t,n=!1){if(f&&e===y)return void(t&&t());let u=await d.fetch(o.ee,e,d.Type.Json);if(!u&&(n&&await S(),u=await async function(e){const t=await(0,a.t9)("fetchLangPack",{sourceLangPacks:o.Bg,langCode:e});if(t)return await d.save(o.ee,e,t.langPack),t.langPack}(e),!u))return;l.clear(),y=e,f=u,document.documentElement.lang=e;const{languages:s,timeFormat:i}=(0,r.Rd)().settings.byKey,c=null==s?void 0:s.find((t=>t.langCode===e));b.isRtl=Boolean(null==c?void 0:c.rtl),b.code=e,b.timeFormat=i,t&&t(),g()}function C(e){e&&e===v||(v=e,b.timeFormat=e,g())}async function S(){h||(h=(await n.e(915).then(n.bind(n,1915))).default,g())}function E(e,t,n,r){const d=e?e["number"==typeof n?function(e){const t=y||o.sR,n=c[t]?c[t](e):0;return i[n]}(n):"value"]:void 0;if(!d||!d.trim()){const e=t.split(".");return e[e.length-1]}if(void 0!==n){const e=function(e,t){t=Array.isArray(t)?t:[t];const n=e.split(s),r=n.shift();return n.reduce(((e,n,r)=>`${e}${String(t[r]||"")}${n}`),r||"")}(d,"i"===r?(0,u.kh)(n):n),o=Array.isArray(n)?JSON.stringify(n):n;return l.set(`${t}_${o}_${r}`,e),e}return d}},647:(e,t,n)=>{n.d(t,{cC:()=>b,he:()=>y,UV:()=>v,Iq:()=>w});var r=n(6137),o=n(3716),d=n(1226),a=n(9524),u=n(1394),s=n(7361);const i=48e3;async function c(e){const t=await new Response(e).arrayBuffer();return new Promise((e=>{const r=new Uint8Array(t);let o=new Worker(new URL(n.p+n.u(745),n.b)),d=new Worker(new URL(n.p+n.u(993),n.b));o.onmessage=e=>{null===e.data?d.postMessage({command:"done"}):d.postMessage({command:"encode",buffers:e.data},e.data.map((({buffer:e})=>e)))},d.onmessage=t=>{"page"===t.data.message&&(e(new Blob([t.data.page],{type:"audio/wav"})),o.terminate(),o=void 0,d.terminate(),d=void 0)},d.postMessage({command:"init",wavBitDepth:16,wavSampleRate:i}),o.postMessage({command:"init",decoderSampleRate:i,outputBufferSampleRate:i}),o.postMessage({command:"decode",pages:r},[r.buffer])}))}var l=n(862);const f={[r.IU.BlobUrl]:a.Type.Blob,[r.IU.Lottie]:a.Type.Json,[r.IU.Progressive]:void 0,[r.IU.Stream]:void 0},h=new Map,m=new Map,p=new Map,g=new Map;function y(e,t,n=!1,i,v){if(t===r.IU.Progressive)return s.I_?function(e){const t=`./progressive/${e}`;return h.set(e,t),Promise.resolve(t)}(e):y(e,r.IU.BlobUrl,n,i,v);if(!m.has(e)){const i=async function(e,t,n){if(!o.Cy){const r=e.startsWith("avatar")?o.SG:o.lW,d=await a.fetch(r,e,f[t],n);if(d){let t=d;if("audio/ogg"!==d.type||s.m5||(t=await c(t)),"image/webp"===d.type&&!(0,s.on)()&&t){const n=await(0,l._y)(e,t);n&&(t=n)}const n=C(t);return h.set(e,n),n}}if(t===r.IU.Stream){const n=new MediaSource,r=URL.createObjectURL(n);let o=!1;return n.addEventListener("sourceopen",(()=>{if(o)return;o=!0;const r=n.addSourceBuffer("audio/mpeg"),a=I(e,n,r);g.set(e,a),(0,d.t9)("downloadMedia",{url:e,mediaFormat:t},a)})),h.set(e,r),r}const i=I(e);g.set(e,i);const m=await(0,d.t9)("downloadMedia",{url:e,mediaFormat:t,isHtmlAllowed:n},i);if(!m)throw new Error(`Failed to fetch media ${e}`);let{prepared:p,mimeType:y}=m;if("audio/ogg"===y&&!s.m5){const e=await(0,u.gm)(p);URL.revokeObjectURL(p);const t=await c(e);p=C(t),y=t.type}if("image/webp"===y&&!(0,s.on)()){const t=await(0,u.gm)(p);URL.revokeObjectURL(p);const n=await(0,l._y)(e,t);n&&(p=C(n))}return h.set(e,p),p}(e,t,n).catch((e=>{o.eM&&console.warn(e)})).finally((()=>{m.delete(e),p.delete(e),g.delete(e)}));m.set(e,i)}if(i&&v){let t=p.get(e);t||(t=new Map,p.set(e,t)),t.set(v,i)}return m.get(e)}function v(e){return h.get(e)}function b(e){p.forEach(((t,n)=>{t.forEach((t=>{if(t===e){const e=g.get(n);if(!e)return;(0,d.u3)(e),g.delete(n),p.delete(n)}}))}))}function w(e,t){const n=p.get(e);n&&n.delete(t)}function I(e,t,n){const r=(o,d)=>{var a;null===(a=p.get(e))||void 0===a||a.forEach((e=>{e(o),e.isCanceled&&(r.isCanceled=!0)})),1===o&&(null==t||t.endOfStream()),d&&(null==n||n.appendBuffer(d))};return r}function C(e){return e instanceof Blob?URL.createObjectURL(e):e}s.I_&&navigator.serviceWorker.addEventListener("message",(async e=>{const{type:t,messageId:n,params:o}=e.data;if("requestPart"!==t)return;const a=await(0,d.t9)("downloadMedia",{mediaFormat:r.IU.Progressive,...o});if(!a)return;const{arrayBuffer:u,mimeType:s,fullSize:i}=a;navigator.serviceWorker.controller.postMessage({type:"partResponse",messageId:n,result:{arrayBuffer:u,mimeType:s,fullSize:i}},[u])}))},735:(e,t,n)=>{n.d(t,{D:()=>r});const r=[]},9203:(e,t,n)=>{n.d(t,{gl:()=>o,$y:()=>u,o5:()=>s,Qt:()=>c});var r=n(3716);let o;!function(e){e[e.Auth=0]="Auth",e[e.Main=1]="Main",e[e.Extra=2]="Extra",e[e.Calls=3]="Calls"}(o||(o={}));const d={},a={};async function u(e,t){if(!d[e]){switch(e){case o.Auth:d[o.Auth]=n.e(133).then(n.bind(n,1133));break;case o.Main:r.eM&&console.log(">>> START LOAD MAIN BUNDLE"),d[o.Main]=Promise.all([n.e(739),n.e(435),n.e(884),n.e(952)]).then(n.bind(n,7826));break;case o.Extra:d[o.Extra]=Promise.all([n.e(739),n.e(435),n.e(701)]).then(n.bind(n,9701));break;case o.Calls:d[o.Calls]=Promise.all([n.e(739),n.e(884),n.e(532)]).then(n.bind(n,7936))}d[e].then(l)}const u=await d[e];return a[e]||(a[e]=u),s(e,t)}function s(e,t){const n=a[e];if(n)return n[t]}const i=[];function c(e){i.includes(e)||i.push(e)}function l(){i.forEach((e=>{e()}))}},8406:(e,t,n)=>{n.d(t,{q3:()=>v,Nz:()=>b,r1:()=>C,Ld:()=>E,zP:()=>P,Vr:()=>M,KC:()=>A});var r=n(1226),o=n(6137),d=n(8005),a=n(3716),u=n(5116),s=n(2858),i=n(663),c=n(307),l=n(1638),f=n(7361),h=n(647),m=n(9118);function p(e){const t=e.toJSON();return JSON.stringify({endpoint:t.endpoint,keys:t.keys})}function g(){return!!f.Mc&&("showNotification"in ServiceWorkerRegistration.prototype?"denied"===Notification.permission?(a.eM&&console.warn("[PUSH] The user has blocked push notifications."),!1):"PushManager"in window||(a.eM&&console.warn("[PUSH] Push messaging isn't supported."),!1):(a.eM&&console.warn("[PUSH] Push notifications aren't supported."),!1))}const y=new Set;async function v(e,t){if(void 0!==e&&y.has(e))return;const{notificationSoundVolume:n}=(0,l.dZ)((0,u.Rd)()),r=t?t/10:n/10;if(0===r)return;const o=new Audio("./notification.mp3");o.volume=r,o.setAttribute("mozaudiochannel","notification"),void 0!==e&&(o.addEventListener("ended",(()=>{y.add(e)}),{once:!0}),setTimeout((()=>{y.delete(e)}),3e3));try{await o.play()}catch(e){a.eM&&console.warn("[PUSH] Unable to play notification sound")}}const b=(0,m.Ds)(v,1e3,!0,!1);async function w(){"Notification"in window&&(["granted","denied"].includes(Notification.permission)||await Notification.requestPermission())}async function I(e){const t=(0,u.Rd)(),n=(0,u.uC)();if(e)try{const t=p(e);return await(0,r.t9)("unregisterDevice",t),await e.unsubscribe(),void n.deleteDeviceToken()}catch(e){a.eM&&console.log("[PUSH] Unable to unsubscribe from push.",e)}t.push&&(await(0,r.t9)("unregisterDevice",t.push.deviceToken),n.deleteDeviceToken())}async function C(){if(!g())return;const e=await navigator.serviceWorker.ready,t=await e.pushManager.getSubscription();await I(t)}let S=!1;async function E(){if(!g())return void await w();const e=await navigator.serviceWorker.ready;let t=await e.pushManager.getSubscription();if(function(e){const t=(0,u.Rd)();return!t.push||!e||p(e)!==t.push.deviceToken||Date.now()-t.push.subscribedAt>432e5}(t)){await I(t);try{t=await e.pushManager.subscribe({userVisibleOnly:!0});const n=p(t);a.eM&&console.log("[PUSH] Received push subscription: ",n),await(0,r.t9)("registerDevice",n),(0,u.uC)().setDeviceToken(n)}catch(e){"denied"===Notification.permission?a.eM&&console.warn("[PUSH] The user has blocked push notifications."):a.eM&&(console.log("[PUSH] Unable to subscribe to push.",e),e.code===DOMException.ABORT_ERR&&await w())}}}async function P({chat:e,message:t}){const{hasWebNotifications:n}=await async function(){if(S)return(0,l.dZ)((0,u.Rd)());const[e,t]=await Promise.all([(0,r.t9)("fetchNotificationSettings",{serverTimeOffset:(0,u.Rd)().serverTimeOffset}),(0,r.t9)("fetchNotificationExceptions",{serverTimeOffset:(0,u.Rd)().serverTimeOffset})]);if(!e)return(0,l.dZ)((0,u.Rd)());let n=(0,c.BI)((0,u.Rd)(),e);return t&&(n=(0,c.aJ)(n,t)),(0,u.R3)(n),S=!0,(0,l.dZ)(n)}();if(!function(e){if(!S)return!1;const t=(0,u.Rd)();return!((0,s.i4)(e,(0,l.dZ)(t),(0,l.NJ)(t))||e.isNotJoined||!e.isListed||document.hasFocus())}(e))return;const f="Notification"in window?"denied"!==Notification.permission||(a.eM&&console.warn("[PUSH] The user has blocked push notifications."),!1):(a.eM&&console.warn("[PUSH] This browser does not support desktop notification"),!1);if(!n||!f)return void b(String(t.id)||e.id);if(!f)return;if(!t.id)return;const{title:m,body:p}=function(e,t){const n=(0,u.Rd)(),{senderId:r,replyToMessageId:o}=t,a=r?(0,l.dy)(n,r):void 0,c=(0,s.N5)(t),f=c&&o?(0,l.hj)(n,e.id,o):void 0,{targetUserIds:h,targetChatId:m}=c||{},p=h?h.map((e=>(0,l.dy)(n,e))).filter(Boolean):void 0,g=(0,s.zX)(e),y=g?(0,l.dy)(n,g):void 0;let v;if((0,s.Sm)(e,(0,l.dZ)(n),(0,l.NJ)(n)))if((0,s.Lo)(t)){const n=e&&((0,s.eA)(e)||t.senderId===t.chatId)?e:a;v=(0,d.D)(i.i0,t,n,p,f,m,{asPlain:!0})}else{const n=(0,s.zF)(i.i0,e.id,a),r=(0,s.MK)(i.i0,t);v=n?`${n}: ${r}`:r}else v="New message";return{title:(0,s.U)(i.i0,e,y),body:v}}(e,t),y=await async function(e){const t=(0,s.RT)(e);if(!t)return;let n=h.UV(t);return n||(await h.he(t,o.IU.BlobUrl),n=h.UV(t)),n}(e);if(g()){var v;null!==(v=navigator.serviceWorker)&&void 0!==v&&v.controller&&navigator.serviceWorker.controller.postMessage({type:"newMessageNotification",payload:{title:m,body:p,icon:y,chatId:e.id,messageId:t.id}})}else{const n=(0,u.uC)(),r={body:p,icon:y,badge:y,tag:String(t.id)};"vibrate"in navigator&&(r.vibrate=[200,100,200]);const o=new Notification(m,r);o.onclick=()=>{o.close(),n.focusMessage({chatId:e.id,messageId:t.id}),window.focus&&window.focus()},o.onshow=()=>{b(String(t.id)||e.id)}}}function M(e){var t;!a.Cg&&null!==(t=navigator.serviceWorker)&&void 0!==t&&t.controller&&navigator.serviceWorker.controller.postMessage({type:"closeMessageNotifications",payload:e})}function A(){var e;null!==(e=navigator.serviceWorker)&&void 0!==e&&e.controller&&navigator.serviceWorker.controller.postMessage({type:"clientReady"})}},6272:(e,t,n)=>{n.d(t,{U9:()=>a,g3:()=>u,un:()=>s,WZ:()=>i});var r=n(782);const o="X",d="XXX XXX XXX XXX";function a(e,t){return e.filter((e=>e.iso2===t))}function u(e,t=""){var n;let o=t.replace(/[^\d+]+/g,"");o.startsWith("+")&&(o=o.substr(1));const d=e.filter((e=>o.startsWith(e.countryCode))),a=(0,r.xH)(d.map((e=>(e.prefixes||[""]).map((t=>({code:`${e.countryCode}${t}`,country:e})))))).filter((({code:e})=>o.startsWith(e))).sort(((e,t)=>e.code.length-t.code.length));return null===(n=a[a.length-1])||void 0===n?void 0:n.country}function s(e,t){let n=e.replace(/[^\d]+/g,"");if(t)n=n.substr(t.countryCode.length);else if(e.startsWith("+"))return e;const r=function(e,t){if(!t||0===t.length)return d;if(1===t.length)return t[0];const n=t.find((e=>e.startsWith(o)))||d,r=t.filter((t=>{const n=t.replace(/[^\dX]+/g,"");if(n.startsWith(o))return!1;for(let t=0;tn.length-1||n[t]!==o&&n[t]!==e[t])return!1;return!0}));return 1===r.length?r[0]:n}(n,null==t?void 0:t.patterns),a=[];let u=0;for(let e=0;e{n.d(t,{q:()=>o,V:()=>d});var r=n(6137);const o=e=>e.chatId.toString()+("thread"!==e.type?`_${e.type}`:-1!==e.threadId?`_${e.threadId}`:""),d=e=>{if(!e)return;const[t,n]=e.replace(/^#/,"").split("_");if(!t)return;const o=["thread","pinned","scheduled"].includes(n);return{chatId:t,type:n&&o?n:"thread",threadId:n&&!o?Number(n):r._f}}},9118:(e,t,n)=>{function r(e,t,n=!0,r=!0){let o;return(...d)=>{o?(clearTimeout(o),o=void 0):n&&e(...d),o=self.setTimeout((()=>{r&&e(...d),o=void 0}),t)}}function o(e,t,n=!0){let r,o,d;return(...a)=>{o=!0,d=a,r||(n&&(o=!1,e(...d)),r=self.setInterval((()=>{if(!o)return self.clearInterval(r),void(r=void 0);o=!1,e(...d)}),t))}}function d(e){return u(g,e)}function a(e){return u(y,e)}function u(e,t){let n,r=!1;return(...o)=>{n=o,r||(r=!0,e((()=>{r=!1,t(...n)})))}}function s(e){self.requestIdleCallback?self.requestIdleCallback(e):v(e)}n.d(t,{Ds:()=>r,P2:()=>o,mS:()=>d,wT:()=>a,Q8:()=>s,wO:()=>i,Pn:()=>c,T2:()=>g,D0:()=>y,R3:()=>v,zD:()=>b,Gq:()=>w});const i=e=>new Promise((t=>{setTimeout((()=>t()),e)}));function c(){return new Promise((e=>{g(e)}))}let l,f,h,m,p;function g(e,t=!1){l?t?f.push(e):l.push(e):(l=t?[]:[e],f=t?[e]:[],requestAnimationFrame((()=>{const e=l,t=f;l=void 0,f=void 0,t.forEach((e=>e())),e.forEach((e=>e()))})))}function y(e){g(e,!0)}function v(e,t=!1){h?t?m.push(e):h.push(e):(h=t?[]:[e],m=t?[e]:[],Promise.resolve().then((()=>{const e=h,t=m;h=void 0,m=void 0,t.forEach((e=>e())),e.forEach((e=>e()))})))}function b(e){v(e,!0)}function w(e,t=!1){return p||(p=[],self.addEventListener("beforeunload",(()=>{p.forEach((e=>e()))}))),t?p.push(e):p.unshift(e),()=>{p=p.filter((t=>t!==e))}}},5765:(e,t,n)=>{let r;n.d(t,{Z:()=>o});try{r=new RegExp("[^\\p{L}\\p{M}]+","ui")}catch(e){r=new RegExp("[^\\wа-яё]+","i")}function o(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)))))}},2267:(e,t,n)=>{n.d(t,{b:()=>r});const r=e=>Math.floor(Date.now()/1e3)+e},4688:(e,t,n)=>{n.d(t,{f3:()=>m,jv:()=>l,ti:()=>i,Qw:()=>h,K8:()=>f,wX:()=>c});function r(e){return new Promise(((t,n)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>n(e.error)}))}let o;function d(){return o||(o=function(e,t){const n=function(){if(navigator.userAgentData||!/Safari\//.test(navigator.userAgent)||/Chrom(e|ium)\//.test(navigator.userAgent)||!indexedDB.databases)return Promise.resolve();let e;return new Promise((t=>{const n=()=>indexedDB.databases().finally(t);e=setInterval(n,100),n()})).finally((()=>clearInterval(e)))}().then((()=>{const e=indexedDB.open("keyval-store");return e.onupgradeneeded=()=>e.result.createObjectStore(t),r(e)}));return(e,r)=>n.then((n=>r(n.transaction(t,e).objectStore(t))))}(0,"keyval")),o}var a=n(3716),u=n(9524);const s=[1,2,3,4,5];function i(e=!1){if(e&&localStorage.getItem(a.Vx))return!0;const t=localStorage.getItem(a.b_);if(!t)return!1;try{const e=JSON.parse(t);return Boolean(e&&e.id&&e.dcID)}catch(e){return!1}}function c(e,t){const{mainDcId:n,keys:r,hashes:o}=e;localStorage.setItem(a.b_,JSON.stringify({dcID:n,id:t})),localStorage.setItem("dc",String(n)),Object.keys(r).map(Number).forEach((e=>{localStorage.setItem(`dc${e}_auth_key`,JSON.stringify(r[e]))})),o&&Object.keys(o).map(Number).forEach((e=>{localStorage.setItem(`dc${e}_hash`,JSON.stringify(o[e]))}))}function l(){[a.b_,"dc",...s.map((e=>`dc${e}_auth_key`)),...s.map((e=>`dc${e}_hash`))].forEach((e=>{localStorage.removeItem(e)}))}function f(){if(!i())return;const e=JSON.parse(localStorage.getItem(a.b_)),t=Number(e.dcID),n={},r={};return s.forEach((e=>{try{const t=localStorage.getItem(`dc${e}_auth_key`);t&&(n[e]=JSON.parse(t));const o=localStorage.getItem(`dc${e}_hash`);o&&(r[e]=JSON.parse(o))}catch(e){a.eM&&console.warn("Failed to load stored session",e)}})),Object.keys(n).length?{mainDcId:t,keys:n,hashes:r}:void 0}async function h(){const e=localStorage.getItem(a.Vx);if(!e)return;const t=await function(e,t=d()){return t("readonly",(t=>r(t.get(e))))}(`GramJs:${e}`);try{c(JSON.parse(t))}catch(e){a.eM&&console.warn("Failed to load legacy session",e)}}async function m(){localStorage.removeItem(a.Vx);const e=await function(e=d()){const t=[];return function(e,t){return e("readonly",(e=>(e.openCursor().onsuccess=function(){this.result&&(t(this.result),this.result.continue())},r(e.transaction))))}(e,(e=>t.push(e.key))).then((()=>t))}();await Promise.all([u.clear("GramJs"),...e.filter((e=>"string"==typeof e&&e.startsWith("GramJs:GramJs-session-"))).map((e=>function(e,t=d()){return t("readwrite",(t=>(t.delete(e),r(t.transaction))))}(e)))])}},6917:(e,t,n)=>{n.d(t,{Z:()=>c});var r=n(9933);const o=JSON.parse('{"--color-primary":["#3390EC","#8774E1"],"--color-primary-opacity":["#50A2E980","#8378DB80"],"--color-primary-shade":["#4a95d6","#7b71c6"],"--color-background":["#FFFFFF","#212121"],"--color-background-secondary":["#f4f4f5","#0F0F0F"],"--color-background-secondary-accent":["#E4E4E5","#100f10"],"--color-background-own":["#EEFFDE","#8774E1"],"--color-background-own-apple":["#DCF8C5","#8774E1"],"--color-background-selected":["#F4F4F5","#2C2C2C"],"--color-background-own-selected":["#d0ffac","#6549d4"],"--color-chat-hover":["#F4F4F5","#2C2C2C"],"--color-chat-active":["#3390EC","#8774E1"],"--color-item-active":["#ededed","#292929"],"--color-text":["#000000","#FFFFFF"],"--color-text-secondary":["#707579","#AAAAAA"],"--color-text-secondary-apple":["#8E8E92","#AAAAAA"],"--color-borders":["#DADCE0","#303030"],"--color-borders-input":["#DADCE0","#5B5B5A"],"--color-dividers":["#C8C6CC","#404040"],"--color-links":["#3390EC","#8774E1"],"--color-gray":["#C4C9CC","#717579"],"--color-pinned":["#C4C9CC","#707579"],"--color-default-shadow":["#72727240","#1010109c"],"--color-light-shadow":["#7272722B","#00000040"],"--color-green":["#00C73E","#8774E1"],"--color-text-meta-colored":["#4DCD5E","#8378DB"],"--color-reply-hover":["#F4F4F4","#272727"],"--color-reply-active":["#E8E9E9","#2E2F2F"],"--color-reply-own-hover":["#D9F5CE","#7d6bca"],"--color-reply-own-hover-apple":["#cbefb7","#7d6bca"],"--color-reply-own-active":["#C5ECBE","#7264b6"],"--color-reply-own-active-apple":["#bae6a8","#7264b6"],"--color-accent-own":["#45AF54","#FFFFFF"],"--color-message-meta-own":["#4FAE4EFF","#FFFFFF88"],"--color-own-links":["#3390EC","#FFFFFF"],"--color-code":["#4a729a","#8774E1"],"--color-code-own":["#3c7940","#FFFFFF"],"--color-code-bg":["#70757914","#ffffff26"],"--color-code-own-bg":["#70757914","#ffffff26"],"--color-composer-button":["#707579CC","#AAAAAACC"]}');let d=!1;const a=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i,u=new Set(["--color-primary-shade","--color-text-secondary"]),s=(e,t,n)=>(1-n)*e+n*t,i=Object.keys(o).map((e=>({property:e,colors:[l(o[e][0]),l(o[e][1])]}))),c=(e,t)=>{const n="dark"===e,o=d&&t,a=n?0:1,u=n?1:0,s=Date.now(),i=document.querySelector('meta[name="theme-color"]');document.documentElement.classList.remove("theme-"+(n?"light":"dark")),d&&document.documentElement.classList.add("no-animations"),document.documentElement.classList.add(`theme-${e}`),i&&i.setAttribute("content",n?"#212121":"#fff"),setTimeout((()=>{document.documentElement.classList.remove("no-animations")}),500),d=!0,o?(0,r.c)((()=>{const e=Math.min((Date.now()-s)/200,1);return f(a,u,function(e){return 1-(1-e)**3.5}(e)),e<1})):f(a,u)};function l(e){const t=a.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 f(e,t,n=1){i.forEach((({property:r,colors:o})=>{const d=Math.round(s(o[e].r,o[t].r,n)),a=Math.round(s(o[e].g,o[t].g,n)),i=Math.round(s(o[e].b,o[t].b,n)),c=void 0!==o[e].a?Math.round(s(o[e].a,o[t].a,n)):void 0;document.documentElement.style.setProperty(r,void 0!==c?`rgba(${d},${a},${i},${c/255})`:`rgb(${d},${a},${i})`),u.has(r)&&document.documentElement.style.setProperty(`${r}-rgb`,`${d},${a},${i}`)}))}},2155:(e,t,n)=>{n.d(t,{kh:()=>d,bi:()=>u,Xv:()=>s});var r=n(3681),o=n(4284);function d(e){return String(e).replace(/\d(?=(\d{3})+$)/g,"$& ")}function a(e){return".0"===String(e.toFixed(1)).substr(-2)?Math.round(e):e.toFixed(1).replace(".",",")}function u(e){return e<1e3?e:e<1e6?`${a(e/1e3)}K`:`${a(e/1e6)}M`}function s(e,t=2){return e.replace(/[.,!@#$%^&*()_+=\-`~[\]/\\{}:"|<>?]+/gi,"").trim().split(/\s+/).slice(0,t).map((e=>{if(!e.length)return"";const t=(e=(0,o.g6)(e)).match(r.Z);return t&&e.startsWith(t[0])?t[0]:e.match(/./u)[0].toUpperCase()})).join("")}},8035:(e,t,n)=>{function r(e,t=30){return!e||e.length<=t?e:`${e.substr(0,t)}...`}n.d(t,{Z:()=>r})},862:(e,t,n)=>{n.d(t,{Hu:()=>s,_y:()=>i,p6:()=>c});var r=n(7361),o=n(1394),d=n(9118);let a,u;const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";async function i(e,t){for(l();!u.wasmReady;)await(0,d.wO)(2e3);const{result:n,width:r,height:o}=await function(e,t){return new Promise((n=>{u.requests||(u.requests=new Map),u.requests.set(e,n),u.postMessage({id:e,blob:t})}))}(e,t);if(r&&o)return function({result:e,width:t,height:n}){return a||(a=document.createElement("canvas")),new Promise((r=>{const o=new ImageData(e,t,n);a.width=t,a.height=n,a.getContext("2d").putImageData(o,0,0),a.toBlob((e=>{r(null!=e?e:void 0)}),"image/png",1)}))}({result:n,width:r,height:o})}async function c(e,t){if((0,r.on)()||"data:image/webp"!==t.substr(0,15))return t;l();const n=await i(e,(0,o.A9)(t));if(!n)throw new Error(`Can't convert webp to png. Url: ${t}`);return(0,o.YJ)(n)}function l(){u||(u=new Worker(new URL(n.p+n.u(536),n.b)),u.wasmReady=!1,u.onmessage=f)}function f(e){const{id:t}=e.data;switch(e.data.type){case"initialized":u.wasmReady=!0;break;case"result":if(u.requests.has(t)){const n=u.requests.get(t);u.requests.delete(t),n(e.data)}}}},1622:(e,t,n)=>{n.d(t,{I:()=>l,p:()=>f});var r=n(3716),o=n(5116),d=n(4688);const a=["t.me","telegram.me"].map((e=>`//${e}/_websync_?`)),u=`${r.Ji} Z`,s="tgme_sync",i=()=>Math.floor(Number(new Date)/1e3);let c;const l=e=>{const t=i(),{canRedirect:n,ts:r}=JSON.parse(localStorage.getItem(s)||"{}");return n!==e||r+86400<=t?Promise.all(a.map((t=>new Promise(((n,r)=>{const o=document.createElement("script"),d=()=>!!document.body.removeChild(o);o.src=t+new URLSearchParams({authed:Number(e).toString(),version:u}),document.body.appendChild(o),o.onload=()=>{(e=>{const t=i();localStorage.setItem(s,JSON.stringify({canRedirect:e,ts:t}))})(e),d(),c&&(clearTimeout(c),c=void 0),f(),n()},o.onerror=()=>{d(),r()}}))))):Promise.resolve()};function f(){if(r.eM)return;if(void 0!==c)return;const e=i(),{ts:t}=JSON.parse(localStorage.getItem(s)||"{}"),n=86400-(e-t);c=setTimeout((()=>{const{authState:e}=(0,o.Rd)(),t="authorizationStateReady"===e||(0,d.ti)(!0);l(t)}),Math.max(0,1e3*n))}},3858:(e,t,n)=>{n.d(t,{z:()=>l,Z:()=>h});var r=n(9118),o=n(3716),d=n(7361);const a=d.wB&&f(),u=window.innerHeight;let s=l(),i=!1;const c=(0,r.P2)((()=>{s=l(),!i&&((s.width<=o.l3||s.width<=o.u_&&s.height<=o.rO)!==d.wB||d.wB&&a!==f())&&window.location.reload()}),250,!0);function l(){let e;e=d.cj?window.visualViewport.height+window.visualViewport.pageTop:window.innerHeight;const t=.01*e;return document.documentElement.style.setProperty("--vh",`${t}px`),{width:window.innerWidth,height:window.innerHeight}}function f(){return d.cj?window.matchMedia("(orientation: landscape)").matches:window.matchMedia("screen and (min-device-aspect-ratio: 1/1) and (orientation: landscape)").matches}window.addEventListener("orientationchange",c),d.cj?window.visualViewport.addEventListener("resize",c):window.addEventListener("resize",c);const h={get:()=>s,getIsKeyboardVisible:()=>u>s.height,disableRefresh:function(){i=!0},enableRefresh:function(){i=!1}}},5359:(e,t,n)=>{e.exports=n.p+"app-inactive.bc7953c2dfebcabce2c4..png"},2162:(e,t,n)=>{e.exports=n.p+"monkey.a3d5fcdc50b18dc55695..svg"},4128:(e,t,n)=>{e.exports=n.p+"telegram-logo.1b2bb5b107f046ea9325..svg"}},u={};function s(e){var t=u[e];if(void 0!==t)return t.exports;var n=u[e]={exports:{}};return a[e].call(n.exports,n,n.exports,s),n.exports}s.m=a,s.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return s.d(t,{a:t}),t},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,s.t=function(n,r){if(1&r&&(n=this(n)),8&r)return n;if("object"==typeof n&&n){if(4&r&&n.__esModule)return n;if(16&r&&"function"==typeof n.then)return n}var o=Object.create(null);s.r(o);var d={};e=e||[null,t({}),t([]),t(t)];for(var a=2&r&&n;"object"==typeof a&&!~e.indexOf(a);a=t(a))Object.getOwnPropertyNames(a).forEach((e=>d[e]=()=>n[e]));return d.default=()=>n,s.d(o,d),o},s.d=(e,t)=>{for(var n in t)s.o(t,n)&&!s.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},s.f={},s.e=e=>Promise.all(Object.keys(s.f).reduce(((t,n)=>(s.f[n](e,t),t)),[])),s.u=e=>e+"."+{99:"f03a947e6e336feffec8",133:"f7b0e36077dea7bb93a4",161:"286d0207d962142ad548",354:"e734f2f3723608c533ad",435:"15d3c1acaf8d2000388e",472:"21e5264f606f2b525030",501:"72ce4b6e27f459e194cd",524:"2a153f6444bb77830f1f",532:"381cf48a5d9ac614b987",536:"55dc7dd4ab42a2c9f037",701:"b9c40fbb5ff59255dc0a",739:"a56999dcc623ac81b6df",745:"9316c5c2b711c39a20a5",884:"48fa8564ff8f90ff2a28",915:"13af1c4ab9a00d84ac23",927:"3f0ca4e5000b59400d2f",941:"aad13fbc78f9d63ec948",952:"ca0651df42c323c2fa24",993:"f0aad9f6787f211b4e51"}[e]+".js",s.miniCssF=e=>e+"."+{133:"f7b0e36077dea7bb93a4",435:"15d3c1acaf8d2000388e",472:"21e5264f606f2b525030",532:"381cf48a5d9ac614b987",701:"b9c40fbb5ff59255dc0a",952:"ca0651df42c323c2fa24"}[e]+".css",s.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n={},r="telegram-t:",s.l=(e,t,o,d)=>{if(n[e])n[e].push(t);else{var a,u;if(void 0!==o)for(var i=document.getElementsByTagName("script"),c=0;c{a.onerror=a.onload=null,clearTimeout(h);var o=n[e];if(delete n[e],a.parentNode&&a.parentNode.removeChild(a),o&&o.forEach((e=>e(r))),t)return t(r)},h=setTimeout(f.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=f.bind(null,a.onerror),a.onload=f.bind(null,a.onload),u&&document.head.appendChild(a)}},s.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;s.g.importScripts&&(e=s.g.location+"");var t=s.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");n.length&&(e=n[n.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),s.p=e})(),o=e=>new Promise(((t,n)=>{var r=s.miniCssF(e),o=s.p+r;if(((e,t)=>{for(var n=document.getElementsByTagName("link"),r=0;r{var o=document.createElement("link");o.rel="stylesheet",o.type="text/css",o.onerror=o.onload=d=>{if(o.onerror=o.onload=null,"load"===d.type)n();else{var a=d&&("load"===d.type?"missing":d.type),u=d&&d.target&&d.target.href||t,s=new Error("Loading CSS chunk "+e+" failed.\n("+u+")");s.code="CSS_CHUNK_LOAD_FAILED",s.type=a,s.request=u,o.parentNode.removeChild(o),r(s)}},o.href=t,document.head.appendChild(o)})(e,o,t,n)})),d={179:0},s.f.miniCss=(e,t)=>{d[e]?t.push(d[e]):0!==d[e]&&{133:1,435:1,472:1,532:1,701:1,952:1}[e]&&t.push(d[e]=o(e).then((()=>{d[e]=0}),(t=>{throw delete d[e],t})))},(()=>{s.b=document.baseURI||self.location.href;var e={179:0};s.f.j=(t,n)=>{var r=s.o(e,t)?e[t]:void 0;if(0!==r)if(r)n.push(r[2]);else{var o=new Promise(((n,o)=>r=e[t]=[n,o]));n.push(r[2]=o);var d=s.p+s.u(t),a=new Error;s.l(d,(n=>{if(s.o(e,t)&&(0!==(r=e[t])&&(e[t]=void 0),r)){var o=n&&("load"===n.type?"missing":n.type),d=n&&n.target&&n.target.src;a.message="Loading chunk "+t+" failed.\n("+o+": "+d+")",a.name="ChunkLoadError",a.type=o,a.request=d,r[1](a)}}),"chunk-"+t,t)}};var t=(t,n)=>{var r,o,[d,a,u]=n,i=0;if(d.some((t=>0!==e[t]))){for(r in a)s.o(a,r)&&(s.m[r]=a[r]);u&&u(s)}for(t&&t(n);i{s(3592);var e=s(3716),t=s(5116),n=s(7361),r=s(8406);function o(n){const o=n.data;if(e.eM&&console.log("[SW] Message from worker",o),!o.type)return;const d=(0,t.uC)();switch(o.type){case"focusMessage":d.focusMessage&&d.focusMessage(o.payload);break;case"playNotificationSound":(0,r.Nz)(o.payload.id)}}function d(){navigator.serviceWorker.removeEventListener("message",o),navigator.serviceWorker.addEventListener("message",o),(0,r.KC)()}n.Mc&&(window.addEventListener("load",(async()=>{try{await navigator.serviceWorker.register(new URL(s.p+s.u(524),s.b)),e.eM&&console.log("[SW] ServiceWorker registered"),await navigator.serviceWorker.ready,navigator.serviceWorker.controller?(e.eM&&console.log("[SW] ServiceWorker ready"),d()):(e.eM&&console.error("[SW] ServiceWorker not available"),n.cj||n.wZ||(0,t.uC)().showDialog({data:{message:"SERVICE_WORKER_DISABLED",hasErrorKey:!0}}))}catch(t){e.eM&&console.error("[SW] ServiceWorker registration failed: ",t)}})),window.addEventListener("focus",(async()=>{await navigator.serviceWorker.ready,d()})));var a=s(2916);const u={isLeftColumnShown:!0,isChatInfoShown:!1,newChatMembersProgress:s(1713).WB.Closed,uiReadyState:0,serverTimeOffset:0,authRememberMe:!0,countryList:{phoneCodes:[],general:[]},blocked:{ids:[],totalCount:0},users:{byId:{}},chats:{listIds:{},isFullyLoaded:{},orderedPinnedIds:{},totalCount:{},byId:{}},messages:{byChatId:{},messageLists:[]},groupCalls:{byId:{}},scheduledMessages:{byChatId:{}},chatFolders:{byId:{},activeChatFolder:0},fileUploads:{byMessageLocalId:{}},recentEmojis:["grinning","kissing_heart","christmas_tree","brain","trophy"],stickers:{setsById:{},added:{},recent:{stickers:[]},favorite:{stickers:[]},greeting:{stickers:[]},featured:{setIds:[]},search:{},forEmoji:{}},emojiKeywords:{},gifs:{saved:{},search:{}},inlineBots:{isLoading:!1,byUsername:{}},globalSearch:{},userSearch:{},localTextSearch:{byChatThreadKey:{}},localMediaSearch:{byChatId:{}},management:{byChatId:{}},topPeers:{},topInlineBots:{},mediaViewer:{},audioPlayer:{volume:e.Qx,playbackRate:e.mw,isMuted:!1},forwardMessages:{},pollResults:{},payment:{},notifications:[],dialogs:[],activeSessions:[],settings:{byKey:{theme:"light",shouldUseSystemTheme:!0,messageTextSize:n.cj?e.b6:n.jm?e.AR:e.xS,animationLevel:e.CX,messageSendKeyCombo:"enter",canAutoLoadPhotoFromContacts:!0,canAutoLoadPhotoInPrivateChats:!0,canAutoLoadPhotoInGroups:!0,canAutoLoadPhotoInChannels:!0,canAutoLoadVideoFromContacts:!0,canAutoLoadVideoInPrivateChats:!0,canAutoLoadVideoInGroups:!0,canAutoLoadVideoInChannels:!0,canAutoLoadFileFromContacts:!1,canAutoLoadFileInPrivateChats:!1,canAutoLoadFileInGroups:!1,canAutoLoadFileInChannels:!1,autoLoadFileMaxSizeMb:10,hasWebNotifications:!0,hasPushNotifications:!0,notificationSoundVolume:5,canAutoPlayGifs:!0,canAutoPlayVideos:!0,shouldSuggestStickers:!0,shouldLoopStickers:!0,language:"en",timeFormat:"24h",wasTimeFormatSetManually:!1},themes:{light:{isBlurred:!0,patternColor:e.g},dark:{isBlurred:!0,patternColor:e.Vv}},privacy:{},notifyExceptions:{}},twoFaSettings:{},shouldShowContextMenuHint:!0,activeDownloads:{byChatId:{}},serviceNotifications:[]};var i=s(6137),c=s(9118),l=s(8674),f=s(782),h=s(1638),m=s(4688),p=s(5780),g=s(6590),y=s(2858);const v=(0,c.P2)((()=>(0,c.Q8)(E)),5e3,!1);let b,w=!1,I=!1;function C(){w=!0,b=(0,c.Gq)(E,!0),window.addEventListener("blur",E),(0,t.ll)(v)}function S(){w=!1,(0,t.Iq)(v),window.removeEventListener("blur",E),b&&b()}function E(){if(!w||I)return;const n=(0,t.Rd)();if(n.isLoggingOut)return;const r={...u,...(0,f.ei)(n,["authState","authPhoneNumber","authRememberMe","authNearestCountry","currentUserId","contactList","topPeers","topInlineBots","recentEmojis","push","shouldShowContextMenuHint","leftColumnWidth","serviceNotifications"]),audioPlayer:{volume:n.audioPlayer.volume,playbackRate:n.audioPlayer.playbackRate,isMuted:n.audioPlayer.isMuted},isChatInfoShown:P(n),users:M(n),chats:A(n),messages:k(n),globalSearch:{recentlyFoundChatIds:n.globalSearch.recentlyFoundChatIds},settings:T(n),chatFolders:N(n),groupCalls:L(n)},o=JSON.stringify(r);localStorage.setItem(e.Uh,o)}function P(t){return window.innerWidth>e._m&&t.isChatInfoShown}function M(t){const{users:{byId:n,selectedId:r}}=t,o=[...(t.chats.listIds.active||[]).slice(0,e.gJ).filter(y.YC),...Object.keys(n)].slice(0,e.lO);return{byId:(0,f.ei)(n,o),selectedId:window.innerWidth>e._m?r:void 0}}function A(t){const n=[...(t.chats.listIds.active||[]).slice(0,e.gJ)],{chatId:r}=(0,h.Bt)(t)||{};return{...t.chats,byId:(0,f.ei)(t.chats.byId,r?[...n,r]:n),listIds:{active:n},isFullyLoaded:{},orderedPinnedIds:{active:t.chats.orderedPinnedIds.active}}}function k(t){const n={},{chatId:r}=(0,h.Bt)(t)||{};return[...(t.chats.listIds.active||[]).slice(0,e.gJ),...r?[r]:[]].forEach((e=>{const r=t.messages.byChatId[e];if(!r)return;const o=r.threadsById[i._f];o&&o.viewportIds&&(n[e]={byId:(0,f.ei)(r.byId,o.viewportIds),threadsById:{[i._f]:o}})})),{byChatId:n,messageLists:[]}}function T(e){const{byKey:t,themes:n}=e.settings;return{byKey:t,themes:n,privacy:{},notifyExceptions:{}}}function N(e){return{...e.chatFolders,activeChatFolder:0}}function L(e){return{...e.groupCalls,byId:{},activeGroupCallId:void 0,isGroupCallPanelHidden:void 0,isFallbackConfirmOpen:void 0}}document.addEventListener(l._L,(()=>{I=!0})),document.addEventListener(l.OV,(()=>{I=!1})),e.sd||((0,t.Q6)("saveSession",(()=>{w||C()})),(0,t.Q6)("reset",(()=>{localStorage.removeItem(e.Uh),w&&S()}))),(0,t.Q6)("init",(()=>{const t=(0,f.Xh)(u);return function(t){if(!e.sd)return(0,m.ti)(!0)?(C(),function(t){e.eM&&console.time("global-state-cache-read");const r=localStorage.getItem(e.Uh),o=r?JSON.parse(r):void 0;e.eM&&console.timeEnd("global-state-cache-read"),o&&function(t,n){if("shouldAutoDownloadMediaFromContacts"in t.settings.byKey){const{shouldAutoDownloadMediaFromContacts:e,shouldAutoDownloadMediaInPrivateChats:n,shouldAutoDownloadMediaInGroups:r,shouldAutoDownloadMediaInChannels:o,shouldAutoPlayVideos:d,shouldAutoPlayGifs:a,...u}=t.settings.byKey;t.settings.byKey={...u,canAutoLoadPhotoFromContacts:e,canAutoLoadVideoFromContacts:e,canAutoLoadPhotoInPrivateChats:n,canAutoLoadVideoInPrivateChats:n,canAutoLoadPhotoInGroups:r,canAutoLoadVideoInGroups:r,canAutoLoadPhotoInChannels:o,canAutoLoadVideoInChannels:o,canAutoPlayVideos:d,canAutoPlayGifs:a}}t.settings.byKey={...n.settings.byKey,...t.settings.byKey},t.settings.themes={...n.settings.themes,...t.settings.themes},t.chatFolders={...n.chatFolders,...t.chatFolders},t.stickers.greeting||(t.stickers.greeting=n.stickers.greeting),t.activeDownloads||(t.activeDownloads={byChatId:{}}),t.serviceNotifications||(t.serviceNotifications=[]),void 0===t.audioPlayer.volume&&(t.audioPlayer.volume=e.Qx),void 0===t.audioPlayer.playbackRate&&(t.audioPlayer.playbackRate=e.mw),void 0===t.groupCalls&&(t.groupCalls=n.groupCalls)}(o,t);const d={...t,...o},a=n.wB?void 0:(0,p.V)(g.Oy);return{...d,messages:{...d.messages,messageLists:a?[a]:[]}}}(t)):void S()}(t)||t}));var R=s(4050),D=s(3858);const Z="tt-active-tab",O=String(Date.now()+Math.random());let x;localStorage.setItem(Z,O);const _=window.setInterval((()=>{x&&localStorage.getItem(Z)!==O&&(x(),clearInterval(_))}),2e3);var F=s(706),B=(s(7895),s(3781),s(1363),s(9667),s(4907),s(8332)),$=s(1212),U=s(1394);const j=["400 1em Roboto","500 1em Roboto"];function W(){if("fonts"in document)return Promise.all(j.map((e=>document.fonts.load(e))))}var G=s(647),V=s(9203),H=s(6752),z=s(4128),Q=s(2162);function K(){const{listIds:e,byId:n}=(0,t.Rd)().chats;if(e.active)return Promise.all(e.active.slice(0,10).map((e=>{const t=n[e];if(!t)return;const r=(0,B.RT)(t);return r?G.he(r,i.IU.BlobUrl):void 0})))}const J={main:()=>Promise.all([(0,V.$y)(V.gl.Main,"Main").then(W),K()]),authPhoneNumber:()=>Promise.all([W(),(0,U.pt)(z)]),authCode:()=>(0,U.pt)(Q),authPassword:()=>(0,U.pt)(Q),authQrCode:W},q=(0,t.c$)((e=>{const t=(0,h.Pu)(e),{background:n,backgroundColor:r}=e.settings.themes[t]||{};return{shouldSkipHistoryAnimations:e.shouldSkipHistoryAnimations,uiReadyState:e.uiReadyState,hasCustomBackground:Boolean(n),hasCustomBackgroundColor:Boolean(r),isRightColumnShown:(0,h.Jf)(e),leftColumnWidth:e.leftColumnWidth}}),((e,t)=>(0,f.ei)(t,["setIsUiReady"])))((({page:e,children:t,hasCustomBackground:n,hasCustomBackgroundColor:r,isRightColumnShown:o,shouldSkipHistoryAnimations:d,leftColumnWidth:a,setIsUiReady:u})=>{const[s,i]=(0,F.Z)(),{shouldRender:l,transitionClassNames:f}=(0,$.Z)(!s,void 0,!0);return(0,R.d4)((()=>{let t;return Promise.race([(0,c.wO)(700),(async()=>{try{await J[e]()}catch(e){}})()]).then((()=>{i(),u({uiReadyState:1}),t=window.setTimeout((()=>{u({uiReadyState:2})}),1e3)})),()=>{t&&(clearTimeout(t),t=void 0),u({uiReadyState:0})}}),[]),R.ZP.createElement("div",{id:"UiLoader"},t,l&&!d&&R.ZP.createElement("div",{className:(0,H.Z)("mask",f)},"main"===e?R.ZP.createElement(R.ZP.Fragment,null,R.ZP.createElement("div",{className:"left",style:a?`width: ${a}px`:void 0}),R.ZP.createElement("div",{className:(0,H.Z)("middle",n&&"custom-bg-image",r&&"custom-bg-color",o&&"with-right-column")}),o&&R.ZP.createElement("div",{className:"right"})):R.ZP.createElement("div",{className:"blank"})))}));var Y=s(6272),X=s(663),ee=s(9107);const te=(e,t)=>{const[n,r]=(0,R.eJ)();return e&&X.Pn(e,t).then(r),n};function ne(){let e=navigator.language;return e&&"pt-br"!==e&&(e=e.substr(0,2)),e}var re=s(231),oe=s(4605),de=s(7687),ae=s(4288),ue=s(5765),se=s(2340),ie=s(4284),ce=s(9290),le=s(3106),fe=s(8964),he=s(9204);const me=200+e.fK,pe=(0,R.X$)((0,t.c$)((e=>{const{countryList:{phoneCodes:t}}=e;return{phoneCodeList:t}}))((({id:e,value:t,isLoading:n,onChange:r,phoneCodeList:o})=>{const d=(0,ee.Z)(),a=(0,R.sO)(null),[u,s]=(0,R.eJ)(),[i,c]=(0,R.eJ)([]),l=(0,R.I4)((e=>{s(e),c(function(e,t=""){return t.length?e.filter((e=>(0,ue.Z)(e.defaultName,t)||e.name&&(0,ue.Z)(e.name,t))):e}(o,e))}),[o]);(0,ce.Z)((([e])=>{0===(null==e?void 0:e.length)&&o.length>0&&l(u)}),[o,l]);const f=(0,R.I4)((e=>{r(e),setTimeout((()=>l(void 0)),me)}),[r,l]),h=(0,R.I4)((e=>{l(e.currentTarget.value)}),[l]),m=(0,R.I4)((e=>{if(8!==e.keyCode)return;const n=e.currentTarget;t&&void 0===u&&(n.value=""),l(n.value)}),[u,l,t]);return R.ZP.createElement(le.Z,{className:"CountryCodeInput",trigger:({onTrigger:r,isOpen:o})=>{const s=()=>{if(o)return;setTimeout((()=>{a.current.select()}),50),r();const e=document.getElementById("auth-phone-number-form");e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},i=null!=u?u:(null==t?void 0:t.name)||(null==t?void 0:t.defaultName)||"";return R.ZP.createElement("div",{className:(0,H.Z)("input-group",t&&"touched")},R.ZP.createElement("input",{ref:a,className:(0,H.Z)("form-control",o&&"focus"),type:"text",id:e,value:i,autoComplete:"off",onClick:s,onFocus:s,onInput:e=>{h(e),s()},onKeyDown:m}),R.ZP.createElement("label",null,d("Login.SelectCountry.Title")),n?R.ZP.createElement(he.Z,{color:"black"}):R.ZP.createElement("i",{onClick:s,className:(0,H.Z)("css-icon-down",o&&"open")}))}},i.map((e=>R.ZP.createElement(fe.Z,{key:e.iso2,className:t&&e.iso2===t.iso2?"selected":"",onClick:()=>f(e)},R.ZP.createElement("span",{className:"country-flag"},(0,se.Z)((0,ie.Wg)(e.iso2),["hq_emoji"])),R.ZP.createElement("span",{className:"country-name"},e.name||e.defaultName),R.ZP.createElement("span",{className:"country-code"},e.countryCode)))),!i.length&&R.ZP.createElement(fe.Z,{key:"no-results",className:"no-results",disabled:!0},R.ZP.createElement("span",null,d("lng_country_none"))))})));let ge=!1;const ye=(0,R.X$)((0,t.c$)((e=>{const{settings:{byKey:{language:t}},countryList:{phoneCodes:n}}=e;return{...(0,f.ei)(e,["connectionState","authState","authPhoneNumber","authIsLoading","authIsLoadingQrCode","authError","authRememberMe","authNearestCountry"]),language:t,phoneCodeList:n}}),((e,t)=>(0,f.ei)(t,["setAuthPhoneNumber","setAuthRememberMe","clearAuthError","loadNearestCountry","loadCountryList","goToAuthQrCode","setSettingOption"])))((({connectionState:e,authState:t,authPhoneNumber:r,authIsLoading:o,authIsLoadingQrCode:d,authError:a,authRememberMe:u,authNearestCountry:s,phoneCodeList:i,language:c,setAuthPhoneNumber:l,setAuthRememberMe:f,loadNearestCountry:h,loadCountryList:m,clearAuthError:p,goToAuthQrCode:g,setSettingOption:y})=>{const v=(0,ee.Z)(),b=(0,R.sO)(null),w=ne(),I=te(w,"ContinueOnThisLanguage"),[C,S]=(0,R.eJ)(),[E,P]=(0,R.eJ)(),[M,A]=(0,R.eJ)(!1),[k,T]=(0,R.eJ)(),[N,L,D]=(0,F.Z)(),Z=C?`+${C.countryCode} ${E||""}`:E,O=Z&&Z.replace(/[^\d]+/g,"").length>=7;(0,R.d4)((()=>{n.$b||b.current.focus()}),[C]),(0,R.d4)((()=>{"connectionStateReady"!==e||s||h()}),[e,s,h]),(0,R.d4)((()=>{"connectionStateReady"===e&&m({langCode:c})}),[e,c,m]),(0,R.d4)((()=>{s&&i&&!C&&!M&&S((0,Y.U9)(i,s)[0])}),[C,s,M,i]);const x=(0,R.I4)((e=>{e.length||P("");const t=i&&(0,Y.g3)(i,e),n=!C||t&&t.iso2!==C.iso2||!t&&e.length?t:C;(!C||!n||n&&n.iso2!==C.iso2)&&S(n),P((0,Y.un)(e,n))}),[i,C]),_=(0,R.I4)((()=>{L(),(0,X.m0)(w,(()=>{D(),y({language:w})}))}),[L,y,w,D]);(0,R.d4)((()=>{void 0===E&&r&&x(r)}),[r,E,x]),(0,R.bt)((()=>{b.current&&k&&b.current.setSelectionRange(...k)}),[k]);const B=(0,R.sO)(!1),$=(0,R.I4)((()=>{B.current=!0,requestAnimationFrame((()=>{B.current=!1}))}),[]),j=(0,R.I4)((e=>{S(e),P("")}),[]),G=(0,R.I4)((e=>{a&&p(),ge||(ge=!0,W(),(0,U.pt)(Q));const{value:t,selectionStart:r,selectionEnd:o}=e.target;T(r&&o&&o1&&!B.current;x(d?`${C.countryCode} ${t}`:t)}),[a,p,C,Z,x]),V=(0,R.I4)((e=>{f(e.target.checked)}),[f]),H="authorizationStateWaitPhoneNumber"===t;return R.ZP.createElement("div",{id:"auth-phone-number-form",className:"custom-scroll"},R.ZP.createElement("div",{className:"auth-form"},R.ZP.createElement("div",{id:"logo"}),R.ZP.createElement("h2",null,"Telegram"),R.ZP.createElement("p",{className:"note"},v("StartText")),R.ZP.createElement("form",{action:"",onSubmit:function(e){e.preventDefault(),o||O&&l({phoneNumber:Z})}},R.ZP.createElement(pe,{id:"sign-in-phone-code",value:C,isLoading:!s&&!C,onChange:j}),R.ZP.createElement(de.Z,{ref:b,id:"sign-in-phone-number",label:v("Login.PhonePlaceholder"),value:Z,error:a&&v(a),inputMode:"tel",onChange:G,onPaste:n.s$?$:void 0}),R.ZP.createElement(oe.Z,{id:"sign-in-keep-session",label:"Keep me signed in",checked:Boolean(u),onChange:V}),O&&(H?R.ZP.createElement(re.Z,{type:"submit",ripple:!0,isLoading:o},v("Login.Next")):R.ZP.createElement(ae.Z,null)),H&&R.ZP.createElement(re.Z,{isText:!0,ripple:!0,isLoading:d,onClick:g},v("Login.QR.Login")),w&&w!==c&&I&&R.ZP.createElement(re.Z,{isText:!0,isLoading:N,onClick:_},I))))})));var ve=s(8778);const be=(0,R.X$)((()=>{const e=(0,ve.Z)(V.gl.Auth,"AuthCode");return e?R.ZP.createElement(e,null):R.ZP.createElement(ae.Z,null)})),we=(0,R.X$)((()=>{const e=(0,ve.Z)(V.gl.Auth,"AuthPassword");return e?R.ZP.createElement(e,null):R.ZP.createElement(ae.Z,null)})),Ie=(0,R.X$)((()=>{const e=(0,ve.Z)(V.gl.Auth,"AuthRegister");return e?R.ZP.createElement(e,null):R.ZP.createElement(ae.Z,null)}));let Ce=null;class Se{}Se.render=function(e,t){Ce(e,t)},self.QrCreator=Se,function(e){function t(t,n,r,o){var d={},a=e(r,n);a.u(t),a.J(),o=o||0;var u=a.h(),s=a.h()+2*o;return d.text=t,d.level=n,d.version=r,d.O=s,d.a=function(e,t){return t-=o,!(0>(e-=o)||e>=u||0>t||t>=u)&&a.a(e,t)},d}function n(e,t,n,r,o,d,a,u,s,i){function c(t,n,r,o,a,u,s){t?(e.lineTo(n+u,r+s),e.arcTo(n,r,o,a,d)):e.lineTo(n,r)}a?e.moveTo(t+d,n):e.moveTo(t,n),c(u,r,n,r,o,-d,0),c(s,r,o,t,o,0,-d),c(i,t,o,t,n,d,0),c(a,t,n,r,n,0,d)}function r(e,t,n,r,o,d,a,u,s,i){function c(t,n,r,o){e.moveTo(t+r,n),e.lineTo(t,n),e.lineTo(t,n+o),e.arcTo(t,n,t+r,n,d)}a&&c(t,n,d,d),u&&c(r,n,-d,d),s&&c(r,o,-d,-d),i&&c(t,o,d,-d)}function o(e,o){e:{var d=o.text,a=o.v,u=o.N,s=o.K,i=o.P;for(u=Math.max(1,u||1),s=Math.min(40,s||40);u<=s;u+=1)try{var c=t(d,a,u,i);break e}catch(e){}c=void 0}if(!c)return null;for(d=e.getContext("2d"),o.background&&(d.fillStyle=o.background,d.fillRect(o.left,o.top,o.size,o.size)),a=c.O,s=o.size/a,d.beginPath(),i=0;iMath.round(e*t.size))),"linear-gradient"===r)var d=e.createLinearGradient.apply(e,n);else{if("radial-gradient"!==r)throw Error("Unsupported fill");d=e.createRadialGradient.apply(e,n)}o.forEach((([e,t])=>{d.addColorStop(e,t)})),e.fillStyle=d}}(d,o),d.fill(),e}var d={minVersion:1,maxVersion:40,ecLevel:"L",left:0,top:0,size:200,fill:"#000",background:null,text:"no text",radius:.5,quiet:0};Ce=function(e,t){var n={};Object.assign(n,d,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),o(t,n)):((e=document.createElement("canvas")).width=n.size,e.height=n.size,n=o(e,n),t.appendChild(n))}}(function(){function e(o,a){function u(e,t){for(var n=-1;7>=n;n+=1)if(!(-1>=e+n||l<=e+n))for(var r=-1;7>=r;r+=1)-1>=t+r||l<=t+r||(c[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 s(e,n){for(var a=l=4*o+17,s=Array(a),m=0;m=y;y+=1)for(var v=-2;2>=v;v+=1)c[p+y][g+v]=-2==y||2==y||-2==v||2==v||0==y&&0==v}for(a=8;as;s+=1)m=!e&&1==(a>>s&1),c[6>s?s:8>s?s+1:l-15+s][8]=m,c[8][8>s?l-s-1:9>s?15-s:14-s]=m;if(c[l-8][8]=!e,7<=o){for(a=r.A(o),s=0;18>s;s+=1)m=!e&&1==(a>>s&1),c[Math.floor(s/3)][s%3+l-8-3]=m;for(s=0;18>s;s+=1)m=!e&&1==(a>>s&1),c[s%3+l-8-3][Math.floor(s/3)]=m}if(null==f){for(e=d.I(o,i),a=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}(),s=0;s8*m)throw Error("code length overflow. ("+a.f()+">"+8*m+")");for(a.f()+4<=8*m&&a.put(0,4);0!=a.f()%8;)a.m(!1);for(;!(a.f()>=8*m||(a.put(236,8),a.f()>=8*m));)a.put(17,8);var b=0;for(m=s=0,p=Array(e.length),g=Array(e.length),y=0;yy;y+=1)null==c[s][g-y]&&(v=!1,p>>m&1)),n(s,g-y)&&(v=!v),c[s][g-y]=v,-1==--m&&(p+=1,m=7));if(0>(s+=a)||l<=s){s-=a,a=-a;break}}}var i=n[a],c=null,l=0,f=null,h=[],m={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||l<=e||0>t||l<=t)throw Error(e+","+t);return c[e][t]},h:function(){return l},J:function(){for(var e=0,t=0,n=0;8>n;n+=1){s(!0,n);var o=r.D(m);(0==n||e>o)&&(e=o,t=n)}s(!1,t)}};return m}function t(e,n){if(void 0===e.length)throw Error(e.length+"/"+n);var r=function(){for(var t=0;td.b()-e.b())return d;for(var n=o.g(d.c(0))-o.g(e.c(0)),r=Array(d.b()),a=0;ar?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=u;u+=1)if(!(0>r+u||t<=r+u))for(var s=-1;1>=s;s+=1)0>o+s||t<=o+s||(0!=u||0!=s)&&a==e.a(r+u,o+s)&&(d+=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]}}}(),d=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 o=0;o{const{connectionState:t,authState:n,authQrCode:r,settings:{byKey:{language:o}}}=e;return{connectionState:t,authState:n,authQrCode:r,language:o}}),((e,t)=>(0,f.ei)(t,["returnToAuthPhoneNumber","setSettingOption"])))((({connectionState:e,authState:t,authQrCode:n,language:r,returnToAuthPhoneNumber:o,setSettingOption:d})=>{const a=ne(),u=(0,ee.Z)(),s=(0,R.sO)(null),i=te(a,"ContinueOnThisLanguage"),[c,l,f]=(0,F.Z)();(0,R.d4)((()=>{if(!n||"connectionStateReady"!==e)return;const t=s.current;t.innerHTML="",t.classList.remove("pre-animate"),Ee.render({text:`tg://login?token=${n.token}`,radius:.5,ecLevel:"M",fill:"#4E96D4",size:280},t)}),[e,n]);const h=(0,R.I4)((()=>{l(),(0,X.m0)(a,(()=>{f(),d({language:a})}))}),[l,d,a,f]),m="authorizationStateWaitQrCode"===t;return R.ZP.createElement("div",{id:"auth-qr-form",className:"custom-scroll"},R.ZP.createElement("div",{className:"auth-form qr"},n?R.ZP.createElement("div",{key:"qr-container",className:"qr-container pre-animate",ref:s}):R.ZP.createElement("div",{key:"qr-loading",className:"qr-loading"},R.ZP.createElement(ae.Z,null)),R.ZP.createElement("h3",null,u("Login.QR.Title")),R.ZP.createElement("ol",null,R.ZP.createElement("li",null,R.ZP.createElement("span",null,u("Login.QR.Help1"))),R.ZP.createElement("li",null,R.ZP.createElement("span",null,(0,se.Z)(u("Login.QR.Help2"),["simple_markdown"]))),R.ZP.createElement("li",null,R.ZP.createElement("span",null,u("Login.QR.Help3")))),m&&R.ZP.createElement(re.Z,{isText:!0,onClick:o},u("Login.QR.Cancel")),a&&a!==r&&i&&R.ZP.createElement(re.Z,{isText:!0,isLoading:c,onClick:h},i)))}))),Me=(0,R.X$)((0,t.c$)((e=>(0,f.ei)(e,["authState"])),((e,t)=>(0,f.ei)(t,["reset","initApi","returnToAuthPhoneNumber","goToAuthQrCode"])))((({authState:e,reset:t,initApi:r,returnToAuthPhoneNumber:o,goToAuthQrCode:d})=>{(0,R.d4)((()=>{t(),r()}),[t,r]);const a="iOS"===n.Lt||"Android"===n.Lt;switch((0,g.ZP)(!a&&"authorizationStateWaitPhoneNumber"===e||a&&"authorizationStateWaitQrCode"===e,(()=>{a?o():d()})),(0,R.d4)((()=>(D.Z.disableRefresh(),()=>{D.Z.enableRefresh()})),[]),e){case"authorizationStateWaitCode":return R.ZP.createElement(q,{page:"authCode",key:"authCode"},R.ZP.createElement(be,null));case"authorizationStateWaitPassword":return R.ZP.createElement(q,{page:"authPassword",key:"authPassword"},R.ZP.createElement(we,null));case"authorizationStateWaitRegistration":return R.ZP.createElement(Ie,null);case"authorizationStateWaitPhoneNumber":return R.ZP.createElement(q,{page:"authPhoneNumber",key:"authPhoneNumber"},R.ZP.createElement(ye,null));case"authorizationStateWaitQrCode":return R.ZP.createElement(q,{page:"authQrCode",key:"authQrCode"},R.ZP.createElement(Pe,null));default:return a?R.ZP.createElement(q,{page:"authPhoneNumber",key:"authPhoneNumber"},R.ZP.createElement(ye,null)):R.ZP.createElement(q,{page:"authQrCode",key:"authQrCode"},R.ZP.createElement(Pe,null))}}))),Ae=(0,R.X$)((()=>{const e=(0,ve.Z)(V.gl.Main,"Main");return e?R.ZP.createElement(e,null):void 0}));var ke=s(5359);const Te=()=>R.ZP.createElement("div",{id:"AppInactive"},R.ZP.createElement("div",{className:"content"},R.ZP.createElement("img",{src:ke,alt:""}),R.ZP.createElement("h3",{className:"title"},"Such error, many tabs"),R.ZP.createElement("div",{className:"description"},"Telegram supports only one active tab with the app.",R.ZP.createElement("br",null),"Please reload this page to continue using this tab or close it."),R.ZP.createElement("div",{className:"actions"},R.ZP.createElement(re.Z,{isText:!0,ripple:!0,onClick:()=>{window.location.reload()}},"Reload app"))));function Ne(){return t.ZP.createElement(q,{page:"main",key:"main"},t.ZP.createElement(Ae,null))}const Le=(0,t.c$)((e=>(0,f.ei)(e,["authState"])),((e,t)=>(0,f.ei)(t,["disconnect"])))((({authState:n,disconnect:r})=>{const[o,d]=(0,F.Z)(!1);if((0,R.d4)((()=>{(0,D.z)(),x=()=>{r(),document.title=`${e.Ti}${e.ou}`,d()}}),[r,d]),o)return t.ZP.createElement(Te,null);if(n)switch(n){case"authorizationStateWaitPhoneNumber":case"authorizationStateWaitCode":case"authorizationStateWaitPassword":case"authorizationStateWaitRegistration":case"authorizationStateWaitQrCode":return t.ZP.createElement(Me,null);case"authorizationStateClosed":case"authorizationStateClosing":case"authorizationStateLoggingOut":case"authorizationStateReady":return Ne()}return(0,m.ti)(!0)?Ne():t.ZP.createElement(Me,null)}));e.eM&&console.log(">>> INIT"),(0,t.uC)().init(),e.eM&&console.log(">>> START INITIAL RENDER"),a.Z.render(t.ZP.createElement(Le,null),document.getElementById("root")),e.eM&&console.log(">>> FINISH INITIAL RENDER"),document.addEventListener("dblclick",(()=>{console.warn("GLOBAL STATE",(0,t.Rd)())}))})()})(); +//# sourceMappingURL=main.c92a96f8daed1b315a1e.js.map \ No newline at end of file diff --git a/dist/main.c92a96f8daed1b315a1e.js.map b/dist/main.c92a96f8daed1b315a1e.js.map new file mode 100644 index 000000000..b19f1883d --- /dev/null +++ b/dist/main.c92a96f8daed1b315a1e.js.map @@ -0,0 +1 @@ +{"version":3,"file":"main.c92a96f8daed1b315a1e.js","mappings":"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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,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,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,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,GAAG,GAAG,GAAG,EAAE,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,KACzO,MADgP,CAA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","sources":["webpack://telegram-t/webpack/runtime/create fake namespace object","webpack://telegram-t/webpack/runtime/load script","webpack://telegram-t/webpack/runtime/css loading","webpack://telegram-t/./src/api/gramjs/worker/provider.ts","webpack://telegram-t/./src/api/types/media.ts","webpack://telegram-t/./src/api/types/messages.ts","webpack://telegram-t/./src/lib/punycode.js","webpack://telegram-t/./src/components/common/SafeLink.tsx","webpack://telegram-t/./src/components/common/helpers/documentInfo.ts","webpack://telegram-t/./src/components/common/helpers/parseEmojiOnlyString.ts","webpack://telegram-t/./src/components/common/UserLink.tsx","webpack://telegram-t/./src/components/common/MessageLink.tsx","webpack://telegram-t/./src/components/common/ChatLink.tsx","webpack://telegram-t/./src/components/common/GroupCallLink.tsx","webpack://telegram-t/./src/components/common/helpers/renderActionMessageText.tsx","webpack://telegram-t/./src/components/common/helpers/renderText.tsx","webpack://telegram-t/./src/components/middle/helpers/preventMessageInputBlur.ts","webpack://telegram-t/./src/components/middle/message/MentionLink.tsx","webpack://telegram-t/./src/components/ui/Button.tsx","webpack://telegram-t/./src/components/ui/Checkbox.tsx","webpack://telegram-t/./src/components/ui/DropdownMenu.tsx","webpack://telegram-t/./src/components/ui/InputText.tsx","webpack://telegram-t/./src/components/ui/Link.tsx","webpack://telegram-t/./src/components/ui/Loading.tsx","webpack://telegram-t/./src/components/ui/Menu.tsx","webpack://telegram-t/./src/components/ui/MenuItem.tsx","webpack://telegram-t/./src/components/ui/RippleEffect.tsx","webpack://telegram-t/./src/components/ui/Spinner.tsx","webpack://telegram-t/./src/config.ts","webpack://telegram-t/./src/hooks/useEffectWithPrevDeps.ts","webpack://telegram-t/./src/hooks/useFlag.ts","webpack://telegram-t/./src/hooks/useForceUpdate.ts","webpack://telegram-t/./src/hooks/useHeavyAnimationCheck.ts","webpack://telegram-t/./src/hooks/useHistoryBack.ts","webpack://telegram-t/./src/hooks/useKeyboardListNavigation.ts","webpack://telegram-t/./src/hooks/useLang.ts","webpack://telegram-t/./src/hooks/useModuleLoader.ts","webpack://telegram-t/./src/hooks/useOnChange.ts","webpack://telegram-t/./src/hooks/usePrevious.ts","webpack://telegram-t/./src/hooks/useShowTransition.ts","webpack://telegram-t/./src/hooks/useVirtualBackdrop.ts","webpack://telegram-t/./src/lib/teact/dom-events.ts","webpack://telegram-t/./src/lib/teact/teact-dom.ts","webpack://telegram-t/./src/lib/teact/teact.ts","webpack://telegram-t/./src/lib/teact/teactn.tsx","webpack://telegram-t/./src/lib/twemojiRegex.js","webpack://telegram-t/./src/modules/actions/api/initial.ts","webpack://telegram-t/./src/modules/actions/api/settings.ts","webpack://telegram-t/./src/modules/actions/apiUpdaters/initial.ts","webpack://telegram-t/./src/modules/actions/ui/initial.ts","webpack://telegram-t/./src/modules/actions/ui/settings.ts","webpack://telegram-t/./src/modules/helpers/chats.ts","webpack://telegram-t/./src/modules/helpers/messages.ts","webpack://telegram-t/./src/modules/helpers/messageMedia.ts","webpack://telegram-t/./src/modules/helpers/localSearch.ts","webpack://telegram-t/./src/modules/helpers/payments.ts","webpack://telegram-t/./src/modules/helpers/users.ts","webpack://telegram-t/./src/modules/reducers/chats.ts","webpack://telegram-t/./src/modules/reducers/messages.ts","webpack://telegram-t/./src/modules/reducers/symbols.ts","webpack://telegram-t/./src/modules/reducers/users.ts","webpack://telegram-t/./src/modules/reducers/globalSearch.ts","webpack://telegram-t/./src/modules/reducers/localSearch.ts","webpack://telegram-t/./src/modules/reducers/management.ts","webpack://telegram-t/./src/modules/reducers/settings.ts","webpack://telegram-t/./src/modules/reducers/twoFaSettings.ts","webpack://telegram-t/./src/modules/reducers/payments.ts","webpack://telegram-t/./src/modules/selectors/chats.ts","webpack://telegram-t/./src/modules/selectors/symbols.ts","webpack://telegram-t/./src/modules/selectors/messages.ts","webpack://telegram-t/./src/modules/selectors/localSearch.ts","webpack://telegram-t/./src/modules/selectors/management.ts","webpack://telegram-t/./src/modules/selectors/ui.ts","webpack://telegram-t/./src/modules/selectors/globalSearch.ts","webpack://telegram-t/./src/modules/selectors/payments.ts","webpack://telegram-t/./src/modules/selectors/settings.ts","webpack://telegram-t/./src/modules/selectors/users.ts","webpack://telegram-t/./src/types/index.ts","webpack://telegram-t/./src/util/animation.ts","webpack://telegram-t/./src/util/appBadge.ts","webpack://telegram-t/./src/util/arePropsShallowEqual.ts","webpack://telegram-t/./src/util/buildClassName.ts","webpack://telegram-t/./src/util/cacheApi.ts","webpack://telegram-t/./src/util/captureEscKeyListener.ts","webpack://telegram-t/./src/util/captureKeyboardListeners.ts","webpack://telegram-t/./src/util/dateFormat.ts","webpack://telegram-t/./src/util/emoji.ts","webpack://telegram-t/./src/util/ensureProtocol.ts","webpack://telegram-t/./src/util/environmentWebp.ts","webpack://telegram-t/./src/util/environmentSystemTheme.ts","webpack://telegram-t/./src/util/environment.ts","webpack://telegram-t/./src/util/files.ts","webpack://telegram-t/./src/util/formatCurrency.ts","webpack://telegram-t/./src/util/generateIdFor.ts","webpack://telegram-t/./src/util/getReadableErrorText.ts","webpack://telegram-t/./src/util/handleError.ts","webpack://telegram-t/./src/util/iteratees.ts","webpack://telegram-t/./src/util/langProvider.ts","webpack://telegram-t/./src/util/callbacks.ts","webpack://telegram-t/./src/util/oggToWav.ts","webpack://telegram-t/./src/util/mediaLoader.ts","webpack://telegram-t/./src/util/memo.ts","webpack://telegram-t/./src/util/moduleLoader.ts","webpack://telegram-t/./src/util/notifications.ts","webpack://telegram-t/./src/util/phoneNumber.ts","webpack://telegram-t/./src/util/routing.ts","webpack://telegram-t/./src/util/schedulers.ts","webpack://telegram-t/./src/util/searchWords.ts","webpack://telegram-t/./src/util/serverTime.ts","webpack://telegram-t/./node_modules/idb-keyval/dist/esm/index.js","webpack://telegram-t/./node_modules/safari-14-idb-fix/dist/esm/index.js","webpack://telegram-t/./src/util/sessions.ts","webpack://telegram-t/./src/util/switchTheme.ts","webpack://telegram-t/./src/util/textFormat.ts","webpack://telegram-t/./src/util/trimText.ts","webpack://telegram-t/./src/util/webpToPng.ts","webpack://telegram-t/./src/util/websync.ts","webpack://telegram-t/./src/util/windowSize.ts","webpack://telegram-t/webpack/bootstrap","webpack://telegram-t/webpack/runtime/compat get default export","webpack://telegram-t/webpack/runtime/define property getters","webpack://telegram-t/webpack/runtime/ensure chunk","webpack://telegram-t/webpack/runtime/get javascript chunk filename","webpack://telegram-t/webpack/runtime/get mini-css chunk filename","webpack://telegram-t/webpack/runtime/global","webpack://telegram-t/webpack/runtime/hasOwnProperty shorthand","webpack://telegram-t/webpack/runtime/make namespace object","webpack://telegram-t/webpack/runtime/publicPath","webpack://telegram-t/webpack/runtime/jsonp chunk loading","webpack://telegram-t/./src/util/setupServiceWorker.ts","webpack://telegram-t/./src/global/initial.ts","webpack://telegram-t/./src/global/cache.ts","webpack://telegram-t/./src/global/index.ts","webpack://telegram-t/./src/util/activeTabMonitor.ts","webpack://telegram-t/./src/util/fonts.ts","webpack://telegram-t/./src/components/common/UiLoader.tsx","webpack://telegram-t/./src/hooks/useLangString.ts","webpack://telegram-t/./src/components/auth/helpers/getSuggestedLanguage.ts","webpack://telegram-t/./src/components/auth/CountryCodeInput.tsx","webpack://telegram-t/./src/components/auth/AuthPhoneNumber.tsx","webpack://telegram-t/./src/components/auth/AuthCode.async.tsx","webpack://telegram-t/./src/components/auth/AuthPassword.async.tsx","webpack://telegram-t/./src/components/auth/AuthRegister.async.tsx","webpack://telegram-t/./node_modules/qr-creator/dist/qr-creator.es6.min.js","webpack://telegram-t/./src/components/auth/AuthQrCode.tsx","webpack://telegram-t/./src/components/auth/Auth.tsx","webpack://telegram-t/./src/components/main/Main.async.tsx","webpack://telegram-t/./src/components/main/AppInactive.tsx","webpack://telegram-t/./src/App.tsx","webpack://telegram-t/./src/index.tsx"],"sourcesContent":["var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"telegram-t:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\t;\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","var createStylesheet = (chunkId, fullhref, resolve, reject) => {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tvar onLinkComplete = (event) => {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + realHref + \")\");\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tlinkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\tdocument.head.appendChild(linkTag);\n\treturn linkTag;\n};\nvar findStylesheet = (href, fullhref) => {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = (chunkId) => {\n\treturn new Promise((resolve, reject) => {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t179: 0\n};\n\n__webpack_require__.f.miniCss = (chunkId, promises) => {\n\tvar cssChunks = {\"133\":1,\"435\":1,\"472\":1,\"532\":1,\"701\":1,\"952\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(() => {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, (e) => {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr","import { ApiInitialArgs, 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';\nimport { pause } from '../../../util/schedulers';\n\ntype RequestStates = {\n messageId: string;\n resolve: Function;\n reject: Function;\n callback?: AnyToVoidFunction;\n};\n\nconst HEALTH_CHECK_TIMEOUT = 150;\nconst HEALTH_CHECK_MIN_DELAY = 5 * 1000; // 5 sec\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, initialArgs: ApiInitialArgs) {\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(new URL('./worker.ts', import.meta.url));\n subscribeToWorker(onUpdate);\n\n if (initialArgs.platform === 'iOS') {\n setupIosHealthCheck();\n }\n }\n\n return makeRequest({\n type: 'initApi',\n args: [initialArgs],\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 requestStates.get(data.messageId)?.callback?.(...data.callbackArgs);\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 (('args' in payload) && 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\nconst startedAt = Date.now();\n\n// Workaround for iOS sometimes stops interacting with worker\nfunction setupIosHealthCheck() {\n window.addEventListener('focus', async () => {\n try {\n await Promise.race([\n makeRequest({ type: 'ping' }),\n pause(HEALTH_CHECK_TIMEOUT).then(() => Promise.reject(new Error('HEALTH_CHECK_TIMEOUT'))),\n ]);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n\n if (Date.now() - startedAt >= HEALTH_CHECK_MIN_DELAY) {\n window.location.reload();\n }\n }\n });\n}\n","// We cache avatars as Data URI for faster initial load\n// and messages media as Blob for smaller size.\n\nexport enum ApiMediaFormat {\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 { ApiGroupCall } from './calls';\n\nexport interface ApiDimensions {\n width: number;\n height: number;\n}\n\nexport interface ApiPhotoSize extends ApiDimensions {\n type: 's' | 'm' | 'x' | 'y' | 'z';\n}\n\nexport interface ApiThumbnail extends ApiDimensions {\n dataUri: string;\n}\n\nexport interface ApiPhoto {\n id: string;\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 stickers?: ApiSticker[];\n packs?: Record;\n covers?: ApiSticker[];\n shortName: string;\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 thumbnailSizes?: ApiPhotoSize[];\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 mediaType?: 'photo' | 'video';\n mediaSize?: ApiDimensions;\n}\n\nexport interface ApiContact {\n firstName: string;\n lastName: string;\n phoneNumber: string;\n userId: string;\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?: string[];\n solution?: string;\n solutionEntities?: ApiMessageEntity[];\n };\n}\n\nexport interface ApiInvoice {\n text: string;\n title: string;\n photoUrl?: string;\n amount: number;\n currency: string;\n receiptMsgId?: number;\n isTest?: boolean;\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 targetUserIds?: string[];\n targetChatId?: string;\n type: 'historyClear' | 'contactSignUp' | 'chatCreate' | 'other';\n photo?: ApiPhoto;\n amount?: number;\n currency?: string;\n translationValues: string[];\n call?: Partial;\n}\n\nexport interface ApiWebPage {\n id: number;\n url: string;\n displayUrl: string;\n type?: string;\n siteName?: string;\n title?: string;\n description?: string;\n photo?: ApiPhoto;\n duration?: number;\n document?: ApiDocument;\n video?: ApiVideo;\n}\n\nexport interface ApiMessageForwardInfo {\n isChannelPost: boolean;\n channelPostId?: number;\n isLinkedChannelPost?: boolean;\n fromChatId?: string;\n senderUserId?: string;\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?: string;\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: string;\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?: string;\n replyToChatId?: string;\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 isMentioned?: boolean;\n isMediaUnread?: boolean;\n groupedId?: string;\n isInAlbum?: boolean;\n hasUnreadMention?: boolean;\n inlineButtons?: ApiKeyboardButtons;\n keyboardButtons?: ApiKeyboardButtons;\n keyboardPlaceholder?: string;\n isKeyboardSingleUse?: boolean;\n viaBotId?: string;\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: string;\n topMessageId?: number;\n originChannelId?: string;\n messagesCount: number;\n lastMessageId?: number;\n lastReadInboxMessageId?: number;\n recentReplierIds?: string[];\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[][];\nexport type ApiReplyKeyboard = {\n keyboardPlaceholder?: string;\n isKeyboardSingleUse?: boolean;\n} & {\n [K in 'inlineButtons' | 'keyboardButtons']?: ApiKeyboardButtons;\n};\n\nexport type ApiMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio' | 'voice' | 'profilePhoto';\nexport type ApiGlobalMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio' | 'voice';\n\nexport type ApiReportReason = 'spam' | 'violence' | 'pornography' | 'childAbuse'\n| 'copyright' | 'geoIrrelevant' | 'fake' | 'other';\n\nexport const MAIN_THREAD_ID = -1;\n\n// `Symbol` can not be transferred from worker\nexport const MESSAGE_DELETED = 'MESSAGE_DELETED';\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 { getDispatch } from '../../lib/teact/teactn';\nimport convertPunycode from '../../lib/punycode';\n\nimport {\n DEBUG, RE_TG_LINK, RE_TME_LINK,\n} from '../../config';\nimport buildClassName from '../../util/buildClassName';\nimport { ensureProtocol } from '../../util/ensureProtocol';\n\ntype OwnProps = {\n url?: string;\n text: string;\n className?: string;\n children?: any;\n isRtl?: boolean;\n};\n\nconst SafeLink: FC = ({\n url,\n text,\n className,\n children,\n isRtl,\n}) => {\n const { toggleSafeLinkModal, openTelegramLink } = getDispatch();\n\n const content = children || text;\n const isNotSafe = url !== content;\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_TG_LINK))\n ) {\n if (isNotSafe) {\n toggleSafeLinkModal({ url });\n\n e.preventDefault();\n return false;\n }\n\n return true;\n }\n\n e.preventDefault();\n openTelegramLink({ url });\n\n return false;\n }, [isNotSafe, openTelegramLink, toggleSafeLinkModal, 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 {content}\n \n );\n};\n\nfunction getDomain(url?: string) {\n if (!url) {\n return undefined;\n }\n\n const href = ensureProtocol(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(SafeLink);\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","// @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","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?: string;\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, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiGroupCall } 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 groupCall?: Partial;\n children: any;\n};\n\ntype DispatchProps = Pick;\n\nconst GroupCallLink: FC = ({\n className, groupCall, joinGroupCall, children,\n}) => {\n const handleClick = useCallback(() => {\n if (groupCall) {\n joinGroupCall({ id: groupCall.id, accessHash: groupCall.accessHash });\n }\n }, [groupCall, joinGroupCall]);\n\n if (!groupCall) {\n return children;\n }\n\n return (\n {children}\n );\n};\n\nexport default withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['joinGroupCall']),\n)(GroupCallLink);\n","import React from '../../../lib/teact/teact';\n\nimport {\n ApiChat, ApiMessage, ApiUser, ApiGroupCall,\n} from '../../../api/types';\nimport { LangFn } from '../../../hooks/useLang';\nimport {\n getChatTitle,\n getMessageContent,\n getMessageSummaryText,\n getUserFullName,\n isUserId,\n} from '../../../modules/helpers';\nimport trimText from '../../../util/trimText';\nimport { formatCurrency } from '../../../util/formatCurrency';\nimport { TextPart } from './renderMessageText';\nimport renderText from './renderText';\n\nimport UserLink from '../UserLink';\nimport MessageLink from '../MessageLink';\nimport ChatLink from '../ChatLink';\nimport GroupCallLink from '../GroupCallLink';\n\ninterface ActionMessageTextOptions {\n maxTextLength?: number;\n asPlain?: boolean;\n isEmbedded?: boolean;\n}\n\nconst NBSP = '\\u00A0';\n\nexport function renderActionMessageText(\n lang: LangFn,\n message: ApiMessage,\n actionOrigin?: ApiUser | ApiChat,\n targetUsers?: ApiUser[],\n targetMessage?: ApiMessage,\n targetChatId?: string,\n options: ActionMessageTextOptions = {},\n) {\n if (!message.content.action) {\n return [];\n }\n const {\n text, translationValues, amount, currency, call,\n } = message.content.action;\n const content: TextPart[] = [];\n const textOptions: ActionMessageTextOptions = { ...options, maxTextLength: 32 };\n const translationKey = text === 'Chat.Service.Group.UpdatedPinnedMessage1' && !targetMessage\n ? 'Message.PinnedGenericMessage'\n : text;\n\n let unprocessed = lang(translationKey, translationValues && translationValues.length ? translationValues : undefined);\n let processed: TextPart[];\n\n if (unprocessed.includes('%payment_amount%')) {\n processed = processPlaceholder(\n unprocessed,\n '%payment_amount%',\n formatCurrency(amount!, currency, lang.code),\n );\n unprocessed = processed.pop() as string;\n content.push(...processed);\n }\n\n processed = processPlaceholder(\n unprocessed,\n '%action_origin%',\n actionOrigin\n ? (!options.isEmbedded && renderOriginContent(lang, 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 targetUsers\n ? targetUsers.map((user) => renderUserContent(user, options.asPlain)).filter(Boolean as any)\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(lang, 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 if (call) {\n return renderGroupCallContent(call, content);\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(lang: LangFn, message: ApiMessage, options: ActionMessageTextOptions = {}) {\n const text = getMessageSummaryText(lang, message);\n const {\n photo, video, document, sticker,\n } = getMessageContent(message);\n\n const { maxTextLength, isEmbedded, asPlain } = options;\n\n const showQuotes = isEmbedded && text && !photo && !video && !document && !sticker;\n let messageText = trimText(text as string, maxTextLength)!;\n\n if (isEmbedded) {\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\n if (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(lang: LangFn, origin: ApiUser | ApiChat, asPlain?: boolean) {\n return isUserId(origin.id)\n ? renderUserContent(origin as ApiUser, asPlain)\n : renderChatContent(lang, origin as ApiChat, asPlain);\n}\n\nfunction renderGroupCallContent(groupCall: Partial, text: TextPart[]): string | TextPart | undefined {\n return (\n \n {text}\n \n );\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(lang: LangFn, chat: ApiChat, asPlain?: boolean): string | TextPart | undefined {\n const text = trimText(getChatTitle(lang, chat));\n\n if (asPlain) {\n return text;\n }\n\n return {chat && renderText(text!)};\n}\n\nfunction renderMigratedContent(chatId: string, 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[]): 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 if (Array.isArray(replaceValue)) {\n replaceValue.forEach((value, index) => {\n content.push(value);\n if (index + 1 < replaceValue.length) {\n content.push(', ');\n }\n });\n } else {\n content.push(replaceValue);\n }\n content.push(text.substring(placeholderPosition + placeholder.length));\n\n return content;\n}\n","import React from '../../../lib/teact/teact';\nimport EMOJI_REGEX, { removeVS16s } from '../../../lib/twemojiRegex';\n\nimport { RE_LINK_TEMPLATE, RE_MENTION_TEMPLATE } from '../../../config';\nimport { IS_EMOJI_SUPPORTED } from '../../../util/environment';\nimport { fixNonStandardEmoji, nativeToUnified } 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 part = fixNonStandardEmoji(part);\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 = nativeToUnified(removeVS16s(emoji));\n if (!code) return emojiResult;\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}|${RE_MENTION_TEMPLATE}`, '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);\n if (!links || !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 if (nextLink.endsWith('?')) {\n nextLink = nextLink.slice(0, nextLink.length - 1);\n }\n\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 React from '../../../lib/teact/teact';\n\nimport { EDITABLE_INPUT_ID } from '../../../config';\nimport { IS_IOS } from '../../../util/environment';\n\nexport function preventMessageInputBlur(e: React.MouseEvent, withBubbling = false) {\n if (\n IS_IOS\n || !document.activeElement\n || document.activeElement.id !== EDITABLE_INPUT_ID\n || (!withBubbling && e.target !== e.currentTarget)\n ) {\n return;\n }\n\n e.preventDefault();\n}\n\nexport function preventMessageInputBlurWithBubbling(e: React.MouseEvent) {\n preventMessageInputBlur(e, true);\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?: string;\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 { 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 backgroundImage?: string;\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 isRtl?: boolean;\n withClickPropagation?: boolean;\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 backgroundImage,\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 isRtl,\n withClickPropagation,\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 backgroundImage && 'with-image',\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 if (!withClickPropagation) e.preventDefault();\n if (!disabled && onMouseDown) {\n onMouseDown(e);\n }\n }, [onMouseDown, disabled, withClickPropagation]);\n\n if (href) {\n return (\n }\n className={fullClassName}\n href={href}\n title={ariaLabel}\n download={download}\n tabIndex={tabIndex}\n dir={isRtl ? 'rtl' : undefined}\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 dir={isRtl ? 'rtl' : undefined}\n // @ts-ignore\n style={backgroundImage ? `background-image: url(${backgroundImage})` : undefined}\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 { ChangeEvent } from 'react';\nimport React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\nimport renderText from '../common/helpers/renderText';\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 lang = useLang();\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","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 forceOpen?: boolean;\n onOpen?: NoneToVoidFunction;\n onClose?: NoneToVoidFunction;\n children: any;\n};\n\nconst DropdownMenu: FC = ({\n trigger,\n className,\n children,\n positionX = 'left',\n positionY = 'top',\n footer,\n forceOpen,\n onOpen,\n onClose,\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 if (isOpen) {\n if (onClose) onClose();\n } else if (onOpen) onOpen();\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 if (onClose) onClose();\n };\n\n return (\n \n {trigger({ onTrigger: toggleIsOpen, isOpen })}\n\n \n {children}\n \n
\n );\n};\n\nexport default DropdownMenu;\n","import { ChangeEvent, FormEvent, RefObject } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\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 onPaste?: (e: React.ClipboardEvent) => 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 onPaste,\n}) => {\n const lang = useLang();\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 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 isRtl?: boolean;\n onClick?: (e: React.MouseEvent) => void;\n};\n\nconst Link: FC = ({\n children, className, isRtl, onClick,\n}) => {\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 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 { 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';\nimport useHistoryBack from '../../hooks/useHistoryBack';\nimport { preventMessageInputBlurWithBubbling } from '../middle/helpers/preventMessageInputBlur';\n\nimport './Menu.scss';\n\ntype OwnProps = {\n ref?: RefObject;\n containerRef?: RefObject;\n isOpen: boolean;\n className?: string;\n style?: string;\n menuStyle?: string;\n positionX?: 'left' | 'right';\n positionY?: 'top' | 'bottom';\n autoClose?: boolean;\n shouldSkipTransition?: 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 menuStyle,\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 shouldSkipTransition,\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 {\n transitionClassNames,\n } = useShowTransition(\n isOpen,\n onCloseAnimationEnd,\n shouldSkipTransition,\n undefined,\n shouldSkipTransition,\n );\n\n useEffect(\n () => (isOpen && onClose ? captureEscKeyListener(onClose) : undefined),\n [isOpen, onClose],\n );\n\n useHistoryBack(isOpen, onClose, undefined, undefined, autoClose);\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, undefined, true);\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 React, { FC, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\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 lang = useLang();\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, memo,\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 }) => (\n \n ))}\n
\n );\n};\n\nexport default memo(RippleEffect);\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","export const PAGE_TITLE = 'Telegram';\nexport const INACTIVE_MARKER = ' [Inactive]';\n\nexport const APP_NAME = process.env.APP_NAME || 'Telegram WebZ';\nexport const APP_VERSION = process.env.APP_VERSION || 'dev';\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 SESSION_USER_KEY = 'user_auth';\nexport const LEGACY_SESSION_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-v6';\nexport const ASSET_CACHE_NAME = 'tt-assets';\nexport const AUTODOWNLOAD_FILESIZE_MB_LIMITS = [1, 5, 10, 50, 100, 500];\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 MEMBERS_SLICE = 30;\nexport const MEMBERS_LOAD_SLICE = 200;\nexport const PINNED_MESSAGES_LIMIT = 50;\nexport const BLOCKED_LIST_LIMIT = 100;\nexport const PROFILE_PHOTOS_LIMIT = 40;\nexport const PROFILE_SENSITIVE_AREA = 500;\nexport const COMMON_CHATS_LIMIT = 100;\nexport const GROUP_CALL_PARTICIPANTS_LIMIT = 100;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 20;\nexport const ALL_CHATS_PRELOAD_DISABLED = false;\n\nexport const DEFAULT_VOLUME = 1;\nexport const DEFAULT_PLAYBACK_RATE = 1;\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;\nexport const IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 17;\nexport const MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 15;\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;\nexport const TMP_CHAT_ID = '0';\n\nexport const ANIMATION_END_DELAY = 100;\n\nexport const FAST_SMOOTH_MAX_DISTANCE = 1500;\nexport const FAST_SMOOTH_MIN_DURATION = 250;\nexport const FAST_SMOOTH_MAX_DURATION = 600;\nexport const FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE = 500; // px\n\n// Average duration of message sending animation\nexport const API_UPDATE_THROTTLE = Math.round((FAST_SMOOTH_MIN_DURATION + FAST_SMOOTH_MAX_DURATION) / 2);\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\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 STICKER_SIZE_INLINE_BOT_RESULT = 100;\nexport const RECENT_STICKERS_LIMIT = 20;\nexport const MEMOJI_STICKER_ID = 'MEMOJI_STICKER';\n\nexport const BASE_EMOJI_KEYWORD_LANG = 'en';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\n\nexport const VIDEO_MOV_TYPE = 'video/quicktime';\n\nexport const SUPPORTED_IMAGE_CONTENT_TYPES = new Set([\n 'image/png', 'image/gif', 'image/jpeg',\n]);\n\nexport const SUPPORTED_VIDEO_CONTENT_TYPES = new Set([\n 'video/mp4', // video/quicktime added dynamically in environment.ts\n]);\n\nexport const CONTENT_TYPES_WITH_PREVIEW = new Set([\n ...SUPPORTED_IMAGE_CONTENT_TYPES,\n ...SUPPORTED_VIDEO_CONTENT_TYPES,\n]);\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,63})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_MENTION_TEMPLATE = '(@[\\\\w\\\\d_-]+)';\nexport const RE_TG_LINK = /^tg:(\\/\\/)?([?=&\\d\\w_-]+)?/gm;\nexport const RE_TME_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/)/gm;\n\n// eslint-disable-next-line max-len\nexport const COUNTRIES_WITH_12H_TIME_FORMAT = new Set(['AU', 'BD', 'CA', 'CO', 'EG', 'HN', 'IE', 'IN', 'JO', 'MX', 'MY', 'NI', 'NZ', 'PH', 'PK', 'SA', 'SV', 'US']);\n\n// MTProto constants\nexport const SERVICE_NOTIFICATIONS_USER_ID = '777000';\nexport const REPLIES_USER_ID = '1271266957'; // TODO For Test connection ID must be equal to 708513\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_CODE = 'en';\nexport const DEFAULT_LANG_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios', 'tdesktop', 'macos'] as const;\nexport const TIPS_USERNAME = 'TelegramTips';\nexport const LOCALIZED_TIPS = ['ar', 'pt-br', 'id', 'it', 'ko', 'ms', 'pl', 'es', 'tr'];\nexport const FEEDBACK_URL = 'https://bugs.telegram.org/?tag_ids=41&sort=time';\nexport const LIGHT_THEME_BG_COLOR = '#A2AF8E';\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\n// Group calls\nexport const GROUP_CALL_VOLUME_MULTIPLIER = 100;\nexport const GROUP_CALL_DEFAULT_VOLUME = 100 * GROUP_CALL_VOLUME_MULTIPLIER;\nexport const ENABLE_THUMBNAIL_VIDEO = false;\n","import { useEffect } from '../lib/teact/teact';\nimport usePrevious from './usePrevious';\n\nexport default (cb: (args: PT) => void, dependencies: T, debugKey?: string) => {\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, debugKey);\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 { 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 { useEffect } from '../lib/teact/teact';\n\nexport const ANIMATION_START_EVENT = 'tt-event-heavy-animation-start';\nexport const ANIMATION_END_EVENT = 'tt-event-heavy-animation-end';\n\nlet timeout: number | undefined;\nlet isAnimating = false;\n\nexport const dispatchHeavyAnimationEvent = (duration?: number) => {\n if (!isAnimating) {\n isAnimating = true;\n document.dispatchEvent(new Event(ANIMATION_START_EVENT));\n }\n\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n if (duration) {\n timeout = window.setTimeout(() => {\n isAnimating = false;\n document.dispatchEvent(new Event(ANIMATION_END_EVENT));\n timeout = undefined;\n }, duration);\n }\n\n return () => {\n isAnimating = false;\n document.dispatchEvent(new Event(ANIMATION_END_EVENT));\n };\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","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\n\nimport { IS_IOS } from '../util/environment';\nimport usePrevious from './usePrevious';\nimport { getDispatch } from '../lib/teact/teactn';\nimport { areSortedArraysEqual } from '../util/iteratees';\n\ntype HistoryState = {\n currentIndex: number;\n nextStateIndexToReplace: number;\n isHistoryAltered: boolean;\n isDisabled: boolean;\n isEdge: boolean;\n currentIndexes: number[];\n};\n\n// Carefully selected by swiping and observing visual changes\n// TODO: may be different on other devices such as iPad, maybe take dpi into account?\nconst SAFARI_EDGE_BACK_GESTURE_LIMIT = 300;\nconst SAFARI_EDGE_BACK_GESTURE_DURATION = 350;\nexport const LOCATION_HASH = window.location.hash;\nconst PATH_BASE = `${window.location.pathname}${window.location.search}`;\n\nconst historyState: HistoryState = {\n currentIndex: 0,\n nextStateIndexToReplace: -1,\n isHistoryAltered: false,\n isDisabled: false,\n isEdge: false,\n currentIndexes: [],\n};\n\nexport const disableHistoryBack = () => {\n historyState.isDisabled = true;\n};\n\nconst handleTouchStart = (event: TouchEvent) => {\n const x = event.touches[0].pageX;\n\n if (x <= SAFARI_EDGE_BACK_GESTURE_LIMIT || x >= window.innerWidth - SAFARI_EDGE_BACK_GESTURE_LIMIT) {\n historyState.isEdge = true;\n }\n};\n\nconst handleTouchEnd = () => {\n if (historyState.isEdge) {\n setTimeout(() => {\n historyState.isEdge = false;\n }, SAFARI_EDGE_BACK_GESTURE_DURATION);\n }\n};\n\nif (IS_IOS) {\n window.addEventListener('touchstart', handleTouchStart);\n window.addEventListener('touchend', handleTouchEnd);\n window.addEventListener('popstate', handleTouchEnd);\n}\n\nwindow.history.replaceState({ index: historyState.currentIndex }, '', PATH_BASE);\n\nexport default function useHistoryBack(\n isActive: boolean | undefined,\n onBack: ((noDisableAnimation: boolean) => void) | undefined,\n onForward?: (state: any) => void,\n currentState?: any,\n shouldReplaceNext = false,\n hashes?: string[],\n) {\n const indexRef = useRef(-1);\n const isForward = useRef(false);\n const prevIsActive = usePrevious(isActive);\n const isClosed = useRef(true);\n const indexHashRef = useRef<{ index: number; hash: string }[]>([]);\n const prevHashes = usePrevious(hashes);\n const isHashChangedFromEvent = useRef(false);\n\n const handleChange = useCallback((isForceClose = false) => {\n if (!hashes) {\n if (isActive && !isForceClose) {\n isClosed.current = false;\n\n if (isForward.current) {\n isForward.current = false;\n historyState.currentIndexes.push(indexRef.current);\n } else {\n setTimeout(() => {\n const index = ++historyState.currentIndex;\n\n historyState.currentIndexes.push(index);\n\n window.history[(\n (\n historyState.currentIndexes.includes(historyState.nextStateIndexToReplace - 1)\n && window.history.state.index !== 0\n && historyState.nextStateIndexToReplace === index\n && !shouldReplaceNext\n )\n ? 'replaceState'\n : 'pushState'\n )]({\n index,\n state: currentState,\n }, '');\n\n indexRef.current = index;\n\n if (shouldReplaceNext) {\n historyState.nextStateIndexToReplace = historyState.currentIndex + 1;\n }\n }, 0);\n }\n }\n\n if ((isForceClose || !isActive) && !isClosed.current) {\n if ((indexRef.current === historyState.currentIndex || !shouldReplaceNext)) {\n historyState.isHistoryAltered = true;\n window.history.back();\n\n setTimeout(() => {\n historyState.nextStateIndexToReplace = -1;\n }, 400);\n }\n historyState.currentIndexes.splice(historyState.currentIndexes.indexOf(indexRef.current), 1);\n\n isClosed.current = true;\n }\n } else {\n const prev = prevHashes || [];\n if (prev.length < hashes.length) {\n setTimeout(() => {\n const index = ++historyState.currentIndex;\n historyState.currentIndexes.push(index);\n\n window.history.pushState({\n index,\n state: currentState,\n }, '', `#${hashes[hashes.length - 1]}`);\n\n indexHashRef.current.push({\n index,\n hash: hashes[hashes.length - 1],\n });\n }, 0);\n } else {\n const delta = prev.length - hashes.length;\n if (isHashChangedFromEvent.current) {\n isHashChangedFromEvent.current = false;\n } else {\n if (hashes.length !== indexHashRef.current.length) {\n if (delta > 0) {\n const last = indexHashRef.current[indexHashRef.current.length - delta - 1];\n let realDelta = delta;\n if (last) {\n const indexLast = historyState.currentIndexes.findIndex(\n (l) => l === last.index,\n );\n realDelta = historyState.currentIndexes.length - indexLast - 1;\n }\n historyState.isHistoryAltered = true;\n window.history.go(-realDelta);\n const removed = indexHashRef.current.splice(indexHashRef.current.length - delta - 1, delta);\n removed.forEach(({ index }) => {\n historyState.currentIndexes.splice(historyState.currentIndexes.indexOf(index), 1);\n });\n }\n }\n\n if (hashes.length > 0) {\n setTimeout(() => {\n const index = ++historyState.currentIndex;\n historyState.currentIndexes[historyState.currentIndexes.length - 1] = index;\n\n window.history.replaceState({\n index,\n state: currentState,\n }, '', `${PATH_BASE}#${hashes[hashes.length - 1]}`);\n\n indexHashRef.current[indexHashRef.current.length - 1] = {\n index,\n hash: hashes[hashes.length - 1],\n };\n }, 0);\n }\n }\n }\n }\n }, [currentState, hashes, isActive, prevHashes, shouldReplaceNext]);\n\n useEffect(() => {\n const handlePopState = (event: PopStateEvent) => {\n if (historyState.isHistoryAltered) {\n setTimeout(() => {\n historyState.isHistoryAltered = false;\n }, 0);\n return;\n }\n const { index: i } = event.state;\n const index = i || 0;\n try {\n const currIndex = hashes ? indexHashRef.current[indexHashRef.current.length - 1].index : indexRef.current;\n\n const prev = historyState.currentIndexes[historyState.currentIndexes.indexOf(currIndex) - 1];\n\n if (historyState.isDisabled) return;\n\n if ((!isClosed.current && (index === 0 || index === prev)) || (hashes && (index === 0 || index === prev))) {\n if (hashes) {\n isHashChangedFromEvent.current = true;\n indexHashRef.current.pop();\n }\n\n historyState.currentIndexes.splice(historyState.currentIndexes.indexOf(currIndex), 1);\n\n if (onBack) {\n if (historyState.isEdge) {\n getDispatch()\n .disableHistoryAnimations();\n }\n onBack(!historyState.isEdge);\n isClosed.current = true;\n }\n } else if (index === currIndex && isClosed.current && onForward && !hashes) {\n isForward.current = true;\n if (historyState.isEdge) {\n getDispatch()\n .disableHistoryAnimations();\n }\n onForward(event.state.state);\n }\n } catch (e) {\n // Forward navigation for hashed is not supported\n }\n };\n\n const hasChanged = hashes\n ? (!prevHashes || !areSortedArraysEqual(prevHashes, hashes))\n : prevIsActive !== isActive;\n\n if (!historyState.isDisabled && hasChanged) {\n handleChange();\n }\n\n window.addEventListener('popstate', handlePopState);\n return () => window.removeEventListener('popstate', handlePopState);\n }, [\n currentState, handleChange, hashes, isActive, onBack, onForward, prevHashes, prevIsActive, shouldReplaceNext,\n ]);\n\n return {\n forceClose: () => handleChange(true),\n };\n}\n","import { RefObject } from 'react';\nimport { useState, useCallback, useEffect } from '../lib/teact/teact';\n\nexport default (\n elementRef: RefObject,\n isOpen: boolean,\n onSelectWithEnter?: (index: number) => void,\n itemSelector?: string,\n noCaptureFocus?: boolean,\n) => {\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n useEffect(() => {\n setFocusedIndex(-1);\n\n const element = elementRef.current;\n if (isOpen && element && !noCaptureFocus) {\n element.tabIndex = -1;\n element.focus();\n }\n }, [elementRef, isOpen, noCaptureFocus]);\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(focusedIndex);\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(itemSelector ? element.querySelectorAll(itemSelector) : 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 }, [elementRef, onSelectWithEnter, itemSelector, focusedIndex]);\n\n return handleKeyDown;\n};\n","import * 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 { 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 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 { 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 { 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 [hasOpenClassName, setHasOpenClassName] = useState(isOpen && noOpenTransition);\n\n if (isOpen) {\n setIsClosed(false);\n setHasOpenClassName(true);\n\n if (closeTimeoutRef.current) {\n window.clearTimeout(closeTimeoutRef.current);\n closeTimeoutRef.current = undefined;\n }\n } else {\n setHasOpenClassName(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 // `noCloseTransition`, when set to true, should remove the open class immediately\n const shouldHaveOpenClassName = hasOpenClassName && !(noCloseTransition && !isOpen);\n const isClosing = Boolean(closeTimeoutRef.current);\n const shouldRender = isOpen || isClosing;\n const transitionClassNames = buildClassName(\n className && 'opacity-transition',\n className,\n shouldHaveOpenClassName && 'open',\n shouldRender && 'shown',\n isClosing && 'closing',\n );\n\n return {\n shouldRender,\n transitionClassNames,\n };\n};\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","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, asCapture = false) {\n const eventName = resolveEventName(propName, element);\n if (canUseEventDelegation(eventName, element, asCapture)) {\n addDelegatedListener(eventName, element, handler);\n } else {\n element.addEventListener(eventName, handler, asCapture);\n }\n}\n\nexport function removeEventListener(element: HTMLElement, propName: string, handler: Handler, asCapture = false) {\n const eventName = resolveEventName(propName, element);\n if (canUseEventDelegation(eventName, element, asCapture)) {\n removeDelegatedListener(eventName, element);\n } else {\n element.removeEventListener(eventName, handler, asCapture);\n }\n}\n\nfunction resolveEventName(propName: string, element: HTMLElement) {\n const eventName = propName\n .replace(/^on/, '')\n .replace(/Capture$/, '').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, asCapture: boolean) {\n return (\n !asCapture\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 {\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 HTML_ATTRIBUTES = new Set(['dir']);\nconst MAPPED_ATTRIBUTES: { [k: string]: string } = {\n autoPlay: 'autoplay',\n autoComplete: 'autocomplete',\n};\nconst INDEX_KEY_PREFIX = '__indexKey#';\n\nconst headsByElement: Record = {};\n// eslint-disable-next-line @typescript-eslint/naming-convention\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 if (props[key] !== undefined) {\n setAttribute(element, key, props[key]);\n }\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 const currentValue = $current.props[key];\n const newValue = $new.props[key];\n\n if (\n currentValue !== undefined\n && (\n newValue === undefined\n || (currentValue !== newValue && key.startsWith('on'))\n )\n ) {\n removeAttribute(element, key, currentValue);\n }\n });\n\n newKeys.forEach((key) => {\n const currentValue = $current.props[key];\n const newValue = $new.props[key];\n\n if (newValue !== undefined && newValue !== currentValue) {\n setAttribute(element, key, newValue);\n }\n });\n}\n\nfunction setAttribute(element: HTMLElement, key: string, value: any) {\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 === 'dangerouslySetInnerHTML') {\n // eslint-disable-next-line no-underscore-dangle\n element.innerHTML = value.__html;\n } else if (key.startsWith('on')) {\n addEventListener(element, key, value, key.endsWith('Capture'));\n } else if (key.startsWith('data-') || HTML_ATTRIBUTES.has(key)) {\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 === 'dangerouslySetInnerHTML') {\n element.innerHTML = '';\n } else if (key.startsWith('on')) {\n removeEventListener(element, key, value, key.endsWith('Capture'));\n } else if (key.startsWith('data-') || HTML_ATTRIBUTES.has(key)) {\n element.removeAttribute(key);\n } else if (!FILTERED_ATTRIBUTES.has(key)) {\n delete (element as any)[MAPPED_ATTRIBUTES[key] || key];\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\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","import { DEBUG, DEBUG_MORE } from '../../config';\nimport {\n fastRaf, fastRafPrimary, onTickEnd, onTickEndPrimary, throttleWithPrimaryRaf, throttleWithRaf,\n} from '../../util/schedulers';\nimport { flatten, orderBy } from '../../util/iteratees';\nimport arePropsShallowEqual, { getUnequalProps } 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// eslint-disable-next-line @typescript-eslint/naming-convention\nexport type FC_withDebug = FC & {\n DEBUG_contentComponentName?: string;\n};\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 prepareForFrame?: () => void;\n forceUpdate?: () => void;\n onUpdate?: () => void;\n}\n\nexport type VirtualElement =\n VirtualElementEmpty\n | VirtualElementText\n | VirtualElementTag\n | VirtualElementComponent;\nexport type VirtualRealElement =\n VirtualElementTag\n | 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\n// eslint-disable-next-line @typescript-eslint/naming-convention\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 // eslint-disable-next-line @typescript-eslint/naming-convention\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 need to remove all references to DOM objects. We also clean all other references, just in case.\nfunction helpGc(componentInstance: ComponentInstance) {\n /* eslint-disable no-null/no-null */\n\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.renderedValue = 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 /* eslint-enable no-null/no-null */\n}\n\nfunction prepareComponentForFrame(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 componentInstance.prepareForFrame = throttleWithPrimaryRaf(() => prepareComponentForFrame(componentInstance));\n componentInstance.forceUpdate = throttleWithRaf(() => forceUpdateComponent(componentInstance));\n}\n\nfunction forceUpdateComponent(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted || !componentInstance.onUpdate) {\n return;\n }\n\n const currentElement = componentInstance.$element;\n\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.prepareForFrame || !componentInstance.forceUpdate) {\n componentInstance.prepareForFrame = throttleWithPrimaryRaf(\n () => prepareComponentForFrame(componentInstance),\n );\n componentInstance.forceUpdate = throttleWithRaf(\n () => forceUpdateComponent(componentInstance),\n );\n }\n\n componentInstance.prepareForFrame();\n componentInstance.forceUpdate();\n\n if (DEBUG_MORE) {\n if (componentInstance.name !== 'TeactNContainer') {\n // eslint-disable-next-line no-console\n console.log(\n '[Teact.useState]',\n componentInstance.name,\n // `componentInstance.Component` may be set to `null` by GC helper\n componentInstance.Component && (componentInstance.Component as FC_withDebug).DEBUG_contentComponentName\n ? `> ${(componentInstance.Component as FC_withDebug).DEBUG_contentComponentName}`\n : '',\n `Forced update at cursor #${cursor}, next value: `,\n byCursor[cursor].nextValue,\n );\n }\n }\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 primarySchedulerFn: typeof onTickEnd | typeof requestAnimationFrame,\n effect: () => Function | void,\n dependencies?: any[],\n debugKey?: string,\n) {\n const { cursor, byCursor } = renderingInstance.hooks.effects;\n const componentInstance = renderingInstance;\n\n function execCleanup() {\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\n function exec() {\n if (!componentInstance.isMounted) {\n return;\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 if (debugKey) {\n const causedBy = dependencies.reduce((res, newValue, i) => {\n const prevValue = byCursor[cursor].dependencies![i];\n if (newValue !== prevValue) {\n res.push(`${i}: ${prevValue} => ${newValue}`);\n }\n\n return res;\n }, []);\n\n // eslint-disable-next-line no-console\n console.log(\n '[Teact]',\n debugKey,\n 'Effect caused by dependencies.',\n causedBy.join(', '),\n );\n }\n\n primarySchedulerFn(execCleanup);\n schedulerFn(exec);\n }\n } else {\n primarySchedulerFn(execCleanup);\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[], debugKey?: string) {\n return useLayoutEffectBase(fastRaf, fastRafPrimary, effect, dependencies, debugKey);\n}\n\nexport function useLayoutEffect(effect: () => Function | void, dependencies?: any[], debugKey?: string) {\n return useLayoutEffectBase(onTickEnd, onTickEndPrimary, effect, dependencies, debugKey);\n}\n\nexport function useMemo(resolver: () => T, dependencies: any[], debugKey?: string): 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 if (DEBUG && debugKey) {\n // eslint-disable-next-line no-console\n console.log(\n `[Teact.useMemo] ${renderingInstance.name} (${debugKey}): Update is caused by:`,\n byCursor[cursor]\n ? getUnequalProps(dependencies, byCursor[cursor].dependencies).join(', ')\n : '[first render]',\n );\n }\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[], debugKey?: string): F {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => newCallback, dependencies, debugKey);\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, debugKey?: string) {\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 if (DEBUG && debugKey) {\n // eslint-disable-next-line no-console\n console.log(\n `[Teact.memo] ${Component.name} (${debugKey}): Update is caused by:`,\n getUnequalProps(propsRef.current!, props).join(', '),\n );\n }\n\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","import React, {\n FC, FC_withDebug, 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, { getUnequalProps } 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\n// `noThrottle = true` is used as a workaround for iOS gesture history navigation\nexport function setGlobal(newGlobal?: GlobalState, noThrottle = false) {\n if (typeof newGlobal === 'object' && newGlobal !== currentGlobal) {\n currentGlobal = newGlobal;\n if (!noThrottle) {\n runCallbacksThrottled();\n } else {\n runCallbacks();\n }\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, noThrottle?: boolean) {\n if (reducers[name]) {\n reducers[name].forEach((reducer) => {\n const newGlobal = reducer(currentGlobal, actions, payload);\n if (newGlobal) {\n setGlobal(newGlobal, noThrottle);\n }\n });\n }\n}\n\nfunction updateContainers() {\n // eslint-disable-next-line @typescript-eslint/naming-convention\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, noThrottle = false) => {\n onDispatch(name, payload, noThrottle);\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 (TeactNContainer as FC_withDebug).DEBUG_contentComponentName = Component.name;\n\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\nif (DEBUG) {\n (window as any).getGlobal = getGlobal;\n\n document.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log(\n 'GLOBAL CONTAINERS',\n orderBy(\n Array.from(containers.values())\n .map(({ DEBUG_componentName, DEBUG_updates }) => ({ DEBUG_componentName, DEBUG_updates })),\n 'DEBUG_updates',\n 'desc',\n ),\n );\n });\n}\n","// Copyright Twitter Inc. Licensed under MIT\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\n// Version 2c193ce 28.05.2021\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 /(?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\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\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\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\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\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\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\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\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\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\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc8f\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc91\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d\\udc8f\\udc91])|(?:\\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\\uddd4\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f|(?:\\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\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\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\\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|\\ud83d\\ude36\\u200d\\ud83c\\udf2b\\ufe0f|\\u2764\\ufe0f\\u200d\\ud83d\\udd25|\\u2764\\ufe0f\\u200d\\ud83e\\ude79|\\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|\\ud83d\\ude2e\\u200d\\ud83d\\udca8|\\ud83d\\ude35\\u200d\\ud83d\\udcab|\\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-\\udc8e\\udc90\\udc92-\\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 {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { initApi, callApi } from '../../../api/gramjs';\nimport { GlobalState } from '../../../global/types';\n\nimport {\n LANG_CACHE_NAME,\n CUSTOM_BG_CACHE_NAME,\n MEDIA_CACHE_NAME,\n MEDIA_CACHE_NAME_AVATARS,\n MEDIA_PROGRESSIVE_CACHE_NAME,\n IS_TEST,\n} from '../../../config';\nimport { IS_MOV_SUPPORTED, PLATFORM_ENV } from '../../../util/environment';\nimport { unsubscribe } from '../../../util/notifications';\nimport * as cacheApi from '../../../util/cacheApi';\nimport { updateAppBadge } from '../../../util/appBadge';\nimport {\n storeSession,\n loadStoredSession,\n clearStoredSession,\n importLegacySession,\n clearLegacySessions,\n} from '../../../util/sessions';\nimport { forceWebsync } from '../../../util/websync';\n\naddReducer('initApi', (global: GlobalState, actions) => {\n (async () => {\n if (!IS_TEST) {\n await importLegacySession();\n void clearLegacySessions();\n }\n\n void initApi(actions.apiUpdate, {\n userAgent: navigator.userAgent,\n platform: PLATFORM_ENV,\n sessionData: loadStoredSession(),\n isTest: window.location.search.includes('test'),\n isMovSupported: IS_MOV_SUPPORTED,\n });\n })();\n});\n\naddReducer('setAuthPhoneNumber', (global, actions, payload) => {\n const { phoneNumber } = payload!;\n\n void callApi('provideAuthPhoneNumber', phoneNumber.replace(/[^\\d]/g, ''));\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('goToAuthQrCode', (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 { sessionData } = payload;\n\n if (sessionData) {\n storeSession(payload.sessionData, global.currentUserId);\n } else {\n clearStoredSession();\n }\n});\n\naddReducer('signOut', () => {\n (async () => {\n try {\n await unsubscribe();\n await callApi('destroy');\n await forceWebsync(false);\n } catch (err) {\n // Do nothing\n }\n\n getDispatch().reset();\n })();\n});\n\naddReducer('reset', () => {\n clearStoredSession();\n\n void cacheApi.clear(MEDIA_CACHE_NAME);\n void cacheApi.clear(MEDIA_CACHE_NAME_AVATARS);\n void cacheApi.clear(MEDIA_PROGRESSIVE_CACHE_NAME);\n void cacheApi.clear(CUSTOM_BG_CACHE_NAME);\n\n const langCachePrefix = LANG_CACHE_NAME.replace(/\\d+$/, '');\n const langCacheVersion = (LANG_CACHE_NAME.match(/\\d+$/) || [0])[0];\n for (let i = 0; i < langCacheVersion; i++) {\n void cacheApi.clear(`${langCachePrefix}${i === 0 ? '' : i}`);\n }\n\n void clearLegacySessions();\n\n updateAppBadge(0);\n\n getDispatch().init();\n});\n\naddReducer('disconnect', () => {\n (async () => {\n await callApi('disconnect');\n })();\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\naddReducer('setDeviceToken', (global, actions, deviceToken) => {\n setGlobal({\n ...global,\n push: {\n deviceToken,\n subscribedAt: Date.now(),\n },\n });\n});\n\naddReducer('deleteDeviceToken', (global) => {\n const newGlobal = { ...global };\n delete newGlobal.push;\n setGlobal(newGlobal);\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\nimport {\n ApiPrivacyKey, PrivacyVisibility, ProfileEditProgress, InputPrivacyRules, InputPrivacyContact,\n UPLOADING_WALLPAPER_SLUG,\n} from '../../../types';\n\nimport { COUNTRIES_WITH_12H_TIME_FORMAT } from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { subscribe, unsubscribe } from '../../../util/notifications';\nimport { setTimeFormat } from '../../../util/langProvider';\nimport { selectUser } from '../../selectors';\nimport {\n addUsers, addBlockedContact, updateChats, updateUser, removeBlockedContact, replaceSettings, updateNotifySettings,\n addNotifyExceptions,\n} from '../../reducers';\nimport { isUserId } 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');\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?.length) {\n newGlobal = addUsers(newGlobal, buildCollectionByKey(result.users, 'id'));\n }\n if (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, accessHash } = payload!;\n\n (async () => {\n const result = await callApi('blockContact', contactId, accessHash);\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 = isUserId(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('loadNotificationExceptions', (global) => {\n const { serverTimeOffset } = global;\n\n (async () => {\n const result = await callApi('fetchNotificationExceptions', { serverTimeOffset });\n if (!result) {\n return;\n }\n\n setGlobal(addNotifyExceptions(getGlobal(), result));\n })();\n});\n\naddReducer('loadNotificationSettings', (global) => {\n const { serverTimeOffset } = global;\n (async () => {\n const result = await callApi('fetchNotificationSettings', {\n serverTimeOffset,\n });\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), result));\n })();\n});\n\naddReducer('updateNotificationSettings', (global, actions, payload) => {\n const { peerType, isSilent, shouldShowPreviews } = payload!;\n\n (async () => {\n const result = await callApi('updateNotificationSettings', peerType, { isSilent, shouldShowPreviews });\n\n if (!result) {\n return;\n }\n\n setGlobal(updateNotifySettings(getGlobal(), peerType, isSilent, shouldShowPreviews));\n })();\n});\n\naddReducer('updateWebNotificationSettings', (global, actions, payload) => {\n (async () => {\n setGlobal(replaceSettings(getGlobal(), payload));\n const newGlobal = getGlobal();\n const { hasPushNotifications, hasWebNotifications } = newGlobal.settings.byKey;\n if (hasWebNotifications && hasPushNotifications) {\n await subscribe();\n } else {\n await unsubscribe();\n }\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: string[];\n deniedIds: string[];\n}): InputPrivacyRules {\n const {\n users: { byId: usersById },\n chats: { byId: chatsById },\n } = global;\n\n const rules: InputPrivacyRules = {\n visibility,\n };\n let users: InputPrivacyContact[];\n let chats: InputPrivacyContact[];\n\n const collectUsers = (userId: string) => {\n if (!isUserId(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: string) => {\n if (isUserId(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 InputPrivacyContact[];\n chats = allowedIds.map(collectChats).filter(Boolean) as InputPrivacyContact[];\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 InputPrivacyContact[];\n chats = deniedIds.map(collectChats).filter(Boolean) as InputPrivacyContact[];\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\naddReducer('updateIsOnline', (global, actions, payload) => {\n callApi('updateIsOnline', payload);\n});\n\naddReducer('loadContentSettings', () => {\n (async () => {\n const result = await callApi('fetchContentSettings');\n if (!result) return;\n\n setGlobal(replaceSettings(getGlobal(), result));\n })();\n});\n\naddReducer('updateContentSettings', (global, actions, payload) => {\n (async () => {\n setGlobal(replaceSettings(getGlobal(), { isSensitiveEnabled: payload }));\n\n const result = await callApi('updateContentSettings', payload);\n if (!result) {\n setGlobal(replaceSettings(getGlobal(), { isSensitiveEnabled: !payload }));\n }\n })();\n});\n\naddReducer('loadCountryList', (global, actions, payload = {}) => {\n let { langCode } = payload;\n if (!langCode) langCode = global.settings.byKey.language;\n\n (async () => {\n const countryList = await callApi('fetchCountryList', { langCode });\n if (!countryList) return;\n\n setGlobal({\n ...getGlobal(),\n countryList,\n });\n })();\n});\n\naddReducer('ensureTimeFormat', (global, actions) => {\n if (global.authNearestCountry) {\n const timeFormat = COUNTRIES_WITH_12H_TIME_FORMAT.has(global.authNearestCountry.toUpperCase()) ? '12h' : '24h';\n actions.setSettingOption({ timeFormat });\n setTimeFormat(timeFormat);\n }\n\n (async () => {\n if (getGlobal().settings.byKey.wasTimeFormatSetManually) {\n return;\n }\n\n const nearestCountryCode = await callApi('fetchNearestCountry');\n if (nearestCountryCode) {\n const timeFormat = COUNTRIES_WITH_12H_TIME_FORMAT.has(nearestCountryCode.toUpperCase()) ? '12h' : '24h';\n actions.setSettingOption({ timeFormat });\n setTimeFormat(timeFormat);\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 ApiUpdateSession,\n ApiUpdateCurrentUser, ApiUpdateServerTimeOffset,\n} from '../../../api/types';\nimport { DEBUG, SESSION_USER_KEY } from '../../../config';\nimport { subscribe } from '../../../util/notifications';\nimport { updateUser } from '../../reducers';\nimport { setLanguage } from '../../../util/langProvider';\nimport { selectNotifySettings } from '../../selectors';\nimport { forceWebsync } from '../../../util/websync';\nimport { getShippingError } from '../../../util/getReadableErrorText';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n if (DEBUG) {\n if (update['@type'] !== 'updateUserStatus' && update['@type'] !== 'updateServerTimeOffset') {\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 'updateSession':\n onUpdateSession(update);\n break;\n\n case 'updateServerTimeOffset':\n onUpdateServerTimeOffset(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 const paymentShippingError = getShippingError(update.error);\n if (paymentShippingError) {\n actions.addPaymentError({ error: paymentShippingError });\n } else if (actions.showDialog) {\n actions.showDialog({ data: { ...update.error, hasErrorKey: true } });\n }\n\n break;\n }\n }\n});\n\nfunction onUpdateApiReady(global: GlobalState) {\n const { hasWebNotifications, hasPushNotifications } = selectNotifySettings(global);\n if (hasWebNotifications && hasPushNotifications) {\n void subscribe();\n }\n void 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 void forceWebsync(false);\n\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 void forceWebsync(true);\n\n setGlobal({\n ...global,\n isLoggingOut: false,\n lastSyncTime: Date.now(),\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 onUpdateSession(update: ApiUpdateSession) {\n const { sessionData } = update;\n const { authRememberMe, authState } = getGlobal();\n const isEmpty = !sessionData || !sessionData.mainDcId;\n\n if (!authRememberMe || authState !== 'authorizationStateReady' || isEmpty) {\n return;\n }\n\n getDispatch().saveSession({ sessionData });\n}\n\nfunction onUpdateServerTimeOffset(update: ApiUpdateServerTimeOffset) {\n const global = getGlobal();\n\n if (global.serverTimeOffset === update.serverTimeOffset) {\n return;\n }\n\n setGlobal({\n ...global,\n serverTimeOffset: update.serverTimeOffset,\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 updateSessionUserId(currentUser.id);\n}\n\nfunction updateSessionUserId(currentUserId: string) {\n const sessionUserAuth = localStorage.getItem(SESSION_USER_KEY);\n if (!sessionUserAuth) return;\n\n const userAuth = JSON.parse(sessionUserAuth);\n userAuth.id = currentUserId;\n\n localStorage.setItem(SESSION_USER_KEY, JSON.stringify(userAuth));\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ANIMATION_LEVEL_MAX } from '../../../config';\nimport {\n IS_ANDROID, IS_IOS, IS_MAC_OS, IS_TOUCH_ENV,\n} from '../../../util/environment';\nimport { setLanguage } from '../../../util/langProvider';\nimport switchTheme from '../../../util/switchTheme';\nimport { selectTheme } from '../../selectors';\nimport { startWebsync } from '../../../util/websync';\n\nconst HISTORY_ANIMATION_DURATION = 450;\n\nsubscribeToSystemThemeChange();\n\naddReducer('init', (global) => {\n const { animationLevel, messageTextSize, language } = global.settings.byKey;\n const theme = selectTheme(global);\n\n void setLanguage(language, undefined, true);\n\n document.documentElement.style.setProperty(\n '--composer-text-size', `${Math.max(messageTextSize, IS_IOS ? 16 : 15)}px`,\n );\n document.documentElement.style.setProperty('--message-meta-height', `${Math.floor(messageTextSize * 1.3125)}px`);\n document.documentElement.style.setProperty('--message-text-size', `${messageTextSize}px`);\n document.documentElement.setAttribute('data-message-text-size', messageTextSize.toString());\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 === ANIMATION_LEVEL_MAX);\n startWebsync();\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 } else if (IS_MAC_OS) {\n document.body.classList.add('is-macos');\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\naddReducer('disableHistoryAnimations', () => {\n setTimeout(() => {\n setGlobal({\n ...getGlobal(),\n shouldSkipHistoryAnimations: false,\n });\n document.body.classList.remove('no-animate');\n }, HISTORY_ANIMATION_DURATION);\n\n setGlobal({\n ...getGlobal(),\n shouldSkipHistoryAnimations: true,\n }, true);\n});\n\nfunction subscribeToSystemThemeChange() {\n function handleSystemThemeChange() {\n const currentThemeMatch = document.documentElement.className.match(/theme-(\\w+)/);\n const currentTheme = currentThemeMatch ? currentThemeMatch[1] : 'light';\n const global = getGlobal();\n const nextTheme = selectTheme(global);\n const { animationLevel } = global.settings.byKey;\n\n if (nextTheme !== currentTheme) {\n switchTheme(nextTheme, animationLevel === ANIMATION_LEVEL_MAX);\n // Force-update component containers\n setGlobal({ ...global });\n }\n }\n\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\n if (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', handleSystemThemeChange);\n } else if (typeof mql.addListener === 'function') {\n mql.addListener(handleSystemThemeChange);\n }\n}\n","import { addReducer } from '../../../lib/teact/teactn';\nimport { ISettings, IThemeSettings, ThemeKey } from '../../../types';\nimport { replaceSettings, replaceThemeSettings } from '../../reducers';\n\naddReducer('setSettingOption', (global, actions, payload?: Partial) => {\n return replaceSettings(global, payload);\n});\n\naddReducer('setThemeSettings', (global, actions, payload: { theme: ThemeKey } & Partial) => {\n const { theme, ...settings } = payload;\n\n return replaceThemeSettings(global, theme, settings);\n});\n","import {\n ApiChat,\n ApiUser,\n ApiChatBannedRights,\n ApiChatAdminRights,\n ApiChatFolder,\n MAIN_THREAD_ID,\n} from '../../api/types';\n\nimport { NotifyException, NotifySettings } from '../../types';\nimport { LangFn } from '../../hooks/useLang';\n\nimport { ARCHIVED_FOLDER_ID, REPLIES_USER_ID } from '../../config';\nimport { orderBy } from '../../util/iteratees';\nimport { getUserFirstOrLastName } from './users';\nimport { formatDateToString, formatTime } from '../../util/dateFormat';\n\nconst FOREVER_BANNED_DATE = Date.now() / 1000 + 31622400; // 366 days\n\nconst VERIFIED_PRIORITY_BASE = 3e9;\nconst PINNED_PRIORITY_BASE = 3e8;\n\nexport function isUserId(entityId: string) {\n // Workaround for old-fashioned IDs stored locally\n if (typeof entityId === 'number') {\n return entityId > 0;\n }\n\n return !entityId.startsWith('-');\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 isChatWithRepliesBot(chatId: string) {\n return chatId === REPLIES_USER_ID;\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\n// TODO Get rid of `user`\nexport function getChatTitle(lang: LangFn, chat: ApiChat, user?: ApiUser, isSelf = false) {\n if (isSelf || (user && chat.id === user.id && user.isSelf)) {\n return lang('SavedMessages');\n }\n return chat.title || lang('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 if (username) {\n return `https://t.me/${username}`;\n }\n\n const { inviteLink } = chat.fullInfo || {};\n\n return inviteLink;\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?.[key])\n || (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 || isChatWithRepliesBot(chat.id)) {\n return false;\n }\n\n if (chat.isCreator) {\n return true;\n }\n\n if (isUserId(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')) && (!isUserId(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(\n lang: LangFn,\n currentUserBannedRights?: ApiChatBannedRights,\n defaultBannedRights?: ApiChatBannedRights,\n) {\n if (currentUserBannedRights?.sendMessages) {\n const { untilDate } = currentUserBannedRights;\n return untilDate && untilDate < FOREVER_BANNED_DATE\n ? lang(\n 'Channel.Persmission.Denied.SendMessages.Until',\n lang(\n 'formatDateAtTime',\n [formatDateToString(new Date(untilDate * 1000), lang.code), formatTime(untilDate * 1000, lang)],\n ),\n )\n : lang('Channel.Persmission.Denied.SendMessages.Forever');\n }\n\n if (defaultBannedRights?.sendMessages) {\n return lang('Channel.Persmission.Denied.SendMessages.DefaultRestrictedText');\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.draftDate || 0, chat.lastMessage?.date || 0);\n}\n\nexport function isChatArchived(chat: ApiChat) {\n return chat.folderId === ARCHIVED_FOLDER_ID;\n}\n\nexport function selectIsChatMuted(\n chat: ApiChat, notifySettings: NotifySettings, notifyExceptions: Record = {},\n) {\n // If this chat is in exceptions they take precedence\n if (notifyExceptions[chat.id] && notifyExceptions[chat.id].isMuted !== undefined) {\n return notifyExceptions[chat.id].isMuted;\n }\n\n return (\n chat.isMuted\n || (isUserId(chat.id) && !notifySettings.hasPrivateChatsNotifications)\n || (isChatChannel(chat) && !notifySettings.hasBroadcastNotifications)\n || (isChatGroup(chat) && !notifySettings.hasGroupNotifications)\n );\n}\n\nexport function selectShouldShowMessagePreview(\n chat: ApiChat, notifySettings: NotifySettings, notifyExceptions: Record = {},\n) {\n const {\n hasPrivateChatsMessagePreview = true,\n hasBroadcastMessagePreview = true,\n hasGroupMessagePreview = true,\n } = notifySettings;\n // If this chat is in exceptions they take precedence\n if (notifyExceptions[chat.id] && notifyExceptions[chat.id].shouldShowPreviews !== undefined) {\n return notifyExceptions[chat.id].shouldShowPreviews;\n }\n\n return (isUserId(chat.id) && hasPrivateChatsMessagePreview)\n || (isChatChannel(chat) && hasBroadcastMessagePreview)\n || (isChatGroup(chat) && hasGroupMessagePreview);\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 notifySettings: NotifySettings,\n notifyExceptions?: Record,\n chatIdsCache?: string[],\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))\n .filter((id) => {\n return filterChatFolder(\n chatsById[id],\n folder,\n usersById,\n notifySettings,\n notifyExceptions,\n excludedChatIds,\n includedChatIds,\n 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 notifySettings: NotifySettings,\n notifyExceptions?: Record,\n excludedChatIds?: Set,\n includedChatIds?: Set,\n pinnedChatIds?: Set,\n) {\n if (!chat.isListed) {\n return false;\n }\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 (folder.excludeMuted && !chat.unreadMentionsCount && selectIsChatMuted(chat, notifySettings, notifyExceptions)) {\n return false;\n }\n\n if (!chat.unreadCount && !chat.unreadMentionsCount && !chat.hasUnreadMark && folder.excludeRead) {\n return false;\n }\n\n if (isUserId(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: string[],\n orderedPinnedIds?: string[],\n folderType: 'all' | 'archived' | 'folder' = 'all',\n) {\n const listIdsSet = new Set(listIds);\n const orderedPinnedIdsSet = orderedPinnedIds ? new Set(orderedPinnedIds) : undefined;\n\n const pinnedChats = orderedPinnedIds?.reduce((acc, id) => {\n const chat = chatsById[id];\n\n if (chat && listIdsSet.has(chat.id) && chatFilter(chat, folderType)) {\n acc.push(chat);\n }\n\n return acc;\n }, [] as ApiChat[]) || [];\n\n const otherChats = listIds.reduce((acc, id) => {\n const chat = chatsById[id];\n\n if (chat && (!orderedPinnedIdsSet || !orderedPinnedIdsSet.has(chat.id)) && chatFilter(chat, folderType)) {\n acc.push(chat);\n }\n\n return acc;\n }, [] as ApiChat[]);\n const otherChatsOrdered = orderBy(otherChats, getChatOrder, 'desc');\n\n return {\n pinnedChats,\n otherChats: otherChatsOrdered,\n };\n}\n\nfunction chatFilter(chat: ApiChat, folderType: 'all' | 'archived' | 'folder') {\n if (!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\nexport function reduceChatList(\n chatArrays: { pinnedChats: ApiChat[]; otherChats: ApiChat[] },\n filteredIds: string[],\n) {\n const filteredIdsSet = new Set(filteredIds);\n\n return {\n pinnedChats: chatArrays.pinnedChats.filter(({ id }) => filteredIdsSet.has(id)),\n otherChats: chatArrays.otherChats.filter(({ id }) => filteredIdsSet.has(id)),\n };\n}\n\nexport function getFolderUnreadDialogs(\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n chatIdsCache: string[],\n notifySettings: NotifySettings,\n notifyExceptions?: Record,\n) {\n const [listIds] = prepareFolderListIds(chatsById, usersById, folder, notifySettings, notifyExceptions, chatIdsCache);\n\n const listedChats = listIds\n .map((id) => chatsById[id])\n .filter((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 || (!selectIsChatMuted(chat, notifySettings, notifyExceptions) && (chat.unreadCount || chat.hasUnreadMark))\n ));\n\n return {\n unreadDialogsCount,\n hasActiveDialogs,\n };\n}\n\nexport function getFolderDescriptionText(\n lang: LangFn,\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n chatIdsCache: string[],\n notifySettings: NotifySettings,\n notifyExceptions?: Record,\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?.length)\n || (includedChatIds?.length)\n ) {\n const length = getFolderChatsCount(chatsById, usersById, folder, chatIdsCache, notifySettings, notifyExceptions);\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: string[],\n notifySettings: NotifySettings,\n notifyExceptions?: Record,\n) {\n const [listIds, pinnedIds] = prepareFolderListIds(\n chatsById, usersById, folder, notifySettings, notifyExceptions, chatIdsCache,\n );\n const { pinnedChats, otherChats } = prepareChatList(chatsById, listIds, pinnedIds, 'folder');\n return pinnedChats.length + otherChats.length;\n}\n\nexport function getMessageSenderName(lang: LangFn, chatId: string, sender?: ApiUser) {\n if (!sender || isUserId(chatId)) {\n return undefined;\n }\n\n if (sender.isSelf) {\n return lang('FromYou');\n }\n\n return getUserFirstOrLastName(sender);\n}\n\nexport function sortChatIds(\n chatIds: string[],\n chatsById: Record,\n shouldPrioritizeVerified = false,\n priorityIds?: string[],\n) {\n return orderBy(chatIds, (id) => {\n const chat = chatsById[id];\n if (!chat) {\n return 0;\n }\n\n let priority = 0;\n\n if (chat.lastMessage) {\n priority += chat.lastMessage.date;\n }\n\n if (shouldPrioritizeVerified && chat.isVerified) {\n priority += VERIFIED_PRIORITY_BASE; // ~100 years in seconds\n }\n\n if (priorityIds && priorityIds.includes(id)) {\n priority = Date.now() + PINNED_PRIORITY_BASE + (priorityIds.length - priorityIds.indexOf(id));\n }\n\n return priority;\n }, 'desc');\n}\n","import {\n ApiChat, ApiMessage, ApiMessageEntityTypes, ApiUser,\n} from '../../api/types';\nimport { LangFn } from '../../hooks/useLang';\n\nimport { LOCAL_MESSAGE_ID_BASE, SERVICE_NOTIFICATIONS_USER_ID, RE_LINK_TEMPLATE } from '../../config';\nimport { getUserFullName } from './users';\nimport { isWebpSupported, IS_OPUS_SUPPORTED } from '../../util/environment';\nimport { getChatTitle, isUserId } from './chats';\nimport parseEmojiOnlyString from '../../components/common/helpers/parseEmojiOnlyString';\n\nconst CONTENT_NOT_SUPPORTED = 'The message is not supported on this version of Telegram';\nconst RE_LINK = new RegExp(RE_LINK_TEMPLATE, 'i');\nconst TRUNCATED_SUMMARY_LENGTH = 80;\n\nexport type MessageKey = `msg${string}-${number}`;\n\nexport function getMessageKey(message: ApiMessage): MessageKey {\n const { chatId, id } = message;\n\n return buildMessageKey(chatId, id);\n}\n\nexport function buildMessageKey(chatId: string, msgId: number): MessageKey {\n return `msg${chatId}-${msgId}`;\n}\n\nexport function parseMessageKey(key: MessageKey) {\n const match = key.match(/^msg(-?\\d+)-(\\d+)/)!;\n\n return { chatId: match[1], messageId: Number(match[2]) };\n}\n\nexport function getMessageOriginalId(message: ApiMessage) {\n return message.previousLocalId || message.id;\n}\n\nexport function getMessageSummaryText(lang: LangFn, message: ApiMessage, noEmoji = false) {\n const {\n text, photo, video, audio, voice, document, sticker, contact, poll, invoice,\n } = message.content;\n\n const truncatedText = text && text.text.substr(0, TRUNCATED_SUMMARY_LENGTH);\n\n if (message.groupedId) {\n return `${noEmoji ? '' : '🖼 '}${truncatedText || lang('lng_in_dlg_album')}`;\n }\n\n if (photo) {\n return `${noEmoji ? '' : '🖼 '}${truncatedText || lang('AttachPhoto')}`;\n }\n\n if (video) {\n return `${noEmoji ? '' : '📹 '}${truncatedText || lang(video.isGif ? 'AttachGif' : 'AttachVideo')}`;\n }\n\n if (sticker) {\n return `${sticker.emoji || ''} ${lang('AttachSticker')}`.trim();\n }\n\n if (audio) {\n return `${noEmoji ? '' : '🎧 '}${getMessageAudioCaption(message) || lang('AttachMusic')}`;\n }\n\n if (voice) {\n return `${noEmoji ? '' : '🎤 '}${truncatedText || lang('AttachAudio')}`;\n }\n\n if (document) {\n return `${noEmoji ? '' : '📎 '}${truncatedText || document.fileName}`;\n }\n\n if (contact) {\n return lang('AttachContact');\n }\n\n if (poll) {\n return `${noEmoji ? '' : '📊 '}${poll.summary.question}`;\n }\n\n if (invoice) {\n return 'Invoice';\n }\n\n if (text) {\n return truncatedText;\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?.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?.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 && Math.round(message.id) !== message.id;\n}\n\nexport function isAnonymousOwnMessage(message: ApiMessage) {\n return Boolean(message.senderId) && !isUserId(message.senderId!) && isOwnMessage(message);\n}\n\nexport function getSenderTitle(lang: LangFn, sender: ApiUser | ApiChat) {\n return isUserId(sender.id) ? getUserFullName(sender as ApiUser) : getChatTitle(lang, 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\nexport function getMessageAudioCaption(message: ApiMessage) {\n const { audio, text } = message.content;\n\n return (audio && [audio.title, audio.performer].filter(Boolean).join(' — ')) || (text?.text);\n}\n\nexport function getMessageContentFilename(message: ApiMessage) {\n const { content } = message;\n\n const video = content.webPage ? content.webPage.video : content.video;\n const photo = content.webPage ? content.webPage.photo : content.photo;\n const document = content.webPage ? content.webPage.document : content.document;\n if (document) {\n return document.fileName;\n }\n\n if (video) {\n return video.fileName;\n }\n\n if (content.sticker) {\n const extension = content.sticker.isAnimated ? 'tgs' : isWebpSupported() ? 'webp' : 'png';\n return `${content.sticker.id}.${extension}`;\n }\n\n if (content.audio) {\n return content.audio.fileName;\n }\n\n const baseFilename = getMessageKey(message);\n\n if (photo) {\n return `${baseFilename}.jpg`;\n }\n\n if (content.voice) {\n return IS_OPUS_SUPPORTED ? `${baseFilename}.ogg` : `${baseFilename}.wav`;\n }\n\n return baseFilename;\n}\n","import {\n ApiAudio, ApiMediaFormat, ApiMessage, ApiMessageSearchType, ApiPhoto, ApiVideo, ApiDimensions,\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\ntype Target =\n 'micro'\n | 'pictogram'\n | 'inline'\n | 'viewerPreview'\n | 'viewerFull'\n | 'download';\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?.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 isMessageDocumentPhoto(message: ApiMessage) {\n const document = getMessageDocument(message);\n return document ? document.mediaType === 'photo' : undefined;\n}\n\nexport function isMessageDocumentVideo(message: ApiMessage) {\n const document = getMessageDocument(message);\n return document ? document.mediaType === 'video' : undefined;\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 return getMessageWebPage(message)?.photo;\n}\n\nexport function getMessageWebPageDocument(message: ApiMessage) {\n return getMessageWebPage(message)?.document;\n}\n\nexport function getMessageWebPageVideo(message: ApiMessage): ApiVideo | undefined {\n return getMessageWebPage(message)?.video;\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 || getMessageWebPageVideo(message);\n\n if (!media) {\n return undefined;\n }\n\n return media.thumbnail;\n}\n\nexport function getMessageMediaThumbDataUri(message: ApiMessage) {\n return getMessageMediaThumbnail(message)?.dataUri;\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 const webPageVideo = getMessageWebPageVideo(message);\n\n const messageVideo = video || webPageVideo;\n const messagePhoto = photo || webPagePhoto;\n\n if (!(messagePhoto || messageVideo || sticker || audio || voice || document)) {\n return undefined;\n }\n\n const base = getMessageKey(message);\n\n if (messageVideo) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n return !hasMessageLocalBlobUrl(message) ? getVideoOrAudioBaseHash(messageVideo, base) : undefined;\n case 'viewerPreview':\n return `${base}?size=m`;\n case 'viewerFull':\n return getVideoOrAudioBaseHash(messageVideo, base);\n case 'download':\n return `${base}?download`;\n }\n }\n\n if (messagePhoto) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n return !hasMessageLocalBlobUrl(message) ? `${base}?size=x` : undefined;\n case 'viewerPreview':\n return `${base}?size=x`;\n case 'viewerFull':\n case 'download':\n return `${base}?size=z`;\n }\n }\n\n if (document) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n case 'inline':\n case 'viewerPreview':\n if (!getDocumentHasPreview(document) || hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n return `${base}?size=m`;\n case 'viewerFull':\n case 'download':\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 case 'inline':\n return base;\n case 'download':\n return `${base}?download`;\n }\n }\n\n if (audio) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return getAudioHasCover(audio) ? `${base}?size=m` : undefined;\n case 'inline':\n return getVideoOrAudioBaseHash(audio, base);\n case 'download':\n return `${base}?download`;\n }\n }\n\n if (voice) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return undefined;\n case 'inline':\n return base;\n case 'download':\n return `${base}?download`;\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 getAudioHasCover(media: ApiAudio) {\n return media.thumbnailSizes && media.thumbnailSizes.length > 0;\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 const fullVideo = video || getMessageWebPageVideo(message);\n\n if (sticker && target === 'inline' && sticker.isAnimated) {\n return ApiMediaFormat.Lottie;\n } else if (fullVideo && IS_PROGRESSIVE_SUPPORTED && (\n target === 'viewerFull' || target === 'inline'\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 getMessageFileName(message: ApiMessage) {\n const {\n photo, video, document,\n } = message.content;\n const webPagePhoto = getMessageWebPagePhoto(message);\n const webPageVideo = getMessageWebPageVideo(message);\n\n if (photo || webPagePhoto) {\n return `photo${message.date}.jpeg`;\n }\n\n const { fileName } = video || webPageVideo || document || {};\n\n return fileName;\n}\n\nexport function getMessageFileSize(message: ApiMessage) {\n const { video, document } = message.content;\n const webPageVideo = getMessageWebPageVideo(message);\n const { size } = video || webPageVideo || document || {};\n\n return size;\n}\n\nexport function hasMessageLocalBlobUrl(message: ApiMessage) {\n const { photo, video, document } = message.content;\n\n return (photo?.blobUrl) || (video?.blobUrl) || (document?.previewBlobUrl);\n}\n\nexport function getChatMediaMessageIds(\n messages: Record, listedIds: number[], isFromSharedMedia = false,\n) {\n const ids = getMessageContentIds(messages, listedIds, isFromSharedMedia ? 'media' : 'inlineMedia');\n\n return isFromSharedMedia ? ids.reverse() : ids;\n}\n\nexport function getPhotoFullDimensions(photo: ApiPhoto): ApiDimensions | 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): ApiDimensions | 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): ApiDimensions | undefined {\n if (video.width && video.height) {\n return video as ApiDimensions;\n }\n\n return undefined;\n}\n\nexport function getMediaTransferState(message: ApiMessage, progress?: number, isLoadNeeded = false) {\n const isUploading = isMessageLocal(message);\n const isTransferring = isUploading || isLoadNeeded;\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 | 'inlineMedia',\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 case 'voice':\n validator = (message: ApiMessage) => {\n const video = getMessageVideo(message);\n return getMessageVoice(message) || (video && video.isRound);\n };\n break;\n\n case 'inlineMedia':\n validator = (message: ApiMessage) => {\n const video = getMessageVideo(message);\n return (\n getMessagePhoto(message)\n || (video && !video.isRound && !video.isGif)\n || isMessageDocumentPhoto(message)\n || isMessageDocumentVideo(message)\n );\n };\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 || getMessageWebPageVideo(message);\n if (!media) {\n return undefined;\n }\n\n return media.duration;\n}\n","export function buildChatThreadKey(chatId: string, threadId: number) {\n return `${chatId}_${threadId}`;\n}\n","import { ApiFieldError } from '../../api/types';\n\nconst STRIPE_ERRORS: Record = {\n missing_payment_information: {\n field: 'cardNumber',\n message: 'Incorrect card number',\n },\n invalid_number: {\n field: 'cardNumber',\n message: 'Incorrect card number',\n },\n number: {\n field: 'cardNumber',\n message: 'Incorrect card number',\n },\n exp_year: {\n field: 'expiry',\n message: 'Incorrect year',\n },\n exp_month: {\n field: 'expiry',\n message: 'Incorrect month',\n },\n invalid_expiry_year: {\n field: 'expiry',\n message: 'Incorrect year',\n },\n invalid_expiry_month: {\n field: 'expiry',\n message: 'Incorrect month',\n },\n cvc: {\n field: 'cvv',\n message: 'Incorrect CVV',\n },\n invalid_cvc: {\n field: 'cvv',\n message: 'Incorrect CVV',\n },\n};\n\nexport function getStripeError(error: {\n code: string;\n message: string;\n param?: string;\n}) {\n const { message: description, code, param } = error;\n const { field, message } = param ? STRIPE_ERRORS[param] : STRIPE_ERRORS[code];\n\n return { field, message, description };\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';\nimport { getServerTime } from '../../util/serverTime';\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(lang: LangFn, user: ApiUser, serverTimeOffset: number) {\n if (user.id === SERVICE_NOTIFICATIONS_USER_ID) {\n return lang('ServiceNotifications').toLowerCase();\n }\n\n if (user.type && user.type === 'userTypeBot') {\n return lang('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(new Date().getTime() + serverTimeOffset * 1000);\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 const serverToday = new Date(today.getTime() + serverTimeOffset * 1000);\n if (wasOnlineDate > serverToday) {\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, lang));\n }\n\n // yesterday\n const yesterday = new Date();\n yesterday.setDate(now.getDate() - 1);\n yesterday.setHours(0, 0, 0, 0);\n const serverYesterday = new Date(yesterday.getTime() + serverTimeOffset * 1000);\n if (wasOnlineDate > serverYesterday) {\n return lang('LastSeen.YesterdayAt', formatTime(wasOnlineDate, lang));\n }\n\n return lang('LastSeen.AtDate', formatFullDate(lang, 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 getCanAddContact(user: ApiUser) {\n return !user.isContact && !isUserBot(user);\n}\n\nexport function sortUserIds(\n userIds: string[],\n usersById: Record,\n priorityIds?: string[],\n serverTimeOffset = 0,\n) {\n return orderBy(userIds, (id) => {\n const now = getServerTime(serverTimeOffset);\n\n if (priorityIds && priorityIds.includes(id)) {\n // Assuming that online status expiration date can't be as far as two days from now,\n // this should place prioritized on top of the list.\n // Then we subtract index of `id` in `priorityIds` to preserve selected order\n return now + (48 * 60 * 60) - (priorityIds.length - 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\nexport function getUserIdDividend(userId: string) {\n // Workaround for old-fashioned IDs stored locally\n if (typeof userId === 'number') {\n return Math.abs(userId);\n }\n\n return Math.abs(Number(userId));\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 ? getUserIdDividend(peer.id) % 7 : 0;\n\n return USER_COLOR_KEYS[index];\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiChat, ApiPhoto } from '../../api/types';\n\nimport { ARCHIVED_FOLDER_ID } from '../../config';\nimport { omit } from '../../util/iteratees';\nimport { selectChatListType } from '../selectors';\n\nexport function replaceChatListIds(\n global: GlobalState,\n type: 'active' | 'archived',\n newIds: string[] | 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: string[]): GlobalState {\n const { [type]: listIds } = global.chats.listIds;\n const newIds = 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\n// @optimization Don't spread/unspread global for each element, do it in a batch\nfunction getUpdatedChat(\n global: GlobalState, chatId: string, chatUpdate: Partial, photo?: ApiPhoto,\n): ApiChat {\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 ...(photo && { photos: [photo, ...(chat.photos || [])] }),\n };\n\n if (!updatedChat.id || !updatedChat.type) {\n return updatedChat;\n }\n\n return updatedChat;\n}\n\nexport function updateChat(\n global: GlobalState, chatId: string, chatUpdate: Partial, photo?: ApiPhoto,\n): GlobalState {\n const { byId } = global.chats;\n\n const updatedChat = getUpdatedChat(global, chatId, chatUpdate, photo);\n\n return replaceChats(global, {\n ...byId,\n [chatId]: updatedChat,\n });\n}\n\nexport function updateChats(global: GlobalState, updatedById: Record): GlobalState {\n const updatedChats = Object.keys(updatedById).reduce>((acc, id) => {\n const updatedChat = getUpdatedChat(global, id, updatedById[id]);\n if (updatedChat) {\n acc[id] = updatedChat;\n }\n return acc;\n }, {});\n\n global = replaceChats(global, {\n ...global.chats.byId,\n ...updatedChats,\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 let isAdded = false;\n\n const addedChats = Object.keys(addedById).reduce>((acc, id) => {\n if (!byId[id] || (byId[id].isMin && !addedById[id].isMin)) {\n const updatedChat = getUpdatedChat(global, id, addedById[id]);\n if (updatedChat) {\n acc[id] = updatedChat;\n\n if (!isAdded) {\n isAdded = true;\n }\n }\n }\n return acc;\n }, {});\n\n if (isAdded) {\n global = replaceChats(global, {\n ...global.chats.byId,\n ...addedChats,\n });\n }\n\n return global;\n}\n\nexport function updateChatListType(\n global: GlobalState,\n chatId: string,\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?: string[];\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\nexport function leaveChat(global: GlobalState, leftChatId: string): GlobalState {\n const listType = selectChatListType(global, leftChatId);\n if (!listType) {\n return global;\n }\n\n const { [listType]: listIds } = global.chats.listIds;\n\n if (listIds) {\n global = replaceChatListIds(global, listType, listIds.filter((listId) => listId !== leftChatId));\n }\n\n global = updateChat(global, leftChatId, { isNotJoined: true });\n\n return global;\n}\n","import {\n GlobalState, MessageList, MessageListType, Thread,\n} from '../../global/types';\nimport { ApiMessage, ApiThreadInfo, MAIN_THREAD_ID } from '../../api/types';\nimport { FocusDirection } from '../../types';\n\nimport {\n IS_TEST, MESSAGE_LIST_SLICE, MESSAGE_LIST_VIEWPORT_LIMIT, TMP_CHAT_ID,\n} 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: string | undefined,\n threadId: number = MAIN_THREAD_ID,\n type: MessageListType = 'thread',\n shouldReplaceHistory?: boolean,\n): GlobalState {\n const { messageLists } = global.messages;\n let newMessageLists: MessageList[] = messageLists;\n if (shouldReplaceHistory || IS_TEST) {\n newMessageLists = chatId ? [{ chatId, threadId, type }] : [];\n } else if (chatId) {\n const last = messageLists[messageLists.length - 1];\n if (!last || last.chatId !== chatId || last.threadId !== threadId || last.type !== type) {\n if (last && last.chatId === TMP_CHAT_ID) {\n newMessageLists = [...messageLists.slice(0, -1), { chatId, threadId, type }];\n } else {\n newMessageLists = [...messageLists, { chatId, threadId, type }];\n }\n }\n } else {\n newMessageLists = messageLists.slice(0, -1);\n }\n\n return {\n ...global,\n messages: {\n ...global.messages,\n messageLists: newMessageLists,\n },\n };\n}\n\nfunction replaceChatMessages(global: GlobalState, chatId: string, newById: Record): GlobalState {\n return updateMessageStore(global, chatId, {\n byId: newById,\n });\n}\n\nfunction updateThread(\n global: GlobalState, chatId: string, threadId: number, threadUpdate: Partial,\n): GlobalState {\n const current = global.messages.byChatId[chatId];\n\n return updateMessageStore(global, chatId, {\n threadsById: {\n ...(current?.threadsById),\n [threadId]: {\n ...(current?.threadsById[threadId]),\n ...threadUpdate,\n },\n },\n });\n}\n\nfunction updateMessageStore(\n global: GlobalState, chatId: string, 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: string, 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).forEach((chatId) => {\n global = addChatMessagesById(global, chatId, addedByChatId[chatId]);\n });\n\n return global;\n}\n\nexport function addChatMessagesById(\n global: GlobalState, chatId: string, 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: string, 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: string, 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 });\n}\n\nexport function deleteChatMessages(\n global: GlobalState,\n chatId: string,\n messageIds: number[],\n): GlobalState {\n const byId = selectChatMessages(global, chatId);\n if (!byId) {\n return global;\n }\n const newById = omit(byId, messageIds);\n const deletedForwardedPosts = Object.values(pickTruthy(byId, messageIds)).filter(\n ({ forwardInfo }) => forwardInfo?.isLinkedChannelPost,\n );\n\n const threadIds = Object.keys(global.messages.byChatId[chatId].threadsById).map(Number);\n threadIds.forEach((threadId) => {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n\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 let newMessageCount = threadInfo?.messagesCount;\n\n messageIds.forEach((messageId) => {\n if (listedIds && listedIds.includes(messageId)) {\n listedIds = listedIds.filter((id) => id !== messageId);\n if (newMessageCount !== undefined) newMessageCount -= 1;\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 if (threadInfo && newMessageCount !== undefined) {\n global = replaceThreadParam(global, chatId, threadId, 'threadInfo', {\n ...threadInfo,\n messagesCount: newMessageCount,\n });\n }\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?.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: string,\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);\n\n return global;\n}\n\nexport function updateListedIds(\n global: GlobalState,\n chatId: string,\n threadId: number,\n idsUpdate: number[],\n): GlobalState {\n const listedIds = selectListedIds(global, chatId, threadId);\n const newIds = 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: string,\n threadId: number,\n idsUpdate: number[],\n): GlobalState {\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n const newIds = 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: string,\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: string,\n threadId: number,\n newViewportIds: number[],\n): GlobalState {\n const currentIds = selectViewportIds(global, chatId, threadId) || [];\n const newIds = orderHistoryIds(newViewportIds);\n\n return replaceThreadParam(\n global,\n chatId,\n threadId,\n 'viewportIds',\n areSortedArraysEqual(currentIds, newIds) ? currentIds : newIds,\n );\n}\n\nexport function updateThreadInfo(\n global: GlobalState, chatId: string, 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: string, 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: string, newById: Record,\n): GlobalState {\n return updateScheduledMessages(global, chatId, {\n byId: newById,\n });\n}\n\nfunction updateScheduledMessages(\n global: GlobalState, chatId: string, update: Partial<{ byId: Record }>,\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?: string, messageId?: number, noHighlight = false, isResizingContainer = false,\n): GlobalState {\n return {\n ...global,\n focusedMessage: {\n ...global.focusedMessage,\n chatId,\n messageId,\n noHighlight,\n isResizingContainer,\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: string,\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: string,\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\nexport function updateThreadUnreadFromForwardedMessage(\n global: GlobalState,\n originMessage: ApiMessage,\n chatId: string,\n lastMessageId: number,\n isDeleting?: boolean,\n) {\n const { channelPostId, fromChatId } = originMessage.forwardInfo || {};\n if (channelPostId && fromChatId) {\n const threadInfoOld = selectThreadInfo(global, chatId, channelPostId);\n if (threadInfoOld) {\n global = replaceThreadParam(global, chatId, channelPostId, 'threadInfo', {\n ...threadInfoOld,\n lastMessageId,\n messagesCount: threadInfoOld.messagesCount + (isDeleting ? -1 : 1),\n });\n }\n }\n return global;\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: string,\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?: string,\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}\n\n// @optimization Don't spread/unspread global for each element, do it in a batch\nfunction getUpdatedUser(global: GlobalState, userId: string, userUpdate: Partial): ApiUser {\n const { byId } = global.users;\n const user = byId[userId];\n const shouldOmitMinInfo = userUpdate.isMin && user && !user.isMin;\n\n const updatedUser = {\n ...user,\n ...(shouldOmitMinInfo ? omit(userUpdate, ['isMin', 'accessHash']) : userUpdate),\n };\n\n if (!updatedUser.id || !updatedUser.type) {\n return user;\n }\n\n return updatedUser;\n}\n\nfunction updateContactList(global: GlobalState, updatedUsers: ApiUser[]): GlobalState {\n const { userIds: contactUserIds } = global.contactList || {};\n\n if (!contactUserIds) return global;\n\n const newContactUserIds = updatedUsers\n .filter((user) => user?.isContact && !contactUserIds.includes(user.id))\n .map((user) => user.id);\n\n if (newContactUserIds.length === 0) return global;\n\n return {\n ...global,\n contactList: {\n userIds: [\n ...newContactUserIds,\n ...contactUserIds,\n ],\n },\n };\n}\n\nexport function updateUser(global: GlobalState, userId: string, userUpdate: Partial): GlobalState {\n const { byId } = global.users;\n\n const updatedUser = getUpdatedUser(global, userId, userUpdate);\n\n global = updateContactList(global, [updatedUser]);\n\n return replaceUsers(global, {\n ...byId,\n [userId]: updatedUser,\n });\n}\n\nexport function updateUsers(global: GlobalState, updatedById: Record): GlobalState {\n const updatedUsers = Object.keys(updatedById).reduce>((acc, id) => {\n const updatedUser = getUpdatedUser(global, id, updatedById[id]);\n if (updatedUser) {\n acc[id] = updatedUser;\n }\n return acc;\n }, {});\n\n global = updateContactList(global, Object.values(updatedUsers));\n\n global = replaceUsers(global, {\n ...global.users.byId,\n ...updatedUsers,\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 let isAdded = false;\n\n const addedUsers = Object.keys(addedById).reduce>((acc, id) => {\n if (!byId[id] || (byId[id].isMin && !addedById[id].isMin)) {\n const updatedUser = getUpdatedUser(global, id, addedById[id]);\n if (updatedUser) {\n acc[id] = updatedUser;\n\n if (!isAdded) {\n isAdded = true;\n }\n }\n }\n return acc;\n }, {});\n\n if (isAdded) {\n global = replaceUsers(global, {\n ...global.users.byId,\n ...addedUsers,\n });\n\n global = updateContactList(global, Object.values(addedUsers));\n }\n\n return global;\n}\n\nexport function updateSelectedUserId(global: GlobalState, selectedId?: string): 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: string): GlobalState {\n const { byId } = global.users;\n const { userIds } = global.contactList || {};\n delete byId[userId];\n\n global = {\n ...global,\n contactList: {\n userIds: userIds ? userIds.filter((id) => id !== userId) : MEMO_EMPTY_ARRAY,\n },\n };\n\n return replaceUsers(global, byId);\n}\n\nexport function updateUserSearch(\n global: GlobalState,\n searchStatePartial: Partial,\n) {\n return {\n ...global,\n userSearch: {\n ...global.userSearch,\n ...searchStatePartial,\n },\n };\n}\n\nexport function updateUserSearchFetchingStatus(\n global: GlobalState, newState: boolean,\n) {\n return updateUserSearch(global, {\n fetchingStatus: newState,\n });\n}\n\nexport function updateUserBlockedState(global: GlobalState, userId: string, isBlocked: boolean) {\n const { byId } = global.users;\n const user = byId[userId];\n if (!user || !user.fullInfo) {\n return global;\n }\n\n return updateUser(global, userId, {\n ...user,\n fullInfo: {\n ...user.fullInfo,\n isBlocked,\n },\n });\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?.[type]?.foundIds;\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: string,\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: string,\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: string,\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?.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: string,\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: string,\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: string,\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: string,\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?.[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: string, 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 {\n ISettings, IThemeSettings, ThemeKey, NotifyException,\n} from '../../types';\nimport { ApiNotifyException } from '../../api/types';\nimport { updateUserBlockedState } from './users';\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 replaceThemeSettings(\n global: GlobalState, theme: ThemeKey, newSettings?: Partial,\n): GlobalState {\n return {\n ...global,\n settings: {\n ...global.settings,\n themes: {\n ...global.settings.themes,\n [theme]: {\n ...(global.settings.themes[theme] || {}),\n ...newSettings,\n },\n },\n },\n };\n}\n\nexport function addNotifyExceptions(\n global: GlobalState, notifyExceptions: ApiNotifyException[],\n): GlobalState {\n notifyExceptions.forEach((notifyException) => {\n const { chatId, ...exceptionData } = notifyException;\n global = addNotifyException(global, chatId, exceptionData);\n });\n\n return global;\n}\n\nexport function addNotifyException(\n global: GlobalState, id: string, notifyException: NotifyException,\n): GlobalState {\n return {\n ...global,\n settings: {\n ...global.settings,\n notifyExceptions: {\n ...global.settings.notifyExceptions,\n [id]: notifyException,\n },\n },\n };\n}\n\nexport function updateNotifySettings(\n global: GlobalState, peerType: 'contact' | 'group' | 'broadcast', isSilent?: boolean, shouldShowPreviews?: boolean,\n) {\n switch (peerType) {\n case 'contact':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasPrivateChatsNotifications: !isSilent }),\n ...(typeof shouldShowPreviews !== 'undefined' && { hasPrivateChatsMessagePreview: shouldShowPreviews }),\n });\n case 'group':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasGroupNotifications: !isSilent }),\n ...(typeof shouldShowPreviews !== 'undefined' && { hasGroupMessagePreview: shouldShowPreviews }),\n });\n case 'broadcast':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasBroadcastNotifications: !isSilent }),\n ...(typeof shouldShowPreviews !== 'undefined' && { hasBroadcastMessagePreview: shouldShowPreviews }),\n });\n\n default:\n return undefined;\n }\n}\n\nexport function addBlockedContact(global: GlobalState, contactId: string): GlobalState {\n global = updateUserBlockedState(global, contactId, true);\n\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: string): GlobalState {\n global = updateUserBlockedState(global, contactId, false);\n\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 requestId: 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 amount,\n currency,\n isTest,\n photoUrl,\n } = message.content.invoice;\n return {\n ...global,\n payment: {\n ...global.payment,\n invoiceContent: {\n title,\n text,\n photoUrl,\n amount,\n currency,\n isTest,\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 { ApiChat, MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalState } from '../../global/types';\n\nimport {\n getPrivateChatUserId, isChatChannel, isUserId, isHistoryClearMessage, isUserBot, isUserOnline, selectIsChatMuted,\n} from '../helpers';\nimport { selectUser } from './users';\nimport {\n ALL_FOLDER_ID, ARCHIVED_FOLDER_ID, MEMBERS_LOAD_SLICE, SERVICE_NOTIFICATIONS_USER_ID,\n} from '../../config';\nimport { selectNotifyExceptions, selectNotifySettings } from './settings';\n\nexport function selectChat(global: GlobalState, chatId: string): 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: string) {\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 (isUserId(chat.id) || isChatChannel(chat) || !chat.fullInfo) {\n return undefined;\n }\n\n if (!chat.fullInfo.members || chat.fullInfo.members.length === MEMBERS_LOAD_SLICE) {\n return chat.fullInfo.onlineCount;\n }\n\n return chat.fullInfo.members.reduce((onlineCount, { userId }) => {\n if (global.users.byId[userId] && isUserOnline(global.users.byId[userId]) && userId !== global.currentUserId) {\n return onlineCount + 1;\n }\n\n return onlineCount;\n }, 0);\n}\n\nexport function selectChatBot(global: GlobalState, chatId: string) {\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: string) {\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: string, 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: string): '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: string, 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\n// Slow, not to be used in `withGlobal`\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 const notifySettings = selectNotifySettings(global);\n const notifyExceptions = selectNotifyExceptions(global);\n\n return activeChatIds.reduce((acc, chatId) => {\n const chat = chats[chatId];\n\n if (\n chat\n && chat.unreadCount\n && chat.isListed\n && !chat.isNotJoined\n && !chat.isRestricted\n && (chat.unreadMentionsCount || !selectIsChatMuted(chat, notifySettings, notifyExceptions))\n ) {\n return acc + chat.unreadCount;\n }\n\n return acc;\n }, 0);\n}\n\nexport function selectIsServiceChatReady(global: GlobalState) {\n return Boolean(selectChat(global, SERVICE_NOTIFICATIONS_USER_ID));\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 selectStickerSetByShortName(global: GlobalState, shortName: string) {\n return Object.values(global.stickers.setsById).find((l) => l.shortName.toLowerCase() === shortName.toLowerCase());\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 // Some emojis (❤️ for example) with a service symbol 'VARIATION SELECTOR-16' are not recognized as animated\n const cleanedEmoji = emoji.replace('\\ufe0f', '');\n\n return animatedEmojis.stickers.find((sticker) => sticker.emoji === emoji || sticker.emoji === cleanedEmoji);\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, SERVICE_NOTIFICATIONS_USER_ID } from '../../config';\nimport {\n selectChat, selectIsChatWithBot, selectIsChatWithSelf,\n} from './chats';\nimport { selectIsUserOrChatContact, selectUser } from './users';\nimport {\n getSendingState,\n isChatChannel,\n isMessageLocal,\n isUserId,\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 getMessageWebPageVideo,\n getMessagePhoto,\n getMessageAudio,\n getMessageVoice,\n getMessageDocument,\n getMessageWebPagePhoto,\n} from '../helpers';\nimport { findLast } from '../../util/iteratees';\nimport { selectIsStickerFavorite } from './symbols';\nimport { getServerTime } from '../../util/serverTime';\nimport { MEMO_EMPTY_ARRAY } from '../../util/memo';\n\nconst MESSAGE_EDIT_ALLOWED_TIME = 172800; // 48 hours\n\nexport function selectCurrentMessageList(global: GlobalState) {\n const { messageLists } = global.messages;\n\n if (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: string) {\n return global.messages.byChatId[chatId]?.byId;\n}\n\nexport function selectScheduledMessages(global: GlobalState, chatId: string) {\n return global.scheduledMessages.byChatId[chatId]?.byId;\n}\n\nexport function selectThreadParam(\n global: GlobalState,\n chatId: string,\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: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'listedIds');\n}\n\nexport function selectOutlyingIds(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'outlyingIds');\n}\n\nexport function selectCurrentMessageIds(\n global: GlobalState, chatId: string, 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: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'viewportIds');\n}\n\nexport function selectPinnedIds(global: GlobalState, chatId: string) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'pinnedIds');\n}\n\nexport function selectScheduledIds(global: GlobalState, chatId: string) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds');\n}\n\nexport function selectScrollOffset(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'scrollOffset');\n}\n\nexport function selectReplyingToId(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'replyingToId');\n}\n\nexport function selectEditingId(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'editingId');\n}\n\nexport function selectEditingScheduledId(global: GlobalState, chatId: string) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'editingScheduledId');\n}\n\nexport function selectDraft(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'draft');\n}\n\nexport function selectNoWebPage(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'noWebPage');\n}\n\nexport function selectThreadInfo(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'threadInfo');\n}\n\nexport function selectFirstMessageId(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'firstMessageId');\n}\n\nexport function selectReplyStack(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'replyStack');\n}\n\nexport function selectThreadOriginChat(global: GlobalState, chatId: string, 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: string, 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: string, 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: string, 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: string, 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: string, messageId: number) {\n const chatMessages = selectChatMessages(global, chatId);\n\n return chatMessages ? chatMessages[messageId] : undefined;\n}\n\nexport function selectScheduledMessage(global: GlobalState, chatId: string, messageId: number) {\n const chatMessages = selectScheduledMessages(global, chatId);\n\n return chatMessages ? chatMessages[messageId] : undefined;\n}\n\nexport function selectEditingMessage(\n global: GlobalState, chatId: string, 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: string) {\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 isUserId(senderId) ? 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) || selectChat(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 = isUserId(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 isLocal = isMessageLocal(message);\n const isServiceNotification = isServiceNotificationMessage(message);\n const isOwn = isOwnMessage(message);\n const isAction = isActionMessage(message);\n const { content } = message;\n\n const canEditMessagesIndefinitely = isChatWithSelf\n || (isSuperGroup && getHasAdminRight(chat, 'pinMessages'))\n || (isChannel && getHasAdminRight(chat, 'editMessages'));\n const isMessageEditable = (\n (\n canEditMessagesIndefinitely\n || getServerTime(global.serverTimeOffset) - message.date < MESSAGE_EDIT_ALLOWED_TIME\n ) && !(\n content.sticker || content.contact || content.poll || content.action || content.audio\n || (content.video?.isRound)\n )\n && !isForwardedMessage(message)\n && !message.viaBotId\n );\n\n const canReply = !isLocal && !isServiceNotification && getCanPostInChat(chat, threadId);\n\n const hasPinPermission = isPrivate || (\n chat.isCreator\n || (!isChannel && !isUserRightBanned(chat, 'pinMessages'))\n || getHasAdminRight(chat, 'pinMessages')\n );\n\n let canPin = !isLocal && !isServiceNotification && !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 = !isLocal && !isServiceNotification && (\n isPrivate\n || isOwn\n || isBasicGroup\n || chat.isCreator\n || getHasAdminRight(chat, 'deleteMessages')\n );\n\n const canReport = !isPrivate && !isOwn;\n\n const canDeleteForAll = canDelete && (\n (isPrivate && !isChatWithSelf)\n || (isBasicGroup && (\n isOwn || getHasAdminRight(chat, 'deleteMessages') || chat.isCreator\n ))\n );\n\n const canEdit = !isLocal && !isAction && isMessageEditable && (\n isOwn\n || (isChannel && (chat.isCreator || getHasAdminRight(chat, 'editMessages')))\n );\n\n const canForward = !isLocal && !isAction;\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\n const canDownload = Boolean(content.webPage?.document || content.webPage?.video || content.webPage?.photo\n || content.audio || content.voice || content.photo || content.video || content.document || content.sticker);\n\n const noOptions = [\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canReport,\n canDelete,\n canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n canDownload,\n ].every((ability) => !ability);\n\n return {\n noOptions,\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canReport,\n canDelete,\n canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n canDownload,\n };\n}\n\n// This selector always returns a new object which can not be safely used in shallow-equal checks\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 selectCanReportSelectedMessages(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 false;\n }\n\n const messageActions = selectedMessageIds\n .map((id) => chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId))\n .filter(Boolean);\n\n return messageActions.every((actions) => actions.canReport);\n}\n\nexport function selectCanDownloadSelectedMessages(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 false;\n }\n\n const messageActions = selectedMessageIds\n .map((id) => chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId))\n .filter(Boolean);\n\n return messageActions.some((actions) => actions.canDownload);\n}\n\nexport function selectIsDownloading(global: GlobalState, message: ApiMessage) {\n const activeInChat = global.activeDownloads.byChatId[message.chatId];\n return activeInChat ? activeInChat.includes(message.id) : false;\n}\n\nexport function selectActiveDownloadIds(global: GlobalState, chatId: string) {\n return global.activeDownloads.byChatId[chatId] || MEMO_EMPTY_ARRAY;\n}\n\nexport function selectUploadProgress(global: GlobalState, message: ApiMessage) {\n return global.fileUploads.byMessageLocalId[message.previousLocalId || message.id]?.progress;\n}\n\nexport function selectRealLastReadId(global: GlobalState, chatId: string, 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 Math.min(threadInfo.lastReadInboxMessageId, threadInfo.lastMessageId || Infinity);\n }\n}\n\nexport function selectFirstUnreadId(global: GlobalState, chatId: string, threadId: number) {\n const chat = selectChat(global, chatId);\n\n if (threadId === MAIN_THREAD_ID) {\n if (!chat) {\n return undefined;\n }\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo\n || (threadInfo.lastMessageId !== undefined && 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 if (!lastReadId && chat && chat.isNotJoined) {\n return undefined;\n }\n\n const lastReadServiceNotificationId = chatId === SERVICE_NOTIFICATIONS_USER_ID\n ? global.serviceNotifications.reduce((max, notification) => {\n return !notification.isUnread && notification.id > max ? notification.id : max;\n }, -1)\n : -1;\n\n function findAfterLastReadId(listIds: number[]) {\n return listIds.find((id) => {\n return (\n (!lastReadId || id > lastReadId)\n && byId[id]\n && (!byId[id].isOutgoing || byId[id].isFromScheduled)\n && id > lastReadServiceNotificationId\n );\n });\n }\n\n if (outlyingIds) {\n const found = findAfterLastReadId(outlyingIds);\n if (found) {\n return found;\n }\n }\n\n if (listedIds) {\n const found = findAfterLastReadId(listedIds);\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 Object.keys(byChatId).find((chatId) => {\n const chat = selectChat(global, 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: string, 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: string, 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: string, 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: string,\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 selectCanAutoLoadMedia(global: GlobalState, message: ApiMessage) {\n const chat = selectChat(global, message.chatId);\n if (!chat) {\n return undefined;\n }\n\n const sender = selectSender(global, message);\n\n const isPhoto = Boolean(getMessagePhoto(message) || getMessageWebPagePhoto(message));\n const isVideo = Boolean(getMessageVideo(message) || getMessageWebPageVideo(message));\n const isFile = Boolean(getMessageAudio(message) || getMessageVoice(message) || getMessageDocument(message));\n\n const {\n canAutoLoadPhotoFromContacts,\n canAutoLoadPhotoInPrivateChats,\n canAutoLoadPhotoInGroups,\n canAutoLoadPhotoInChannels,\n canAutoLoadVideoFromContacts,\n canAutoLoadVideoInPrivateChats,\n canAutoLoadVideoInGroups,\n canAutoLoadVideoInChannels,\n canAutoLoadFileFromContacts,\n canAutoLoadFileInPrivateChats,\n canAutoLoadFileInGroups,\n canAutoLoadFileInChannels,\n } = global.settings.byKey;\n\n if (isPhoto) {\n return canAutoLoadMedia({\n global,\n chat,\n sender,\n canAutoLoadMediaFromContacts: canAutoLoadPhotoFromContacts,\n canAutoLoadMediaInPrivateChats: canAutoLoadPhotoInPrivateChats,\n canAutoLoadMediaInGroups: canAutoLoadPhotoInGroups,\n canAutoLoadMediaInChannels: canAutoLoadPhotoInChannels,\n });\n }\n\n if (isVideo) {\n return canAutoLoadMedia({\n global,\n chat,\n sender,\n canAutoLoadMediaFromContacts: canAutoLoadVideoFromContacts,\n canAutoLoadMediaInPrivateChats: canAutoLoadVideoInPrivateChats,\n canAutoLoadMediaInGroups: canAutoLoadVideoInGroups,\n canAutoLoadMediaInChannels: canAutoLoadVideoInChannels,\n });\n }\n\n if (isFile) {\n return canAutoLoadMedia({\n global,\n chat,\n sender,\n canAutoLoadMediaFromContacts: canAutoLoadFileFromContacts,\n canAutoLoadMediaInPrivateChats: canAutoLoadFileInPrivateChats,\n canAutoLoadMediaInGroups: canAutoLoadFileInGroups,\n canAutoLoadMediaInChannels: canAutoLoadFileInChannels,\n });\n }\n\n return true;\n}\n\nfunction canAutoLoadMedia({\n global,\n chat,\n sender,\n canAutoLoadMediaFromContacts,\n canAutoLoadMediaInPrivateChats,\n canAutoLoadMediaInGroups,\n canAutoLoadMediaInChannels,\n}: {\n global: GlobalState;\n chat: ApiChat;\n canAutoLoadMediaFromContacts: boolean;\n canAutoLoadMediaInPrivateChats: boolean;\n canAutoLoadMediaInGroups: boolean;\n canAutoLoadMediaInChannels: boolean;\n sender?: ApiChat | ApiUser;\n}) {\n const isMediaFromContact = Boolean(sender && (\n sender.id === global.currentUserId || selectIsUserOrChatContact(global, sender)\n ));\n\n return Boolean(\n (isMediaFromContact && canAutoLoadMediaFromContacts)\n || (!isMediaFromContact && canAutoLoadMediaInPrivateChats && isUserId(chat.id))\n || (canAutoLoadMediaInGroups && isChatGroup(chat))\n || (canAutoLoadMediaInChannels && isChatChannel(chat)),\n );\n}\n\nexport function selectCanAutoPlayMedia(global: GlobalState, message: ApiMessage) {\n const video = getMessageVideo(message) || getMessageWebPageVideo(message);\n if (!video) {\n return undefined;\n }\n\n const {\n canAutoPlayVideos,\n canAutoPlayGifs,\n } = global.settings.byKey;\n\n const asGif = video.isGif || video.isRound;\n\n return (canAutoPlayVideos && !asGif) || (canAutoPlayGifs && asGif);\n}\n\nexport function selectShouldLoopStickers(global: GlobalState) {\n return global.settings.byKey.shouldLoopStickers;\n}\n\nexport function selectLastServiceNotification(global: GlobalState) {\n const { serviceNotifications } = global;\n const maxId = Math.max(...serviceNotifications.map(({ id }) => id));\n\n return serviceNotifications.find(({ id }) => id === maxId);\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, isUserId } from '../helpers';\n\nexport function selectManagement(global: GlobalState, chatId: string) {\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 (isUserId(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 { NewChatMembersProgress, RightColumnContent } from '../../types';\n\nimport { getSystemTheme, IS_SINGLE_COLUMN_LAYOUT } 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 newChatMembersProgress,\n } = global;\n\n const isAddingChatMembersShown = newChatMembersProgress !== NewChatMembersProgress.Closed;\n const isPollResults = selectIsPollResultsOpen(global);\n const isSearch = Boolean(!IS_SINGLE_COLUMN_LAYOUT && 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 ) : isStickerSearch ? (\n RightColumnContent.StickerSearch\n ) : isGifSearch ? (\n RightColumnContent.GifSearch\n ) : isAddingChatMembersShown ? (\n RightColumnContent.AddingMembers\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\nexport function selectTheme(global: GlobalState) {\n const { theme, shouldUseSystemTheme } = global.settings.byKey;\n\n return shouldUseSystemTheme ? getSystemTheme() : theme;\n}\n","import { GlobalState } from '../../global/types';\n\nexport function selectCurrentGlobalSearchQuery(global: GlobalState) {\n return global.globalSearch.query;\n}\n","import { GlobalState } from '../../global/types';\n\nexport function selectPaymentChatId(global: GlobalState) {\n return global.payment.chatId;\n}\n\nexport function selectPaymentMessageId(global: GlobalState) {\n return global.payment.messageId;\n}\n\nexport function selectPaymentFormId(global: GlobalState) {\n return global.payment.formId;\n}\n\nexport function selectPaymentRequestId(global: GlobalState) {\n return global.payment.requestId;\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 { GlobalState } from '../../global/types';\n\nexport function selectNotifySettings(global: GlobalState) {\n return global.settings.byKey;\n}\n\nexport function selectNotifyExceptions(global: GlobalState) {\n return global.settings.notifyExceptions;\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiChat, ApiUser } from '../../api/types';\n\nexport function selectUser(global: GlobalState, userId: string): ApiUser | undefined {\n return global.users.byId[userId];\n}\n\nexport function selectIsUserBlocked(global: GlobalState, userId: string) {\n const user = selectUser(global, userId);\n\n return user?.fullInfo?.isBlocked;\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 {\n ApiBotInlineMediaResult, ApiBotInlineResult, ApiBotInlineSwitchPm,\n ApiLanguage, ApiMessage, ApiShippingAddress, ApiStickerSet,\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 type ThemeKey = 'light' | 'dark';\n\nexport interface IThemeSettings {\n background?: string;\n backgroundColor?: string;\n patternColor?: string;\n isBlurred?: boolean;\n}\n\nexport type NotifySettings = {\n hasPrivateChatsNotifications?: boolean;\n hasPrivateChatsMessagePreview?: boolean;\n hasGroupNotifications?: boolean;\n hasGroupMessagePreview?: boolean;\n hasBroadcastNotifications?: boolean;\n hasBroadcastMessagePreview?: boolean;\n hasContactJoinedNotifications?: boolean;\n hasWebNotifications: boolean;\n hasPushNotifications: boolean;\n notificationSoundVolume: number;\n};\n\nexport type LangCode = (\n 'en' | 'ar' | 'be' | 'ca' | 'nl' | 'fr' | 'de' | 'id' | 'it' | 'ko' | 'ms' | 'fa' | 'pl' | 'pt-br' | 'ru' | 'es'\n | 'tr' | 'uk' | 'uz'\n);\n\nexport type TimeFormat = '24h' | '12h';\n\nexport interface ISettings extends NotifySettings, Record {\n theme: ThemeKey;\n shouldUseSystemTheme: boolean;\n messageTextSize: number;\n animationLevel: 0 | 1 | 2;\n messageSendKeyCombo: 'enter' | 'ctrl-enter';\n canAutoLoadPhotoFromContacts: boolean;\n canAutoLoadPhotoInPrivateChats: boolean;\n canAutoLoadPhotoInGroups: boolean;\n canAutoLoadPhotoInChannels: boolean;\n canAutoLoadVideoFromContacts: boolean;\n canAutoLoadVideoInPrivateChats: boolean;\n canAutoLoadVideoInGroups: boolean;\n canAutoLoadVideoInChannels: boolean;\n canAutoLoadFileFromContacts: boolean;\n canAutoLoadFileInPrivateChats: boolean;\n canAutoLoadFileInGroups: boolean;\n canAutoLoadFileInChannels: boolean;\n autoLoadFileMaxSizeMb: number;\n canAutoPlayGifs: boolean;\n canAutoPlayVideos: boolean;\n shouldSuggestStickers: boolean;\n shouldLoopStickers: boolean;\n hasPassword?: boolean;\n languages?: ApiLanguage[];\n language: LangCode;\n isSensitiveEnabled?: boolean;\n canChangeSensitive?: boolean;\n timeFormat: TimeFormat;\n wasTimeFormatSetManually: boolean;\n}\n\nexport interface ApiPrivacySettings {\n visibility: PrivacyVisibility;\n allowUserIds: string[];\n allowChatIds: string[];\n blockUserIds: string[];\n blockChatIds: string[];\n}\n\nexport interface InputPrivacyContact {\n id: string;\n accessHash?: string;\n}\n\nexport interface InputPrivacyRules {\n visibility: PrivacyVisibility;\n allowedUsers?: InputPrivacyContact[];\n allowedChats?: InputPrivacyContact[];\n blockedUsers?: InputPrivacyContact[];\n blockedChats?: InputPrivacyContact[];\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 DataStorage,\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 FoldersEditFolderFromChatList,\n FoldersIncludedChats,\n FoldersIncludedChatsFromChatList,\n FoldersExcludedChats,\n FoldersExcludedChatsFromChatList,\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 StickerSearch,\n GifSearch,\n PollResults,\n AddingMembers,\n}\n\nexport enum MediaViewerOrigin {\n Inline,\n ScheduledInline,\n SharedMedia,\n ProfileAvatar,\n SettingsAvatar,\n MiddleHeaderAvatar,\n Album,\n ScheduledAlbum,\n SearchResult,\n}\n\nexport enum AudioOrigin {\n Inline,\n SharedMedia,\n Search,\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 enum NewChatMembersProgress {\n Closed,\n InProgress,\n Loading,\n}\n\nexport type ProfileTabType = 'members' | 'commonChats' | 'media' | 'documents' | 'links' | 'audio' | 'voice';\nexport type SharedMediaType = 'media' | 'documents' | 'links' | 'audio' | 'voice';\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\nexport type NotifyException = {\n isMuted: boolean;\n isSilent?: boolean;\n shouldShowPreviews?: boolean;\n};\n\nexport type EmojiKeywords = {\n isLoading?: boolean;\n version: number;\n keywords: Record;\n};\n\nexport type InlineBotSettings = {\n id: string;\n help?: string;\n query?: string;\n offset?: string;\n canLoadMore?: boolean;\n results?: (ApiBotInlineResult | ApiBotInlineMediaResult)[];\n isGallery?: boolean;\n switchPm?: ApiBotInlineSwitchPm;\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 { DEBUG } from '../config';\n\nexport function updateAppBadge(unreadCount: number) {\n if (typeof window.navigator.setAppBadge !== 'function') {\n return;\n }\n\n window.navigator.setAppBadge(unreadCount).catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n });\n}\n","export default function arePropsShallowEqual(currentProps: AnyLiteral, newProps: AnyLiteral) {\n if (currentProps === newProps) {\n return true;\n }\n\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 if (currentKeysLength === 0) {\n return true;\n }\n\n for (let i = 0; i < currentKeysLength; i++) {\n const prop = currentKeys[i];\n if (currentProps[prop] !== newProps[prop]) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function 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.reduce((res, prop) => {\n if (currentProps[prop] !== newProps[prop]) {\n res.push(`${prop}: ${currentProps[prop]} => ${newProps[prop]}`);\n }\n\n return res;\n }, [] as string[]);\n}\n","type Parts = (string | false | undefined)[];\n\nexport default (...parts: Parts) => {\n return parts.filter(Boolean).join(' ');\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(\n cacheName: string, key: string, type: Type, isHtmlAllowed = false,\n) {\n if (!cacheApi) {\n return undefined;\n }\n\n try {\n // To avoid the error \"Request scheme 'webdocument' is unsupported\"\n const request = new Request(key.replace(/:/g, '_'));\n const cache = await cacheApi.open(cacheName);\n const response = await cache.match(request);\n if (!response) {\n return undefined;\n }\n\n const contentType = response.headers.get('Content-Type');\n\n switch (type) {\n case Type.Text:\n return await response.text();\n case Type.Blob: {\n // Ignore deprecated data-uri avatars\n if (key.startsWith('avatar') && contentType && contentType.startsWith('text')) {\n return undefined;\n }\n\n const blob = await response.blob();\n\n // Safari does not return correct Content-Type header for webp images.\n if (key.startsWith('sticker')) {\n return new Blob([blob], { type: 'image/webp' });\n }\n\n const shouldRecreate = !blob.type || (!isHtmlAllowed && blob.type.includes('html'));\n // iOS Safari fails to preserve `type` in cache\n let resolvedType = blob.type || contentType;\n\n if (!(shouldRecreate && resolvedType)) {\n return blob;\n }\n\n // Prevent HTML-in-video attacks (for files that were cached before fix)\n if (!isHtmlAllowed) {\n resolvedType = resolvedType.replace(/html/gi, '');\n }\n\n return new Blob([blob], { type: resolvedType });\n }\n case Type.Json:\n return await response.json();\n default:\n return undefined;\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\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 try {\n const cacheData = typeof data === 'string' || data instanceof Blob ? data : JSON.stringify(data);\n // To avoid the error \"Request scheme 'webdocument' is unsupported\"\n const request = new Request(key.replace(/:/g, '_'));\n const response = new Response(cacheData);\n const cache = await cacheApi.open(cacheName);\n return await cache.put(request, response);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n\nexport async function clear(cacheName: string) {\n try {\n if (!cacheApi) {\n return undefined;\n }\n\n return await cacheApi.delete(cacheName);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n","import captureKeyboardListener from './captureKeyboardListeners';\n\ntype IHandlerFunction = () => void;\n\nexport default function captureEscKeyListener(handler: IHandlerFunction) {\n return captureKeyboardListener({ onEsc: handler });\n}\n","type HandlerName = 'onEnter' | 'onBackspace' | 'onDelete' | 'onEsc' | 'onUp' | 'onDown' | 'onLeft' | 'onRight'\n| '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 ArrowLeft: 'onLeft',\n ArrowRight: 'onRight',\n Tab: 'onTab',\n};\n\nconst handlers: Record = {\n onEnter: [],\n onDelete: [],\n onBackspace: [],\n onEsc: [],\n onUp: [],\n onDown: [],\n onLeft: [],\n onRight: [],\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","import { LangFn } from '../hooks/useLang';\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;\nexport const MILLISECONDS_IN_DAY = 24 * 60 * 60 * 1000;\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\n// @optimization `toLocaleTimeString` is avoided because of bad performance\nexport function formatTime(datetime: number | Date, lang: LangFn) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n const timeFormat = lang.timeFormat || '24h';\n\n let hours = date.getHours();\n let marker = '';\n if (timeFormat === '12h') {\n marker = hours >= 12 ? ' PM' : ' AM';\n hours = hours > 12 ? hours % 12 : hours;\n }\n\n return `${String(hours).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}${marker}`;\n}\n\nexport function formatPastTimeShort(lang: LangFn, 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, lang);\n }\n\n const weekAgo = new Date(today);\n weekAgo.setDate(today.getDate() - 7);\n if (date >= weekAgo) {\n return lang(`Weekday.Short${WEEKDAYS_FULL[date.getDay()]}`);\n }\n\n const withYear = date.getFullYear() !== today.getFullYear();\n const format = (\n lang(withYear ? 'formatDateScheduleYear' : 'formatDateSchedule')\n || (withYear ? 'd MMM yyyy' : 'd MMM')\n );\n\n return formatDate(lang, date, format);\n}\n\nexport function formatFullDate(lang: LangFn, datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n const format = lang('formatterYearMax') || 'dd.MM.yyyy';\n\n return formatDate(lang, date, format);\n}\n\nexport function formatMonthAndYear(lang: LangFn, date: Date, isShort = false) {\n const format = lang(isShort ? 'formatterMonthYear2' : 'formatterMonthYear') || 'MMM yyyy';\n\n return formatDate(lang, date, format);\n}\n\nexport function formatHumanDate(\n lang: LangFn,\n datetime: number | Date,\n isShort = false,\n noWeekdays = false,\n isUpperFirst?: boolean,\n) {\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 (isUpperFirst || !isShort ? upperFirst : lowerFirst)(lang('Weekday.Today'));\n }\n\n const yesterday = new Date(today);\n yesterday.setDate(today.getDate() - 1);\n if (toIsoString(date) === toIsoString(yesterday)) {\n return (isUpperFirst || !isShort ? upperFirst : lowerFirst)(lang('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 const weekDayString = isShort ? lang(`Weekday.Short${weekDay}`) : lang(`Weekday.${weekDay}`);\n\n return (isUpperFirst || !isShort ? upperFirst : lowerFirst)(weekDayString);\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 = lang(formatKey) || 'd MMMM yyyy';\n\n return (isUpperFirst || !isShort ? upperFirst : lowerFirst)(formatDate(lang, date, format));\n}\n\nfunction formatDate(lang: LangFn, date: Date, format: string) {\n const day = date.getDate();\n const monthIndex = date.getMonth();\n\n return format\n .replace('LLLL', lang(MONTHS_FULL[monthIndex]))\n .replace('MMMM', lang(`Month.Gen${MONTHS_FULL[monthIndex]}`))\n .replace('MMM', lang(`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(\n lang: LangFn,\n datetime: number | Date,\n isUpperFirst?: boolean,\n) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n return `${formatHumanDate(lang, date, true, undefined, isUpperFirst)}, ${formatTime(date, lang)}`;\n}\n\nexport function formatMediaDuration(duration: number, maxValue?: 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 const maxHours = maxValue ? Math.floor(maxValue / 3600) : 0;\n const maxMinutes = maxValue ? Math.floor((maxValue % 3600) / 60) : 0;\n let string = '';\n if (hours > 0 || maxHours > 0) {\n string += `${String(hours).padStart(2, '0')}:`;\n string += `${String(minutes).padStart(2, '0')}:`;\n } else if (maxMinutes >= 10) {\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, locale = 'en-US') {\n return date.toLocaleString(\n locale,\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 + MILLISECONDS_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 EMOJI_REGEX from '../lib/twemojiRegex';\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\nconst ISO_FLAGS_OFFSET = 127397;\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\n// Non-standard variations of emojis, used on some devices\nconst EMOJI_EXCEPTIONS: [string | RegExp, string][] = [\n [/\\u{1f3f3}\\u200d\\u{1f308}/gu, '\\u{1f3f3}\\ufe0f\\u200d\\u{1f308}'], // 🏳‍🌈\n [/\\u{1f3f3}\\u200d\\u26a7\\ufe0f/gu, '\\u{1f3f3}\\ufe0f\\u200d\\u26a7\\ufe0f'], // 🏳️‍⚧️\n [/\\u{1f937}\\u200d\\u2642/gu, '\\u{1f937}\\u200d\\u2642\\ufe0f'], // 🤷‍♂️\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 fixNonStandardEmoji(text: string) {\n // Non-standard sequences typically parsed as separate emojis, so no need to fix text without any\n if (!text.match(EMOJI_REGEX)) return text;\n // eslint-disable-next-line no-restricted-syntax\n for (const [regex, replacement] of EMOJI_EXCEPTIONS) {\n text = text.replace(regex, replacement);\n }\n\n return text;\n}\n\nexport function nativeToUnified(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][0])) {\n category.emojis.push(emojiRaw[1][0]);\n emojiData.emojis[emojiRaw[1][0]] = {\n id: emojiRaw[1][0],\n names: emojiRaw[1] as string[],\n native: unifiedToNative(emojiRaw[0] as string),\n image: (emojiRaw[0] as string).toLowerCase(),\n };\n }\n }\n\n emojiData.categories.push(category);\n }\n\n return emojiData;\n}\n\nexport function isoToEmoji(iso: string) {\n const code = iso.toUpperCase();\n\n if (!/^[A-Z]{2}$/.test(code)) return iso;\n const codePoints = [...code].map((c) => c.codePointAt(0)! + ISO_FLAGS_OFFSET);\n return String.fromCodePoint(...codePoints);\n}\n","export function ensureProtocol(url?: string) {\n if (!url) {\n return undefined;\n }\n\n // HTTP was chosen by default as a fix for https://bugs.telegram.org/c/10712.\n // It is also the default protocol in the official TDesktop client.\n return url.includes('://') ? url : `http://${url}`;\n}\n","let 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","import { ThemeKey } from '../types';\n\nlet systemThemeCache: ThemeKey = (\n window.matchMedia?.('(prefers-color-scheme: dark)').matches\n) ? 'dark' : 'light';\n\nexport function getSystemTheme() {\n return systemThemeCache;\n}\n\nfunction handleSystemThemeChange(e: MediaQueryListEventMap['change']) {\n systemThemeCache = e.matches ? 'dark' : 'light';\n}\n\nconst mql = window.matchMedia('(prefers-color-scheme: dark)');\nif (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', handleSystemThemeChange);\n} else if (typeof mql.addListener === 'function') {\n mql.addListener(handleSystemThemeChange);\n}\n","import {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT,\n MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH,\n IS_TEST,\n SUPPORTED_VIDEO_CONTENT_TYPES,\n VIDEO_MOV_TYPE,\n} from '../config';\n\nexport * from './environmentWebp';\n\nexport * from './environmentSystemTheme';\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: 'macOS' | 'iOS' | 'Windows' | 'Android' | 'Linux' | undefined;\n\n if (macosPlatforms.indexOf(platform) !== -1) {\n os = 'macOS';\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 === 'macOS';\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);\nexport const IS_PWA = window.matchMedia('(display-mode: standalone)').matches\n|| (window.navigator as any).standalone\n|| document.referrer.includes('android-app://');\n\nexport const IS_TOUCH_ENV = window.matchMedia('(pointer: coarse)').matches;\n// Keep in mind the landscape orientation\nexport const IS_SINGLE_COLUMN_LAYOUT = window.innerWidth <= MOBILE_SCREEN_MAX_WIDTH || (\n window.innerWidth <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH && window.innerHeight <= MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT\n);\n// Special layout, 1 column while chat opened, 2 columns while collapsed\nexport const IS_TABLET_COLUMN_LAYOUT = !IS_SINGLE_COLUMN_LAYOUT && (\n window.innerWidth <= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n);\nexport const IS_VOICE_RECORDING_SUPPORTED = Boolean(\n navigator.mediaDevices && 'getUserMedia' in navigator.mediaDevices && (\n window.AudioContext || (window as any).webkitAudioContext\n ),\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'));\nexport const IS_CANVAS_FILTER_SUPPORTED = (\n !IS_TEST && 'filter' in (document.createElement('canvas').getContext('2d') || {})\n);\nexport const IS_REQUEST_FULLSCREEN_SUPPORTED = 'requestFullscreen' in document.createElement('div');\nexport const ARE_CALLS_SUPPORTED = !navigator.userAgent.includes('Firefox');\nexport const LAYERS_ANIMATION_NAME = IS_ANDROID ? 'slide-fade' : IS_IOS ? 'slide-layers' : 'push-slide';\n\nconst TEST_VIDEO = document.createElement('video');\nexport const IS_MOV_SUPPORTED = Boolean(\n TEST_VIDEO.canPlayType(VIDEO_MOV_TYPE).replace('no', '')\n || IS_IOS, // IOS reports '', but still plays .mov files\n);\n\nif (IS_MOV_SUPPORTED) SUPPORTED_VIDEO_CONTENT_TYPES.add(VIDEO_MOV_TYPE);\n\nexport const DPR = window.devicePixelRatio || 1;\n\nexport const MASK_IMAGE_DISABLED = true;\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 if (!video.videoWidth || !video.videoHeight) {\n resolve(undefined);\n }\n\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","import { LangCode } from '../types';\n\nexport function formatCurrency(totalPrice: number, currency?: string, locale: LangCode = 'en') {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n }).format(currency === 'JPY' ? totalPrice : totalPrice / 100);\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 { ApiError, ApiFieldError } 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 MESSAGE_TOO_LONG: 'Message is too long',\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 MESSAGE_TOO_LONG_PLEASE_REMOVE_CHARACTERS: 'The provided message 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 SCHEDULE_DATE_INVALID: 'Invalid schedule date provided',\n WALLPAPER_DIMENSIONS_INVALID: 'The wallpaper dimensions are invalid, please select another file',\n};\n\nexport const SHIPPING_ERRORS: Record = {\n ADDRESS_STREET_LINE1_INVALID: {\n field: 'streetLine1',\n message: 'Incorrect street address',\n },\n ADDRESS_STREET_LINE2_INVALID: {\n field: 'streetLine2',\n message: 'Incorrect street address',\n },\n ADDRESS_CITY_INVALID: {\n field: 'city',\n message: 'Incorrect city',\n },\n ADDRESS_COUNTRY_INVALID: {\n field: 'countryIso2',\n message: 'Incorrect country',\n },\n ADDRESS_POSTCODE_INVALID: {\n field: 'postCode',\n message: 'Incorrect post code',\n },\n ADDRESS_STATE_INVALID: {\n field: 'state',\n message: 'Incorrect state',\n },\n REQ_INFO_NAME_INVALID: {\n field: 'fullName',\n message: 'Incorrect name',\n },\n REQ_INFO_PHONE_INVALID: {\n field: 'phone',\n message: 'Incorrect phone',\n },\n REQ_INFO_EMAIL_INVALID: {\n field: 'email',\n message: 'Incorrect email',\n },\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\nexport function getShippingError(error: ApiError): ApiFieldError | undefined {\n return SHIPPING_ERRORS[error.message];\n}\n","import { DEBUG_ALERT_MSG } 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;\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 (APP_ENV === 'development' || APP_ENV === 'staging') {\n throttledAlert(`${DEBUG_ALERT_MSG}\\n\\n${(err?.message) || err}\\n${err?.stack}`);\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 { getGlobal } from '../lib/teact/teactn';\n\nimport { ApiLangPack, ApiLangString } from '../api/types';\nimport { LangCode, TimeFormat } from '../types';\n\nimport {\n DEFAULT_LANG_CODE, DEFAULT_LANG_PACK, LANG_CACHE_NAME, LANG_PACKS,\n} from '../config';\nimport * as cacheApi from './cacheApi';\nimport { callApi } from '../api/gramjs';\nimport { createCallbackManager } from './callbacks';\nimport { formatInteger } from './textFormat';\n\ninterface LangFn {\n (key: string, value?: any, format?: 'i'): any;\n\n isRtl?: boolean;\n code?: LangCode;\n timeFormat?: TimeFormat;\n}\n\nconst SUBSTITUTION_REGEX = /%\\d?\\$?[sdf@]/g;\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 | undefined;\nlet fallbackLangPack: ApiLangPack | undefined;\n\nconst {\n addCallback,\n removeCallback,\n runCallbacks,\n} = createCallbackManager();\n\nexport { addCallback, removeCallback };\n\nlet currentLangCode: string | undefined;\nlet currentTimeFormat: TimeFormat | undefined;\n\nexport const getTranslation: LangFn = (key: string, value?: any, format?: 'i') => {\n if (value !== undefined) {\n const cacheValue = Array.isArray(value) ? JSON.stringify(value) : value;\n const cached = cache.get(`${key}_${cacheValue}_${format}`);\n if (cached) {\n return cached;\n }\n }\n\n if (!langPack && !fallbackLangPack) {\n return key;\n }\n\n const langString = (langPack?.[key]) || (fallbackLangPack?.[key]);\n if (!langString) {\n if (!fallbackLangPack) {\n void importFallbackLangPack();\n }\n\n return key;\n }\n\n return processTranslation(langString, key, value, format);\n};\n\nexport async function getTranslationForLangString(langCode: string, key: string) {\n let translateString: ApiLangString | undefined = await cacheApi.fetch(\n LANG_CACHE_NAME,\n `${DEFAULT_LANG_PACK}_${langCode}_${key}`,\n cacheApi.Type.Json,\n );\n\n if (!translateString) {\n translateString = await fetchRemoteString(DEFAULT_LANG_PACK, langCode, key);\n }\n\n return processTranslation(translateString, key);\n}\n\nexport async function setLanguage(langCode: LangCode, callback?: NoneToVoidFunction, withFallback = false) {\n if (langPack && langCode === currentLangCode) {\n if (callback) {\n callback();\n }\n\n return;\n }\n\n let newLangPack = await cacheApi.fetch(LANG_CACHE_NAME, langCode, cacheApi.Type.Json);\n if (!newLangPack) {\n if (withFallback) {\n await importFallbackLangPack();\n }\n\n newLangPack = await fetchRemote(langCode);\n if (!newLangPack) {\n return;\n }\n }\n\n cache.clear();\n\n currentLangCode = langCode;\n langPack = newLangPack;\n document.documentElement.lang = langCode;\n\n const { languages, timeFormat } = getGlobal().settings.byKey;\n const langInfo = languages?.find((l) => l.langCode === langCode);\n getTranslation.isRtl = Boolean(langInfo?.rtl);\n getTranslation.code = langCode;\n getTranslation.timeFormat = timeFormat;\n\n if (callback) {\n callback();\n }\n\n runCallbacks();\n}\n\nexport function setTimeFormat(timeFormat: TimeFormat) {\n if (timeFormat && timeFormat === currentTimeFormat) {\n return;\n }\n\n currentTimeFormat = timeFormat;\n getTranslation.timeFormat = timeFormat;\n\n runCallbacks();\n}\n\nasync function importFallbackLangPack() {\n if (fallbackLangPack) {\n return;\n }\n\n fallbackLangPack = (await import('./fallbackLangPack')).default;\n runCallbacks();\n}\n\nasync function fetchRemote(langCode: string): Promise {\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\nasync function fetchRemoteString(\n remoteLangPack: typeof LANG_PACKS[number], langCode: string, key: string,\n): Promise {\n const remote = await callApi('fetchLangStrings', {\n langPack: remoteLangPack,\n langCode,\n keys: [key],\n });\n\n if (remote?.length) {\n await cacheApi.save(LANG_CACHE_NAME, `${remoteLangPack}_${langCode}_${key}`, remote[0]);\n\n return remote[0];\n }\n\n return undefined;\n}\n\nfunction getPluralOption(amount: number) {\n const langCode = currentLangCode || DEFAULT_LANG_CODE;\n const optionIndex = PLURAL_RULES[langCode as keyof typeof PLURAL_RULES]\n ? PLURAL_RULES[langCode as keyof typeof PLURAL_RULES](amount)\n : 0;\n\n return PLURAL_OPTIONS[optionIndex];\n}\n\nfunction processTemplate(template: string, value: any) {\n value = Array.isArray(value) ? value : [value];\n const translationSlices = template.split(SUBSTITUTION_REGEX);\n const initialValue = translationSlices.shift();\n\n return translationSlices.reduce((result, str, index) => {\n return `${result}${String(value[index] || '')}${str}`;\n }, initialValue || '');\n}\n\nfunction processTranslation(langString: ApiLangString | undefined, key: string, value?: any, format?: 'i') {\n const template = langString ? langString[typeof value === 'number' ? getPluralOption(value) : 'value'] : undefined;\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 const cacheValue = Array.isArray(value) ? JSON.stringify(value) : value;\n cache.set(`${key}_${cacheValue}_${format}`, result);\n return result;\n }\n\n return template;\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","const 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: Worker | undefined = new Worker(\n new URL('opus-recorder/dist/decoderWorker.min.js', import.meta.url),\n );\n let wavWorker: Worker | undefined = new Worker(new URL('opus-recorder/dist/waveWorker.min.js', import.meta.url));\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.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>();\nconst progressCallbacks = new Map>();\nconst cancellableCallbacks = new Map();\n\nexport function fetch(\n url: string,\n mediaFormat: T,\n isHtmlAllowed = false,\n onProgress?: ApiOnProgress,\n callbackUniqueId?: string,\n): Promise> {\n if (mediaFormat === ApiMediaFormat.Progressive) {\n return (\n IS_PROGRESSIVE_SUPPORTED\n ? getProgressive(url)\n : fetch(url, ApiMediaFormat.BlobUrl, isHtmlAllowed, onProgress, callbackUniqueId)\n ) as Promise>;\n }\n\n if (!fetchPromises.has(url)) {\n const promise = fetchFromCacheOrRemote(url, mediaFormat, isHtmlAllowed)\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 progressCallbacks.delete(url);\n cancellableCallbacks.delete(url);\n });\n\n fetchPromises.set(url, promise);\n }\n\n if (onProgress && callbackUniqueId) {\n let activeCallbacks = progressCallbacks.get(url);\n if (!activeCallbacks) {\n activeCallbacks = new Map();\n progressCallbacks.set(url, activeCallbacks);\n }\n activeCallbacks.set(callbackUniqueId, onProgress);\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 progressCallbacks.forEach((map, url) => {\n map.forEach((callback) => {\n if (callback === progressCallback) {\n const parentCallback = cancellableCallbacks.get(url);\n if (!parentCallback) return;\n\n cancelApiProgress(parentCallback);\n cancellableCallbacks.delete(url);\n progressCallbacks.delete(url);\n }\n });\n });\n}\n\nexport function removeCallback(url: string, callbackUniqueId: string) {\n const callbacks = progressCallbacks.get(url);\n if (!callbacks) return;\n callbacks.delete(callbackUniqueId);\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(\n url: string, mediaFormat: ApiMediaFormat, isHtmlAllowed: boolean,\n) {\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]!, isHtmlAllowed);\n\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 const onProgress = makeOnProgress(url, mediaSource, sourceBuffer);\n cancellableCallbacks.set(url, onProgress);\n\n void callApi('downloadMedia', { url, mediaFormat }, onProgress);\n });\n\n memoryCache.set(url, streamUrl);\n return streamUrl;\n }\n\n const onProgress = makeOnProgress(url);\n cancellableCallbacks.set(url, onProgress);\n\n const remote = await callApi('downloadMedia', { url, mediaFormat, isHtmlAllowed }, onProgress);\n if (!remote) {\n throw new Error(`Failed to fetch media ${url}`);\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 = media.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 }\n }\n\n memoryCache.set(url, prepared);\n\n return prepared;\n}\n\nfunction makeOnProgress(url: string, mediaSource?: MediaSource, sourceBuffer?: SourceBuffer) {\n const onProgress: ApiOnProgress = (progress: number, arrayBuffer: ArrayBuffer) => {\n progressCallbacks.get(url)?.forEach((callback) => {\n callback(progress);\n if (callback.isCanceled) onProgress.isCanceled = true;\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 return onProgress;\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","export const MEMO_EMPTY_ARRAY = [];\n","import { DEBUG } from '../config';\n\nexport enum Bundles {\n Auth,\n Main,\n Extra,\n Calls,\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 [Bundles.Calls]: typeof import('../bundles/calls');\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 case Bundles.Calls:\n LOAD_PROMISES[Bundles.Calls] = import('../bundles/calls');\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","import { callApi } from '../api/gramjs';\nimport {\n ApiChat, ApiMediaFormat, ApiMessage, ApiUser,\n} from '../api/types';\nimport { renderActionMessageText } from '../components/common/helpers/renderActionMessageText';\nimport { DEBUG, IS_TEST } from '../config';\nimport { getDispatch, getGlobal, setGlobal } from '../lib/teact/teactn';\nimport {\n getChatAvatarHash,\n getChatTitle,\n getMessageAction,\n getMessageSenderName,\n getMessageSummaryText,\n getPrivateChatUserId,\n isActionMessage,\n isChatChannel,\n selectIsChatMuted, selectShouldShowMessagePreview,\n} from '../modules/helpers';\nimport { getTranslation } from './langProvider';\nimport { addNotifyExceptions, replaceSettings } from '../modules/reducers';\nimport {\n selectChatMessage, selectNotifyExceptions, selectNotifySettings, selectUser,\n} from '../modules/selectors';\nimport { IS_SERVICE_WORKER_SUPPORTED } from './environment';\nimport * as mediaLoader from './mediaLoader';\nimport { debounce } from './schedulers';\n\nfunction getDeviceToken(subscription: PushSubscription) {\n const data = subscription.toJSON();\n return JSON.stringify({\n endpoint: data.endpoint,\n keys: data.keys,\n });\n}\n\nfunction checkIfPushSupported() {\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.warn('[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.warn('[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.warn('[PUSH] Push messaging isn\\'t supported.');\n }\n return false;\n }\n return true;\n}\n\nfunction checkIfNotificationsSupported() {\n // Let's check if the browser supports notifications\n if (!('Notification' in window)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] This browser does not support desktop notification');\n }\n return false;\n }\n\n if (Notification.permission === 'denied' as NotificationPermission) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] The user has blocked push notifications.');\n }\n return false;\n }\n return true;\n}\n\nconst expirationTime = 12 * 60 * 60 * 1000; // 12 hours\n// Notification id is removed from soundPlayed cache after 3 seconds\nconst soundPlayedDelay = 3 * 1000;\nconst soundPlayedIds = new Set();\n\nexport async function playNotifySound(id?: string, volume?: number) {\n if (id !== undefined && soundPlayedIds.has(id)) return;\n const { notificationSoundVolume } = selectNotifySettings(getGlobal());\n const currentVolume = volume ? volume / 10 : notificationSoundVolume / 10;\n if (currentVolume === 0) return;\n\n const audio = new Audio('./notification.mp3');\n audio.volume = currentVolume;\n audio.setAttribute('mozaudiochannel', 'notification');\n if (id !== undefined) {\n audio.addEventListener('ended', () => {\n soundPlayedIds.add(id);\n }, { once: true });\n\n setTimeout(() => {\n soundPlayedIds.delete(id);\n }, soundPlayedDelay);\n }\n\n try {\n await audio.play();\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] Unable to play notification sound');\n }\n }\n}\n\nexport const playNotifySoundDebounced = debounce(playNotifySound, 1000, true, false);\n\nfunction checkIfShouldResubscribe(subscription: PushSubscription | null) {\n const global = getGlobal();\n if (!global.push || !subscription) return true;\n if (getDeviceToken(subscription) !== global.push.deviceToken) return true;\n return Date.now() - global.push.subscribedAt > expirationTime;\n}\n\nasync function requestPermission() {\n if (!('Notification' in window)) return;\n if (!['granted', 'denied'].includes(Notification.permission)) {\n await Notification.requestPermission();\n }\n}\n\nasync function unsubscribeFromPush(subscription: PushSubscription | null) {\n const global = getGlobal();\n const dispatch = getDispatch();\n if (subscription) {\n try {\n const deviceToken = getDeviceToken(subscription);\n await callApi('unregisterDevice', deviceToken);\n await subscription.unsubscribe();\n dispatch.deleteDeviceToken();\n return;\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 if (global.push) {\n await callApi('unregisterDevice', global.push.deviceToken);\n dispatch.deleteDeviceToken();\n }\n}\n\nexport async function unsubscribe() {\n if (!checkIfPushSupported()) return;\n const serviceWorkerRegistration = await navigator.serviceWorker.ready;\n const subscription = await serviceWorkerRegistration.pushManager.getSubscription();\n await unsubscribeFromPush(subscription);\n}\n\n// Indicates if notification settings are loaded from the api\nlet areSettingsLoaded = false;\n\n// Load notification settings from the api\nasync function loadNotificationSettings() {\n if (areSettingsLoaded) return selectNotifySettings(getGlobal());\n const [resultSettings, resultExceptions] = await Promise.all([\n callApi('fetchNotificationSettings', {\n serverTimeOffset: getGlobal().serverTimeOffset,\n }),\n callApi('fetchNotificationExceptions', {\n serverTimeOffset: getGlobal().serverTimeOffset,\n }),\n ]);\n if (!resultSettings) return selectNotifySettings(getGlobal());\n\n let global = replaceSettings(getGlobal(), resultSettings);\n if (resultExceptions) {\n global = addNotifyExceptions(global, resultExceptions);\n }\n setGlobal(global);\n areSettingsLoaded = true;\n return selectNotifySettings(global);\n}\n\nexport async function subscribe() {\n if (!checkIfPushSupported()) {\n // Ask for notification permissions only if service worker notifications are not supported\n // As pushManager.subscribe automatically triggers permission popup\n await requestPermission();\n return;\n }\n const serviceWorkerRegistration = await navigator.serviceWorker.ready;\n let subscription = await serviceWorkerRegistration.pushManager.getSubscription();\n if (!checkIfShouldResubscribe(subscription)) return;\n await unsubscribeFromPush(subscription);\n try {\n 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 getDispatch()\n .setDeviceToken(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.warn('[PUSH] The user has blocked push notifications.');\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 // Request permissions and fall back to local notifications\n // if pushManager.subscribe was aborted due to invalid VAPID key.\n if (error.code === DOMException.ABORT_ERR) {\n await requestPermission();\n }\n }\n }\n}\n\nfunction checkIfShouldNotify(chat: ApiChat) {\n if (!areSettingsLoaded) return false;\n const global = getGlobal();\n const isMuted = selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global));\n if (isMuted || chat.isNotJoined || !chat.isListed) {\n return false;\n }\n\n return !document.hasFocus();\n}\n\nfunction getNotificationContent(chat: ApiChat, message: ApiMessage) {\n const global = getGlobal();\n const {\n senderId,\n replyToMessageId,\n } = message;\n\n const messageSender = senderId ? selectUser(global, senderId) : undefined;\n const messageAction = getMessageAction(message as ApiMessage);\n const actionTargetMessage = messageAction && replyToMessageId\n ? selectChatMessage(global, chat.id, replyToMessageId)\n : undefined;\n const {\n targetUserIds: actionTargetUserIds,\n targetChatId: actionTargetChatId,\n } = messageAction || {};\n\n const actionTargetUsers = actionTargetUserIds\n ? actionTargetUserIds.map((userId) => selectUser(global, userId))\n .filter(Boolean as any)\n : undefined;\n const privateChatUserId = getPrivateChatUserId(chat);\n const privateChatUser = privateChatUserId ? selectUser(global, privateChatUserId) : undefined;\n\n let body: string;\n if (selectShouldShowMessagePreview(chat, selectNotifySettings(global), selectNotifyExceptions(global))) {\n if (isActionMessage(message)) {\n const actionOrigin = chat && (isChatChannel(chat) || message.senderId === message.chatId)\n ? chat\n : messageSender;\n body = renderActionMessageText(\n getTranslation,\n message,\n actionOrigin,\n actionTargetUsers,\n actionTargetMessage,\n actionTargetChatId,\n { asPlain: true },\n ) as string;\n } else {\n const senderName = getMessageSenderName(getTranslation, chat.id, messageSender);\n const summary = getMessageSummaryText(getTranslation, message);\n\n body = senderName ? `${senderName}: ${summary}` : summary;\n }\n } else {\n body = 'New message';\n }\n\n return {\n title: getChatTitle(getTranslation, chat, privateChatUser),\n body,\n };\n}\n\nasync function getAvatar(chat: ApiChat) {\n const imageHash = getChatAvatarHash(chat);\n if (!imageHash) return undefined;\n let mediaData = mediaLoader.getFromMemory(imageHash);\n if (!mediaData) {\n await mediaLoader.fetch(imageHash, ApiMediaFormat.BlobUrl);\n mediaData = mediaLoader.getFromMemory(imageHash);\n }\n return mediaData;\n}\n\nexport async function notifyAboutNewMessage({\n chat,\n message,\n}: { chat: ApiChat; message: Partial }) {\n const { hasWebNotifications } = await loadNotificationSettings();\n if (!checkIfShouldNotify(chat)) return;\n const areNotificationsSupported = checkIfNotificationsSupported();\n if (!hasWebNotifications || !areNotificationsSupported) {\n // only play sound if web notifications are disabled\n playNotifySoundDebounced(String(message.id) || chat.id);\n return;\n }\n if (!areNotificationsSupported) return;\n if (!message.id) return;\n\n const {\n title,\n body,\n } = getNotificationContent(chat, message as ApiMessage);\n\n const icon = await getAvatar(chat);\n\n if (checkIfPushSupported()) {\n if (navigator.serviceWorker?.controller) {\n // notify service worker about new message notification\n navigator.serviceWorker.controller.postMessage({\n type: 'newMessageNotification',\n payload: {\n title,\n body,\n icon,\n chatId: chat.id,\n messageId: message.id,\n },\n });\n }\n } else {\n const dispatch = getDispatch();\n const options: NotificationOptions = {\n body,\n icon,\n badge: icon,\n tag: String(message.id),\n };\n\n if ('vibrate' in navigator) {\n options.vibrate = [200, 100, 200];\n }\n\n const notification = new Notification(title, options);\n\n notification.onclick = () => {\n notification.close();\n dispatch.focusMessage({\n chatId: chat.id,\n messageId: message.id,\n });\n if (window.focus) {\n window.focus();\n }\n };\n\n // Play sound when notification is displayed\n notification.onshow = () => {\n playNotifySoundDebounced(String(message.id) || chat.id);\n };\n }\n}\n\nexport function closeMessageNotifications(payload: { chatId: string; lastReadInboxMessageId?: number }) {\n if (IS_TEST || !navigator.serviceWorker?.controller) return;\n navigator.serviceWorker.controller.postMessage({\n type: 'closeMessageNotifications',\n payload,\n });\n}\n\n// Notify service worker that client is fully loaded\nexport function notifyClientReady() {\n if (!navigator.serviceWorker?.controller) return;\n navigator.serviceWorker.controller.postMessage({\n type: 'clientReady',\n });\n}\n","import { ApiCountryCode } from '../api/types';\nimport { flatten } from './iteratees';\n\nconst PATTERN_PLACEHOLDER = 'X';\nconst DEFAULT_PATTERN = 'XXX XXX XXX XXX';\n\nexport function getCountryCodesByIso(phoneCodeList: ApiCountryCode[], iso: string) {\n return phoneCodeList.filter((country) => country.iso2 === iso);\n}\n\nexport function getCountryFromPhoneNumber(phoneCodeList: ApiCountryCode[], input = '') {\n let phoneNumber = input.replace(/[^\\d+]+/g, '');\n if (phoneNumber.startsWith('+')) {\n phoneNumber = phoneNumber.substr(1);\n }\n\n const possibleCountries = phoneCodeList\n .filter((country) => phoneNumber.startsWith(country.countryCode));\n const codesWithPrefix: { code: string; country: ApiCountryCode }[] = flatten(possibleCountries\n .map((country) => (country.prefixes || ['']).map((prefix) => {\n return {\n code: `${country.countryCode}${prefix}`,\n country,\n };\n })));\n\n const bestMatches = codesWithPrefix\n .filter(({ code }) => phoneNumber.startsWith(code))\n .sort((a, b) => a.code.length - b.code.length);\n\n return bestMatches[bestMatches.length - 1]?.country;\n}\n\nexport function formatPhoneNumber(input: string, country?: ApiCountryCode) {\n let phoneNumber = input.replace(/[^\\d]+/g, '');\n if (country) {\n phoneNumber = phoneNumber.substr(country.countryCode.length);\n } else if (input.startsWith('+')) {\n return input;\n }\n const pattern = getBestPattern(phoneNumber, country?.patterns);\n\n const result: string[] = []; // Result character array\n let j = 0; // Position inside pattern\n for (let i = 0; i < phoneNumber.length; i++) {\n while (pattern[j] !== PATTERN_PLACEHOLDER && j < pattern.length) {\n result.push(pattern[j]);\n if (pattern[j] === phoneNumber[i]) { // If pattern contains digits, move input position too\n i++;\n if (i === phoneNumber.length) break; // But don't overdo it, or it will insert full pattern unexpectedly\n }\n j++;\n }\n\n result.push(phoneNumber[i]); // For placeholder characters, setting current input digit\n j++;\n }\n\n return result.join('');\n}\n\nfunction getBestPattern(numberWithoutCode: string, patterns?: string[]) {\n if (!patterns || patterns.length === 0) return DEFAULT_PATTERN;\n if (patterns.length === 1) return patterns[0];\n\n const defaultPattern = patterns.find((pattern) => pattern.startsWith(PATTERN_PLACEHOLDER)) || DEFAULT_PATTERN;\n\n const bestMatches = patterns.filter((pattern) => {\n const stripped = pattern.replace(/[^\\dX]+/g, '');\n if (stripped.startsWith(PATTERN_PLACEHOLDER)) return false; // Don't consider default number format here\n for (let i = 0; i < numberWithoutCode.length; i++) {\n if (i > stripped.length - 1 || (stripped[i] !== PATTERN_PLACEHOLDER && stripped[i] !== numberWithoutCode[i])) {\n return false;\n }\n }\n return true;\n });\n\n // Playing it safe: if not sure, use default for that region\n return bestMatches.length === 1 ? bestMatches[0] : defaultPattern;\n}\n\nexport function formatPhoneNumberWithCode(phoneCodeList: ApiCountryCode[], phoneNumber: string) {\n const numberWithPlus = phoneNumber.startsWith('+') ? phoneNumber : `+${phoneNumber}`;\n const country = getCountryFromPhoneNumber(phoneCodeList, numberWithPlus);\n if (!country) {\n return numberWithPlus;\n }\n return `+${country.countryCode} ${formatPhoneNumber(numberWithPlus, country)}`;\n}\n","import { MessageList, MessageListType } from '../global/types';\nimport { MAIN_THREAD_ID } from '../api/types';\n\nexport const createMessageHash = (messageList: MessageList): string => (\n messageList.chatId.toString()\n + (messageList.type !== 'thread' ? `_${messageList.type}`\n : (messageList.threadId !== -1 ? `_${messageList.threadId}` : ''))\n);\n\nexport const parseLocationHash = (value: string): MessageList | undefined => {\n if (!value) return undefined;\n\n const [chatId, typeOrThreadId] = value.replace(/^#/, '').split('_');\n\n if (!chatId) return undefined;\n\n const isType = ['thread', 'pinned', 'scheduled'].includes(typeOrThreadId);\n\n return {\n chatId,\n type: !!typeOrThreadId && isType ? (typeOrThreadId as MessageListType) : 'thread',\n threadId: !!typeOrThreadId && !isType ? Number(typeOrThreadId) : MAIN_THREAD_ID,\n };\n};\n","type Scheduler =\n typeof requestAnimationFrame\n | typeof onTickEnd\n | 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(fastRafPrimary, 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 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 fastRaf(resolve);\n });\n}\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\nlet fastRafPrimaryCallbacks: NoneToVoidFunction[] | undefined;\n\n// May result in an immediate execution if called from another `requestAnimationFrame` callback\nexport function fastRaf(callback: NoneToVoidFunction, isPrimary = false) {\n if (!fastRafCallbacks) {\n fastRafCallbacks = isPrimary ? [] : [callback];\n fastRafPrimaryCallbacks = isPrimary ? [callback] : [];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n const currentPrimaryCallbacks = fastRafPrimaryCallbacks!;\n fastRafCallbacks = undefined;\n fastRafPrimaryCallbacks = undefined;\n currentPrimaryCallbacks.forEach((cb) => cb());\n currentCallbacks.forEach((cb) => cb());\n });\n } else if (isPrimary) {\n fastRafPrimaryCallbacks!.push(callback);\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nexport function fastRafPrimary(callback: NoneToVoidFunction) {\n fastRaf(callback, true);\n}\n\nlet onTickEndCallbacks: NoneToVoidFunction[] | undefined;\nlet onTickEndPrimaryCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function onTickEnd(callback: NoneToVoidFunction, isPrimary = false) {\n if (!onTickEndCallbacks) {\n onTickEndCallbacks = isPrimary ? [] : [callback];\n onTickEndPrimaryCallbacks = isPrimary ? [callback] : [];\n\n Promise.resolve().then(() => {\n const currentCallbacks = onTickEndCallbacks!;\n const currentPrimaryCallbacks = onTickEndPrimaryCallbacks!;\n onTickEndCallbacks = undefined;\n onTickEndPrimaryCallbacks = undefined;\n currentPrimaryCallbacks.forEach((cb) => cb());\n currentCallbacks.forEach((cb) => cb());\n });\n } else if (isPrimary) {\n onTickEndPrimaryCallbacks!.push(callback);\n } else {\n onTickEndCallbacks.push(callback);\n }\n}\n\nexport function onTickEndPrimary(callback: NoneToVoidFunction) {\n onTickEnd(callback, true);\n}\n\nlet beforeUnloadCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function onBeforeUnload(callback: NoneToVoidFunction, isLast = false) {\n if (!beforeUnloadCallbacks) {\n beforeUnloadCallbacks = [];\n // eslint-disable-next-line no-restricted-globals\n self.addEventListener('beforeunload', () => {\n beforeUnloadCallbacks!.forEach((cb) => cb());\n });\n }\n\n if (isLast) {\n beforeUnloadCallbacks.push(callback);\n } else {\n beforeUnloadCallbacks.unshift(callback);\n }\n\n return () => {\n beforeUnloadCallbacks = beforeUnloadCallbacks!.filter((cb) => cb !== callback);\n };\n}\n","let RE_NOT_LETTER: RegExp;\n\ntry {\n RE_NOT_LETTER = new RegExp('[^\\\\p{L}\\\\p{M}]+', 'ui');\n} catch (e) {\n // Support for older versions of firefox\n RE_NOT_LETTER = new RegExp('[^\\\\wа-яё]+', 'i');\n}\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","export const getServerTime = (serverTimeOffset: number) => {\n return Math.floor(Date.now() / 1000) + serverTimeOffset;\n};\n","import safariFix from 'safari-14-idb-fix';\n\nfunction promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n const dbp = safariFix().then(() => {\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n return promisifyRequest(request);\n });\n return (txMode, callback) => dbp.then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(customStore, callback) {\n return customStore('readonly', (store) => {\n // This would be store.getAllKeys(), but it isn't supported by Edge or Safari.\n // And openKeyCursor isn't supported by Safari.\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n const items = [];\n return eachCursor(customStore, (cursor) => items.push(cursor.key)).then(() => items);\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n const items = [];\n return eachCursor(customStore, (cursor) => items.push(cursor.value)).then(() => items);\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n const items = [];\n return eachCursor(customStore, (cursor) => items.push([cursor.key, cursor.value])).then(() => items);\n}\n\nexport { clear, createStore, del, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","/**\n * https://bugs.webkit.org/show_bug.cgi?id=226547\n * Safari has a horrible bug where IDB requests can hang while the browser is starting up.\n * The only solution is to keep nudging it until it's awake.\n * This probably creates garbage, but garbage is better than totally failing.\n */\nfunction idbReady() {\n const isSafari = !navigator.userAgentData &&\n /Safari\\//.test(navigator.userAgent) &&\n !/Chrom(e|ium)\\//.test(navigator.userAgent);\n // No point putting other browsers or older versions of Safari through this mess.\n if (!isSafari || !indexedDB.databases)\n return Promise.resolve();\n let intervalId;\n return new Promise((resolve) => {\n const tryIdb = () => indexedDB.databases().finally(resolve);\n intervalId = setInterval(tryIdb, 100);\n tryIdb();\n }).finally(() => clearInterval(intervalId));\n}\n\nexport default idbReady;\n","import * as idb from 'idb-keyval';\n\nimport { ApiSessionData } from '../api/types';\n\nimport { DEBUG, LEGACY_SESSION_KEY, SESSION_USER_KEY } from '../config';\nimport * as cacheApi from './cacheApi';\n\nconst DC_IDS = [1, 2, 3, 4, 5];\n\nexport function hasStoredSession(withLegacy = false) {\n if (withLegacy && localStorage.getItem(LEGACY_SESSION_KEY)) {\n return true;\n }\n\n const userAuthJson = localStorage.getItem(SESSION_USER_KEY);\n if (!userAuthJson) return false;\n\n try {\n const userAuth = JSON.parse(userAuthJson);\n return Boolean(userAuth && userAuth.id && userAuth.dcID);\n } catch (err) {\n // Do nothing.\n return false;\n }\n}\n\nexport function storeSession(sessionData: ApiSessionData, currentUserId?: string) {\n const { mainDcId, keys, hashes } = sessionData;\n\n localStorage.setItem(SESSION_USER_KEY, JSON.stringify({ dcID: mainDcId, id: currentUserId }));\n localStorage.setItem('dc', String(mainDcId));\n Object.keys(keys).map(Number).forEach((dcId) => {\n localStorage.setItem(`dc${dcId}_auth_key`, JSON.stringify(keys[dcId]));\n });\n\n if (hashes) {\n Object.keys(hashes).map(Number).forEach((dcId) => {\n localStorage.setItem(`dc${dcId}_hash`, JSON.stringify(hashes[dcId]));\n });\n }\n}\n\nexport function clearStoredSession() {\n [\n SESSION_USER_KEY,\n 'dc',\n ...DC_IDS.map((dcId) => `dc${dcId}_auth_key`),\n ...DC_IDS.map((dcId) => `dc${dcId}_hash`),\n ].forEach((key) => {\n localStorage.removeItem(key);\n });\n}\n\nexport function loadStoredSession(): ApiSessionData | undefined {\n if (!hasStoredSession()) {\n return undefined;\n }\n\n const userAuth = JSON.parse(localStorage.getItem(SESSION_USER_KEY)!);\n const mainDcId = Number(userAuth.dcID);\n const keys: Record = {};\n const hashes: Record = {};\n\n DC_IDS.forEach((dcId) => {\n try {\n const key = localStorage.getItem(`dc${dcId}_auth_key`);\n if (key) {\n keys[dcId] = JSON.parse(key);\n }\n\n const hash = localStorage.getItem(`dc${dcId}_hash`);\n if (hash) {\n hashes[dcId] = JSON.parse(hash);\n }\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('Failed to load stored session', err);\n }\n // Do nothing.\n }\n });\n\n if (!Object.keys(keys).length) return undefined;\n\n return {\n mainDcId,\n keys,\n hashes,\n };\n}\n\nexport async function importLegacySession() {\n const sessionId = localStorage.getItem(LEGACY_SESSION_KEY);\n if (!sessionId) return;\n\n const sessionJson = await idb.get(`GramJs:${sessionId}`);\n try {\n const sessionData = JSON.parse(sessionJson) as ApiSessionData;\n storeSession(sessionData);\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('Failed to load legacy session', err);\n }\n // Do nothing.\n }\n}\n\n// Remove previously created IndexedDB and cache API sessions\nexport async function clearLegacySessions() {\n localStorage.removeItem(LEGACY_SESSION_KEY);\n\n const idbKeys = await idb.keys();\n\n await Promise.all>([\n cacheApi.clear('GramJs'),\n ...idbKeys\n .filter((k) => typeof k === 'string' && k.startsWith('GramJs:GramJs-session-'))\n .map((k) => idb.del(k)),\n ]);\n}\n\nexport function importTestSession() {\n const sessionJson = process.env.TEST_SESSION!;\n try {\n const sessionData = JSON.parse(sessionJson) as ApiSessionData & { userId: string };\n storeSession(sessionData, sessionData.userId);\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('Failed to load test session', err);\n }\n // Do nothing.\n }\n}\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;\nconst RGB_VARIABLES = new Set([\n '--color-primary-shade',\n '--color-text-secondary',\n]);\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('no-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('no-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 if (RGB_VARIABLES.has(property)) {\n document.documentElement.style.setProperty(`${property}-rgb`, `${r},${g},${b}`);\n }\n });\n}\n","import EMOJI_REGEX from '../lib/twemojiRegex';\nimport { fixNonStandardEmoji } from './emoji';\n\nexport 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) => {\n if (!word.length) return '';\n word = fixNonStandardEmoji(word);\n const emojis = word.match(EMOJI_REGEX);\n if (emojis && word.startsWith(emojis[0])) {\n return emojis[0];\n }\n return word.match(/./u)![0].toUpperCase();\n })\n .join('');\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 { isWebpSupported } from './environment';\nimport { dataUriToBlob, blobToDataUri } from './files';\nimport { pause } from './schedulers';\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, dataUri: string): Promise {\n if (isWebpSupported() || dataUri.substr(0, 15) !== 'data:image/webp') {\n return dataUri;\n }\n\n initWebpWorker();\n\n const pngBlob = await webpToPng(key, dataUriToBlob(dataUri));\n\n if (!pngBlob) {\n throw new Error(`Can't convert webp to png. Url: ${dataUri}`);\n }\n\n return blobToDataUri(pngBlob);\n}\n\nfunction initWebpWorker() {\n if (!worker) {\n worker = new Worker(new URL('../lib/webp/webp_wasm.worker.js', import.meta.url)) 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 if (!worker.requests) {\n worker.requests = new Map();\n }\n\n worker.requests.set(url, resolve);\n worker.postMessage({ id: url, blob });\n });\n}\n","import { APP_VERSION, DEBUG } from '../config';\nimport { getGlobal } from '../lib/teact/teactn';\nimport { hasStoredSession } from './sessions';\n\nconst WEBSYNC_URLS = [\n 't.me',\n 'telegram.me',\n].map((domain) => `//${domain}/_websync_?`);\nconst WEBSYNC_VERSION = `${APP_VERSION} Z`;\nconst WEBSYNC_KEY = 'tgme_sync';\nconst WEBSYNC_TIMEOUT = 86400;\n\nconst getTs = () => {\n return Math.floor(Number(new Date()) / 1000);\n};\n\nconst saveSync = (authed: boolean) => {\n const ts = getTs();\n localStorage.setItem(WEBSYNC_KEY, JSON.stringify({\n canRedirect: authed,\n ts,\n }));\n};\n\nlet lastTimeout: NodeJS.Timeout | undefined;\n\nexport const forceWebsync = (authed: boolean) => {\n const currentTs = getTs();\n\n const { canRedirect, ts } = JSON.parse(localStorage.getItem(WEBSYNC_KEY) || '{}');\n\n if (canRedirect !== authed || ts + WEBSYNC_TIMEOUT <= currentTs) {\n return Promise.all(WEBSYNC_URLS.map((url) => {\n return new Promise((resolve, reject) => {\n const script = document.createElement('script');\n\n const removeElement = () => !!document.body.removeChild(script);\n\n script.src = url + new URLSearchParams({\n authed: Number(authed).toString(),\n version: WEBSYNC_VERSION,\n });\n\n document.body.appendChild(script);\n\n script.onload = () => {\n saveSync(authed);\n removeElement();\n if (lastTimeout) {\n clearTimeout(lastTimeout);\n lastTimeout = undefined;\n }\n startWebsync();\n resolve();\n };\n\n script.onerror = () => {\n removeElement();\n reject();\n };\n });\n }));\n } else {\n return Promise.resolve();\n }\n};\n\nexport function startWebsync() {\n if (DEBUG) {\n return;\n }\n\n if (lastTimeout !== undefined) return;\n const currentTs = getTs();\n\n const { ts } = JSON.parse(localStorage.getItem(WEBSYNC_KEY) || '{}');\n\n const timeout = WEBSYNC_TIMEOUT - (currentTs - ts);\n\n lastTimeout = setTimeout(() => {\n const { authState } = getGlobal();\n\n const authed = authState === 'authorizationStateReady' || hasStoredSession(true);\n forceWebsync(authed);\n }, Math.max(0, timeout * 1000));\n}\n","import { throttle } from './schedulers';\nimport {\n MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT,\n MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH,\n MOBILE_SCREEN_MAX_WIDTH,\n} from '../config';\nimport { IS_IOS, IS_SINGLE_COLUMN_LAYOUT } from './environment';\n\ntype IDimensions = {\n width: number;\n height: number;\n};\n\nconst IS_LANDSCAPE = IS_SINGLE_COLUMN_LAYOUT && isLandscape();\n\nconst initialHeight = window.innerHeight;\nlet windowSize = updateSizes();\nlet isRefreshDisabled = false;\n\nfunction disableRefresh() {\n isRefreshDisabled = true;\n}\n\nfunction enableRefresh() {\n isRefreshDisabled = false;\n}\n\nconst handleResize = throttle(() => {\n windowSize = updateSizes();\n\n if (!isRefreshDisabled && (\n isMobileScreen() !== IS_SINGLE_COLUMN_LAYOUT\n || (IS_SINGLE_COLUMN_LAYOUT && IS_LANDSCAPE !== isLandscape())\n )) {\n window.location.reload();\n }\n}, 250, true);\n\nwindow.addEventListener('orientationchange', handleResize);\nif (IS_IOS) {\n window.visualViewport.addEventListener('resize', handleResize);\n} else {\n window.addEventListener('resize', handleResize);\n}\n\nexport function updateSizes(): IDimensions {\n let height: number;\n if (IS_IOS) {\n height = window.visualViewport.height + window.visualViewport.pageTop;\n } else {\n height = window.innerHeight;\n }\n const vh = height * 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\nfunction isMobileScreen() {\n return windowSize.width <= MOBILE_SCREEN_MAX_WIDTH || (\n windowSize.width <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH && windowSize.height <= MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT\n );\n}\n\nfunction isLandscape() {\n if (IS_IOS) {\n return window.matchMedia('(orientation: landscape)').matches;\n }\n\n // eslint-disable-next-line max-len\n // Source: https://web.archive.org/web/20160509220835/http://blog.abouthalf.com/development/orientation-media-query-challenges-in-android-browsers/\n // Feature is marked as deprecated now, but it is still supported\n // https://developer.mozilla.org/en-US/docs/Web/CSS/@media/device-aspect-ratio#browser_compatibility\n return window.matchMedia('screen and (min-device-aspect-ratio: 1/1) and (orientation: landscape)').matches;\n}\n\nexport default {\n get: () => windowSize,\n getIsKeyboardVisible: () => initialHeight > windowSize.height,\n disableRefresh,\n enableRefresh,\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + {\"99\":\"f03a947e6e336feffec8\",\"133\":\"f7b0e36077dea7bb93a4\",\"161\":\"286d0207d962142ad548\",\"354\":\"e734f2f3723608c533ad\",\"435\":\"15d3c1acaf8d2000388e\",\"472\":\"21e5264f606f2b525030\",\"501\":\"72ce4b6e27f459e194cd\",\"524\":\"2a153f6444bb77830f1f\",\"532\":\"381cf48a5d9ac614b987\",\"536\":\"55dc7dd4ab42a2c9f037\",\"701\":\"b9c40fbb5ff59255dc0a\",\"739\":\"a56999dcc623ac81b6df\",\"745\":\"9316c5c2b711c39a20a5\",\"884\":\"48fa8564ff8f90ff2a28\",\"915\":\"13af1c4ab9a00d84ac23\",\"927\":\"3f0ca4e5000b59400d2f\",\"941\":\"aad13fbc78f9d63ec948\",\"952\":\"ca0651df42c323c2fa24\",\"993\":\"f0aad9f6787f211b4e51\"}[chunkId] + \".js\";\n};","// This function allow to reference all chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + {\"133\":\"f7b0e36077dea7bb93a4\",\"435\":\"15d3c1acaf8d2000388e\",\"472\":\"21e5264f606f2b525030\",\"532\":\"381cf48a5d9ac614b987\",\"701\":\"b9c40fbb5ff59255dc0a\",\"952\":\"ca0651df42c323c2fa24\"}[chunkId] + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t179: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\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\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkIds[i]] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunktelegram_t\"] = self[\"webpackChunktelegram_t\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","import { DEBUG } from '../config';\nimport { getDispatch } from '../lib/teact/teactn';\nimport { IS_ANDROID, IS_IOS, IS_SERVICE_WORKER_SUPPORTED } from './environment';\nimport { notifyClientReady, playNotifySoundDebounced } from './notifications';\n\ntype WorkerAction = {\n type: string;\n payload: Record;\n};\n\nfunction handleWorkerMessage(e: MessageEvent) {\n const action: WorkerAction = e.data;\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] Message from worker', action);\n }\n if (!action.type) return;\n const dispatch = getDispatch();\n switch (action.type) {\n case 'focusMessage':\n if (dispatch.focusMessage) {\n dispatch.focusMessage(action.payload);\n }\n break;\n case 'playNotificationSound':\n playNotifySoundDebounced(action.payload.id);\n break;\n }\n}\n\nfunction subscribeToWorker() {\n navigator.serviceWorker.removeEventListener('message', handleWorkerMessage);\n navigator.serviceWorker.addEventListener('message', handleWorkerMessage);\n // Notify web worker that client is ready to receive messages\n notifyClientReady();\n}\n\nif (IS_SERVICE_WORKER_SUPPORTED) {\n window.addEventListener('load', async () => {\n try {\n await navigator.serviceWorker.register(new URL('../serviceWorker.ts', import.meta.url));\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] 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('[SW] ServiceWorker ready');\n }\n subscribeToWorker();\n } else {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('[SW] ServiceWorker not available');\n }\n\n if (!IS_IOS && !IS_ANDROID) {\n getDispatch().showDialog({ data: { message: 'SERVICE_WORKER_DISABLED', hasErrorKey: true } });\n }\n }\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('[SW] ServiceWorker registration failed: ', err);\n }\n }\n });\n window.addEventListener('focus', async () => {\n await navigator.serviceWorker.ready;\n subscribeToWorker();\n });\n}\n","import { GlobalState } from './types';\nimport { NewChatMembersProgress } from '../types';\n\nimport {\n ANIMATION_LEVEL_DEFAULT, DARK_THEME_PATTERN_COLOR, DEFAULT_MESSAGE_TEXT_SIZE_PX, DEFAULT_PATTERN_COLOR,\n DEFAULT_PLAYBACK_RATE,\n DEFAULT_VOLUME,\n IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX, MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX,\n} from '../config';\nimport { IS_IOS, IS_MAC_OS } from '../util/environment';\n\nexport const INITIAL_STATE: GlobalState = {\n isLeftColumnShown: true,\n isChatInfoShown: false,\n newChatMembersProgress: NewChatMembersProgress.Closed,\n uiReadyState: 0,\n serverTimeOffset: 0,\n\n authRememberMe: true,\n countryList: {\n phoneCodes: [],\n general: [],\n },\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 messageLists: [],\n },\n\n groupCalls: {\n byId: {},\n },\n\n scheduledMessages: {\n byChatId: {},\n },\n\n chatFolders: {\n byId: {},\n activeChatFolder: 0,\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 greeting: {\n stickers: [],\n },\n featured: {\n setIds: [],\n },\n search: {},\n forEmoji: {},\n },\n\n emojiKeywords: {},\n\n gifs: {\n saved: {},\n search: {},\n },\n\n inlineBots: {\n isLoading: false,\n byUsername: {},\n },\n\n globalSearch: {},\n\n userSearch: {},\n\n localTextSearch: {\n byChatThreadKey: {},\n },\n\n localMediaSearch: {\n byChatId: {},\n },\n\n management: {\n byChatId: {},\n },\n\n topPeers: {},\n\n topInlineBots: {},\n\n mediaViewer: {},\n\n audioPlayer: {\n volume: DEFAULT_VOLUME,\n playbackRate: DEFAULT_PLAYBACK_RATE,\n isMuted: false,\n },\n\n forwardMessages: {},\n\n pollResults: {},\n\n payment: {},\n\n notifications: [],\n\n dialogs: [],\n\n activeSessions: [],\n\n settings: {\n byKey: {\n theme: 'light',\n shouldUseSystemTheme: true,\n messageTextSize: IS_IOS\n ? IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX\n : (IS_MAC_OS ? MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX : DEFAULT_MESSAGE_TEXT_SIZE_PX),\n animationLevel: ANIMATION_LEVEL_DEFAULT,\n messageSendKeyCombo: 'enter',\n canAutoLoadPhotoFromContacts: true,\n canAutoLoadPhotoInPrivateChats: true,\n canAutoLoadPhotoInGroups: true,\n canAutoLoadPhotoInChannels: true,\n canAutoLoadVideoFromContacts: true,\n canAutoLoadVideoInPrivateChats: true,\n canAutoLoadVideoInGroups: true,\n canAutoLoadVideoInChannels: true,\n canAutoLoadFileFromContacts: false,\n canAutoLoadFileInPrivateChats: false,\n canAutoLoadFileInGroups: false,\n canAutoLoadFileInChannels: false,\n autoLoadFileMaxSizeMb: 10,\n hasWebNotifications: true,\n hasPushNotifications: true,\n notificationSoundVolume: 5,\n canAutoPlayGifs: true,\n canAutoPlayVideos: true,\n shouldSuggestStickers: true,\n shouldLoopStickers: true,\n language: 'en',\n timeFormat: '24h',\n wasTimeFormatSetManually: false,\n },\n themes: {\n light: {\n isBlurred: true,\n patternColor: DEFAULT_PATTERN_COLOR,\n },\n dark: {\n isBlurred: true,\n patternColor: DARK_THEME_PATTERN_COLOR,\n },\n },\n privacy: {},\n notifyExceptions: {},\n },\n\n twoFaSettings: {},\n\n shouldShowContextMenuHint: true,\n\n activeDownloads: {\n byChatId: {},\n },\n\n serviceNotifications: [],\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 { onBeforeUnload, 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 MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n GLOBAL_STATE_CACHE_USER_LIST_LIMIT,\n DEFAULT_VOLUME,\n DEFAULT_PLAYBACK_RATE,\n} from '../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../util/environment';\nimport { ANIMATION_END_EVENT, ANIMATION_START_EVENT } from '../hooks/useHeavyAnimationCheck';\nimport { pick } from '../util/iteratees';\nimport { selectCurrentMessageList } from '../modules/selectors';\nimport { hasStoredSession } from '../util/sessions';\nimport { INITIAL_STATE } from './initial';\nimport { parseLocationHash } from '../util/routing';\nimport { LOCATION_HASH } from '../hooks/useHistoryBack';\nimport { isUserId } from '../modules/helpers';\n\nconst UPDATE_THROTTLE = 5000;\n\nconst updateCacheThrottled = throttle(() => onIdle(updateCache), UPDATE_THROTTLE, false);\n\nlet isCaching = false;\nlet isHeavyAnimating = false;\nlet unsubscribeFromBeforeUnload: NoneToVoidFunction | undefined;\n\nsetupHeavyAnimationListeners();\n\nexport function initCache() {\n if (GLOBAL_STATE_CACHE_DISABLED) {\n return;\n }\n\n addReducer('saveSession', () => {\n if (isCaching) {\n return;\n }\n\n setupCaching();\n });\n\n addReducer('reset', () => {\n localStorage.removeItem(GLOBAL_STATE_CACHE_KEY);\n\n if (!isCaching) {\n return;\n }\n\n clearCaching();\n });\n}\n\nexport function loadCache(initialState: GlobalState): GlobalState | undefined {\n if (GLOBAL_STATE_CACHE_DISABLED) {\n return undefined;\n }\n\n if (hasStoredSession(true)) {\n setupCaching();\n\n return readCache(initialState);\n } else {\n clearCaching();\n\n return undefined;\n }\n}\n\nfunction setupCaching() {\n isCaching = true;\n unsubscribeFromBeforeUnload = onBeforeUnload(updateCache, true);\n window.addEventListener('blur', updateCache);\n addCallback(updateCacheThrottled);\n}\n\nfunction clearCaching() {\n isCaching = false;\n removeCallback(updateCacheThrottled);\n window.removeEventListener('blur', updateCache);\n if (unsubscribeFromBeforeUnload) {\n unsubscribeFromBeforeUnload();\n }\n}\n\nfunction readCache(initialState: GlobalState): 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 migrateCache(cached, initialState);\n }\n\n const newState = {\n ...initialState,\n ...cached,\n };\n\n const parsedMessageList = !IS_SINGLE_COLUMN_LAYOUT ? parseLocationHash(LOCATION_HASH) : undefined;\n\n return {\n ...newState,\n messages: {\n ...newState.messages,\n messageLists: parsedMessageList ? [parsedMessageList] : [],\n },\n };\n}\n\nfunction migrateCache(cached: GlobalState, initialState: GlobalState) {\n if ('shouldAutoDownloadMediaFromContacts' in cached.settings.byKey) {\n const {\n shouldAutoDownloadMediaFromContacts,\n shouldAutoDownloadMediaInPrivateChats,\n shouldAutoDownloadMediaInGroups,\n shouldAutoDownloadMediaInChannels,\n shouldAutoPlayVideos,\n shouldAutoPlayGifs,\n ...rest\n } = cached.settings.byKey;\n\n cached.settings.byKey = {\n ...rest,\n canAutoLoadPhotoFromContacts: shouldAutoDownloadMediaFromContacts,\n canAutoLoadVideoFromContacts: shouldAutoDownloadMediaFromContacts,\n canAutoLoadPhotoInPrivateChats: shouldAutoDownloadMediaInPrivateChats,\n canAutoLoadVideoInPrivateChats: shouldAutoDownloadMediaInPrivateChats,\n canAutoLoadPhotoInGroups: shouldAutoDownloadMediaInGroups,\n canAutoLoadVideoInGroups: shouldAutoDownloadMediaInGroups,\n canAutoLoadPhotoInChannels: shouldAutoDownloadMediaInChannels,\n canAutoLoadVideoInChannels: shouldAutoDownloadMediaInChannels,\n canAutoPlayVideos: shouldAutoPlayVideos,\n canAutoPlayGifs: shouldAutoPlayGifs,\n };\n }\n\n cached.settings.byKey = {\n ...initialState.settings.byKey,\n ...cached.settings.byKey,\n };\n\n cached.settings.themes = {\n ...initialState.settings.themes,\n ...cached.settings.themes,\n };\n\n cached.chatFolders = {\n ...initialState.chatFolders,\n ...cached.chatFolders,\n };\n\n if (!cached.stickers.greeting) {\n cached.stickers.greeting = initialState.stickers.greeting;\n }\n\n if (!cached.activeDownloads) {\n cached.activeDownloads = {\n byChatId: {},\n };\n }\n\n if (!cached.serviceNotifications) {\n cached.serviceNotifications = [];\n }\n\n if (cached.audioPlayer.volume === undefined) {\n cached.audioPlayer.volume = DEFAULT_VOLUME;\n }\n\n if (cached.audioPlayer.playbackRate === undefined) {\n cached.audioPlayer.playbackRate = DEFAULT_PLAYBACK_RATE;\n }\n\n if (cached.groupCalls === undefined) {\n cached.groupCalls = initialState.groupCalls;\n }\n}\n\nfunction updateCache() {\n if (!isCaching || isHeavyAnimating) {\n return;\n }\n\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 'authNearestCountry',\n 'currentUserId',\n 'contactList',\n 'topPeers',\n 'topInlineBots',\n 'recentEmojis',\n 'push',\n 'shouldShowContextMenuHint',\n 'leftColumnWidth',\n 'serviceNotifications',\n ]),\n audioPlayer: {\n volume: global.audioPlayer.volume,\n playbackRate: global.audioPlayer.playbackRate,\n isMuted: global.audioPlayer.isMuted,\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 chatFolders: reduceChatFolders(global),\n groupCalls: reduceGroupCalls(global),\n };\n\n const json = JSON.stringify(reducedGlobal);\n localStorage.setItem(GLOBAL_STATE_CACHE_KEY, json);\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(isUserId),\n ...Object.keys(byId),\n ].slice(0, GLOBAL_STATE_CACHE_USER_LIST_LIMIT);\n\n return {\n byId: pick(byId, idsToSave),\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 return {\n byChatId,\n messageLists: [],\n };\n}\n\nfunction reduceSettings(global: GlobalState): GlobalState['settings'] {\n const { byKey, themes } = global.settings;\n\n return {\n byKey,\n themes,\n privacy: {},\n notifyExceptions: {},\n };\n}\n\nfunction reduceChatFolders(global: GlobalState): GlobalState['chatFolders'] {\n return {\n ...global.chatFolders,\n activeChatFolder: 0,\n };\n}\n\nfunction reduceGroupCalls(global: GlobalState): GlobalState['groupCalls'] {\n return {\n ...global.groupCalls,\n byId: {},\n activeGroupCallId: undefined,\n isGroupCallPanelHidden: undefined,\n isFallbackConfirmOpen: undefined,\n };\n}\n\nfunction setupHeavyAnimationListeners() {\n document.addEventListener(ANIMATION_START_EVENT, () => {\n isHeavyAnimating = true;\n });\n document.addEventListener(ANIMATION_END_EVENT, () => {\n isHeavyAnimating = false;\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';\n\ninitCache();\n\naddReducer('init', () => {\n const initial = cloneDeep(INITIAL_STATE);\n return loadCache(initial) || initial;\n});\n","const STORAGE_KEY = 'tt-active-tab';\nconst INTERVAL = 2000;\n\nconst tabKey = String(Date.now() + Math.random());\n\nlocalStorage.setItem(STORAGE_KEY, tabKey);\n\nlet callback: NoneToVoidFunction;\n\nconst interval = window.setInterval(() => {\n if (callback && localStorage.getItem(STORAGE_KEY) !== tabKey) {\n callback();\n clearInterval(interval);\n }\n}, INTERVAL);\n\nexport function addActiveTabChangeListener(_callback: NoneToVoidFunction) {\n callback = _callback;\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","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, selectTheme } 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 hasCustomBackgroundColor: boolean;\n isRightColumnShown?: boolean;\n leftColumnWidth?: number;\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.BlobUrl);\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 hasCustomBackgroundColor,\n isRightColumnShown,\n shouldSkipHistoryAnimations,\n leftColumnWidth,\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 const safePreload = async () => {\n try {\n await preloadTasks[page]();\n } catch (err) {\n // Do nothing\n }\n };\n\n Promise.race([\n pause(MAX_PRELOAD_DELAY),\n safePreload(),\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 && !shouldSkipHistoryAnimations && (\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 const theme = selectTheme(global);\n const { background, backgroundColor } = global.settings.themes[theme] || {};\n\n return {\n shouldSkipHistoryAnimations: global.shouldSkipHistoryAnimations,\n uiReadyState: global.uiReadyState,\n hasCustomBackground: Boolean(background),\n hasCustomBackgroundColor: Boolean(backgroundColor),\n isRightColumnShown: selectIsRightColumnShown(global),\n leftColumnWidth: global.leftColumnWidth,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setIsUiReady']),\n)(UiLoader);\n","import * as langProvider from '../util/langProvider';\nimport { useState } from '../lib/teact/teact';\n\nexport default (langCode: string | undefined, key: string): string | undefined => {\n const [translation, setTranslation] = useState();\n\n if (langCode) {\n langProvider\n .getTranslationForLangString(langCode, key)\n .then(setTranslation);\n }\n\n return translation;\n};\n","import { LangCode } from '../../../types';\n\nexport function getSuggestedLanguage() {\n let suggestedLanguage = navigator.language;\n\n if (suggestedLanguage && suggestedLanguage !== 'pt-br') {\n suggestedLanguage = suggestedLanguage.substr(0, 2);\n }\n\n return suggestedLanguage as LangCode;\n}\n","import React, {\n FC, useState, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiCountryCode } from '../../api/types';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport searchWords from '../../util/searchWords';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport { isoToEmoji } from '../../util/emoji';\nimport useOnChange from '../../hooks/useOnChange';\n\nimport DropdownMenu from '../ui/DropdownMenu';\nimport MenuItem from '../ui/MenuItem';\nimport Spinner from '../ui/Spinner';\n\nimport './CountryCodeInput.scss';\n\ntype StateProps = {\n phoneCodeList: ApiCountryCode[];\n};\n\ntype OwnProps = {\n id: string;\n value?: ApiCountryCode;\n isLoading?: boolean;\n onChange: (value: ApiCountryCode) => 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 phoneCodeList,\n}) => {\n const lang = useLang();\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([]);\n\n const updateFilter = useCallback((filterValue?: string) => {\n setFilter(filterValue);\n setFilteredList(getFilteredList(phoneCodeList, filterValue));\n }, [phoneCodeList]);\n\n useOnChange(([prevPhoneCodeList]) => {\n if (prevPhoneCodeList?.length === 0 && phoneCodeList.length > 0) {\n updateFilter(filter);\n }\n }, [phoneCodeList, updateFilter]);\n\n const handleChange = useCallback((country: ApiCountryCode) => {\n onChange(country);\n\n setTimeout(() => updateFilter(undefined), MENU_HIDING_DURATION);\n }, [onChange, updateFilter]);\n\n const handleInput = useCallback((e: React.FormEvent) => {\n updateFilter(e.currentTarget.value);\n }, [updateFilter]);\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, updateFilter, 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 handleCodeInput = (e: React.FormEvent) => {\n handleInput(e);\n handleTrigger();\n };\n\n const inputValue = filter ?? (value?.name || value?.defaultName || '');\n\n return (\n
\n \n \n {isLoading ? (\n \n ) : (\n \n )}\n
\n );\n };\n\n return (\n \n {filteredList\n .map((country: ApiCountryCode) => (\n handleChange(country)}\n >\n {renderText(isoToEmoji(country.iso2), ['hq_emoji'])}\n {country.name || country.defaultName}\n {country.countryCode}\n \n ))}\n {!filteredList.length && (\n \n {lang('lng_country_none')}\n \n )}\n \n );\n};\n\nfunction getFilteredList(countryList: ApiCountryCode[], filter = ''): ApiCountryCode[] {\n const filtered = filter.length\n ? countryList.filter((country) => (\n searchWords(country.defaultName, filter) || (country.name && searchWords(country.name, filter))\n )) : countryList;\n return filtered;\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { countryList: { phoneCodes: phoneCodeList } } = global;\n return {\n phoneCodeList,\n };\n },\n)(CountryCodeInput));\n","import { ChangeEvent } from 'react';\n\n// @ts-ignore\nimport monkeyPath from '../../assets/monkey.svg';\n\nimport React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { LangCode } from '../../types';\nimport { ApiCountryCode } from '../../api/types';\n\nimport { IS_SAFARI, IS_TOUCH_ENV } from '../../util/environment';\nimport { preloadImage } from '../../util/files';\nimport preloadFonts from '../../util/fonts';\nimport { pick } from '../../util/iteratees';\nimport { formatPhoneNumber, getCountryCodesByIso, getCountryFromPhoneNumber } from '../../util/phoneNumber';\nimport { setLanguage } from '../../util/langProvider';\nimport useLang from '../../hooks/useLang';\nimport useFlag from '../../hooks/useFlag';\nimport useLangString from '../../hooks/useLangString';\nimport { getSuggestedLanguage } from './helpers/getSuggestedLanguage';\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 & {\n language?: LangCode;\n phoneCodeList: ApiCountryCode[];\n};\ntype DispatchProps = Pick;\n\nconst MIN_NUMBER_LENGTH = 7;\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 phoneCodeList,\n language,\n setAuthPhoneNumber,\n setAuthRememberMe,\n loadNearestCountry,\n loadCountryList,\n clearAuthError,\n goToAuthQrCode,\n setSettingOption,\n}) => {\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const suggestedLanguage = getSuggestedLanguage();\n\n const continueText = useLangString(suggestedLanguage, 'ContinueOnThisLanguage');\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 const [isLoading, markIsLoading, unmarkIsLoading] = useFlag();\n\n const fullNumber = country ? `+${country.countryCode} ${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 (connectionState === 'connectionStateReady') {\n loadCountryList({ langCode: language });\n }\n }, [connectionState, language, loadCountryList]);\n\n useEffect(() => {\n if (authNearestCountry && phoneCodeList && !country && !isTouched) {\n setCountry(getCountryCodesByIso(phoneCodeList, authNearestCountry)[0]);\n }\n }, [country, authNearestCountry, isTouched, phoneCodeList]);\n\n const parseFullNumber = useCallback((newFullNumber: string) => {\n if (!newFullNumber.length) {\n setPhoneNumber('');\n }\n\n const suggestedCountry = phoneCodeList && getCountryFromPhoneNumber(phoneCodeList, newFullNumber);\n\n // Any phone numbers should be allowed, in some cases ignoring formatting\n const selectedCountry = !country\n || (suggestedCountry && suggestedCountry.iso2 !== country.iso2)\n || (!suggestedCountry && newFullNumber.length)\n ? suggestedCountry\n : country;\n\n if (!country || !selectedCountry || (selectedCountry && selectedCountry.iso2 !== country.iso2)) {\n setCountry(selectedCountry);\n }\n setPhoneNumber(formatPhoneNumber(newFullNumber, selectedCountry));\n }, [phoneCodeList, country]);\n\n const handleLangChange = useCallback(() => {\n markIsLoading();\n\n void setLanguage(suggestedLanguage, () => {\n unmarkIsLoading();\n\n setSettingOption({ language: suggestedLanguage });\n });\n }, [markIsLoading, setSettingOption, suggestedLanguage, unmarkIsLoading]);\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 const isJustPastedRef = useRef(false);\n const handlePaste = useCallback(() => {\n isJustPastedRef.current = true;\n requestAnimationFrame(() => {\n isJustPastedRef.current = false;\n });\n }, []);\n\n const handleCountryChange = useCallback((value: ApiCountryCode) => {\n setCountry(value);\n setPhoneNumber('');\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 void 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\n const shouldFixSafariAutoComplete = (\n IS_SAFARI && country && fullNumber !== undefined\n && value.length - fullNumber.length > 1 && !isJustPastedRef.current\n );\n parseFullNumber(shouldFixSafariAutoComplete ? `${country!.countryCode} ${value}` : value);\n }, [authError, clearAuthError, country, fullNumber, 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

Telegram

\n

{lang('StartText')}

\n
\n \n \n \n {canSubmit && (\n isAuthReady ? (\n \n ) : (\n \n )\n )}\n {isAuthReady && (\n \n )}\n {suggestedLanguage && suggestedLanguage !== language && continueText && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n settings: { byKey: { language } },\n countryList: { phoneCodes: phoneCodeList },\n } = global;\n\n return {\n ...pick(global, [\n 'connectionState',\n 'authState',\n 'authPhoneNumber',\n 'authIsLoading',\n 'authIsLoadingQrCode',\n 'authError',\n 'authRememberMe',\n 'authNearestCountry',\n ]),\n language,\n phoneCodeList,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setAuthPhoneNumber',\n 'setAuthRememberMe',\n 'clearAuthError',\n 'loadNearestCountry',\n 'loadCountryList',\n 'goToAuthQrCode',\n 'setSettingOption',\n ]),\n)(AuthPhoneNumber));\n","import React, { FC, memo } 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 memo(AuthCodeAsync);\n","import React, { FC, memo } 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 memo(AuthPasswordAsync);\n","import React, { FC, memo } 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 memo(AuthRegisterAsync);\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 & {\n language?: LangCode;\n};\ntype DispatchProps = Pick;\n\nconst DATA_PREFIX = 'tg://login?token=';\n\nconst AuthCode: FC = ({\n connectionState,\n authState,\n authQrCode,\n language,\n returnToAuthPhoneNumber,\n setSettingOption,\n}) => {\n const suggestedLanguage = getSuggestedLanguage();\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const qrCodeRef = useRef(null);\n const continueText = useLangString(suggestedLanguage, 'ContinueOnThisLanguage');\n const [isLoading, markIsLoading, unmarkIsLoading] = useFlag();\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\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 const handleLangChange = useCallback(() => {\n markIsLoading();\n\n void setLanguage(suggestedLanguage, () => {\n unmarkIsLoading();\n\n setSettingOption({ language: suggestedLanguage });\n });\n }, [markIsLoading, setSettingOption, suggestedLanguage, unmarkIsLoading]);\n\n const isAuthReady = authState === 'authorizationStateWaitQrCode';\n\n return (\n
\n
\n {authQrCode ? (\n
\n ) : (\n
\n )}\n

{lang('Login.QR.Title')}

\n
    \n
  1. {lang('Login.QR.Help1')}
  2. \n
  3. {renderText(lang('Login.QR.Help2'), ['simple_markdown'])}
  4. \n
  5. {lang('Login.QR.Help3')}
  6. \n
\n {isAuthReady && (\n \n )}\n {suggestedLanguage && suggestedLanguage !== language && continueText && (\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n connectionState, authState, authQrCode, settings: { byKey: { language } },\n } = global;\n\n return {\n connectionState,\n authState,\n authQrCode,\n language,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'returnToAuthPhoneNumber', 'setSettingOption',\n ]),\n)(AuthCode));\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';\nimport { PLATFORM_ENV } from '../../util/environment';\nimport windowSize from '../../util/windowSize';\nimport useHistoryBack from '../../hooks/useHistoryBack';\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';\n\nimport './Auth.scss';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst Auth: FC = ({\n authState, reset, initApi, returnToAuthPhoneNumber, goToAuthQrCode,\n}) => {\n useEffect(() => {\n reset();\n initApi();\n }, [reset, initApi]);\n\n const isMobile = PLATFORM_ENV === 'iOS' || PLATFORM_ENV === 'Android';\n\n const handleChangeAuthorizationMethod = () => {\n if (!isMobile) {\n goToAuthQrCode();\n } else {\n returnToAuthPhoneNumber();\n }\n };\n\n useHistoryBack(\n (!isMobile && authState === 'authorizationStateWaitPhoneNumber')\n || (isMobile && authState === 'authorizationStateWaitQrCode'), handleChangeAuthorizationMethod,\n );\n\n // Prevent refresh when rotating device\n useEffect(() => {\n windowSize.disableRefresh();\n\n return () => {\n windowSize.enableRefresh();\n };\n }, []);\n\n switch (authState) {\n case 'authorizationStateWaitCode':\n return ;\n case 'authorizationStateWaitPassword':\n return ;\n case 'authorizationStateWaitRegistration':\n return ;\n case 'authorizationStateWaitPhoneNumber':\n return ;\n case 'authorizationStateWaitQrCode':\n return ;\n default:\n return isMobile\n ? \n : ;\n }\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authState']),\n (global, actions): DispatchProps => pick(actions, ['reset', 'initApi', 'returnToAuthPhoneNumber', 'goToAuthQrCode']),\n)(Auth));\n","import React, { FC, memo } 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 memo(MainAsync);\n","import React, { FC } from '../../lib/teact/teact';\n\nimport Button from '../ui/Button';\n\nimport appInactivePath from '../../assets/app-inactive.png';\nimport './AppInactive.scss';\n\nconst AppInactive: FC = () => {\n const handleReload = () => {\n window.location.reload();\n };\n\n return (\n
\n
\n \"\"\n

Such error, many tabs

\n
\n Telegram supports only one active tab with the app.\n
\n Please reload this page to continue using this tab or close it.\n
\n
\n \n
\n
\n
\n );\n};\n\nexport default AppInactive;\n","import { FC, useEffect } from './lib/teact/teact';\nimport React, { withGlobal } from './lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from './global/types';\n\nimport { INACTIVE_MARKER, PAGE_TITLE } from './config';\nimport { pick } from './util/iteratees';\nimport { updateSizes } from './util/windowSize';\nimport { addActiveTabChangeListener } from './util/activeTabMonitor';\nimport useFlag from './hooks/useFlag';\n\nimport Auth from './components/auth/Auth';\nimport UiLoader from './components/common/UiLoader';\nimport Main from './components/main/Main.async';\nimport AppInactive from './components/main/AppInactive';\nimport { hasStoredSession } from './util/sessions';\n// import Test from './components/test/TestNoRedundancy';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst App: FC = ({ authState, disconnect }) => {\n const [isInactive, markInactive] = useFlag(false);\n\n useEffect(() => {\n updateSizes();\n addActiveTabChangeListener(() => {\n disconnect();\n document.title = `${PAGE_TITLE}${INACTIVE_MARKER}`;\n\n markInactive();\n });\n }, [disconnect, markInactive]);\n\n // return ;\n\n if (isInactive) {\n return ;\n }\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 hasStoredSession(true) ? renderMain() : ;\n};\n\nfunction renderMain() {\n return (\n \n
\n \n );\n}\n\nexport default withGlobal(\n (global): StateProps => pick(global, ['authState']),\n (setGlobal, actions): DispatchProps => pick(actions, ['disconnect']),\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.warn('GLOBAL STATE', getGlobal());\n});\n"],"names":["leafPrototypes","getProto","inProgress","dataWebpackPrefix","loadStylesheet","installedCssChunks","worker","requestStates","Map","requestStatesByCallback","initApi","onUpdate","initialArgs","DEBUG","console","log","Worker","URL","addEventListener","data","type","update","requestState","get","messageId","error","reject","resolve","response","callback","callbackArgs","subscribeToWorker","platform","window","async","Promise","race","makeRequest","pause","then","Error","err","Date","now","startedAt","location","reload","args","callApi","fnName","name","warn","cancelApiProgress","progressCallback","isCanceled","postMessage","message","generateIdFor","payload","promise","Object","assign","pop","set","catch","finally","delete","ApiMediaFormat","ApiMessageEntityTypes","MAIN_THREAD_ID","MESSAGE_DELETED","base","maxint","adapt","delta","numpoints","firsttime","k","Math","floor","decode","input","preserveCase","output","case_flags","input_length","length","n","out","i","bias","basic","j","ic","oldi","w","digit","t","len","lastIndexOf","charCodeAt","RangeError","push","cp","splice","String","fromCharCode","toUpperCase","value","join","utf16","getDomain","url","href","ensureProtocol","decodedHref","decodeURI","match","domain","replace","domain_array","split","s","slice","convertPunycode","memo","text","className","children","isRtl","toggleSafeLinkModal","openTelegramLink","getDispatch","content","isNotSafe","handleClick","useCallback","e","ctrlKey","altKey","shiftKey","metaKey","RE_TME_LINK","RE_TG_LINK","preventDefault","classNames","buildClassName","title","target","rel","onClick","dir","getFileSizeString","bytes","ONE_GIGABYTE","toFixed","ONE_MEGABYTE","getDocumentExtension","document","fileName","mimeType","getFileExtension","indexOf","getColorFromExtension","extension","getDocumentHasPreview","Boolean","previewBlobUrl","thumbnail","RE_EMOJI_ONLY","RegExp","twemojiRegex","DETECT_UP_TO","emojiCount","withGlobal","undefined","setGlobal","actions","pick","sender","openUserInfo","id","Link","focusMessage","handleMessageClick","chatId","openChat","groupCall","joinGroupCall","accessHash","renderActionMessageText","lang","actionOrigin","targetUsers","targetMessage","targetChatId","options","action","translationValues","amount","currency","call","textOptions","maxTextLength","processed","unprocessed","includes","processPlaceholder","formatCurrency","code","isEmbedded","origin","asPlain","isUserId","renderUserContent","chat","trimText","getChatTitle","renderText","renderChatContent","renderOriginContent","map","user","filter","getMessageSummaryText","photo","video","sticker","getMessageContent","showQuotes","messageText","isGif","renderMessageContent","invoice","renderProductContent","renderMigratedContent","trim","renderGroupCallContent","getUserFullName","placeholder","replaceValue","placeholderPosition","substring","Array","isArray","forEach","index","RE_LETTER_OR_DIGIT","SIMPLE_MARKDOWN_REGEX","part","filters","params","reduce","textParts","divEl","createElement","result","innerText","innerHTML","escapeHtml","EMOJI_REGEX","replaceEmojis","addLineBreaks","highlight","lowerCaseText","toLowerCase","queryPosition","nextSymbol","newParts","links","RE_LINK","nextLink","shift","lastIndex","startsWith","username","endsWith","addLinks","replaceSimpleMarkdown","size","IS_EMOJI_SUPPORTED","parts","fixNonStandardEmoji","emojis","emojiResult","emoji","nativeToUnified","removeVS16s","src","alt","line","source","trimmedLine","trimLeft","indentLength","repeat","RE_LINK_TEMPLATE","RE_MENTION_TEMPLATE","entities","entityResult","entity","preventMessageInputBlur","withBubbling","IS_IOS","activeElement","EDITABLE_INPUT_ID","currentTarget","preventMessageInputBlurWithBubbling","global","userId","userOrChat","selectUser","openChatByUsername","ref","onContextMenu","onMouseDown","onMouseEnter","onMouseLeave","onFocus","color","backgroundImage","round","pill","fluid","isText","isLoading","ariaLabel","download","disabled","ripple","faded","tabIndex","withClickPropagation","elementRef","useRef","isClicked","setIsClicked","useState","fullClassName","setTimeout","handleMouseDown","style","label","subLabel","checked","blocking","onChange","onCheck","useLang","handleChange","event","trigger","positionX","positionY","footer","forceOpen","onOpen","onClose","menuRef","dropdownRef","isOpen","setIsOpen","onKeyDown","menu","current","keyCode","focusedElement","elementChildren","from","focus","onTrigger","containerRef","autoClose","shouldSkipTransition","success","readOnly","autoComplete","inputMode","maxLength","onInput","onKeyPress","onBlur","onPaste","labelText","htmlFor","withBackground","menuStyle","noCloseOnBackdrop","onCloseAnimationEnd","backdropContainerRef","transitionClassNames","useShowTransition","useEffect","captureEscKeyListener","useHistoryBack","useEffectWithPrevDeps","prevIsOpen","dispatchHeavyAnimationEvent","handleKeyDown","useKeyboardListNavigation","useVirtualBackdrop","bubbleClassName","props","icon","destructive","stopPropagation","role","ripples","setRipples","cleanUpDebounced","useMemo","debounce","button","container","position","getBoundingClientRect","rippleSize","offsetWidth","x","clientX","y","clientY","requestAnimationFrame","PAGE_TITLE","INACTIVE_MARKER","APP_NAME","process","APP_VERSION","DEBUG_MORE","IS_TEST","DEBUG_ALERT_MSG","SESSION_USER_KEY","LEGACY_SESSION_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","AUTODOWNLOAD_FILESIZE_MB_LIMITS","isBigScreen","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","MEMBERS_SLICE","MEMBERS_LOAD_SLICE","PROFILE_SENSITIVE_AREA","TOP_CHAT_MESSAGES_PRELOAD_LIMIT","ALL_CHATS_PRELOAD_DISABLED","DEFAULT_VOLUME","DEFAULT_PLAYBACK_RATE","ANIMATION_LEVEL_MIN","ANIMATION_LEVEL_MAX","ANIMATION_LEVEL_DEFAULT","DEFAULT_MESSAGE_TEXT_SIZE_PX","IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX","MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX","DRAFT_DEBOUNCE","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","TMP_CHAT_ID","ANIMATION_END_DELAY","FAST_SMOOTH_MAX_DISTANCE","FAST_SMOOTH_MIN_DURATION","FAST_SMOOTH_MAX_DURATION","FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE","STICKER_SIZE_INLINE_DESKTOP_FACTOR","Set","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","STICKER_SIZE_INLINE_BOT_RESULT","MEMOJI_STICKER_ID","BASE_EMOJI_KEYWORD_LANG","MENU_TRANSITION_DURATION","SLIDE_TRANSITION_DURATION","VIDEO_MOV_TYPE","SUPPORTED_IMAGE_CONTENT_TYPES","SUPPORTED_VIDEO_CONTENT_TYPES","CONTENT_TYPES_WITH_PREVIEW","COUNTRIES_WITH_12H_TIME_FORMAT","SERVICE_NOTIFICATIONS_USER_ID","REPLIES_USER_ID","ALL_FOLDER_ID","ARCHIVED_FOLDER_ID","MAX_MEDIA_FILES_FOR_ALBUM","MAX_ACTIVE_PINNED_CHATS","SCHEDULED_WHEN_ONLINE","DEFAULT_LANG_CODE","DEFAULT_LANG_PACK","LANG_PACKS","TIPS_USERNAME","LOCALIZED_TIPS","FEEDBACK_URL","LIGHT_THEME_BG_COLOR","DARK_THEME_BG_COLOR","DARK_THEME_PATTERN_COLOR","DEFAULT_PATTERN_COLOR","GROUP_CALL_VOLUME_MULTIPLIER","GROUP_CALL_DEFAULT_VOLUME","ENABLE_THUMBNAIL_VIDEO","cb","dependencies","debugKey","prevDeps","usePrevious","initial","setValue","setTrigger","ANIMATION_START_EVENT","ANIMATION_END_EVENT","timeout","isAnimating","duration","dispatchEvent","Event","clearTimeout","handleAnimationStart","handleAnimationEnd","removeEventListener","LOCATION_HASH","hash","PATH_BASE","pathname","search","historyState","currentIndex","nextStateIndexToReplace","isHistoryAltered","isDisabled","isEdge","currentIndexes","disableHistoryBack","handleTouchEnd","isActive","onBack","onForward","currentState","shouldReplaceNext","hashes","indexRef","isForward","prevIsActive","isClosed","indexHashRef","prevHashes","isHashChangedFromEvent","isForceClose","prev","history","pushState","state","last","realDelta","indexLast","findIndex","l","go","replaceState","back","handlePopState","currIndex","disableHistoryAnimations","hasChanged","areSortedArraysEqual","forceClose","touches","pageX","innerWidth","onSelectWithEnter","itemSelector","noCaptureFocus","focusedIndex","setFocusedIndex","element","querySelectorAll","newIndex","item","forceUpdate","useForceUpdate","useOnChange","langProvider","bundleName","moduleName","noLoad","autoUpdate","module","getModuleFromMemory","addLoadListener","loadModule","some","d","next","shouldSkipUndefined","onCloseTransitionEnd","noOpenTransition","noCloseTransition","setIsClosed","closeTimeoutRef","hasOpenClassName","setHasOpenClassName","shouldHaveOpenClassName","isClosing","shouldRender","handleEvent","contains","classList","NON_BUBBLEABLE_EVENTS","delegationRegistry","delegatedEventsByElement","documentEventCounters","propName","handler","asCapture","eventName","resolveEventName","canUseEventDelegation","resolveDelegationRegistryForName","existing","newSet","resolveDelegatedEventsForElement","add","addDelegatedListener","removeDelegatedListener","tagName","realEventName","has","removeAllDelegatedListeners","eventNames","realEvent","events","furtherCallsPrevented","Proxy","p","Reflect","body","parentNode","FILTERED_ATTRIBUTES","HTML_ATTRIBUTES","MAPPED_ATTRIBUTES","autoPlay","headsByElement","renderWithVirtual","parentEl","$current","$new","$parent","skipComponentUpdate","forceIndex","fragment","moveDirection","isComponentElement","hasElementChanged","componentInstance","renderComponent","updateComponent","isMounted","setupComponentUpdateListener","initComponent","node","createNode","setTarget","childNodes","insertBefore","appendChild","removeChild","getTarget","unmountTree","replaceChild","areComponents","isRealElement","nextSibling","currentKeys","keys","newKeys","key","currentValue","newValue","cssText","removeAttribute","setAttribute","updateAttributes","currentEl","teactFastList","$newChild","currentRemainingIndex","remainingByKey","acc","$currentChild","newChildKey","$element","order","teactOrderKey","fragmentQueue","fragmentIndex","newChildren","currentPreservedIndex","currentChildInfo","concat","flushFragmentQueue","shouldMoveNode","isMovingDown","renderFastListChildren","max","createDocumentFragment","renderChildren","mountComponent","$firstChild","isEmptyElement","createTextNode","isTextElement","tag","$child","$fragmentChild","__html","render","headId","getAttribute","$head","VirtualElementTypesEnum","Fragment","Symbol","renderingInstance","Empty","Text","isTagElement","Tag","Component","flatten","parsedChildren","hooks","cursor","byCursor","effects","memos","buildComponentElement","createComponentInstance","dropEmptyTail","buildChildElement","buildTagElement","isEmptyPlaceholder","child","DEBUG_components","newRenderedValue","DEBUG_startAt","componentName","renderCount","renderTimes","performance","renderTime","handleError","renderedValue","newChild","$old","hook","cleanup","effect","nextValue","setter","helpGc","prepareComponentForFrame","prepareForFrame","throttleWithPrimaryRaf","throttleWithRaf","forceUpdateComponent","currentElement","DEBUG_contentComponentName","useLayoutEffectBase","schedulerFn","primarySchedulerFn","execCleanup","exec","dependency","causedBy","res","prevValue","fastRaf","fastRafPrimary","useLayoutEffect","onTickEnd","onTickEndPrimary","resolver","getUnequalProps","newCallback","areEqual","arePropsShallowEqual","propsRef","renderedRef","orderBy","values","React","currentGlobal","reducers","callbacks","containers","mapStateToProps","mapReducersToProps","ownProps","mappedProps","newMappedProps","Number","isNaN","DEBUG_componentName","areMappedPropsChanged","DEBUG_updates","updateTime","runCallbacks","runCallbacksThrottled","newGlobal","noThrottle","getGlobal","addReducer","reducer","onDispatch","addCallback","removeCallback","TeactNContainer","vs16RegExp","zeroWidthJoiner","rawEmoji","importLegacySession","clearLegacySessions","apiUpdate","userAgent","navigator","PLATFORM_ENV","sessionData","loadStoredSession","isTest","isMovSupported","IS_MOV_SUPPORTED","phoneNumber","authIsLoading","authError","password","file","firstName","lastName","authIsLoadingQrCode","storeSession","currentUserId","clearStoredSession","unsubscribe","forceWebsync","reset","cacheApi","langCachePrefix","langCacheVersion","updateAppBadge","init","connectionState","authNearestCountry","deviceToken","subscribedAt","buildInputPrivacyRules","visibility","allowedIds","deniedIds","users","byId","usersById","chats","chatsById","rules","collectUsers","collectChats","allowedUsers","allowedChats","blockedUsers","blockedChats","bio","about","profileEdit","progress","ProfileEditProgress","currentUser","updateUser","fullInfo","isUsernameAvailable","settings","loadedWallpapers","wallpapers","createObjectURL","slug","UPLOADING_WALLPAPER_SLUG","wallpaper","firstWallpaper","withLocalMedia","addUsers","buildCollectionByKey","updateChats","blocked","ids","blockedIds","totalCount","contactId","addBlockedContact","removeBlockedContact","activeSessions","session","isCurrent","serverTimeOffset","addNotifyExceptions","replaceSettings","peerType","isSilent","shouldShowPreviews","updateNotifySettings","hasPushNotifications","hasWebNotifications","byKey","subscribe","hasContactJoinedNotifications","languages","phoneNumberSettings","lastSeenSettings","profilePhotoSettings","forwardsSettings","chatInviteSettings","all","privacy","lastSeen","profilePhoto","forwards","chatInvite","privacyKey","allowUserIds","allowChatIds","blockUserIds","blockChatIds","isAllowList","contactsIds","isSensitiveEnabled","langCode","language","countryList","timeFormat","setSettingOption","setTimeFormat","wasTimeFormatSetManually","nearestCountryCode","selectNotifySettings","setLanguage","onUpdateApiReady","wasAuthReady","authState","authorizationState","isLoggingOut","authIsCodeViaApp","isCodeViaApp","authHint","hint","authQrCode","qrCode","lastSyncTime","onUpdateAuthorizationState","onUpdateAuthorizationError","sync","signOut","onUpdateConnectionState","authRememberMe","isEmpty","mainDcId","saveSession","onUpdateSession","onUpdateServerTimeOffset","sessionUserAuth","localStorage","getItem","userAuth","JSON","parse","setItem","stringify","updateSessionUserId","onUpdateCurrentUser","paymentShippingError","getShippingError","addPaymentError","showDialog","hasErrorKey","handleSystemThemeChange","currentThemeMatch","documentElement","currentTheme","nextTheme","selectTheme","animationLevel","switchTheme","mql","matchMedia","addListener","subscribeToSystemThemeChange","messageTextSize","theme","setProperty","toString","IS_TOUCH_ENV","startWebsync","IS_ANDROID","IS_MAC_OS","uiReadyState","remove","authPhoneNumber","shouldSkipHistoryAnimations","replaceThemeSettings","FOREVER_BANNED_DATE","entityId","isChatGroup","isChatBasicGroup","isChatSuperGroup","isChatChannel","isCommonBoxChat","isChatWithRepliesBot","getChatTypeString","getPrivateChatUserId","isSelf","getChatDescription","getChatLink","inviteLink","getChatAvatarHash","owner","avatarHash","isChatSummaryOnly","lastMessage","isChatAdmin","adminRights","getHasAdminRight","isUserRightBanned","currentUserBannedRights","defaultBannedRights","getCanPostInChat","threadId","isRestricted","migratedTo","isNotJoined","isCreator","getAllowedAttachmentOptions","isChatWithBot","canAttachMedia","canAttachPolls","canSendStickers","canSendGifs","canAttachEmbedLinks","isAdmin","getMessageSendingRestrictionReason","sendMessages","untilDate","formatDateToString","formatTime","getChatSlowModeOptions","slowMode","getChatOrder","joinDate","draftDate","date","isChatArchived","folderId","selectIsChatMuted","notifySettings","notifyExceptions","isMuted","hasPrivateChatsNotifications","hasBroadcastNotifications","hasGroupNotifications","selectShouldShowMessagePreview","hasPrivateChatsMessagePreview","hasBroadcastMessagePreview","hasGroupMessagePreview","getCanDeleteChat","prepareFolderListIds","folder","chatIdsCache","excludedChatIds","includedChatIds","pinnedChatIds","isListed","excludeArchived","excludeMuted","unreadMentionsCount","unreadCount","hasUnreadMark","excludeRead","privateChatUser","bots","contacts","isContact","nonContacts","groups","channels","filterChatFolder","prepareChatList","listIds","orderedPinnedIds","folderType","listIdsSet","orderedPinnedIdsSet","pinnedChats","chatFilter","otherChats","reduceChatList","chatArrays","filteredIds","filteredIdsSet","getFolderUnreadDialogs","listedChats","unreadDialogsCount","total","hasActiveDialogs","getFolderDescriptionText","emoticon","description","pinnedIds","getFolderChatsCount","getMessageSenderName","getUserFirstOrLastName","sortChatIds","chatIds","shouldPrioritizeVerified","priorityIds","priority","isVerified","CONTENT_NOT_SUPPORTED","getMessageKey","msgId","buildMessageKey","parseMessageKey","getMessageOriginalId","previousLocalId","noEmoji","audio","voice","contact","poll","truncatedText","substr","groupedId","performer","getMessageAudioCaption","summary","question","getMessageText","webPage","getMessageCustomShape","isRound","parseEmojiOnlyString","getMessageSingleEmoji","getFirstLinkInMessage","link","find","offset","isOwnMessage","isOutgoing","isReplyMessage","replyToMessageId","isForwardedMessage","forwardInfo","isActionMessage","isServiceNotificationMessage","isAnonymousOwnMessage","senderId","getSenderTitle","getSendingState","sendingState","isMessageLocal","isHistoryClearMessage","getMessageContentFilename","isAnimated","isWebpSupported","baseFilename","IS_OPUS_SUPPORTED","hasMessageMedia","getMessagePhoto","getMessageVideo","getMessageDocument","getMessageSticker","getMessageContact","getMessagePoll","getMessageAction","getMessageAudio","getMessageVoice","getMessageRoundVideo","isMessageDocumentPhoto","mediaType","isMessageDocumentVideo","getMessageInvoice","getMessageWebPage","getMessageWebPagePhoto","getMessageWebPageVideo","getMessageMediaThumbDataUri","media","getMessageMediaThumbnail","dataUri","getMessageMediaHash","webPagePhoto","webPageVideo","messageVideo","messagePhoto","hasMessageLocalBlobUrl","getVideoOrAudioBaseHash","getAudioHasCover","IS_PROGRESSIVE_SUPPORTED","IS_SAFARI","thumbnailSizes","getMessageMediaFormat","fullVideo","getMessageFileName","getMessageFileSize","blobUrl","getChatMediaMessageIds","messages","listedIds","isFromSharedMedia","getMessageContentIds","reverse","getPhotoFullDimensions","sizes","getPhotoInlineDimensions","getVideoDimensions","width","height","getMediaTransferState","isLoadNeeded","isUploading","isTransferring","transferProgress","messageIds","contentType","validator","matchLinkInMessageText","getMediaDuration","buildChatThreadKey","STRIPE_ERRORS","missing_payment_information","field","invalid_number","number","exp_year","exp_month","invalid_expiry_year","invalid_expiry_month","cvc","invalid_cvc","getStripeError","param","USER_COLOR_KEYS","isDeletedUser","getUserStatus","status","wasOnline","getTime","wasOnlineDate","diff","today","setHours","yesterday","setDate","getDate","formatFullDate","isUserOnline","isUserBot","getCanAddContact","sortUserIds","userIds","getServerTime","expires","getUserIdDividend","abs","getUserColorKey","peer","replaceChatListIds","newIds","updateChatListIds","idsUpdate","replaceChats","newById","getUpdatedChat","chatUpdate","shouldOmitMinInfo","isMin","updatedChat","omit","photos","updateChat","updatedById","updatedChats","addChats","addedById","isAdded","addedChats","updateChatListType","listType","currentListIds","listTypeKey","currentFolderList","updateChatListSecondaryInfo","info","totalCountKey","totalChatCount","isFullyLoaded","leaveChat","leftChatId","selectChatListType","listId","updateCurrentMessageList","shouldReplaceHistory","messageLists","newMessageLists","replaceChatMessages","updateMessageStore","byChatId","threadsById","replaceThreadParam","paramName","threadUpdate","updateThread","addMessages","addedByChatId","messagesByChatId","addChatMessagesById","selectChatMessages","every","newId","updateChatMessage","messageUpdate","updatedMessage","updateScheduledMessage","selectScheduledMessages","replaceScheduledMessages","deleteChatMessages","deletedForwardedPosts","pickTruthy","isLinkedChannelPost","threadInfo","selectThreadInfo","selectListedIds","outlyingIds","selectOutlyingIds","viewportIds","selectViewportIds","selectPinnedIds","newMessageCount","messagesCount","currentMessageList","selectCurrentMessageList","canDeleteCurrentThread","currentThreadId","fromChatId","fromMessageId","originalPost","selectChatMessage","deleteChatScheduledMessages","scheduledIds","selectScheduledIds","updateListedIds","orderHistoryIds","updateOutlyingIds","sort","a","b","addViewportId","safeReplaceViewportIds","newViewportIds","currentIds","updateThreadInfo","newThreadInfo","updateThreadInfos","updates","scheduledMessages","updateScheduledMessages","updateFocusedMessage","noHighlight","isResizingContainer","focusedMessage","updateFocusDirection","direction","enterMessageSelectMode","selectedMessages","prototype","toggleMessageSelection","messageListType","childMessageIds","withShift","oldSelectedMessages","selectMessageIdsByGroupId","selectedMessageIds","newMessageIds","newSelectedMessageIds","selectCurrentMessageIds","prevIndex","min","to","unique","exitMessageSelectMode","updateThreadUnreadFromForwardedMessage","originMessage","lastMessageId","isDeleting","channelPostId","threadInfoOld","updateStickerSets","category","sets","resultIds","updatedSets","stickerSet","stickers","setsById","setIds","updateStickerSet","stickerSetId","currentStickerSet","updateGifSearch","isNew","results","nextOffset","currentResults","gifs","newResults","gif","replaceAnimatedEmojis","animatedEmojis","updateStickersForEmoji","remoteStickers","allStickers","selectStickersForEmoji","uniqueIds","forEmoji","rebuildStickersForEmoji","replaceUsers","getUpdatedUser","userUpdate","updatedUser","updateContactList","updatedUsers","contactUserIds","contactList","newContactUserIds","updateUsers","addedUsers","updateSelectedUserId","selectedId","deleteUser","MEMO_EMPTY_ARRAY","updateUserSearch","searchStatePartial","userSearch","updateUserSearchFetchingStatus","newState","fetchingStatus","updateUserBlockedState","isBlocked","getComplexKey","updateGlobalSearch","globalSearch","updateGlobalSearchContent","currentContent","updateGlobalSearchResults","newFoundMessages","nextRate","resultsByType","newFoundMessagesById","foundIdsForType","foundIds","updateGlobalSearchFetchingStatus","prevFoundIds","newFoundIds","foundOrPrevFoundIds","nextOffsetId","replaceLocalTextSearch","chatThreadKey","searchParams","localTextSearch","byChatThreadKey","updateLocalTextSearch","query","replaceLocalTextSearchResults","updateLocalTextSearchResults","orderFoundIds","replaceLocalMediaSearch","localMediaSearch","updateLocalMediaSearchType","currentType","updateLocalMediaSearchResults","replaceLocalMediaSearchResults","updateManagementProgress","management","updateManagement","newSettings","themes","notifyException","exceptionData","addNotifyException","updateTwoFaSettings","twoFaSettings","updateShippingOptions","shippingOptions","payment","setRequestInfoId","requestId","setPaymentStep","step","setInvoiceMessageInfo","photoUrl","invoiceContent","setStripeCardInfo","cardInfo","stripeCredentials","setPaymentForm","form","setReceipt","receipt","messageInvoice","clearPayment","closeInvoice","isPaymentModalOpen","selectChat","selectChatUser","selectIsChatWithSelf","selectIsChatWithBot","selectSupportChat","isSupport","selectChatOnlineCount","members","onlineCount","selectChatBot","selectIsChatBotNotStarted","bot","messageInfo","selectAreActiveChatsLoaded","active","selectIsChatListed","targetList","list","selectChatFolder","chatFolders","selectIsChatPinned","archived","chatFoldersById","selectChatByUsername","usernameLowered","selectCountNotMutedUnread","activeChatIds","selectNotifyExceptions","selectIsServiceChatReady","selectCurrentStickerSearch","selectCurrentGifSearch","selectStickerSet","selectStickerSetByShortName","shortName","stickerSets","stickersForEmoji","packs","selectAnimatedEmoji","cleanedEmoji","selectCurrentChat","selectThreadParam","thread","selectScrollOffset","selectReplyingToId","selectEditingId","selectEditingScheduledId","selectDraft","selectNoWebPage","selectFirstMessageId","selectReplyStack","selectThreadOriginChat","originChannelId","selectThreadTopMessageId","topMessageId","selectThreadByMessage","replyToTopMessageId","isMessageInCurrentMessageList","selectIsViewportNewest","chatMessages","selectScheduledMessage","selectEditingMessage","selectChatMessageByPollId","pollId","messageWithPoll","selectFocusedMessageId","focusedChatId","selectIsMessageFocused","focusedId","selectOutgoingStatus","isScheduledList","lastReadOutboxMessageId","selectIsMessageUnread","selectSender","selectForwardedSender","isChannelPost","senderUserId","selectAllowedMessageActions","isPrivate","isChatWithSelf","isBasicGroup","isSuperGroup","isChannel","isLocal","isServiceNotification","isOwn","isAction","isMessageEditable","viaBotId","canReply","hasPinPermission","canPin","canUnpin","pinnedMessageIds","canDelete","canReport","canDeleteForAll","canEdit","canForward","hasSticker","hasFavoriteSticker","favorite","selectIsStickerFavorite","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","canDownload","noOptions","ability","selectCanDeleteSelectedMessages","messageActions","selectCanReportSelectedMessages","selectCanDownloadSelectedMessages","selectIsDownloading","activeInChat","activeDownloads","selectActiveDownloadIds","selectUploadProgress","fileUploads","byMessageLocalId","selectRealLastReadId","lastReadInboxMessageId","Infinity","selectFirstUnreadId","lastReadId","lastReadServiceNotificationId","serviceNotifications","notification","isUnread","findAfterLastReadId","isFromScheduled","found","selectIsForwardModalOpen","forwardMessages","isModalShown","selectCommonBoxChatId","fromLastMessage","selectIsInSelectMode","selectIsMessageSelected","selectForwardedMessageIdsByGroupId","selectIsDocumentGroupSelected","selectedIds","groupIds","selectSelectedMessagesCount","selectNewestMessageWithBotKeyboardButtons","findLast","keyboardButtons","replyHideMessageId","shouldHideKeyboardButtons","selectCanAutoLoadMedia","isPhoto","isVideo","isFile","canAutoLoadPhotoFromContacts","canAutoLoadPhotoInPrivateChats","canAutoLoadPhotoInGroups","canAutoLoadPhotoInChannels","canAutoLoadVideoFromContacts","canAutoLoadVideoInPrivateChats","canAutoLoadVideoInGroups","canAutoLoadVideoInChannels","canAutoLoadFileFromContacts","canAutoLoadFileInPrivateChats","canAutoLoadFileInGroups","canAutoLoadFileInChannels","canAutoLoadMedia","canAutoLoadMediaFromContacts","canAutoLoadMediaInPrivateChats","canAutoLoadMediaInGroups","canAutoLoadMediaInChannels","isMediaFromContact","selectIsUserOrChatContact","selectCanAutoPlayMedia","canAutoPlayVideos","canAutoPlayGifs","asGif","selectShouldLoopStickers","shouldLoopStickers","selectLastServiceNotification","maxId","selectCurrentTextSearch","currentSearch","selectCurrentMediaSearchPeerId","currentProfileUserId","selectCurrentMediaSearch","peerId","selectManagement","selectCurrentManagementType","selectIsMediaViewerOpen","mediaViewer","avatarOwnerId","selectRightColumnContentKey","isChatInfoShown","newChatMembersProgress","isAddingChatMembersShown","NewChatMembersProgress","isPollResults","pollResults","selectIsPollResultsOpen","isSearch","IS_SINGLE_COLUMN_LAYOUT","isManagement","currentManagement","selectCurrentManagement","isStickerSearch","isGifSearch","currentChatId","areActiveChatsLoaded","isUserInfo","isChatInfo","RightColumnContent","selectIsRightColumnShown","shouldUseSystemTheme","getSystemTheme","selectCurrentGlobalSearchQuery","selectPaymentChatId","selectPaymentMessageId","selectPaymentFormId","formId","selectPaymentRequestId","selectProviderPublishableKey","nativeParams","publishableKey","selectStripeCredentials","selectIsUserBlocked","LoadMoreDirection","FocusDirection","SettingsScreens","LeftColumnContent","GlobalSearchContent","MediaViewerOrigin","AudioOrigin","ChatCreationProgress","ManagementProgress","ProfileState","PaymentStep","ManagementScreens","currentInstance","animateSingle","tick","instance","isCancelled","animate","setAppBadge","currentProps","newProps","currentKeysLength","prop","self","caches","Type","fetch","cacheName","isHtmlAllowed","request","Request","cache","open","headers","Blob","blob","shouldRecreate","resolvedType","Json","json","save","cacheData","Response","put","clear","captureKeyboardListener","onEsc","keyToHandlerName","Enter","Backspace","Delete","Esc","Escape","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Tab","handlers","onEnter","onDelete","onBackspace","onUp","onDown","onLeft","onRight","onTab","captureKeyboardListeners","hasActiveHandlers","handlerName","currentEventHandlers","releaseKeyboardListener","keyHandlers","WEEKDAYS_FULL","MONTHS_FULL","MONTHS_FULL_LOWERCASE","month","getDayStart","datetime","getDayStartAt","toYearMonth","timestamp","getFullYear","getMonth","toIsoString","hours","getHours","marker","padStart","getMinutes","formatPastTimeShort","weekAgo","getDay","withYear","format","formatDate","formatMonthAndYear","isShort","formatHumanDate","noWeekdays","isUpperFirst","upperFirst","lowerFirst","weekAhead","weekDay","day","monthIndex","formatMediaDateTime","formatMediaDuration","maxValue","minutes","seconds","maxHours","maxMinutes","string","formatVoiceRecordDuration","durationInMs","milliseconds","locale","toLocaleString","year","isValidDate","MAX_MONTH_IN_YEAR","parseDateString","matchStringDate","matchEuropeStringDate","matchNumberDate","dateParts","timestampPlusDay","MILLISECONDS_IN_DAY","str","EXCLUDE_EMOJIS","EMOJI_EXCEPTIONS","unifiedToNative","unified","codePoints","parseInt","fromCodePoint","regex","replacement","pairs","uncompressEmoji","emojiData","categories","emojiRaw","names","native","image","isoToEmoji","iso","test","c","codePointAt","isWebpSupportedCache","webp","Image","handleLoadOrError","onload","onerror","hasWebp","systemThemeCache","matches","os","getPlatform","IS_PWA","standalone","referrer","IS_TABLET_COLUMN_LAYOUT","IS_VOICE_RECORDING_SUPPORTED","mediaDevices","AudioContext","webkitAudioContext","IS_SERVICE_WORKER_SUPPORTED","Audio","canPlayType","IS_CANVAS_FILTER_SUPPORTED","getContext","IS_REQUEST_FULLSCREEN_SUPPORTED","ARE_CALLS_SUPPORTED","LAYERS_ANIMATION_NAME","TEST_VIDEO","DPR","devicePixelRatio","MASK_IMAGE_DISABLED","dataUriToBlob","arr","mime","bstr","atob","u8arr","Uint8Array","blobToDataUri","reader","FileReader","readAsDataURL","blobToFile","File","lastModified","preloadImage","img","preloadVideo","volume","onloadedmetadata","createPosterForVideo","onseeked","videoWidth","videoHeight","canvas","drawImage","toDataURL","currentTime","fetchBlob","fetchFile","imgToCanvas","constructor","fileBits","rest","super","this","totalPrice","Intl","NumberFormat","store","random","hasOwnProperty","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","MESSAGE_TOO_LONG","SERVICE_WORKER_DISABLED","MESSAGE_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","SCHEDULE_DATE_INVALID","WALLPAPER_DIMENSIONS_INVALID","SHIPPING_ERRORS","getReadableErrorText","isSlowMode","textParams","extraPartIndex","errorMessage","handleErrorEvent","ErrorEvent","reason","throttle","alert","collection","member","mapValues","newByKey","object","stringKeys","orderKey","mode","mode1","mode2","orderKey1","orderKey2","aValue1","bValue1","aValue2","bValue2","aValue","bValue","array","compact","array1","array2","areSortedArraysIntersecting","findIntersectionWithSet","chunkSize","cloneDeep","predicate","SUBSTITUTION_REGEX","PLURAL_OPTIONS","PLURAL_RULES","en","ar","ca","de","es","fa","fr","it","ko","ms","nl","pl","pt_BR","ru","tr","uk","uz","langPack","fallbackLangPack","createCallbackManager","currentLangCode","currentTimeFormat","getTranslation","cacheValue","cached","langString","processTranslation","importFallbackLangPack","getTranslationForLangString","translateString","remoteLangPack","remote","fetchRemoteString","withFallback","newLangPack","sourceLangPacks","fetchRemote","langInfo","rtl","default","template","optionIndex","getPluralOption","translationSlices","initialValue","processTemplate","formatInteger","SAMPLE_RATE","oggToWav","opusData","arrayBuffer","typedArray","decoderWorker","wavWorker","onmessage","command","buffers","buffer","page","terminate","wavBitDepth","wavSampleRate","decoderSampleRate","outputBufferSampleRate","pages","asCacheApiType","memoryCache","fetchPromises","progressCallbacks","cancellableCallbacks","mediaFormat","onProgress","callbackUniqueId","progressiveUrl","getProgressive","mediaPng","webpToPng","prepared","prepareMedia","mediaSource","MediaSource","streamUrl","sourceBuffer","addSourceBuffer","makeOnProgress","revokeObjectURL","fetchFromCacheOrRemote","activeCallbacks","getFromMemory","cancelProgress","parentCallback","endOfStream","appendBuffer","mediaData","serviceWorker","fullSize","controller","Bundles","LOAD_PROMISES","MEMORY_CACHE","Auth","Main","Extra","Calls","handleBundleLoad","bundle","listeners","listener","getDeviceToken","subscription","toJSON","endpoint","checkIfPushSupported","ServiceWorkerRegistration","Notification","permission","soundPlayedIds","playNotifySound","notificationSoundVolume","currentVolume","once","play","playNotifySoundDebounced","requestPermission","unsubscribeFromPush","dispatch","deleteDeviceToken","serviceWorkerRegistration","ready","pushManager","getSubscription","areSettingsLoaded","checkIfShouldResubscribe","userVisibleOnly","setDeviceToken","DOMException","ABORT_ERR","notifyAboutNewMessage","resultSettings","resultExceptions","loadNotificationSettings","hasFocus","checkIfShouldNotify","areNotificationsSupported","messageSender","messageAction","actionTargetMessage","targetUserIds","actionTargetUserIds","actionTargetChatId","actionTargetUsers","privateChatUserId","senderName","getNotificationContent","imageHash","mediaLoader","getAvatar","badge","vibrate","onclick","close","onshow","closeMessageNotifications","notifyClientReady","PATTERN_PLACEHOLDER","DEFAULT_PATTERN","getCountryCodesByIso","phoneCodeList","country","iso2","getCountryFromPhoneNumber","possibleCountries","countryCode","bestMatches","prefixes","prefix","formatPhoneNumber","pattern","numberWithoutCode","patterns","defaultPattern","stripped","getBestPattern","formatPhoneNumberWithCode","numberWithPlus","createMessageHash","messageList","parseLocationHash","typeOrThreadId","isType","fn","shouldRunFirst","shouldRunLast","waitingTimeout","interval","isPending","_args","setInterval","clearInterval","throttleWith","waiting","onIdle","requestIdleCallback","rafPromise","fastRafCallbacks","fastRafPrimaryCallbacks","onTickEndCallbacks","onTickEndPrimaryCallbacks","beforeUnloadCallbacks","isPrimary","currentCallbacks","currentPrimaryCallbacks","onBeforeUnload","isLast","unshift","RE_NOT_LETTER","searchWords","haystack","needle","haystackWords","needleWord","haystackWord","promisifyRequest","oncomplete","onsuccess","onabort","defaultGetStoreFunc","defaultGetStore","dbName","storeName","dbp","userAgentData","indexedDB","databases","intervalId","tryIdb","onupgradeneeded","createObjectStore","txMode","db","transaction","objectStore","createStore","DC_IDS","hasStoredSession","withLegacy","userAuthJson","dcID","dcId","removeItem","sessionId","sessionJson","customStore","idb","idbKeys","items","openCursor","continue","eachCursor","isInitialized","HEX_COLOR_REGEX","RGB_VARIABLES","lerp","start","end","interpolationRatio","colors","themeColors","property","hexToRgb","withAnimation","isDarkTheme","shouldAnimate","startIndex","endIndex","startAt","themeColorTag","querySelector","applyColorAnimationStep","transition","hex","r","g","propertyColors","formatFixedNumber","formatIntegerCompact","views","getFirstLetters","phrase","count","word","EMPTY_IMAGE_DATA_URI","initWebpWorker","wasmReady","requests","getDecodePromise","ImageData","putImageData","toBlob","createPng","webpToPngBase64","pngBlob","handleLibWebpMessage","WEBSYNC_URLS","WEBSYNC_VERSION","WEBSYNC_KEY","getTs","lastTimeout","authed","currentTs","canRedirect","ts","script","removeElement","URLSearchParams","version","saveSync","IS_LANDSCAPE","isLandscape","initialHeight","windowSize","updateSizes","isRefreshDisabled","handleResize","visualViewport","pageTop","vh","getIsKeyboardVisible","disableRefresh","enableRefresh","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","__webpack_modules__","m","getter","__esModule","getPrototypeOf","obj","ns","create","def","getOwnPropertyNames","definition","o","defineProperty","enumerable","f","chunkId","promises","u","miniCssF","globalThis","Function","done","needAttach","scripts","getElementsByTagName","charset","nc","onScriptComplete","doneFns","bind","head","toStringTag","scriptUrl","importScripts","currentScript","fullhref","existingLinkTags","dataHref","existingStyleTags","findStylesheet","linkTag","errorType","realHref","createStylesheet","miniCss","baseURI","installedChunks","installedChunkData","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","chunkLoadingGlobal","handleWorkerMessage","register","INITIAL_STATE","isLeftColumnShown","phoneCodes","general","groupCalls","activeChatFolder","recentEmojis","added","recent","greeting","featured","emojiKeywords","saved","inlineBots","byUsername","topPeers","topInlineBots","audioPlayer","playbackRate","notifications","dialogs","messageSendKeyCombo","autoLoadFileMaxSizeMb","shouldSuggestStickers","light","isBlurred","patternColor","dark","shouldShowContextMenuHint","updateCacheThrottled","updateCache","unsubscribeFromBeforeUnload","isCaching","isHeavyAnimating","setupCaching","clearCaching","reducedGlobal","reduceShowChatInfo","reduceUsers","reduceChats","reduceMessages","recentlyFoundChatIds","reduceSettings","reduceChatFolders","reduceGroupCalls","idsToSave","chatIdsToSave","mainThread","activeGroupCallId","isGroupCallPanelHidden","isFallbackConfirmOpen","initialState","time","timeEnd","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","shouldAutoPlayVideos","shouldAutoPlayGifs","migrateCache","parsedMessageList","readCache","loadCache","STORAGE_KEY","tabKey","SITE_FONTS","preloadFonts","font","fonts","load","preloadAvatars","preloadTasks","main","telegramLogoPath","authCode","monkeyPath","authPassword","background","backgroundColor","hasCustomBackground","hasCustomBackgroundColor","isRightColumnShown","leftColumnWidth","setIsUiReady","isReady","markReady","useFlag","shouldRenderMask","safePreload","translation","setTranslation","getSuggestedLanguage","suggestedLanguage","MENU_HIDING_DURATION","inputRef","setFilter","filteredList","setFilteredList","updateFilter","filterValue","defaultName","getFilteredList","prevPhoneCodeList","handleInput","handleInputKeyDown","DropdownMenu","handleTrigger","select","formEl","getElementById","scrollTo","top","scrollHeight","behavior","inputValue","Spinner","MenuItem","isPreloadInitiated","setAuthPhoneNumber","setAuthRememberMe","loadNearestCountry","loadCountryList","clearAuthError","goToAuthQrCode","continueText","useLangString","setCountry","setPhoneNumber","isTouched","setIsTouched","lastSelection","setLastSelection","markIsLoading","unmarkIsLoading","fullNumber","canSubmit","parseFullNumber","newFullNumber","suggestedCountry","selectedCountry","handleLangChange","setSelectionRange","isJustPastedRef","handlePaste","handleCountryChange","handlePhoneNumberChange","selectionStart","selectionEnd","shouldFixSafariAutoComplete","handleKeepSessionChange","isAuthReady","onSubmit","InputText","Checkbox","Button","Loading","AuthCode","useModuleLoader","AuthPassword","AuthRegister","G","H","B","QrCreator","h","J","level","O","C","lineTo","arcTo","moveTo","z","v","N","K","P","fillStyle","fillRect","left","beginPath","q","D","E","R","I","F","fill","colorStops","createLinearGradient","apply","createRadialGradient","addColorStop","A","minVersion","maxVersion","ecLevel","radius","quiet","HTMLCanvasElement","clearRect","write","S","multiply","L","M","Q","returnToAuthPhoneNumber","qrCodeRef","token","isMobile","AuthQrCode","appInactivePath","renderMain","disconnect","isInactive","markInactive","TeactDOM"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/report.html b/dist/report.html index 0e0c3975d..36adf1618 100644 --- a/dist/report.html +++ b/dist/report.html @@ -3,7 +3,7 @@ - telegram-t [27 Nov 2021 at 17:45] + telegram-t [29 Nov 2021 at 18:34]