diff --git a/.patch-version b/.patch-version index 7f8f011eb..d00491fd7 100644 --- a/.patch-version +++ b/.patch-version @@ -1 +1 @@ -7 +1 diff --git a/dist/133.4f4ca33bcc5de5731151.css b/dist/133.41324961df5671be3f7c.css similarity index 99% rename from dist/133.4f4ca33bcc5de5731151.css rename to dist/133.41324961df5671be3f7c.css index 2bd302093..7f01fa8bd 100644 --- a/dist/133.4f4ca33bcc5de5731151.css +++ b/dist/133.41324961df5671be3f7c.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(.Transition__slide--active) .AvatarEditable label input,.Transition>div:not(.Transition__slide--active) .AvatarEditable label i,.Transition>div:not(.Transition__slide--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(.Transition__slide--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.4f4ca33bcc5de5731151.css.map*/ \ No newline at end of file +/*# sourceMappingURL=133.41324961df5671be3f7c.css.map*/ \ No newline at end of file diff --git a/dist/133.4f4ca33bcc5de5731151.css.map b/dist/133.41324961df5671be3f7c.css.map similarity index 99% rename from dist/133.4f4ca33bcc5de5731151.css.map rename to dist/133.41324961df5671be3f7c.css.map index d020f2675..195a687e2 100644 --- a/dist/133.4f4ca33bcc5de5731151.css.map +++ b/dist/133.41324961df5671be3f7c.css.map @@ -1 +1 @@ -{"version":3,"file":"133.4f4ca33bcc5de5731151.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,gBACA,gBAEA,qDAEE,sBAIJ,kEAGE,uBACA,mBAGF,uBACE,aACA,qBAEA,qEACE,iBAIJ,8BACE,WACA,YACA,iBACA,iBACA,gBACA,qB;AChJF,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,sYACE,wBAGF,gIACE,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 max-height: 90vh;\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.41324961df5671be3f7c.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,gBACA,gBAEA,qDAEE,sBAIJ,kEAGE,uBACA,mBAGF,uBACE,aACA,qBAEA,qEACE,iBAIJ,8BACE,WACA,YACA,iBACA,iBACA,gBACA,qB;AChJF,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,sYACE,wBAGF,gIACE,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 max-height: 90vh;\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.4f4ca33bcc5de5731151.js b/dist/133.41324961df5671be3f7c.js similarity index 99% rename from dist/133.4f4ca33bcc5de5731151.js rename to dist/133.41324961df5671be3f7c.js index ae3c9569f..49060acad 100644 --- a/dist/133.4f4ca33bcc5de5731151.js +++ b/dist/133.41324961df5671be3f7c.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),r=n(5116),o=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=o.wB?m.qp:m.z7,Z=(0,a.X$)((({code:e,codeLength:t,trackingDirection:n,isTracking:r,isBig:o})=>{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:o?"big":""},!d&&a.ZP.createElement("div",{className:"monkey-preview"}),s&&a.ZP.createElement(h.Z,{id:"idleMonkey",size:o?m.K2:g,className:r?"hidden":void 0,animationData:s,play:!r,onLoad:f}),l&&a.ZP.createElement(h.Z,{id:"trackingMonkey",size:o?m.K2:g,className:r?"shown":"hidden",animationData:l,playSegment:r?function(){const a=e&&e.length>1||n<0?15+Z*(e.length-1):0,r=e.length===t?180:15+Z*e.length;return n<1?[r,a]:[a,r]}():void 0,speed:2,noLoop:!0}))})),f=(0,a.X$)((0,r.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:r,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)((()=>{o.$b||g.current.focus()}),[]),(0,l.ZP)(!0,m);const w=(0,a.I4)((e=>{r&&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}))}),[r,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:r&&h(r),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,r.c$)((e=>(0,s.ei)(e,["authIsLoading","authError","authHint"])),((e,t)=>(0,s.ei)(t,["setAuthPassword","clearAuthError"])))((({authIsLoading:e,authError:t,authHint:n,setAuthPassword:r,clearAuthError:o})=>{const s=(0,c.Z)(),[i,l]=(0,a.eJ)(!1),d=(0,a.I4)((e=>{l(e)}),[]),u=(0,a.I4)((e=>{r({password:e})}),[r]);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:o,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,r.c$)((e=>(0,s.ei)(e,["authIsLoading","authError"])),((e,t)=>(0,s.ei)(t,["signUp","clearAuthError","uploadProfilePhoto"])))((({authIsLoading:e,authError:t,signUp:n,clearAuthError:r,uploadProfilePhoto:o})=>{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&&o({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&&r();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),r=n(9118),o=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)(!0),N=(0,a.sO)();N.current=l;const C=(0,a.sO)();C.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,r.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 L=(0,a.I4)(((e=!1)=>{v&&(N.current||C.current)&&(C.current?v.playSegment(C.current):e?v.goToAndPlay(0):v.play())}),[v]),A=(0,a.I4)((()=>{v&&v.pause()}),[v]),I=(0,a.I4)((()=>{w.current=!0,v&&(y.current||(y.current=v.isPlaying()),A())}),[v,A]),x=(0,a.I4)((()=>{y.current&&L(),y.current=!1,w.current=!1}),[L]),M=(0,a.I4)((()=>{(0,r.T2)(x)}),[x]);(0,a.d4)((()=>{v&&(l||u?w.current?y.current=!0:L(p):w.current?y.current=!1:A())}),[v,l,u,p,L,A]),(0,a.d4)((()=>{v&&(k.current?k.current=!1:(v.changeData(n),L()))}),[L,v,n]),(0,s.ZP)(I,x),(0,i.Z)(I,M);const S=(0,o.Z)("AnimatedSticker",e),J=h?`width: ${h}px; height: ${h}px;`:void 0;return a.ZP.createElement("div",{ref:b,className:S,style:J})}))},9364:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(4050),r=n(3716),o=n(7361),s=n(6752),i=n(9107),l=n(231);const c=o.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)((()=>{o.$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>=r.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),r=n(3716),o=n(7361),s=n(7324),i=n(7799);const l=[0,50],c=[0,20],d=[20,0],u=o.wB?r.qp:r.z7,m=(0,a.X$)((({isPasswordVisible:e,isBig:t})=>{const[n,o]=(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(o)}),[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?r.K2:u,className:Z?"hidden":"shown",animationData:n,playSegment:l,noLoop:!0,onLoad:P}),m&&a.ZP.createElement(i.Z,{id:"peekMonkey",size:t?r.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),r=n(647);const o={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=o[e].replace(window.location.origin,"");return r.he(`file${t}`,a.IU.Lottie)}},710:(e,t,n)=>{n.d(t,{Z:()=>Z});var a=n(4050),r=n(6752),o=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:r})=>{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 r=await(0,s.YJ)(e);await h.bind({url:r})}catch(e){o.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:r,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:o})=>{const[s,i]=(0,a.eJ)(),[l,c]=(0,a.eJ)(n);(0,a.d4)((()=>{c(n)}),[n]);const d=(0,r.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),o(e),l&&URL.revokeObjectURL(l),c(URL.createObjectURL(e))}}))}))},3103:(e,t,n)=>{n.d(t,{Z:()=>p});var a=n(4050),r=n(517),o=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,r.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 r=0;a>=0&&(r=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,o.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:()=>o});var a=n(4050),r=n(2916);const o=({containerId:e,className:t,children:n})=>{const o=(0,a.sO)();return o.current||(o.current=document.createElement("div")),(0,a.bt)((()=>{const n=document.querySelector(e||"#portals");if(!n)return;const a=o.current;return t&&a.classList.add(t),n.appendChild(a),()=>{r.Z.render(void 0,a),n.removeChild(a)}}),[t,e]),r.Z.render(n,o.current)}},5332:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(4050);function r(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.4f4ca33bcc5de5731151.js.map \ No newline at end of file +//# sourceMappingURL=133.41324961df5671be3f7c.js.map \ No newline at end of file diff --git a/dist/133.4f4ca33bcc5de5731151.js.map b/dist/133.41324961df5671be3f7c.js.map similarity index 99% rename from dist/133.4f4ca33bcc5de5731151.js.map rename to dist/133.41324961df5671be3f7c.js.map index 48f92cedd..0a1eba28e 100644 --- a/dist/133.4f4ca33bcc5de5731151.js.map +++ b/dist/133.41324961df5671be3f7c.js.map @@ -1 +1 @@ -{"version":3,"file":"133.4f4ca33bcc5de5731151.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 const isFirstRender = useRef(true);\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 if (isFirstRender.current) {\n isFirstRender.current = false;\n } else {\n animation.changeData(animationData);\n playAnimation();\n }\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","isFirstRender","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.41324961df5671be3f7c.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 const isFirstRender = useRef(true);\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 if (isFirstRender.current) {\n isFirstRender.current = false;\n } else {\n animation.changeData(animationData);\n playAnimation();\n }\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","isFirstRender","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/354.b752615a082133d9d0a3.js b/dist/354.3843b6b832a69d88fdd6.js similarity index 97% rename from dist/354.b752615a082133d9d0a3.js rename to dist/354.3843b6b832a69d88fdd6.js index b66d418e7..55c392644 100644 --- a/dist/354.b752615a082133d9d0a3.js +++ b/dist/354.3843b6b832a69d88fdd6.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.b752615a082133d9d0a3.js.map \ No newline at end of file +//# sourceMappingURL=354.3843b6b832a69d88fdd6.js.map \ No newline at end of file diff --git a/dist/354.3843b6b832a69d88fdd6.js.map b/dist/354.3843b6b832a69d88fdd6.js.map new file mode 100644 index 000000000..1e228c1ee --- /dev/null +++ b/dist/354.3843b6b832a69d88fdd6.js.map @@ -0,0 +1 @@ +{"version":3,"file":"354.3843b6b832a69d88fdd6.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_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// TODO Get values from `getConfig` method once it's available\nexport const SEEN_BY_MEMBERS_CHAT_MAX = 50;\nexport const SEEN_BY_MEMBERS_EXPIRE = 604680; // One week - 2 min\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/354.b752615a082133d9d0a3.js.map b/dist/354.b752615a082133d9d0a3.js.map deleted file mode 100644 index fa1039506..000000000 --- a/dist/354.b752615a082133d9d0a3.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"354.b752615a082133d9d0a3.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// TODO Get values from `getConfig` method once it's available\nexport const SEEN_BY_MEMBERS_CHAT_MAX = 50;\nexport const SEEN_BY_MEMBERS_EXPIRE = 604680; // One week - 2 min\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/477.a474b061825f5523f240.css b/dist/477.51d8c60b6925b9015068.css similarity index 99% rename from dist/477.a474b061825f5523f240.css rename to dist/477.51d8c60b6925b9015068.css index d088975c8..f1a15b9a7 100644 --- a/dist/477.a474b061825f5523f240.css +++ b/dist/477.51d8c60b6925b9015068.css @@ -65,4 +65,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=477.a474b061825f5523f240.css.map*/ \ No newline at end of file +/*# sourceMappingURL=477.51d8c60b6925b9015068.css.map*/ \ No newline at end of file diff --git a/dist/477.a474b061825f5523f240.css.map b/dist/477.51d8c60b6925b9015068.css.map similarity index 99% rename from dist/477.a474b061825f5523f240.css.map rename to dist/477.51d8c60b6925b9015068.css.map index 67280a833..8c2d749c3 100644 --- a/dist/477.a474b061825f5523f240.css.map +++ b/dist/477.51d8c60b6925b9015068.css.map @@ -1 +1 @@ -{"version":3,"file":"477.a474b061825f5523f240.css","mappings":"AAAA,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,oBACE,kBACA,MACA,OACA,QACA,SACA,eACA,gBACA,UACA,kBACA,YACA,oBACA,uBACA,mBAEA,+BACE,kBAEA,mCACE,kBACA,QACA,SACA,gCAIJ,wBACE,gBACA,iCACA,mBACA,yBAGF,qCACE,gBACA,YAGF,6BACE,Y;ACvCJ,mBACE,kBACA,aACA,YACA,iBACA,0BACA,kCACA,WACA,gBAEA,kBACA,MACA,OACA,QACA,SAEA,qBACE,yBAIJ,kBACE,kBACA,MACA,OACA,QACA,SACA,YACA,cACA,UACA,kBACA,qBAEA,0BACE,U;AClCJ,4BAEE,kBACA,WACA,YAGF,aACE,YACA,gEAGF,eACE,iCAEA,iCACE,gBAGF,uBACE,eACA,MACA,O;ACtBJ,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,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,aACE,eACA,MACA,OACA,YACA,YACA,0BACA,WACA,8BAEA,aACA,2BACA,4BACA,kBACA,eACA,sBACA,mBAEA,yBAlBF,aAmBI,iBAIF,yBACE,yBACA,mBAIA,sIACE,aAIJ,oCACE,mCAKA,sEACE,oBACA,gBAKF,gCACE,aAGF,uCACE,UAGF,sCACE,eACA,MACA,OACA,YACA,aACA,UACA,UAIJ,gCACE,aACA,mBACA,sBACA,kBACA,mCACA,YAEA,4CACE,WACA,YAGF,yBAbF,gCAcI,cAEA,gDAhBJ,gCAiBM,sDAGF,oDACE,qBAIJ,qDAzBF,gCA0BI,uDAIJ,mDAEE,oBAGF,+DAEE,kBACA,oBACA,kBACA,WACA,YACA,aACA,mBACA,gBAGF,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;AClOJ,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,iIAEE,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,sYACE,wBAGF,gIACE,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,kBAGF,6BACE,aACA,kBACA,iBACA,kBAEA,qCACE,8CACA,eACA,uBAEA,uDACE,uB;AC1BN,+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,6BAVF,WAWI,oBAGF,gDACE,iBACA,0B;ACbF,wBACE,eACA,OACA,QACA,SACA,mCACA,gGACA,UAEA,6CACA,uDAVF,wBAWI,yCACA,2CACA,uCACA,+HAGF,6BACE,+BAEA,uDACE,gGAIJ,+CACE,gBAGF,iDACE,8CAIJ,iBACE,iCACA,0DACA,uDAHF,iBAII,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,8CACA,UACA,gBAEA,6BALF,oBAMI,gCAIJ,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,UfxKF,oGe4KE,gBAIA,8CACE,cAGF,0CACE,gB;ACvLN,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/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/MediaViewerContent.scss","webpack://telegram-t/./src/components/mediaViewer/MediaViewerSlides.scss","webpack://telegram-t/./src/components/mediaViewer/PanZoom.scss","webpack://telegram-t/./src/components/mediaViewer/SenderInfo.scss","webpack://telegram-t/./src/components/mediaViewer/ZoomControls.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":[".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",".MediaViewerContent {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n transform: none;\n overflow: hidden;\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 .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",".MediaViewerSlides {\n position: absolute;\n display: flex;\n height: 100%;\n max-height: 100vh;\n min-height: -moz-available;\n max-height: -webkit-fill-available;\n width: 100%;\n overflow: hidden;\n -ms-touch-action: none;\n touch-action: none;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n\n & * {\n -ms-scroll-chaining: none;\n }\n}\n\n.MediaViewerSlide {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n height: 100%;\n flex: 100% 0 0;\n z-index: 0;\n touch-action: none;\n transform-origin: 0 0;\n\n &--active {\n z-index: 1;\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",".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",".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","#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\n display: grid;\n grid-template-columns: auto;\n grid-template-rows: auto 1fr;\n grid-column-gap: 0;\n grid-row-gap: 0;\n justify-items: stretch;\n align-items: center;\n\n @media (max-width: 600px) {\n background: rgba(0, 0, 0, 1);\n }\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 .MediaViewerSlide {\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.5rem 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.5rem;\n\n @supports (padding: 0 env(safe-area-inset-left)) {\n padding: 0.5rem #{\"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.5rem env(safe-area-inset-left)) {\n padding: 0.5rem #{\"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 .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 .middle-column-footer-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(.Transition__slide--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 .avatars {\n display: flex;\n align-self: center;\n margin-left: auto;\n padding-left: 1rem;\n\n .Avatar {\n border: .0625rem solid var(--color-background);\n margin-right: 0;\n box-sizing: content-box;\n\n &:not(:first-child) {\n margin-left: -0.1875rem;\n }\n }\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 @supports (overflow: overlay) {\n overflow-y: overlay;\n }\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 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 width: calc(var(--symbol-menu-width) + .25rem); // Reserve width for scrollbar\n padding: 0;\n overflow: hidden;\n\n @supports (overflow: overlay) {\n width: var(--symbol-menu-width);\n }\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":"477.51d8c60b6925b9015068.css","mappings":"AAAA,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,oBACE,kBACA,MACA,OACA,QACA,SACA,eACA,gBACA,UACA,kBACA,YACA,oBACA,uBACA,mBAEA,+BACE,kBAEA,mCACE,kBACA,QACA,SACA,gCAIJ,wBACE,gBACA,iCACA,mBACA,yBAGF,qCACE,gBACA,YAGF,6BACE,Y;ACvCJ,mBACE,kBACA,aACA,YACA,iBACA,0BACA,kCACA,WACA,gBAEA,kBACA,MACA,OACA,QACA,SAEA,qBACE,yBAIJ,kBACE,kBACA,MACA,OACA,QACA,SACA,YACA,cACA,UACA,kBACA,qBAEA,0BACE,U;AClCJ,4BAEE,kBACA,WACA,YAGF,aACE,YACA,gEAGF,eACE,iCAEA,iCACE,gBAGF,uBACE,eACA,MACA,O;ACtBJ,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,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,aACE,eACA,MACA,OACA,YACA,YACA,0BACA,WACA,8BAEA,aACA,2BACA,4BACA,kBACA,eACA,sBACA,mBAEA,yBAlBF,aAmBI,iBAIF,yBACE,yBACA,mBAIA,sIACE,aAIJ,oCACE,mCAKA,sEACE,oBACA,gBAKF,gCACE,aAGF,uCACE,UAGF,sCACE,eACA,MACA,OACA,YACA,aACA,UACA,UAIJ,gCACE,aACA,mBACA,sBACA,kBACA,mCACA,YAEA,4CACE,WACA,YAGF,yBAbF,gCAcI,cAEA,gDAhBJ,gCAiBM,sDAGF,oDACE,qBAIJ,qDAzBF,gCA0BI,uDAIJ,mDAEE,oBAGF,+DAEE,kBACA,oBACA,kBACA,WACA,YACA,aACA,mBACA,gBAGF,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;AClOJ,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,iIAEE,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,sYACE,wBAGF,gIACE,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,kBAGF,6BACE,aACA,kBACA,iBACA,kBAEA,qCACE,8CACA,eACA,uBAEA,uDACE,uB;AC1BN,+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,6BAVF,WAWI,oBAGF,gDACE,iBACA,0B;ACbF,wBACE,eACA,OACA,QACA,SACA,mCACA,gGACA,UAEA,6CACA,uDAVF,wBAWI,yCACA,2CACA,uCACA,+HAGF,6BACE,+BAEA,uDACE,gGAIJ,+CACE,gBAGF,iDACE,8CAIJ,iBACE,iCACA,0DACA,uDAHF,iBAII,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,8CACA,UACA,gBAEA,6BALF,oBAMI,gCAIJ,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,UfxKF,oGe4KE,gBAIA,8CACE,cAGF,0CACE,gB;ACvLN,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/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/MediaViewerContent.scss","webpack://telegram-t/./src/components/mediaViewer/MediaViewerSlides.scss","webpack://telegram-t/./src/components/mediaViewer/PanZoom.scss","webpack://telegram-t/./src/components/mediaViewer/SenderInfo.scss","webpack://telegram-t/./src/components/mediaViewer/ZoomControls.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":[".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",".MediaViewerContent {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n transform: none;\n overflow: hidden;\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 .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",".MediaViewerSlides {\n position: absolute;\n display: flex;\n height: 100%;\n max-height: 100vh;\n min-height: -moz-available;\n max-height: -webkit-fill-available;\n width: 100%;\n overflow: hidden;\n -ms-touch-action: none;\n touch-action: none;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n\n & * {\n -ms-scroll-chaining: none;\n }\n}\n\n.MediaViewerSlide {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n height: 100%;\n flex: 100% 0 0;\n z-index: 0;\n touch-action: none;\n transform-origin: 0 0;\n\n &--active {\n z-index: 1;\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",".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",".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","#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\n display: grid;\n grid-template-columns: auto;\n grid-template-rows: auto 1fr;\n grid-column-gap: 0;\n grid-row-gap: 0;\n justify-items: stretch;\n align-items: center;\n\n @media (max-width: 600px) {\n background: rgba(0, 0, 0, 1);\n }\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 .MediaViewerSlide {\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.5rem 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.5rem;\n\n @supports (padding: 0 env(safe-area-inset-left)) {\n padding: 0.5rem #{\"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.5rem env(safe-area-inset-left)) {\n padding: 0.5rem #{\"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 .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 .middle-column-footer-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(.Transition__slide--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 .avatars {\n display: flex;\n align-self: center;\n margin-left: auto;\n padding-left: 1rem;\n\n .Avatar {\n border: .0625rem solid var(--color-background);\n margin-right: 0;\n box-sizing: content-box;\n\n &:not(:first-child) {\n margin-left: -0.1875rem;\n }\n }\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 @supports (overflow: overlay) {\n overflow-y: overlay;\n }\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 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 width: calc(var(--symbol-menu-width) + .25rem); // Reserve width for scrollbar\n padding: 0;\n overflow: hidden;\n\n @supports (overflow: overlay) {\n width: var(--symbol-menu-width);\n }\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/477.51d8c60b6925b9015068.js b/dist/477.51d8c60b6925b9015068.js new file mode 100644 index 000000000..905b06bd1 --- /dev/null +++ b/dist/477.51d8c60b6925b9015068.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunktelegram_t=self.webpackChunktelegram_t||[]).push([[477],{9477:(e,t,n)=>{n.r(t),n.d(t,{ArchivedChats:()=>ja,AttachMenu:()=>sr,AttachmentModal:()=>Ts,BotCommandMenu:()=>ir,BotCommandTooltip:()=>or,CalendarModal:()=>Ye,ChatFolderModal:()=>qa,ContactList:()=>za,ContextMenuContainer:()=>ds,CustomSendMenu:()=>cr,DeleteMessageModal:()=>Ke,Dialogs:()=>De,DropArea:()=>dr.Z,EmojiTooltip:()=>hr,ForwardPicker:()=>Re,GifSearch:()=>kr,HeaderMenuContainer:()=>hs,HistoryCalendar:()=>je,InlineBotTooltip:()=>Cr,LeftSearch:()=>Vt,Management:()=>Yr,MediaViewer:()=>fe,MentionTooltip:()=>Ns,MessageSelectToolbar:()=>at,MobileSearch:()=>gs,NewChat:()=>Ha,NewChatStep1:()=>Ja,NewChatStep2:()=>_a,Notifications:()=>Ue,PaymentModal:()=>fo,PinMessageModal:()=>qe,PollModal:()=>As,PollResults:()=>Mr,ReceiptModal:()=>yo,RightSearch:()=>br,SafeLinkModal:()=>ze,SeenByModal:()=>st,Settings:()=>Oa,StickerSearch:()=>wr,StickerSetModal:()=>ms,StickerTooltip:()=>lr,SymbolMenu:()=>ar,TextFormatter:()=>mr.Z,UnpinAllMessagesModal:()=>We});var a=n(4050),s=n(5116),r=n(6137),o=n(1713),i=n(3716),l=n(2937),c=n(5326),d=n(8674),m=n(6590),u=n(9107),h=n(6202),Z=n(2566),P=n(7204),g=n(2858),v=n(1638),p=n(396),E=n(3989),C=n(1174),f=n(7361),b=n(782),I=n(3858),y=n(4399),S=n(935);function w(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 k(e,t){const n=document.querySelector(".Transition__slide--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 .Transition__slide--active .ChatInfo .Avatar",a="img.avatar-media";break;case o.bZ.SettingsAvatar:n="#Settings .ProfileInfo .Transition__slide--active .ProfilePhoto",a="img.avatar-media";break;case o.bZ.ProfileAvatar:n="#RightColumn .ProfileInfo .Transition__slide--active .ProfilePhoto",a="img.avatar-media";break;case o.bZ.ScheduledInline:case o.bZ.Inline:default:n=`.Transition__slide--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 T(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 F=n(231),A=n(126),L=n(2255),R=n(3106),B=n(8964),$=n(9196);const D=(0,a.X$)((0,s.c$)(((e,{message:t})=>({isDownloading:!!t&&(0,v.te)(e,t)})),((e,t)=>(0,b.ei)(t,["downloadMessageMedia","cancelMessageMediaDownload"])))((({mediaData:e,isVideo:t,isZoomed:n,message:s,fileName:r,isAvatar:o,isDownloading:i,onCloseMediaViewer:l,onForward:c,onZoomToggle:d,downloadMessageMedia:m,cancelMessageMediaDownload:h})=>{const{loadProgress:P}=(0,Z.Z)(s&&(0,g.Ti)(s,"download"),!i),v=(0,a.I4)((()=>{i?h({message:s}):m({message:s})}),[h,m,i,s]),p=(0,u.Z)(),E=(0,a.Ye)((()=>({onTrigger:e,isOpen:t})=>a.ZP.createElement(F.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 f.wB?a.ZP.createElement("div",{className:"MediaViewerActions-mobile"},a.ZP.createElement(R.Z,{trigger:E,positionX:"right"},!o&&a.ZP.createElement(B.Z,{icon:"forward",onClick:c},p("Forward")),t?a.ZP.createElement(B.Z,{icon:i?"close":"download",onClick:v},i?`${Math.round(100*P)}% Downloading...`:"Download"):a.ZP.createElement(B.Z,{icon:"download",href:e,download:r},p("AccActionDownload"))),i&&a.ZP.createElement($.Z,{progress:P,size:"s",noCross:!0})):a.ZP.createElement("div",{className:"MediaViewerActions"},!o&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(F.Z,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:p("Forward"),onClick:c},a.ZP.createElement("i",{className:"icon-forward"}))),t?a.ZP.createElement(F.Z,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:p("AccActionDownload"),onClick:v},i?a.ZP.createElement($.Z,{progress:P,size:"s",onClick:v}):a.ZP.createElement("i",{className:"icon-download"})):a.ZP.createElement(F.Z,{href:e,download:r,round:!0,size:"smaller",color:"translucent-white",ariaLabel:p("AccActionDownload")},a.ZP.createElement("i",{className:"icon-download"})),a.ZP.createElement(F.Z,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:n?"Zoom Out":"Zoom In",onClick:d},a.ZP.createElement("i",{className:n?"icon-zoom-out":"icon-zoom-in"})),a.ZP.createElement(F.Z,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:p("Close"),onClick:l},a.ZP.createElement("i",{className:"icon-close"})))})));var x=n(2202),U=n(9933),O=n(275),G=n(9118),z=n(9204),X=n(6752);const J=({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*y.Gw)};t();const n=(0,G.P2)(t,500,!0);return window.addEventListener("resize",n,!1),()=>{window.removeEventListener("resize",n,!1)}}),[]);const i=(0,X.Z)("MediaViewerFooter",n&&"is-for-video",t&&"is-hidden");return a.ZP.createElement("div",{className:i,onClick:function(t){e&&t.stopPropagation()}},e&&a.ZP.createElement("div",{className:"media-viewer-footer-content",onClick:f.wB?void 0:s},a.ZP.createElement("p",{className:"media-text custom-scroll "+(r?"multiline":""),dir:"auto"},e)))};var _=n(1212),V=n(2019);const H=void 0!==document.fullscreenElement?"fullscreenElement":void 0!==document.mozFullScreenElement?"mozFullScreenElement":void 0!==document.webkitFullscreenElement?"webkitFullscreenElement":"";var Y=n(6898),j=n(4753),K=n(790);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:i,isFullscreenSupported:l,isFullscreen:c,onChangeFullscreen:d,onPlayPause:m,onSeek:h})=>{const[Z,P]=(0,a.eJ)(!0),g=(0,a.sO)(null),v=(0,a.sO)(!1);(0,a.d4)((()=>{r&&P(r)}),[r]),(0,a.d4)((()=>{let e;return r||(f.wB?P(!1):e=window.setTimeout((()=>{P(!1)}),800)),()=>{e&&window.clearTimeout(e)}}),[r]),(0,a.d4)((()=>((Z||r)&&document.body.classList.add("video-controls-visible"),()=>{document.body.classList.remove("video-controls-visible")})),[r,Z]);const p=(0,u.Z)(),E=(0,a.I4)((e=>{if(v.current&&g.current){const{width:t,left:a}=g.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]),b=(0,a.I4)((e=>{v.current=!0,E(e)}),[E]),I=(0,a.I4)((()=>{v.current=!1}),[]);var y,S;if((0,a.d4)((()=>{if(g.current&&Z)return(0,C.s)(g.current,{onCapture:b,onRelease:I,onClick:I,onDrag:E})}),[Z,b,E,I]),Z||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,g),a.ZP.createElement(F.Z,{ariaLabel:p("AccActionPlay"),size:"tiny",ripple:!f.wB,color:"translucent-white",className:"play",onClick:m},a.ZP.createElement("i",{className:i?"icon-pause":"icon-play"})),function(e,t){return a.ZP.createElement("div",{className:"player-time"},`${(0,K.k9)(e)} / ${(0,K.k9)(t)}`)}(t,n),e<1&&(y=e,S=s,a.ZP.createElement("div",{className:"player-file-size"},`${W(S*y)} / ${W(S)}`)),l&&a.ZP.createElement(F.Z,{ariaLabel:"Fullscreen",size:"tiny",color:"translucent-white",className:"fullscreen",onClick:d},a.ZP.createElement("i",{className:c?"icon-smallscreen":"icon-fullscreen"})))};function te(){return(te=Object.assign||function(e){for(var t=1;t{const d=(0,a.sO)(null),[m,u]=(0,a.eJ)(!f.$b||!f.cj),[h,Z]=(0,a.eJ)(0),[P,g]=(0,a.eJ)(!0),[v,p,E]=function(e,t){const[n,s]=(0,a.eJ)(Boolean(H&&document[H]));return(0,a.bt)((()=>{const n=()=>{s(Boolean(H&&document[H]))},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))}}),[]),H||"iOS"===f.Lt?[n,()=>{e.current&&(H||"iOS"===f.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]}(d,u),{isBuffered:C,bufferedProgress:b,bufferingHandlers:I}=(0,V.Z)(),{shouldRender:y,transitionClassNames:S}=(0,_.Z)(!C,void 0,void 0,"slow"),{shouldRender:w,transitionClassNames:k}=(0,_.Z)(f.cj&&!m&&!y,void 0,void 0,"slow");(0,a.d4)((()=>{l||!i?d.current.pause():e&&!f.$b&&(0,j.Z)(d.current)}),[l,i,e]),(0,a.d4)((()=>{d.current.currentTime===d.current.duration?(Z(0),u(!1)):Z(d.current.currentTime)}),[h]);const N=(0,a.I4)((e=>{e.stopPropagation(),m?(d.current.pause(),u(!1)):((0,j.Z)(d.current),u(!0),f.wB&&g(!1))}),[m]);(0,Y.Z)(d,[]);const M=(0,a.I4)((()=>{g(!0)}),[]),T=(0,a.I4)((()=>{g(!1)}),[]),A=(0,a.I4)((e=>{Z(e.currentTarget.currentTime)}),[]),L=(0,a.I4)((()=>{Z(0),u(!1),g(!0)}),[]),R=(0,a.I4)((()=>{v&&E?E():!v&&p&&p()}),[E,v,p]),B=(0,a.I4)((e=>{d.current.currentTime=e}),[]),D=(0,a.I4)((e=>{e.stopPropagation(),g(!P),P||(d.current.pause(),u(!1))}),[P]);(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 x=s&&`width: ${s.width}px; height: ${s.height}px`,U=`background-image: url(${n})`;return a.ZP.createElement("div",{className:"VideoPlayer",onClick:!t&&f.wB?D:void 0,onMouseOver:t||f.$b?void 0:M,onMouseOut:t||f.$b?void 0:T},a.ZP.createElement("div",{style:x},a.ZP.createElement("video",te({ref:d,autoPlay:f.$b,playsInline:!0,loop:t,muted:t,id:"media-viewer-video",style:U,onPlay:f.cj?()=>u(!0):void 0,onEnded:L,onClick:f.wB?void 0:N,onDoubleClick:R},I,{onTimeUpdate:A}),e&&a.ZP.createElement("source",{src:e}))),w&&a.ZP.createElement(F.Z,{round:!0,className:`play-button ${k}`,onClick:N},a.ZP.createElement("i",{className:"icon-play"})),y&&a.ZP.createElement("div",{className:["spinner-container",S].join(" ")},!C&&a.ZP.createElement("div",{className:"buffering"},"Buffering..."),a.ZP.createElement($.Z,{size:"xl",progress:C?1:r,square:!0,onClick:c})),!t&&!y&&a.ZP.createElement(ee,{isPlayed:m,bufferedProgress:b,currentTime:h,isFullscreenSupported:Boolean(p),isFullscreen:v,fileSize:o,duration:d.current?d.current.duration:0,isForceVisible:P,isForceMobileVersion:s&&s.width<400,onSeek:B,onChangeFullscreen:R,onPlayPause:N}))})),ae=(0,a.X$)((0,s.c$)(((e,t)=>{const{chatId:n,threadId:a,messageId:s,avatarOwnerId:r,profilePhotoIndex:i,origin:l}=t;if(l===o.bZ.SearchResult){if(!n||!s)return{};const t=(0,v.hj)(e,n,s);return t?{chatId:n,messageId:s,senderId:t.senderId,origin:l,message:t}:{}}if(r)return{messageId:-1,senderId:r,avatarOwner:(0,v.dy)(e,r)||(0,v.Z1)(e,r),profilePhotoIndex:i||0,origin:l};if(!(n&&a&&s))return{};let c;return c=l&&[o.bZ.ScheduledAlbum,o.bZ.ScheduledInline].includes(l)?(0,v.Tm)(e,n,s):(0,v.hj)(e,n,s),c?{chatId:n,threadId:a,messageId:s,senderId:c.senderId,origin:l,message:c}:{}}))((e=>{const{messageId:t,isActive:n,avatarOwner:s,chatId:i,message:c,profilePhotoIndex:d,origin:m,animationLevel:u,onClose:P,onFooterClick:v,isFooterHidden:p}=e,E=c?(0,g.O$)(c):void 0,C=c?(0,g.b7)(c):void 0,f=c?(0,g.F$)(c):void 0,b=c?(0,g.Cg)(c):void 0,I=!!c&&(0,g.rl)(c),w=!!c&&(0,g.hC)(c),k=Boolean(C||b||w),N=Boolean(!k&&(E||f||I)),{isGif:M}=C||b||{},T=Boolean(s||t),F=Boolean(s),A=m===o.bZ.SharedMedia,L=m===o.bZ.SearchResult,R=2===u;function B(e){if(F&&void 0!==d){const{photos:t}=s;return t&&t[d]?`photo${t[d].id}?size=c`:(0,g.RT)(s,e?"big":"normal")}return c&&(0,g.Ti)(c,e?"viewerFull":"viewerPreview")}const $=(0,h.Z)(c&&(A||L)&&(0,g.Ti)(c,"pictogram"),void 0,r.IU.BlobUrl,void 0,R&&350),D=B(),x=(0,h.Z)(D,void 0,r.IU.BlobUrl,void 0,R&&350),{mediaData:U,loadProgress:O}=(0,Z.Z)(B(!0),void 0,c&&(0,g.kG)(c,"viewerFull"),void 0,R&&350),G=E||C?(E||C).blobUrl:void 0;let X=!k&&(G||U)||x||$;const _=(0,l.Z)(!X&&c&&(0,g.DH)(c));X||m===o.bZ.SearchResult||(X=_);const V=c?(0,g.c0)(c):void 0;let H;if(c?I||w?H=(0,g.aE)(c).mediaSize:E||f?H=(0,g.bV)(E||f):(C||b)&&(H=(0,g.jC)(C||b)):H=y.vY,F)return a.ZP.createElement("div",{key:i,className:"MediaViewerContent"},se(U||x,(0,y.PA)(y.vY,!1),!1));if(!c)return;const Y=(0,S.X)(c),j=Boolean(Y);return a.ZP.createElement("div",{className:"MediaViewerContent "+(j?"has-footer":"")},N&&se(G||U||x||$,c&&(0,y.PA)(H,j),!1),k&&(n?a.ZP.createElement(ne,{key:t,url:G||U,isGif:M,posterData:X,posterSize:c&&(0,y.PA)(H,j,!0),loadProgress:O,fileSize:V,isMediaViewerOpen:T,noPlay:!n,onClose:P}):function(e,t,n){const s=t&&`width: ${t.width}px; height: ${t.height}px`,r=`background-image: url(${e})`;return e?a.ZP.createElement("div",{className:"VideoPlayer"},a.ZP.createElement("div",{style:s},a.ZP.createElement("video",{style:r,draggable:Boolean(!1)}))):a.ZP.createElement("div",{className:"spinner-wrapper",style:t?`width: ${t.width}px`:""},a.ZP.createElement(z.Z,{color:"white"}))}(X,c&&(0,y.PA)(H,j,!0))),Y&&a.ZP.createElement(J,{text:Y,onClick:v,isHidden:p&&(!k||M),isForVideo:k&&!M}))})));function se(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(z.Z,{color:"white"}))}function re(){return(re=Object.assign||function(e){for(var t=1;t{const u=(0,a.sO)(null),h=(0,a.sO)(null),Z=(0,a.sO)(le),P=(0,a.sO)(!1),g=(0,a.sO)(!0),[v,p]=(0,a.eJ)(e),E=(0,c.Z)(),[b,I]=(0,a.eJ)(!1),{isZoomed:y,onClose:S}=m,w=(0,a.I4)((e=>{Z.current=e,E()}),[E]),k=(0,a.I4)((e=>{P.current=e,E()}),[E]),N=(0,a.I4)((e=>{g.current=e,E()}),[E]),M=(0,x.Z)(350,!1),T=(0,x.Z)(500,!1),F=(0,x.Z)(800,!1),A=(0,a.I4)((()=>{f.$b&&(o||r)&&d&&I(!b)}),[d,b,r,o]);if((0,a.d4)((()=>{if(!f.$b||!u.current||y||!v)return;let e={...Z.current};const a={x:0,y:0},s={x:0,y:0},r={x:0,y:0};let o,i,l=Date.now();const c=(0,G.Ds)((()=>{l=Date.now()}),500,!1,!0);return(0,C.s)(u.current,{isNotPassive:!0,excludedClosestSelector:".VideoPlayerControls, .MediaViewerFooter",onCapture:e=>{if("touchstart"!==e.type||!("pageX"in e)||e.pageX>10&&e.pageX{ie&&(ie(),ie=void 0),r.x=a.x-s,r.y=a.y-o,a.x=s,a.y=o;const i=Math.abs(s),l=Math.abs(o),{scale:d,x:m,y:u}=Z.current,h=10;if(c(),1===d)return P.current||Math.abs(m)>h||i>h&&lh||l>h&&i{const d=Math.min(12,Math.max(e.scale*n,.6)),m=d/e.scale,u=Math.abs(Math.min(e.x,0))+a,h=Math.abs(Math.min(e.y,0))+r;s.x=l,s.y=c;const Z=u-m*u,P=h-m*h;w({x:e.x+Z+o,y:e.y+P+i,scale:d})},onDoubleClick(t,{centerX:n,centerY:a}){const s=n-3*n,r=a-3*a,{scale:o,x:i,y:l}=Z.current;if(1===o){if(0!==i||0!==l)return;e={x:s,y:r,scale:3}}else e={x:0,y:0,scale:1};return(0,U.vr)({from:[i,l,o],to:[e.x,e.y,e.scale],duration:oe,timing:U.M8.easeOutCubic,onUpdate:e=>w({x:e[0],y:e[1],scale:e[2]})})},onRelease:()=>{const c=Math.abs(Z.current.x),d=Math.abs(Z.current.y),{scale:m,x:u,y:h}=Z.current;if(m<1)return e=le,(0,U.vr)({from:[u,h,m],to:[0,0,1],duration:oe,timing:U.M8.easeOutCubic,onUpdate:e=>w({x:e[0],y:e[1],scale:e[2]})});if(m>1){if(!i||!o)return void(e={x:u,y:h,scale:m});const t=i.getBoundingClientRect(),n=Math.min(m,4),c=n/m;let d=u*c+(s.x-c*s.x),Z=h*c+(s.y-c*s.y);const P=.15;if(e.scale===m){const e=Math.abs(a.x)/(Date.now()-l),t=Math.abs(a.y)/(Date.now()-l);d-=Math.abs(a.x)*e*P*r.x,Z-=Math.abs(a.y)*t*P*r.y}if(t.width>window.innerWidth){const e=-o.left*n,t=window.innerWidth-o.right*n;d=Math.min(e,Math.max(t,d))}else d=(window.innerWidth-window.innerWidth*n)/2;if(t.height>window.innerHeight){const e=-o.top*n,t=window.innerHeight-o.bottom*n;Z=Math.min(e,Math.max(t,Z))}else Z=(window.innerHeight-window.innerHeight*n)/2;return e={x:d,y:Z,scale:n},void(ie=(0,U.vr)({from:[u,h,m],to:[d,Z,n],duration:oe,timing:U.M8.easeOutCubic,onUpdate:e=>w({x:e[0],y:e[1],scale:e[2]})}))}if(e={x:u,y:h,scale:m},d>=50)return S();if(d>0)return(0,U.vr)({from:h,to:0,duration:oe,timing:U.M8.easeOutCubic,onUpdate:e=>w({x:0,y:e,scale:m})});const P=u<0?1:-1,g=t(v,u<0?1:-1),E=r.x<0?-1:1;if(g&&c>=50&&P===E){const e=(window.innerWidth+40)*P;Z.current.x+=e,p(g),M((()=>n(g)))}T((()=>k(!1))),F((()=>N(!0))),ie=(0,U.vr)({from:Z.current.x,to:0,duration:oe,timing:U.M8.easeOutCubic,onUpdate:e=>w({y:0,x:e,scale:Z.current.scale})})}})}),[y,S,w,t,v,k,N]),!v)return;const L=t(v,1),R=t(v,-1),B=Z.current.x,$=Z.current.y,{scale:D}=Z.current;return a.ZP.createElement("div",{className:"MediaViewerSlides",ref:u},R&&1===D&&a.ZP.createElement("div",{className:"MediaViewerSlide",style:de(-window.innerWidth+B-40)},a.ZP.createElement(ae,re({},m,{messageId:R,isFooterHidden:b}))),v&&a.ZP.createElement("div",{className:"MediaViewerSlide "+(l?"MediaViewerSlide--active":""),onClick:A,ref:h,style:de(B,$,D)},a.ZP.createElement(ae,re({},m,{messageId:v,isActive:g.current,isFooterHidden:b||y||1!==D}))),L&&1===D&&a.ZP.createElement("div",{className:"MediaViewerSlide",style:de(window.innerWidth+B+40)},a.ZP.createElement(ae,re({},m,{messageId:L,isFooterHidden:b}))))}));function de(e=0,t=0,n=1){return`transform: translate3d(${e.toFixed(3)}px, ${t.toFixed(3)}px, 0px) scale(${n.toFixed(3)});`}const me=[1,0,0,1,0,0],ue={1:1,1.5:1.5,2:2.2,2.5:3.3,3:5.5},he=150,Ze=(0,a.X$)((({children:e,className:t,noWrap:n,canPan:s,zoomLevel:r,panDeltaX:o,panDeltaY:i,onPan:l})=>{const c=ue[r]||r,[d,m]=(0,a.eJ)(!1),[u,h]=(0,a.eJ)({dx:o,dy:i,x:0,y:0}),[Z,P]=(0,a.eJ)(me),g=(0,a.sO)(null),v=(0,a.sO)(null);return(0,a.d4)((()=>{const e=c||Z[0],t=o||Z[4],n=i||Z[5],a=[...Z];Z[0]!==e&&(a[0]=e||a[0],a[3]=e||a[3]),Z[4]!==t&&(a[4]=t),Z[5]!==n&&(a[5]=n),(0,b.et)(Z,a)||P(function(e,t,n){const a=n&&n.querySelector(".Transition__slide--active img");if(!n||!a)return t;const s=n.getBoundingClientRect(),r=a.getBoundingClientRect(),o=r.width/e*t[0],i=r.height/e*t[3],l=(s.width-o)/2+t[4],c=(s.height-i)/2+t[5];return s.width&&s.width-he{s||P(me)}),[s]),(0,a.d4)((()=>{v.current&&(v.current.style.transform=`matrix(${Z.toString()})`)}),[n,Z]),n?e:a.ZP.createElement("div",{ref:g,className:`pan-wrapper ${t||""}`,onMouseDown:e=>{if(!s)return;e.stopPropagation(),e.preventDefault();const t={dx:Z[4],dy:Z[5],x:e.pageX,y:e.pageY};h(t),m(!0),g.current&&g.current.classList.add("move")},onMouseUp:()=>{m(!1),g.current&&g.current.classList.remove("move"),l&&l(Z[4],Z[5])},onMouseMove:e=>{if(d){const t=function(e,t){const n=[...Z],a=u.x-e,s=u.y-t;return n[4]=u.dx-a,n[5]=u.dy-s,n}(e.pageX,e.pageY);P(t),v.current&&(v.current.style.transform=`matrix(${Z.toString()})`)}}},a.ZP.createElement("div",{ref:v,className:"pan-container"},e))}));var Pe=n(2340),ge=n(172);const ve=(0,s.c$)(((e,{chatId:t,messageId:n,isAvatar:a})=>{if(a&&t)return{sender:(0,g.YC)(t)?(0,v.dy)(e,t):(0,v.Z1)(e,t)};if(!n||!t)return{};const s=(0,v.hj)(e,t,n);return{message:s,sender:s&&(0,v.Ur)(e,s)}}),((e,t)=>(0,b.ei)(t,["closeMediaViewer","focusMessage"])))((({chatId:e,messageId:t,sender:n,isAvatar:s,message:r,closeMediaViewer:o,focusMessage:i})=>{const l=(0,a.I4)((()=>{o(),i({chatId:e,messageId:t})}),[e,i,t,o]),c=(0,u.Z)();if(!n||!r&&!s)return;const d=(0,g.OU)(c,n);return a.ZP.createElement("div",{className:"SenderInfo",onClick:l},(0,g.YC)(n.id)?a.ZP.createElement(ge.Z,{key:n.id,size:"medium",user:n}):a.ZP.createElement(ge.Z,{key:n.id,size:"medium",chat:n}),a.ZP.createElement("div",{className:"meta"},a.ZP.createElement("div",{className:"title",dir:"auto"},d&&(0,Pe.Z)(d)),a.ZP.createElement("div",{className:"date",dir:"auto"},s?c("lng_mediaview_profile_photo"):(0,K.ZK)(c,1e3*r.date,!0))))})),pe=({children:e,...t})=>f.$b?a.ZP.createElement("div",{className:"Transition"},a.ZP.createElement("div",{className:"Transition__slide--active"},e(!0,!0,1))):a.ZP.createElement(L.Z,t,e),Ee=(0,a.X$)((({isShown:e,onChangeZoom:t})=>{const{transitionClassNames:n}=(0,_.Z)(e),s=(0,P.Z)(e),r=(0,a.sO)(null),[o,i]=(0,a.eJ)(1),l=(0,a.sO)(!1);(0,a.d4)((()=>{e&&!s&&i(1.5)}),[e,s]);const c=(0,a.I4)((()=>{l.current=!0}),[]),d=(0,a.I4)((()=>{l.current=!1,1===o&&t(o,!l.current)}),[t,o]);(0,a.d4)((()=>{t(o,!l.current)}),[o,t]);const m=(0,u.Z)(),h=(0,X.Z)("ZoomControls",n);return a.ZP.createElement("div",{className:h},a.ZP.createElement(F.Z,{disabled:1===o,size:"tiny",color:"translucent-white",ariaLabel:m("ZoomOut"),className:"zoom-out",ripple:!f.wB,onClick:()=>{r.current&&i(Math.max(1,o-.5))}},a.ZP.createElement("i",{className:"icon-zoom-out"})),a.ZP.createElement(F.Z,{disabled:3===o,size:"tiny",color:"translucent-white",ariaLabel:"Zoom In",className:"zoom-in",ripple:!f.wB,onClick:()=>{r.current&&i(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=>{i(Math.min(3,Math.max(Number(e.target.value),1)))},onMouseDown:c,onMouseUp:d}))))})),Ce=350,fe=(0,a.X$)((0,s.c$)((e=>{const{chatId:t,threadId:n,messageId:a,avatarOwnerId:s,profilePhotoIndex:r,origin:i}=e.mediaViewer,{animationLevel:l}=e.settings.byKey;if(i===o.bZ.SearchResult){if(!t||!a)return{animationLevel:l};const n=(0,v.hj)(e,t,a);return n?{chatId:t,messageId:a,senderId:n.senderId,origin:i,message:n,animationLevel:l}:{animationLevel:l}}if(s)return{messageId:-1,senderId:s,avatarOwner:(0,v.dy)(e,s)||(0,v.Z1)(e,s),profilePhotoIndex:r||0,animationLevel:l,origin:i};if(!(t&&n&&a))return{animationLevel:l};let c,d,m;if(c=i&&[o.bZ.ScheduledAlbum,o.bZ.ScheduledInline].includes(i)?(0,v.Tm)(e,t,a):(0,v.hj)(e,t,a),!c)return{animationLevel:l};if(d=i&&[o.bZ.ScheduledAlbum,o.bZ.ScheduledInline].includes(i)?(0,v.Fn)(e,t):(0,v.Zw)(e,t),i===o.bZ.Inline||i===o.bZ.Album)m=(0,v.qC)(e,t,n)||(0,v.gb)(e,t,n);else if(i===o.bZ.SharedMedia){const t=(0,v.we)(e),{foundIds:n}=t&&t.resultsByType&&t.resultsByType.media||{};m=n}return{chatId:t,threadId:n,messageId:a,senderId:c.senderId,origin:i,message:c,chatMessages:d,collectionIds:m,animationLevel:l}}),((e,t)=>(0,b.ei)(t,["openMediaViewer","closeMediaViewer","openForwardMenu","focusMessage"])))((({chatId:e,threadId:t,messageId:n,senderId:s,origin:v,avatarOwner:b,profilePhotoIndex:R,message:B,chatMessages:$,collectionIds:x,openMediaViewer:U,closeMediaViewer:O,openForwardMenu:G,focusMessage:z,animationLevel:X})=>{const J=Boolean(b||n),_=v===o.bZ.SharedMedia,V=v===o.bZ.SearchResult,H=B?(0,g.O$)(B):void 0,Y=B?(0,g.b7)(B):void 0,j=B?(0,g.F$)(B):void 0,K=B?(0,g.Cg)(B):void 0,q=!!B&&(0,g.rl)(B),W=!!B&&(0,g.hC)(B),Q=Boolean(Y||K||W),{isGif:ee}=Y||K||{},te=Boolean(!Q&&(H||j||q)),ne=Boolean(b),ae=Boolean(j||K),se=(0,a.Ye)((()=>ae&&n?[n]:(0,g.N0)($||{},x||[],_)),[ae,n,$,x,_]),re=n?se.indexOf(n):-1,oe=0===re||-1===re,ie=re===se.length-1||-1===re,le=(0,a.sO)(),de=(0,P.Z)(s);!J||de&&de===s&&le.current||(le.current=re);const me=X>=1&&!f.$b?"mv-slide":"none",ue=2===X?"slide-fade":"none",he=2===X,[Pe,ge]=(0,a.eJ)(!1),[fe,be]=(0,a.eJ)(!1),[Ie,ye]=(0,a.eJ)(1),[Se,we]=(0,a.eJ)({x:0,y:0});function ke(e){if(ne&&void 0!==R){const{photos:t}=b;return t&&t[R]?`photo${t[R].id}?size=c`:(0,g.RT)(b,e?"big":"normal")}return B&&(0,g.Ti)(B,e?"viewerFull":"viewerPreview")}const Ne=(0,h.Z)(B&&(_||V)&&(0,g.Ti)(B,"pictogram"),void 0,r.IU.BlobUrl,void 0,he&&Ce),Me=ke(),Te=(0,h.Z)(Me,void 0,r.IU.BlobUrl,void 0,he&&Ce),{mediaData:Fe}=(0,Z.Z)(ke(!0),void 0,B&&(0,g.kG)(B,"viewerFull"),void 0,he&&Ce),Ae=H||Y?(H||Y).blobUrl:void 0;let Le=!Q&&(Ae||Fe)||Te||Ne;const Re=(0,l.Z)(!Le&&B&&(0,g.DH)(B));Le||v===o.bZ.SearchResult||(Le=Re);const Be=B?(0,g.ep)(B):ne?`avatar${b.id}-${R}.jpg`:void 0;let $e;B?q||W?$e=(0,g.aE)(B).mediaSize:H||j?$e=(0,g.bV)(H||j):(Y||K)&&($e=(0,g.jC)(Y||K)):$e=y.vY,(0,a.d4)((()=>{f.wB&&document.body.classList.toggle("is-media-viewer-open",J)}),[J]);const De=(0,c.Z)();(0,a.d4)((()=>{const e=window.matchMedia(y.L6);return"function"==typeof e.addEventListener?e.addEventListener("change",De):"function"==typeof e.addListener&&e.addListener(De),()=>{"function"==typeof e.removeEventListener?e.removeEventListener("change",De):"function"==typeof e.removeListener&&e.removeListener(De)}}),[De]);const xe=(0,P.Z)(B),Ue=(0,P.Z)(v),Oe=(0,P.Z)(b),Ge=(0,P.Z)(Le),ze=B?(0,S.X)(B):void 0,Xe=Boolean(ze);(0,a.d4)((()=>{he&&J&&!xe&&!Oe&&((0,d.YW)(Ce+i.fK),function(e,t,n,a,s,r){const{mediaEl:l}=M(t,r);if(!l)return;const{width:c}=I.Z.get(),{width:d,height:m}=(0,y.fM)(e,s),{width:u,height:h}=(0,y.jg)(d,m,a.width,a.height),Z=(c-u)/2,P=function(e){const t=window.matchMedia(y.L6);let n=4.125;return e&&(n+=t.matches?.875:3.375),n*y.Gw}(e)+(m-h)/2;let{top:g,left:v,width:p,height:E}=l.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}}(u,h,g,v,p,E);g=e.top,v=e.left,p=e.width,E=e.height}const C=v+p/2-(Z+u/2),f=g+E/2-(P+h/2),b=p/u,S=E/h,k=w(n||l);N(k,{top:`${P}px`,left:`${Z}px`,width:`${u}px`,height:`${h}px`,transform:`translate3d(${C}px, ${f}px, 0) scale(${b}, ${S})`}),T(k,t),document.body.classList.add("ghost-animating"),requestAnimationFrame((()=>{document.body.appendChild(k),requestAnimationFrame((()=>{k.style.transform="",function(e){e.firstChild.style.objectFit="default",e.classList.remove("rounded-corners","circle")}(k),setTimeout((()=>{requestAnimationFrame((()=>{document.body.contains(k)&&document.body.removeChild(k),document.body.classList.remove("ghost-animating")}))}),200+i.fK)}))}))}(Xe,v,Le,$e,Q,B)),he&&!J&&(xe||Oe)&&((0,d.YW)(Ce+i.fK),function(e,t,n){const{container:a,mediaEl:s}=M(e,n);if(!s)return;const r=document.getElementById("MediaViewer").querySelector(".MediaViewerSlide--active img, .MediaViewerSlide--active video");if(!r||!s)return;const{top:l,left:c,width:d,height:m}=r.getBoundingClientRect(),{top:u,left:h,width:Z,height:P}=s.getBoundingClientRect();let g=u;if(!function(e){if("none"===e.style.display)return!1;const t=e.getBoundingClientRect(),{height:n}=I.Z.get();return t.top<=n&&t.top+t.height>=0}(a)){const{height:e}=I.Z.get();g=uC?E=C:C>E&&(C=E));const b=document.getElementsByClassName("ghost")[0],y=b||w(t||s,e);b||N(y,{top:`${g}px`,left:`${h}px`,width:`${Z}px`,height:`${P}px`,transform:`translate3d(${v}px, ${p}px, 0) scale(${E}, ${C})`}),requestAnimationFrame((()=>{if(b){const{top:e,left:t,width:n,height:a}=b.getBoundingClientRect();N(y,{transition:"none",top:`${g}px`,left:`${h}px`,transformOrigin:"top left",transform:`translate3d(${t-h}px, ${e-g}px, 0) scale(${n/Z}, ${a/P})`,width:`${Z}px`,height:`${P}px`})}document.body.classList.add("ghost-animating"),b||document.body.appendChild(y),requestAnimationFrame((()=>{b&&(b.style.transition=""),y.style.transform="",f&&(y.style.opacity="0"),T(y,e),setTimeout((()=>{requestAnimationFrame((()=>{document.body.contains(y)&&document.body.removeChild(y),document.body.classList.remove("ghost-animating")}))}),200+i.fK)}))}))}(Ue,Ge,xe||void 0))}),[he,J,v,Ue,B,xe,Oe,Le,Ge,$e,Q,Xe]),(0,a.d4)((()=>{let e;return fe?ge(!0):e=window.setTimeout((()=>{ge(!1)}),Ce),()=>{e&&window.clearTimeout(e)}}),[fe]);const Je=()=>{be(!1),ye(1),we({x:0,y:0})},_e=(0,a.I4)((()=>{be(!fe),ye(fe?1:1.5),fe&&we({x:0,y:0})}),[fe]),Ve=(0,a.I4)(((e,t=!1)=>{ye(e),1===e&&t&&Je()}),[]),He=(0,a.I4)((()=>{O(),Je()}),[O]),Ye=(0,a.I4)((()=>{He(),z({chatId:e,threadId:t,messageId:n})}),[He,e,t,z,n]),je=(0,a.I4)((()=>{G({fromChatId:e,messageIds:[n]}),Je()}),[G,e,n]),Ke=(0,a.I4)((n=>U({chatId:e,threadId:t,messageId:n,origin:v},{forceOnHeavyAnimation:!0})),[e,U,v,t]);(0,a.d4)((()=>J?(0,E.Z)((()=>{fe?Je():He()})):void 0),[He,J,fe]),(0,a.d4)((()=>{Q&&!ee&&(0,p.Es)()}),[ee,Q]),(0,a.d4)((()=>{if(J)return I.Z.disableRefresh(),()=>{I.Z.enableRefresh()}}),[J]);const qe=(0,a.I4)(((e,t)=>{if(!e)return;const n=se.indexOf(e);return-1===t&&n>0||1===t&&n{we({x:e,y:t})}),[]),tt=(0,u.Z)();function nt(){return ne?a.ZP.createElement(ve,{key:b.id,chatId:b.id,isAvatar:!0}):a.ZP.createElement(ve,{key:n,chatId:e,messageId:n})}return(0,m.ZP)(J,O,U,{chatId:e,threadId:t,messageId:n,origin:v,avatarOwnerId:b&&b.id}),(0,a.d4)((()=>{if(J)return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)};function e(e){switch(e.key){case"Left":case"ArrowLeft":Ke(Qe);break;case"Right":case"ArrowRight":Ke(We)}}}),[J,We,Qe,Ke]),(0,a.d4)((()=>{if(fe||f.$b)return;const e=document.querySelector(".MediaViewerSlide--active");if(!e)return;const t=ee&&!f.cj;return(0,C.s)(e,{excludedClosestSelector:".backdrop, .navigation, .media-viewer-head, .media-viewer-footer"+(t?"":", .VideoPlayer"),onClick:He})}),[He,ee,fe,n]),a.ZP.createElement(A.Z,{id:"MediaViewer",className:fe?"zoomed":"",isOpen:J},(()=>a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("div",{className:"media-viewer-head",dir:tt.isRtl?"rtl":void 0},f.wB&&a.ZP.createElement(F.Z,{className:"media-viewer-close",round:!0,size:"smaller",color:"translucent-white",ariaLabel:tt("Close"),onClick:He},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement(L.Z,{activeKey:le.current,name:ue},nt),a.ZP.createElement(D,{mediaData:Fe||Te,isVideo:Q,isZoomed:fe,message:B,fileName:Be,onCloseMediaViewer:He,onForward:je,onZoomToggle:_e,isAvatar:ne})),a.ZP.createElement(Ze,{noWrap:!Pe,canPan:fe,panDeltaX:Se.x,panDeltaY:Se.y,zoomLevel:Ie,onPan:et},a.ZP.createElement(pe,{activeKey:re,name:me},(s=>a.ZP.createElement(ce,{messageId:n,getMessageId:qe,chatId:e,isPhoto:te,isGif:ee,threadId:t,avatarOwnerId:b&&b.id,profilePhotoIndex:R,origin:v,isOpen:J,hasFooter:Xe,isZoomed:fe,isActive:s,animationLevel:X,onClose:He,selectMessage:Ke,onFooterClick:Ye})))),!oe&&!f.$b&&a.ZP.createElement("button",{type:"button",className:`navigation prev ${Q&&!ee&&"inline"}`,"aria-label":tt("AccDescrPrevious"),dir:tt.isRtl?"rtl":void 0,onClick:()=>Ke(Qe)}),!ie&&!f.$b&&a.ZP.createElement("button",{type:"button",className:`navigation next ${Q&&!ee&&"inline"}`,"aria-label":tt("Next"),dir:tt.isRtl?"rtl":void 0,onClick:()=>Ke(We)}),a.ZP.createElement(Ee,{isShown:fe,onChangeZoom:Ve}))))})));var be=n(8360),Ie=n(7407),ye=n(2313),Se=n(2515),we=n(4288),ke=n(3103),Ne=n(7687),Me=n(1273),Te=n(1876),Fe=n(8799),Ae=n(6058);const Le=(0,a.X$)((({isOpen:e,currentUserId:t,chatOrUserIds:n,filterRef:s,filter:r,filterPlaceholder:o,onFilterChange:i,onClose:l,loadMore:c,onSelectChatOrUser:d})=>{const m=(0,u.Z)(),[h,Z]=(0,Ie.Z)(c,n,Boolean(r)),P=(0,a.I4)((()=>{i("")}),[i]);(0,Se.Z)(s,e,P);const v=(0,a.sO)(null),p=(0,a.I4)((e=>{i(e.currentTarget.value)}),[i]),E=(0,ye.Z)(v,e,(e=>{h&&h.length>0&&d(h[-1===e?0:e])}),".ListItem-button",!0),C=a.ZP.createElement("div",{className:"modal-header",dir:m.isRtl?"rtl":void 0},a.ZP.createElement(F.Z,{round:!0,color:"translucent",size:"smaller",ariaLabel:m("Close"),onClick:l},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement(Ne.Z,{ref:s,value:r,onChange:p,onKeyDown:E,placeholder:o}));return a.ZP.createElement(ke.Z,{isOpen:e,onClose:l,className:"ChatOrUserPicker",header:C},null!=h&&h.length?a.ZP.createElement(Me.Z,{className:"picker-list custom-scroll",items:h,onLoadMore:Z,noScrollRestore:Boolean(r),ref:v,onKeyDown:E},h.map((e=>a.ZP.createElement(Te.Z,{key:e,className:"chat-item-clickable force-rounded-corners",onClick:()=>d(e)},(0,g.YC)(e)?a.ZP.createElement(Ae.Z,{status:e===t?m("SavedMessagesInfo"):void 0,userId:e}):a.ZP.createElement(Fe.Z,{chatId:e}))))):h&&!h.length?a.ZP.createElement("p",{className:"no-results"},m("lng_blocked_list_not_found")):a.ZP.createElement(we.Z,null))})),Re=(0,a.X$)((0,s.c$)((e=>{var t;const{chats:{byId:n,listIds:a,orderedPinnedIds:s},currentUserId:r}=e;return{chatsById:n,activeListIds:a.active,archivedListIds:a.archived,pinnedIds:s.active,contactIds:null===(t=e.contactList)||void 0===t?void 0:t.userIds,currentUserId:r}}),((e,t)=>(0,b.ei)(t,["setForwardChatId","exitForwardMode","loadMoreChats"])))((({chatsById:e,activeListIds:t,archivedListIds:n,pinnedIds:o,contactIds:i,currentUserId:l,isOpen:c,setForwardChatId:d,exitForwardMode:m,loadMoreChats:h})=>{const Z=(0,u.Z)(),[P,v]=(0,a.eJ)(""),p=(0,a.sO)(null),E=(0,a.Ye)((()=>{if(!c)return;let a=o||[];l&&(a=(0,b.Tw)([l,...a]));const d=[...t||[],...n||[]].filter((t=>{const n=e[t];return n&&(0,g.Qm)(n,r._f)})),m=(0,s.Rd)().users.byId;return(0,g.ih)((0,b.Tw)([...(0,g.$l)(Z,d,e,P,l),...i?(0,g.kK)(i,m,P):[]]),e,void 0,a)}),[t,n,e,i,l,P,c,Z,o]),C=(0,a.I4)((e=>{d({id:e})}),[d]),f=(0,be.Z)(E);return a.ZP.createElement(Le,{currentUserId:l,isOpen:c,chatOrUserIds:f,filterRef:p,filterPlaceholder:Z("ForwardTo"),filter:P,onFilterChange:v,loadMore:h,onSelectChatOrUser:C,onClose:m})})));var Be=n(1947);function $e(e){return e.isSlowMode?"Slowmode enabled":e.hasErrorKey?"Something went wrong":"Telegram"}const De=(0,a.X$)((0,s.c$)((e=>(0,b.ei)(e,["dialogs"])),((e,t)=>(0,b.ei)(t,["dismissDialog","acceptInviteConfirmation"])))((({dialogs:e,dismissDialog:t,acceptInviteConfirmation:n})=>{const s=(0,u.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:i,isChannel:l}=e,c=s(l?"Subscribers":"Members",i,"i"),d=s(l?"ChannelJoin":"JoinGroup");return a.ZP.createElement(ke.Z,{isOpen:!0,onClose:t,className:"error",title:o},void 0!==i&&a.ZP.createElement("p",null,c),a.ZP.createElement(F.Z,{isText:!0,className:"confirm-dialog-button",onClick:()=>{n({hash:r}),t()}},d),a.ZP.createElement(F.Z,{isText:!0,className:"confirm-dialog-button",onClick:t},s("Cancel")))})(e):(r=e,a.ZP.createElement(ke.Z,{isOpen:!0,onClose:t,className:"error",title:$e(r)},r.hasErrorKey?(0,Be.ZP)(r):(0,Pe.Z)(r.message,["emoji","br"]),a.ZP.createElement("div",null,a.ZP.createElement(F.Z,{isText:!0,onClick:t},s("OK")))));var r})))})));var xe=n(6937);const Ue=(0,a.X$)((0,s.c$)((e=>(0,b.ei)(e,["notifications"])),((e,t)=>(0,b.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(xe.Z,{message:(0,Pe.Z)(e,["emoji","br","links","simple_markdown"]),onDismiss:()=>t({localId:n})}))))})));var Oe=n(1396),Ge=n(7551);const ze=(0,a.X$)((0,s.c$)(void 0,((e,t)=>(0,b.ei)(t,["toggleSafeLinkModal"])))((({url:e,toggleSafeLinkModal:t})=>{const n=(0,u.Z)(),s=(0,a.I4)((()=>{window.open((0,Oe.X)(e)),t({url:void 0})}),[t,e]),r=(0,a.I4)((()=>{t({url:void 0})}),[t]),o=(0,be.Z)(e);return a.ZP.createElement(Ge.Z,{isOpen:Boolean(e),onClose:r,title:n("OpenUrlTitle"),textParts:(0,Pe.Z)(n("OpenUrlAlert2",o),["links"]),confirmLabel:n("OpenUrlTitle"),confirmHandler:s})})));var Xe=n(706);const Je=["lng_weekday1","lng_weekday2","lng_weekday3","lng_weekday4","lng_weekday5","lng_weekday6","lng_weekday7"];function _e(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),i=s&&new Date(s.getFullYear(),s.getMonth(),s.getDate(),0,0,0,0);return!!(i&&r>i)||!!(o&&r{const h=(0,u.Z)(),Z=new Date,g=(0,a.Ye)((()=>e?new Date(e):new Date),[e]),v=t?new Date(t):void 0,p=(0,P.Z)(r),[E,C,f]=(0,Xe.Z)(!1),[b,I]=(0,a.eJ)(g),[y,S]=(0,a.eJ)(new Date(b.getFullYear(),b.getMonth(),1)),[w,k]=(0,a.eJ)(Ve(g.getHours())),[N,M]=(0,a.eJ)(Ve(g.getMinutes())),T=He(b.getFullYear(),b.getMonth(),b.getDate()),A=y.getFullYear(),L=y.getMonth();(0,a.d4)((()=>{!p&&r&&(I(g),S(new Date(g.getFullYear(),g.getMonth(),1)))}),[g,r,p]),(0,a.d4)((()=>{n&&!E&&b.getTime()=Z.getFullYear()&&L>=Z.getMonth()||v&&A>=v.getFullYear()&&L>=v.getMonth(),B=n&&A<=Z.getFullYear()&&L<=Z.getMonth(),{prevMonthGrid:$,currentMonthGrid:D,nextMonthGrid:x}=(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(),i=new Date(e,t,0).getDate();for(let e=1;e0)for(let e=1;e<=7-l;e++)s.push(e);return{prevMonthGrid:n,currentMonthGrid:a,nextMonthGrid:s}}(A,L)),[L,A]),U=(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(b.getTime());a.setHours(n),I(a);const s=Ve(n);k(s),e.target.value=s}),[b]),O=(0,a.I4)((e=>{const t=e.target.value.replace(/[^\d]+/g,"");if(!t.length)return M(""),void(e.target.value="");const n=Math.max(0,Math.min(Number(t),59)),a=new Date(b.getTime());a.setMinutes(n),I(a);const s=Ve(n);M(s),e.target.value=s}),[b]);return a.ZP.createElement(ke.Z,{isOpen:r,onClose:c,className:"CalendarModal"},a.ZP.createElement("div",{className:"container"},a.ZP.createElement("div",{className:"month-selector"},a.ZP.createElement(F.Z,{round:!0,size:"smaller",color:"translucent",onClick:c},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement("h4",null,h(`lng_month${L+1}`)," ",A),a.ZP.createElement(F.Z,{round:!0,size:"smaller",color:"translucent",disabled:B,onClick:B?void 0:function(){S((e=>{const t=new Date(e);return t.setMonth(t.getMonth()-1),t}))}},a.ZP.createElement("i",{className:"icon-previous"})),a.ZP.createElement(F.Z,{round:!0,size:"smaller",color:"translucent",disabled:R,onClick:R?void 0:function(){S((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"},Je.map((e=>a.ZP.createElement("div",{className:"day-button faded weekday"},a.ZP.createElement("span",null,h(e))))),$.map((e=>a.ZP.createElement("div",{className:"day-button disabled"},a.ZP.createElement("span",null,e)))),D.map((e=>a.ZP.createElement("div",{role:"button",tabIndex:0,onClick:()=>{return t=e,void I((e=>{const n=new Date(e);return n.setDate(t),n.setMonth(L),n.setFullYear(A),n}));var t},className:(0,X.Z)("day-button",_e(A,L,e,n?Z:void 0,s?Z:v)?"disabled":e?"clickable":"",T===He(A,L,e)&&"selected")},!!e&&a.ZP.createElement("span",null,e)))),x.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:w,onChange:U,onFocus:C,onBlur:f}),":",a.ZP.createElement("input",{type:"text",className:"form-control",inputMode:"decimal",value:N,onChange:O,onFocus:C,onBlur:f})),a.ZP.createElement("div",{className:"footer"},a.ZP.createElement(F.Z,{onClick:function(){d(b)}},o?function(e,t){const n=(0,K.xH)(t,e.code);return n===(0,K.xH)(new Date,e.code)?e("Conversation.ScheduleMessage.SendToday",(0,K.mr)(t,e)):e("Conversation.ScheduleMessage.SendOn",[n,(0,K.mr)(t,e)])}(h,b):i),l&&a.ZP.createElement(F.Z,{onClick:m,isText:!0},l)))})),je=(0,a.X$)((0,s.c$)((e=>({selectedAt:e.historyCalendarSelectedAt})),((e,t)=>(0,b.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,u.Z)();return a.ZP.createElement(Ye,{isOpen:e,selectedAt:t,isPastMode:!0,submitButtonLabel:o("JumpToDate"),onClose:s,onSubmit:r})}))),Ke=(0,a.X$)((0,s.c$)(((e,{message:t,isSchedule:n})=>{const{threadId:a}=(0,v.Bt)(e)||{},{canDeleteForAll:s}=a&&(0,v._k)(e,t,a)||{},r=(0,v.Z1)(e,t.chatId);return{canDeleteForAll:!n&&s,contactName:r&&(0,g.YC)(r.id)?(0,g.Vl)((0,v.dy)(e,(0,g.zX)(r))):void 0,willDeleteForCurrentUserOnly:r&&(0,g.G9)(r)&&!s,willDeleteForAll:r&&(0,g.ZV)(r)}}),((e,t)=>(0,b.ei)(t,["deleteMessages","deleteScheduledMessages"])))((({isOpen:e,isSchedule:t,message:n,album:s,canDeleteForAll:r,contactName:o,willDeleteForCurrentUserOnly:i,willDeleteForAll:l,onClose:c,deleteMessages:d,deleteScheduledMessages:m})=>{const h=(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]),Z=(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]),P=(0,u.Z)();return a.ZP.createElement(ke.Z,{isOpen:e,onClose:c,onEnter:e&&!r?Z:void 0,className:"delete",title:P("DeleteSingleMessagesTitle")},a.ZP.createElement("p",null,P("AreYouSureDeleteSingleMessage")),i&&a.ZP.createElement("p",null,P("lng_delete_for_me_chat_hint",1,"i")),l&&a.ZP.createElement("p",null,P("lng_delete_for_everyone_hint",1,"i")),r&&a.ZP.createElement(F.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:h},o&&(0,Pe.Z)(P("Conversation.DeleteMessagesFor",o)),!o&&P("Conversation.DeleteMessagesForEveryone")),a.ZP.createElement(F.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:Z},P(r?"ChatList.DeleteForCurrentUser":"Delete")),a.ZP.createElement(F.Z,{className:"confirm-dialog-button",isText:!0,onClick:c},P("Cancel")))}))),qe=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,g.YC)(t),a=(0,v.FM)(e,t),s=(0,v.Z1)(e,t),r=!!s&&(0,g.eA)(s),o=!!s&&(0,g.G9)(s),i=!!s&&(0,g.ZV)(s);return{isPrivateChat:n,isChatWithSelf:a,isChannel:r,isGroup:o,isSuperGroup:i,canPinForAll:n&&!a||i||o,contactName:s&&(0,g.YC)(s.id)?(0,g.Vl)((0,v.dy)(e,(0,g.zX)(s))):void 0}}),((e,t)=>(0,b.ei)(t,["pinMessage"])))((({isOpen:e,messageId:t,chatId:n,isChannel:s,isGroup:r,isSuperGroup:o,canPinForAll:i,contactName:l,onClose:c,pinMessage:d})=>{const m=(0,a.I4)((()=>{d({chatId:n,messageId:t,isUnpin:!1}),c()}),[d,n,t,c]),h=(0,a.I4)((()=>{d({chatId:n,messageId:t,isUnpin:!1,isOneSide:!0,isSilent:!0}),c()}),[n,t,c,d]),Z=(0,u.Z)();return a.ZP.createElement(ke.Z,{isOpen:e,onClose:c,className:"pin",title:Z("PinMessageAlertTitle")},a.ZP.createElement("p",null,Z(s?"PinMessageAlertChannel":r||o?"PinMessageAlert":"PinMessageAlertChat")),a.ZP.createElement(F.Z,{className:"confirm-dialog-button",isText:!0,onClick:h},Z("DialogPin")),i&&a.ZP.createElement(F.Z,{className:"confirm-dialog-button",isText:!0,onClick:m},l?(0,Pe.Z)(Z("Conversation.PinMessagesFor",l)):Z("Conversation.PinMessageAlert.PinAndNotifyMembers")),a.ZP.createElement(F.Z,{className:"confirm-dialog-button",isText:!0,onClick:c},Z("Cancel")))}))),We=(0,a.X$)((({isOpen:e,pinnedMessagesCount:t=0,onClose:n,onUnpin:s})=>{const r=(0,u.Z)();return a.ZP.createElement(ke.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(F.Z,{className:"confirm-dialog-button",isText:!0,onClick:s},r("DialogUnpin")),a.ZP.createElement(F.Z,{className:"confirm-dialog-button",isText:!0,onClick:n},r("Cancel")))}));var Qe=n(517);const et=(0,a.X$)((0,s.c$)(((e,{isSchedule:t})=>{const{messageIds:n}=e.selectedMessages||{},{canDeleteForAll:a}=(0,v.xl)(e),s=(0,v.jr)(e);return{selectedMessageIds:n,canDeleteForAll:!t&&a,contactName:s&&(0,g.YC)(s.id)?(0,g.Vl)((0,v.dy)(e,(0,g.zX)(s))):void 0,willDeleteForCurrentUserOnly:s&&(0,g.G9)(s)&&!a,willDeleteForAll:s&&(0,g.ZV)(s)}}),((e,t)=>(0,b.ei)(t,["deleteMessages","deleteScheduledMessages","exitMessageSelectMode"])))((({isOpen:e,isSchedule:t,selectedMessageIds:n,canDeleteForAll:s,contactName:r,willDeleteForCurrentUserOnly:o,willDeleteForAll:i,onClose:l,deleteMessages:c,deleteScheduledMessages:d,exitMessageSelectMode:m})=>{const h=(0,P.Z)(e),Z=(0,a.I4)((()=>{l(),c({messageIds:n,shouldDeleteForAll:!0})}),[c,n,l]),g=(0,a.I4)((()=>{t?d({messageIds:n}):c({messageIds:n,shouldDeleteForAll:!1}),l()}),[t,l,d,n,c]),v=(0,u.Z)();if((0,a.d4)((()=>{!e&&h&&m()}),[m,e,h]),n)return a.ZP.createElement(ke.Z,{isOpen:e,onClose:l,onEnter:s?void 0:g,className:"delete",title:v("Conversation.DeleteManyMessages")},a.ZP.createElement("p",null,v("AreYouSureDeleteFewMessages")),o&&a.ZP.createElement("p",null,"This will delete them just for you, not for other participants in the chat."),i&&a.ZP.createElement("p",null,"This will delete them for everyone in this chat."),s&&a.ZP.createElement(F.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:Z},r?(0,Pe.Z)(v("ChatList.DeleteForEveryone",r)):v("Conversation.DeleteMessagesForEveryone")),a.ZP.createElement(F.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:g},v(s?"ChatList.DeleteForCurrentUser":"Delete")),a.ZP.createElement(F.Z,{className:"confirm-dialog-button",isText:!0,onClick:l},v("Cancel")))})));var tt=n(4434);const nt=(0,a.X$)((0,s.c$)(void 0,((e,t)=>(0,b.ei)(t,["reportMessages","exitMessageSelectMode"])))((({isOpen:e,messageIds:t,reportMessages:n,exitMessageSelectMode:s,onClose:r})=>{const[o,i]=(0,a.eJ)("spam"),[l,c]=(0,a.eJ)(""),d=()=>{n({messageIds:t,reason:o,description:l}),s(),r()},m=(0,a.I4)((e=>{i(e)}),[]),h=(0,a.I4)((e=>{c(e.target.value)}),[]),Z=(0,u.Z)(),P=[{value:"spam",label:Z("lng_report_reason_spam")},{value:"violence",label:Z("lng_report_reason_violence")},{value:"pornography",label:Z("lng_report_reason_pornography")},{value:"childAbuse",label:Z("lng_report_reason_child_abuse")},{value:"copyright",label:Z("ReportPeer.ReasonCopyright")},{value:"other",label:Z("lng_report_reason_other")}];if(t)return a.ZP.createElement(ke.Z,{isOpen:e,onClose:r,onEnter:e?d:void 0,className:"report",title:Z("lng_report_message_title")},a.ZP.createElement(tt.Z,{name:"report-message",options:P,onChange:m,selected:o}),a.ZP.createElement(Ne.Z,{label:Z("lng_report_reason_description"),value:l,onChange:h}),a.ZP.createElement(F.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:d},Z("lng_report_button")),a.ZP.createElement(F.Z,{className:"confirm-dialog-button",isText:!0,onClick:r},Z("Cancel")))}))),at=(0,a.X$)((0,s.c$)((e=>{const{type:t}=(0,v.Bt)(e)||{},{canDelete:n}=(0,v.xl)(e),a=(0,v.nB)(e),s=(0,v.Nu)(e),{messageIds:r}=e.selectedMessages||{};return{isSchedule:"scheduled"===t,selectedMessagesCount:(0,v.D7)(e),canDeleteMessages:n,canReportMessages:a,canDownloadMessages:s,selectedMessageIds:r}}),((e,t)=>(0,b.ei)(t,["exitMessageSelectMode","openForwardMenuForSelectedMessages","downloadSelectedMessages"])))((({canPost:e,isActive:t,messageListType:n,isSchedule:s,selectedMessagesCount:r,canDeleteMessages:o,canReportMessages:i,canDownloadMessages:l,selectedMessageIds:c,exitMessageSelectMode:d,openForwardMenuForSelectedMessages:m,downloadSelectedMessages:h})=>{const[Z,g,v]=(0,Xe.Z)(),[p,E,C]=(0,Xe.Z)();(0,a.d4)((()=>!t||Z||p?void 0:(0,Qe.Z)({onBackspace:g,onDelete:g,onEsc:d})),[t,Z,p,g,d]);const f=(0,a.I4)((()=>{h(),d()}),[h,d]),b=(0,P.Z)(r||void 0,!0),I=t?r:b,y=(0,u.Z)(),S=y("VoiceOver.Chat.MessagesSelected",I,"i"),w=(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:w},a.ZP.createElement("div",{className:"MessageSelectToolbar-inner"},a.ZP.createElement(F.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:S},S),!!r&&a.ZP.createElement("div",{className:"MessageSelectToolbar-actions"},"scheduled"!==n&&k("forward",y("Chat.ForwardActionHeader"),m),i&&k("flag",y("Conversation.ReportMessages"),E),l&&k("download",y("lng_media_download"),f),k("delete",y("EditAdminGroupDeleteMessages"),g,!o,!0))),a.ZP.createElement(et,{isOpen:Z,isSchedule:s,onClose:v}),a.ZP.createElement(nt,{isOpen:p,onClose:C,messageIds:c}))}))),st=(0,a.X$)((0,s.c$)((e=>{var t;const{chatId:n,messageId:a}=e.seenByModal||{};return n&&a?{memberIds:null===(t=(0,v.hj)(e,n,a))||void 0===t?void 0:t.seenByUserIds}:{}}),((e,t)=>(0,b.ei)(t,["openChat","closeSeenByModal"])))((({isOpen:e,memberIds:t,openChat:n,closeSeenByModal:s})=>{const r=(0,u.Z)(),o=(0,a.I4)((e=>{s(),setTimeout((()=>{n({id:e})}),100)}),[s,n]),i=(0,be.Z)(t,!0);return a.ZP.createElement(ke.Z,{isOpen:e,onClose:s,className:"narrow",title:"Which users read the message"},a.ZP.createElement("div",{dir:r.isRtl?"rtl":void 0},i&&i.map((e=>a.ZP.createElement(Te.Z,{key:e,className:"chat-item-clickable scroll-item small-icon",onClick:()=>o(e)},a.ZP.createElement(Ae.Z,{userId:e,noStatusOrTyping:!0}))))),a.ZP.createElement(F.Z,{className:"confirm-dialog-button",isText:!0,onClick:s},r("Close")))})));var rt=n(3133),ot=n(735),it=n(1470);const lt=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 ct=n(329),dt=n(742);const mt=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,v.Z1)(e,t),a=n&&(0,g.zX)(n);return{chat:n,user:a?(0,v.dy)(e,a):void 0,isPinned:(0,v.ep)(e,t),isMuted:n?(0,g.i4)(n,(0,v.dZ)(e),(0,v.NJ)(e)):void 0}}))((({chatId:e,chat:t,user:n,isPinned:s,isMuted:r,withUsername:o,onClick:i})=>{const[l,c,d]=(0,Xe.Z)(),[m,u,h]=(0,Xe.Z)(),Z=(0,it.Z)({chat:t,user:n,isPinned:s,isMuted:r,handleDelete:c,handleChatFolderChange:u},!0),P=()=>{i(e)},v=lt(P);if(t)return a.ZP.createElement(Te.Z,{className:"chat-item-clickable search-result",onClick:P,contextActions:Z,buttonRef:v},(0,g.YC)(e)?a.ZP.createElement(Ae.Z,{userId:e,withUsername:o,avatarSize:"large"}):a.ZP.createElement(Fe.Z,{chatId:e,withUsername:o,avatarSize:"large"}),a.ZP.createElement(ct.Z,{isOpen:l,onClose:d,chat:t}),a.ZP.createElement(dt.Z,{isOpen:m,onClose:h,chatId:e}))})));var ut=n(8781);const ht=(0,G.P2)((e=>e()),6e4,!0),Zt=(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,b.ei)(t,["loadTopUsers","loadContactList","openChat","addRecentlyFoundChatId","clearRecentlyFoundChats"])))((({topUserIds:e,usersById:t,recentlyFoundChatIds:n,onReset:s,loadTopUsers:r,loadContactList:o,openChat:i,addRecentlyFoundChatId:l,clearRecentlyFoundChats:c})=>{const d=(0,a.sO)(null);(0,a.d4)((()=>{ht((()=>{r(),o()}))}),[r,o]),(0,ut.Z)(d.current,!e);const m=(0,a.I4)((e=>{i({id:e,shouldReplaceHistory:!0}),s(),setTimeout((()=>{l({id:e})}),250)}),[i,l,s]),h=(0,u.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(ge.Z,{user:t[e]}),a.ZP.createElement("div",{className:"top-peer-name"},(0,Pe.Z)((0,g.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(F.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(mt,{chatId:e,onClick:m})))))})));var Pt=n(9411),gt=n(8033);const vt=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,v.Z1)(e,t);if(!n)return{};const a=(0,g.zX)(n);return{chat:n,lastSyncTime:e.lastSyncTime,...a&&{privateChatUser:(0,v.dy)(e,a)}}}),((e,t)=>(0,b.ei)(t,["focusMessage"])))((({message:e,searchQuery:t,chatId:n,chat:s,privateChatUser:r,focusMessage:o,lastSyncTime:i})=>{const l=(0,g.DH)(e),c=(0,h.Z)((0,g.Ti)(e,"micro")),d=Boolean((0,g.Y5)(e)),m=(0,a.I4)((()=>{o({chatId:n,messageId:e.id})}),[n,o,e.id]),Z=(0,u.Z)(),P=lt(m);if(s)return a.ZP.createElement(Te.Z,{className:"ChatMessage chat-item-clickable",ripple:!f.wB,onClick:m,buttonRef:P},a.ZP.createElement(ge.Z,{chat:s,user:r,isSavedMessages:null==r?void 0:r.isSelf,lastSyncTime:i}),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,Pe.Z)((0,g.U)(Z,s,r))),s.isVerified&&a.ZP.createElement(Pt.Z,null)),a.ZP.createElement("div",{className:"message-date"},a.ZP.createElement(gt.Z,{className:"date"},(0,K.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,g.b7)(t)&&a.ZP.createElement("i",{className:"icon-play"}),(0,Pe.Z)((0,g.MK)(e,t,!0),["emoji","highlight"],{highlight:s})):(0,Pe.Z)((0,g.MK)(e,t))}(Z,e,c||l,t,d)))))}))),pt=(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,K.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,K.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 Et=n(7262),Ct=n(9187);const ft=(0,G.P2)((e=>e()),500,!0),bt=(0,a.X$)((0,s.c$)((e=>{var t;const{byId:n}=e.chats,{userIds:a}=e.contactList||{};if(!a)return{chatsById:n};const{currentUserId:s,messages:r,lastSyncTime:o}=e,{fetchingStatus:i,globalResults:l,localResults:c,resultsByType:d}=e.globalSearch,{chatIds:m,userIds:u}=l||{},{chatIds:h,userIds:Z}=c||{},{byChatId:P}=r;return{currentUserId:s,localContactIds:a,localChatIds:h,localUserIds:Z,globalChatIds:m,globalUserIds:u,foundIds:null==d||null===(t=d.text)||void 0===t?void 0:t.foundIds,globalMessagesByChatId:P,chatsById:n,fetchingStatus:i,lastSyncTime:o}}),((e,t)=>(0,b.ei)(t,["openChat","addRecentlyFoundChatId","searchMessagesGlobal","setGlobalSearchChatId"])))((({searchQuery:e,searchDate:t,dateSearchQuery:n,currentUserId:r,localContactIds:i,localChatIds:l,localUserIds:c,globalChatIds:d,globalUserIds:m,foundIds:h,globalMessagesByChatId:Z,chatsById:P,fetchingStatus:v,lastSyncTime:p,onReset:E,onSearchDateSelect:C,openChat:I,addRecentlyFoundChatId:y,searchMessagesGlobal:S,setGlobalSearchChatId:w})=>{const k=(0,u.Z)(),[N,M]=(0,a.eJ)(!1),[T,F]=(0,a.eJ)(!1),A=(0,a.I4)((({direction:t})=>{p&&t===o.Uq.Backwards&&ft((()=>{S({type:"text",query:e})}))}),[p,S,e]),L=(0,a.I4)((e=>{I({id:e,shouldReplaceHistory:!0}),e!==r&&y({id:e}),f.wB||E()}),[r,I,y,E]),R=(0,a.I4)((e=>{w({id:e})}),[w]),B=(0,a.Ye)((()=>{if(!e||e.startsWith("@")&&e.length<2)return ot.D;const t=[...r?[r]:[],...i||[]],n=(0,s.Rd)().users.byId,a=(0,g.kK)(t,n,e);return[...(0,g.ih)((0,b.Tw)([...a||[],...l||[],...c||[]]),P,void 0,r?[r]:void 0)]}),[e,i,r,l,c,P]),$=(0,a.Ye)((()=>!e||e.length<4||!d||!m?ot.D:(0,g.ih)((0,b.Tw)([...d,...m]),P,!0)),[P,d,m,e]),D=(0,a.Ye)((()=>(e||t)&&h&&0!==h.length?h.map((e=>{var t;const[n,a]=e.split("_");return null==Z||null===(t=Z[n])||void 0===t?void 0:t.byId[Number(a)]})).filter(Boolean).sort(((e,t)=>t.date-e.date)):ot.D),[h,Z,e,t]),x=(0,a.I4)((()=>{M(!N)}),[N]),U=(0,a.I4)((()=>{F(!T)}),[T]),O=v&&!v.chats&&!v.messages&&!B.length&&!$.length&&!D.length;return e||t?a.ZP.createElement(Me.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(pt,{searchDate:n,onSelect:C})),O&&a.ZP.createElement(Et.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>5&&a.ZP.createElement(gt.Z,{onClick:x},k(N?"ChatList.Search.ShowLess":"ChatList.Search.ShowMore")),k("DialogList.SearchSectionDialogs")),B.map(((e,t)=>{if(N||!(t>=5))return a.ZP.createElement(mt,{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>5&&a.ZP.createElement(gt.Z,{onClick:U},k(T?"ChatList.Search.ShowLess":"ChatList.Search.ShowMore")),k("DialogList.SearchSectionGlobal")),$.map(((e,t)=>{if(T||!(t>=5))return a.ZP.createElement(mt,{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,g.MK)(k,t),s=P[t.chatId];if(n&&s)return a.ZP.createElement(vt,{chatId:t.chatId,message:t,searchQuery:e})})))):a.ZP.createElement(Zt,{onReset:E})}))),It=(0,G.P2)((e=>e()),500,!0),yt=(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:i}=(null==o?void 0:o.text)||{};return{currentUserId:n,foundIds:i,globalMessagesByChatId:a,chatsById:t,fetchingStatus:r,lastSyncTime:s}}),((e,t)=>(0,b.ei)(t,["searchMessagesGlobal"])))((({searchQuery:e,currentUserId:t,dateSearchQuery:n,foundIds:s,globalMessagesByChatId:r,chatsById:i,fetchingStatus:l,lastSyncTime:c,searchMessagesGlobal:d,onSearchDateSelect:m})=>{const h=(0,u.Z)(),Z=(0,a.I4)((({direction:n})=>{c&&n===o.Uq.Backwards&&It((()=>{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)):ot.D),[s,r]),v=l&&!l.chats&&!l.messages&&!P.length;return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(Me.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(pt,{searchDate:n,onSelect:m})),v&&a.ZP.createElement(Et.Z,{text:h("ChatList.Search.NoResults"),description:h("ChatList.Search.NoResultsDescription")}),!!P.length&&P.map((function(t){const n=(0,g.MK)(h,t),s=i[t.chatId];if(n&&s)return a.ZP.createElement(vt,{chatId:t.chatId,message:t,searchQuery:e})}))))})));function St(e){return(t,n)=>{var a;const{byId:s}=t.chats,{byId:r}=t.users,{fetchingStatus:o,resultsByType:i,chatId:l}=t.globalSearch,c="audio"!==e?e:null!=n&&n.isVoice?"voice":"audio",{byChatId:d}=t.messages,m=null==i||null===(a=i[c])||void 0===a?void 0:a.foundIds,u=t.activeDownloads.byChatId;return{theme:(0,v.Pu)(t),isLoading:void 0===m||!!o&&Boolean(o.chats||o.messages),chatsById:s,usersById:r,globalMessagesByChatId:d,foundIds:m,searchChatId:l,activeDownloads:u,lastSyncTime:t.lastSyncTime}}}var wt=n(7891),kt=n(3709);const Nt="media",Mt=(0,G.P2)((e=>e()),500,!0),Tt=(0,a.X$)((0,s.c$)(St(Nt),((e,t)=>(0,b.ei)(t,["searchMessagesGlobal","openMediaViewer"])))((({searchQuery:e,searchChatId:t,isLoading:n,globalMessagesByChatId:s,foundIds:r,lastSyncTime:l,searchMessagesGlobal:c,openMediaViewer:d})=>{const m=(0,u.Z)(),h=(0,a.I4)((({direction:n})=>{l&&n===o.Uq.Backwards&&Mt((()=>{c({type:Nt,query:e,chatId:t})}))}),[l,c,e,t]),Z=(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):ot.D),[s,r]),P=(0,a.I4)(((e,t)=>{d({chatId:t,messageId:e,origin:o.bZ.SearchResult})}),[d]),g=(0,wt.Z)([e],i.Y)&&!n,v=g&&r&&r.length>0&&!e,p=g&&r&&r.length>0&&e,E=(0,X.Z)("search-content custom-scroll",p&&"chat-list");return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(Me.Z,{className:E,items:Z,itemSelector:e?".ListItem":".Media",onLoadMore:h,noFastList:!0},!g&&a.ZP.createElement(we.Z,null),g&&(!r||0===r.length)&&a.ZP.createElement(Et.Z,{text:m("ChatList.Search.NoResults"),description:m("ChatList.Search.NoResultsDescription")}),v&&a.ZP.createElement("div",{className:"media-list",dir:m.isRtl?"rtl":void 0},Z.map((e=>a.ZP.createElement(kt.Z,{key:e.id,idPrefix:"search-media",message:e,onClick:P})))),p&&Z.map((e=>a.ZP.createElement(vt,{key:e.id,chatId:e.chatId,message:e})))))})));var Ft=n(91),At=n(5418);const Lt="links",Rt=(0,G.P2)((e=>e()),500,!0),Bt=(0,a.X$)((0,s.c$)(St(Lt),((e,t)=>(0,b.ei)(t,["searchMessagesGlobal","focusMessage"])))((({searchQuery:e,searchChatId:t,isLoading:n,chatsById:s,usersById:r,globalMessagesByChatId:l,foundIds:c,lastSyncTime:d,searchMessagesGlobal:m,focusMessage:h})=>{const Z=(0,u.Z)(),P=(0,a.I4)((({direction:n})=>{d&&n===o.Uq.Backwards&&Rt((()=>{m({type:Lt,query:e,chatId:t})}))}),[d,m,e,t]),g=(0,a.Ye)((()=>c&&l?c.map((e=>{var t;const[n,a]=e.split("_");return null===(t=l[n])||void 0===t?void 0:t.byId[Number(a)]})).filter(Boolean):ot.D),[l,c]),v=(0,a.I4)(((e,t)=>{h({chatId:t,messageId:e})}),[h]),p=(0,wt.Z)([e],i.Y)&&!n;return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(Me.Z,{className:"search-content documents-list custom-scroll",items:g,onLoadMore:P,noFastList:!0},!p&&a.ZP.createElement(we.Z,null),p&&(!c||0===c.length)&&a.ZP.createElement(Et.Z,{text:Z("ChatList.Search.NoResults"),description:Z("ChatList.Search.NoResultsDescription")}),p&&c&&c.length>0&&g.map(((e,t)=>{const n=0===t||(0,K.kj)(e.date)!==(0,K.kj)(g[t-1].date);return a.ZP.createElement("div",{className:"ListItem small-icon",dir:Z.isRtl?"rtl":void 0,key:e.id},n&&a.ZP.createElement("p",{className:"section-heading",dir:Z.isRtl?"rtl":void 0},(0,K.np)(Z,new Date(1e3*e.date))),a.ZP.createElement(At.Z,{key:e.id,message:e,senderTitle:(0,Ft.F)(Z,e,s,r),onMessageClick:v}))}))))})));var $t=n(2535);const Dt="documents",xt=(0,G.P2)((e=>e()),500,!0),Ut=(0,a.X$)((0,s.c$)(St(Dt),((e,t)=>(0,b.ei)(t,["searchMessagesGlobal","focusMessage"])))((({searchQuery:e,searchChatId:t,isLoading:n,chatsById:s,usersById:r,globalMessagesByChatId:l,foundIds:c,activeDownloads:d,lastSyncTime:m,searchMessagesGlobal:h,focusMessage:Z})=>{const P=(0,u.Z)(),v=(0,a.I4)((({direction:n})=>{m&&n===o.Uq.Backwards&&xt((()=>{h({type:Dt,query:e,chatId:t})}))}),[m,h,e,t]),p=(0,a.Ye)((()=>c&&l?c.map((e=>{var t;const[n,a]=e.split("_"),s=null===(t=l[n])||void 0===t?void 0:t.byId[Number(a)];return s&&(0,g.aE)(s)?s:void 0})).filter(Boolean):ot.D),[l,c]),E=(0,a.I4)(((e,t)=>{Z({chatId:t,messageId:e})}),[Z]),C=(0,wt.Z)([e],i.Y)&&!n;return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(Me.Z,{className:"search-content documents-list custom-scroll",items:p,onLoadMore:v,noFastList:!0},!C&&a.ZP.createElement(we.Z,null),C&&(!c||0===c.length)&&a.ZP.createElement(Et.Z,{text:P("ChatList.Search.NoResults"),description:P("ChatList.Search.NoResultsDescription")}),C&&c&&c.length>0&&p.map(((e,t)=>{var n;const o=0===t||(0,K.kj)(e.date)!==(0,K.kj)(p[t-1].date);return a.ZP.createElement("div",{className:"ListItem small-icon",key:e.id},o&&a.ZP.createElement("p",{className:"section-heading"},(0,K.np)(P,new Date(1e3*e.date))),a.ZP.createElement($t.Z,{message:e,withDate:!0,datetime:e.date,smaller:!0,sender:(0,Ft.F)(P,e,s,r),className:"scroll-item",onDateClick:E,isDownloading:null===(n=d[e.chatId])||void 0===n?void 0:n.includes(e.id)}))}))))})));var Ot=n(4752);const Gt=(0,G.P2)((e=>e()),500,!0),zt=(0,a.X$)((0,s.c$)(St("audio"),((e,t)=>(0,b.ei)(t,["searchMessagesGlobal","focusMessage","openAudioPlayer"])))((({theme:e,isVoice:t,searchQuery:n,searchChatId:s,isLoading:r,chatsById:l,usersById:c,globalMessagesByChatId:d,foundIds:m,lastSyncTime:h,activeDownloads:Z,searchMessagesGlobal:P,focusMessage:g,openAudioPlayer:v})=>{const p=(0,u.Z)(),E=t?"voice":"audio",C=(0,a.I4)((({direction:e})=>{h&&e===o.Uq.Backwards&&Gt((()=>{P({type:E,query:n,chatId:s})}))}),[E,h,P,n,s]),f=(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):ot.D),[d,m]),b=(0,a.I4)(((e,t)=>{g({chatId:t,messageId:e})}),[g]),I=(0,a.I4)(((e,t)=>{v({chatId:t,messageId:e})}),[v]),y=(0,wt.Z)([n],i.Y)&&!r;return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(Me.Z,{className:"search-content documents-list custom-scroll",items:f,onLoadMore:C,noFastList:!0},!y&&a.ZP.createElement(we.Z,null),y&&(!m||0===m.length)&&a.ZP.createElement(Et.Z,{text:p("ChatList.Search.NoResults"),description:p("ChatList.Search.NoResultsDescription")}),y&&m&&m.length>0&&f.map(((t,n)=>{var s;const r=0===n||(0,K.kj)(t.date)!==(0,K.kj)(f[n-1].date);return a.ZP.createElement("div",{className:"ListItem small-icon",key:t.id},r&&a.ZP.createElement("p",{className:"section-heading",dir:p.isRtl?"rtl":void 0},(0,K.np)(p,new Date(1e3*t.date))),a.ZP.createElement(Ot.Z,{key:t.id,theme:e,message:t,origin:o.Cr.Search,senderTitle:(0,Ft.F)(p,t,l,c),date:t.date,lastSyncTime:h,className:"scroll-item",onPlay:I,onDateClick:b,isDownloading:null===(s=Z[t.chatId])||void 0===s?void 0:s.includes(t.id)}))}))))}))),Xt=[{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"}],Jt=[{type:o.nJ.ChatList,title:"All Messages"},...Xt.slice(1)],_t=Object.keys(o.nJ).length/2,Vt=(0,a.X$)((0,s.c$)((e=>{const{currentContent:t,chatId:n}=e.globalSearch;return{currentContent:t,chatId:n}}),((e,t)=>(0,b.ei)(t,["setGlobalSearchContent","setGlobalSearchDate"])))((({searchQuery:e,searchDate:t,isActive:n,currentContent:s=o.nJ.ChatList,chatId:r,setGlobalSearchContent:i,setGlobalSearchDate:l,onReset:c})=>{const d=(0,u.Z)(),[h,Z]=(0,a.eJ)(s),P=(0,a.Ye)((()=>(0,K.xk)(e)),[e]),g=(0,a.I4)((e=>{const t=Xt[e];i({content:t.type}),Z(e)}),[i]),v=(0,a.I4)((e=>{l({date:e.getTime()/1e3})}),[l]);(0,m.ZP)(n,c,void 0,void 0,!0);const p=(0,a.sO)(null),E=(0,ye.Z)(p,n,void 0,".ListItem-button",!0);return a.ZP.createElement("div",{className:"LeftSearch",ref:p,onKeyDown:E},a.ZP.createElement(rt.Z,{activeTab:h,tabs:r?Jt:Xt,onSwitchTab:g}),a.ZP.createElement(L.Z,{name:d.isRtl?"slide-optimized-rtl":"slide-optimized",renderCount:_t,activeKey:s},(()=>{switch(s){case o.nJ.ChatList:return r?a.ZP.createElement(yt,{searchQuery:e,dateSearchQuery:P,onReset:c,onSearchDateSelect:v}):a.ZP.createElement(bt,{searchQuery:e,searchDate:t,dateSearchQuery:P,onReset:c,onSearchDateSelect:v});case o.nJ.Media:return a.ZP.createElement(Tt,{searchQuery:e});case o.nJ.Links:return a.ZP.createElement(Bt,{searchQuery:e});case o.nJ.Files:return a.ZP.createElement(Ut,{searchQuery:e});case o.nJ.Music:return a.ZP.createElement(zt,{key:"audio",searchQuery:e});case o.nJ.Voice:return a.ZP.createElement(zt,{key:"voice",isVoice:!0,searchQuery:e});default:return}})))})));var Ht=n(1090);const Yt={currentPassword:"",password:"",hint:"",email:""},jt=(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 Yt;default:return e}},Kt=(0,a.X$)((0,s.c$)(void 0,((e,t)=>(0,b.ei)(t,["signOut","deleteChatFolder"])))((({currentScreen:e,editedFolderId:t,onReset:n,onSaveFilter:s,signOut:r,deleteChatFolder:i,onScreenSelect:l})=>{const[c,d]=(0,a.eJ)(!1),[m,h]=(0,a.eJ)(!1),Z=(0,a.I4)((()=>{d(!0)}),[]),P=(0,a.I4)((()=>{d(!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(),i({id:t}),n()}),[t,v,i,n]),C=(0,a.Ye)((()=>({onTrigger:e,isOpen:t})=>a.ZP.createElement(F.Z,{round:!0,ripple:!f.wB,size:"smaller",color:"translucent",className:t?"active":"",onClick:e,ariaLabel:"More actions"},a.ZP.createElement("i",{className:"icon-more"}))),[]),b=(0,u.Z)();return a.ZP.createElement("div",{className:"left-header"},a.ZP.createElement(F.Z,{round:!0,size:"smaller",color:"translucent",onClick:n,ariaLabel:b("AccDescrGoBack")},a.ZP.createElement("i",{className:"icon-arrow-left"})),function(){switch(e){case o.MT.EditProfile:return a.ZP.createElement("h3",null,b("lng_settings_information"));case o.MT.General:return a.ZP.createElement("h3",null,b("General"));case o.MT.Notifications:return a.ZP.createElement("h3",null,b("Notifications"));case o.MT.DataStorage:return a.ZP.createElement("h3",null,b("DataSettings"));case o.MT.Privacy:return a.ZP.createElement("h3",null,b("PrivacySettings"));case o.MT.Language:return a.ZP.createElement("h3",null,b("Language"));case o.MT.GeneralChatBackground:return a.ZP.createElement("h3",null,b("ChatBackground"));case o.MT.GeneralChatBackgroundColor:return a.ZP.createElement("h3",null,b("SetColor"));case o.MT.PrivacyPhoneNumber:return a.ZP.createElement("h3",null,b("PrivacyPhone"));case o.MT.PrivacyLastSeen:return a.ZP.createElement("h3",null,b("PrivacyLastSeen"));case o.MT.PrivacyProfilePhoto:return a.ZP.createElement("h3",null,b("Privacy.ProfilePhoto"));case o.MT.PrivacyForwarding:return a.ZP.createElement("h3",null,b("PrivacyForwards"));case o.MT.PrivacyGroupChats:return a.ZP.createElement("h3",null,b("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,b("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,b("NeverShareWith"));case o.MT.PrivacyActiveSessions:return a.ZP.createElement("h3",null,b("SessionsTitle"));case o.MT.PrivacyBlockedUsers:return a.ZP.createElement("h3",null,b("BlockedUsers"));case o.MT.TwoFaDisabled:case o.MT.TwoFaEnabled:return a.ZP.createElement("h3",null,b("TwoStepVerification"));case o.MT.TwoFaNewPassword:case o.MT.TwoFaChangePasswordNew:case o.MT.TwoFaChangePasswordConfirm:return a.ZP.createElement("h3",null,b("PleaseEnterCurrentPassword"));case o.MT.TwoFaNewPasswordConfirm:return a.ZP.createElement("h3",null,b("PleaseReEnterPassword"));case o.MT.TwoFaNewPasswordHint:case o.MT.TwoFaChangePasswordHint:return a.ZP.createElement("h3",null,b("PasswordHint"));case o.MT.TwoFaNewPasswordEmail:case o.MT.TwoFaRecoveryEmail:return a.ZP.createElement("h3",null,b("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,b("TwoStepVerificationPasswordSet"));case o.MT.TwoFaChangePasswordCurrent:case o.MT.TwoFaTurnOff:case o.MT.TwoFaRecoveryEmailCurrentPassword:return a.ZP.createElement("h3",null,b("PleaseEnterCurrentPassword"));case o.MT.Folders:return a.ZP.createElement("h3",null,b("Filters"));case o.MT.FoldersCreateFolder:return a.ZP.createElement("h3",null,b("FilterNew"));case o.MT.FoldersEditFolder:case o.MT.FoldersEditFolderFromChatList:return a.ZP.createElement("div",{className:"settings-main-header"},a.ZP.createElement("h3",null,b("FilterEdit")),t&&a.ZP.createElement(R.Z,{className:"settings-more-menu",trigger:C,positionX:"right"},a.ZP.createElement(B.Z,{icon:"delete",destructive:!0,onClick:g},b("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,b("FilterInclude")):a.ZP.createElement("h3",null,b("FilterExclude")),a.ZP.createElement(F.Z,{round:!0,size:"smaller",color:"translucent",className:"color-primary",onClick:s,ariaLabel:b("AutoDeleteConfirm")},a.ZP.createElement("i",{className:"icon-check"})));default:return a.ZP.createElement("div",{className:"settings-main-header"},a.ZP.createElement("h3",null,b("SETTINGS")),a.ZP.createElement(F.Z,{round:!0,ripple:!f.wB,size:"smaller",color:"translucent",onClick:()=>l(o.MT.EditProfile),ariaLabel:b("lng_settings_information")},a.ZP.createElement("i",{className:"icon-edit"})),a.ZP.createElement(R.Z,{className:"settings-more-menu",trigger:C,positionX:"right"},a.ZP.createElement(B.Z,{icon:"logout",onClick:Z},b("LogOutTitle"))))}}(),a.ZP.createElement(Ge.Z,{isOpen:c,onClose:P,text:b("lng_sure_logout"),confirmLabel:b("AccountSettings.Logout"),confirmHandler:p,confirmIsDestructive:!0}),a.ZP.createElement(Ge.Z,{isOpen:m,onClose:v,text:b("FilterDeleteAlert"),confirmLabel:b("Delete"),confirmHandler:E,confirmIsDestructive:!0}))})));var qt=n(787),Wt=n(180);const Qt=(0,a.X$)((0,s.c$)((e=>{const{currentUserId:t,lastSyncTime:n}=e;return{currentUser:t?(0,v.dy)(e,t):void 0,lastSyncTime:n}}),((e,t)=>(0,b.ei)(t,["loadProfilePhotos"])))((({isActive:e,onScreenSelect:t,onReset:n,loadProfilePhotos:s,currentUser:r,lastSyncTime:i})=>{const l=(0,u.Z)(),c=null==r?void 0:r.id;return(0,a.d4)((()=>{c&&i&&s({profileId:c})}),[i,c,s]),(0,m.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(qt.Z,{userId:r.id,forceShowSelf:!0}),r&&a.ZP.createElement(Wt.Z,{chatOrUserId:r.id,forceShowSelf:!0}),a.ZP.createElement(Te.Z,{icon:"settings",onClick:()=>t(o.MT.General)},l("Telegram.GeneralSettingsViewController")),a.ZP.createElement(Te.Z,{icon:"unmute",onClick:()=>t(o.MT.Notifications)},l("Notifications")),a.ZP.createElement(Te.Z,{icon:"lock",onClick:()=>t(o.MT.Privacy)},l("PrivacySettings")),a.ZP.createElement(Te.Z,{icon:"data",onClick:()=>t(o.MT.DataStorage)},l("DataSettings")),a.ZP.createElement(Te.Z,{icon:"folder",onClick:()=>t(o.MT.Folders)},l("Filters")),a.ZP.createElement(Te.Z,{icon:"language",onClick:()=>t(o.MT.Language)},l("Language"))))})));var en=n(710),tn=n(1151);const nn="https://t.me/",an=/https:\/\/t\.me\/?/i,sn=/^([a-zA-Z0-9_]+)$/,rn=(0,G.Ds)((e=>e()),250,!1),on=(0,a.X$)((({currentUsername:e,asLink:t,isLoading:n,isUsernameAvailable:s,checkUsername:r,onChange:o})=>{const[i,l]=(0,a.eJ)(e||""),c=(0,u.Z)(),d=t?"SetUrl":"Username",m=c(t?"SetUrlPlaceholder":"Username"),[h,Z]=(0,a.Ye)((()=>i.length?i.length<5?[void 0,`${m} is too short`]:i.length>32?[void 0,`${m} is too long`]:sn.test(i)?void 0===s?[]:[s?c(`${d}Available`,"Username"):void 0,!1===s?c(`${d}InUse`):void 0]:[void 0,`${m} contains invalid characters`]:[]),[i,s,c,d,m]);(0,a.d4)((()=>{l(e||"")}),[t,e]);const P=(0,a.I4)((e=>{const n=e.target.value.trim().replace(an,"");l(n),e.target.value=`${t?nn:""}${n}`;const a=function(e){return e.length>=5&&e.length<=32&&sn.test(e)}(n);a&&rn((()=>{r({username:n})})),o&&o(!!a&&n)}),[t,r,o]);return a.ZP.createElement(Ne.Z,{value:`${t?nn:""}${i}`,onChange:P,label:m,error:Z,success:h,readOnly:n})})),ln=(0,G.P2)((e=>e()),6e4,!0),cn="Please provide your first name",dn="Bio can' be longer than 70 characters",mn=(0,a.X$)((0,s.c$)((e=>{const{currentUserId:t}=e,{progress:n,isUsernameAvailable:a}=e.profileEdit||{},s=t?(0,v.dy)(e,t):void 0;if(!s)return{progress:n,isUsernameAvailable:a};const{firstName:r,lastName:o,username:i,fullInfo:l}=s,{bio:c}=l||{};return{currentAvatarHash:(0,g.RT)(s),currentFirstName:r,currentLastName:o,currentBio:c,currentUsername:i,progress:n,isUsernameAvailable:a}}),((e,t)=>(0,b.ei)(t,["loadCurrentUser","updateProfile","checkUsername"])))((({isActive:e,onScreenSelect:t,onReset:n,currentAvatarHash:s,currentFirstName:i,currentLastName:l,currentBio:c,currentUsername:d,progress:Z,isUsernameAvailable:P,loadCurrentUser:g,updateProfile:v,checkUsername:p})=>{const E=(0,u.Z)(),[C,f]=(0,a.eJ)(!1),[b,I]=(0,a.eJ)(!1),[y,S]=(0,a.eJ)(),[w,k]=(0,a.eJ)(),[N,M]=(0,a.eJ)(i||""),[T,F]=(0,a.eJ)(l||""),[A,L]=(0,a.eJ)(c||""),[R,B]=(0,a.eJ)(d||""),$=(0,h.Z)(s,!1,r.IU.BlobUrl),D=Z===o.rN.InProgress,x=!1===R,U=(0,a.Ye)((()=>!x&&(Boolean(w)||b||!0===P)),[w,b,x,P]);(0,m.ZP)(e,n,t,o.MT.EditProfile),(0,a.d4)((()=>{ln((()=>{g()}))}),[g]),(0,a.d4)((()=>{k(void 0)}),[$]),(0,a.d4)((()=>{M(i||""),F(l||""),L(c||"")}),[i,l,c]),(0,a.d4)((()=>{B(d||"")}),[d]),(0,a.d4)((()=>{Z===o.rN.Complete&&(I(!1),f(!1),S(void 0))}),[Z]);const O=(0,a.I4)((e=>{k(e)}),[]),G=(0,a.I4)((e=>{M(e.target.value),I(!0)}),[]),X=(0,a.I4)((e=>{F(e.target.value),I(!0)}),[]),J=(0,a.I4)((e=>{L(e.target.value),I(!0)}),[]),_=(0,a.I4)((e=>{B(e),f(!0)}),[]),V=(0,a.I4)((()=>{const e=N.trim(),t=T.trim(),n=A.trim();e.length?n.length>70?S(dn):v({photo:w,...b&&{firstName:e,lastName:t,bio:n},...C&&{username:R}}):S(cn)}),[w,N,T,A,b,R,C,v]);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(en.Z,{currentAvatarBlobUrl:$,onChange:O,title:"Edit your profile photo",disabled:D}),a.ZP.createElement(Ne.Z,{value:N,onChange:G,label:E("FirstName"),disabled:D,error:y===cn?y:void 0}),a.ZP.createElement(Ne.Z,{value:T,onChange:X,label:E("LastName"),disabled:D}),a.ZP.createElement(Ne.Z,{value:A,onChange:J,label:E("UserBio"),disabled:D,error:y===dn?y:void 0}),a.ZP.createElement("p",{className:"settings-item-description",dir:E.isRtl?"rtl":void 0},(0,Pe.Z)(E("lng_settings_about_bio"),["br","simple_markdown"]))),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:E.isRtl?"rtl":void 0},E("Username")),a.ZP.createElement(on,{currentUsername:R||"",isLoading:D,isUsernameAvailable:P,checkUsername:p,onChange:_}),a.ZP.createElement("p",{className:"settings-item-description",dir:E.isRtl?"rtl":void 0},(0,Pe.Z)(E("UsernameHelp"),["br","simple_markdown"])),R&&a.ZP.createElement("p",{className:"settings-item-description",dir:E.isRtl?"rtl":void 0},E("lng_username_link"),a.ZP.createElement("br",null),a.ZP.createElement("span",{className:"username-link"},"https://t.me/",R)))),a.ZP.createElement(tn.Z,{isShown:U,onClick:V,disabled:D,ariaLabel:"Save changes"},D?a.ZP.createElement(z.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})))})));var un=n(4605),hn=n(8051);const Zn=(0,a.X$)((0,s.c$)((e=>(0,b.ei)(e.settings.byKey,["canAutoLoadPhotoFromContacts","canAutoLoadPhotoInPrivateChats","canAutoLoadPhotoInGroups","canAutoLoadPhotoInChannels","canAutoLoadVideoFromContacts","canAutoLoadVideoInPrivateChats","canAutoLoadVideoInGroups","canAutoLoadVideoInChannels","canAutoLoadFileFromContacts","canAutoLoadFileInPrivateChats","canAutoLoadFileInGroups","canAutoLoadFileInChannels","canAutoPlayGifs","canAutoPlayVideos","autoLoadFileMaxSizeMb"])),((e,t)=>(0,b.ei)(t,["setSettingOption"])))((({isActive:e,onScreenSelect:t,onReset:n,canAutoLoadPhotoFromContacts:s,canAutoLoadPhotoInPrivateChats:r,canAutoLoadPhotoInGroups:l,canAutoLoadPhotoInChannels:c,canAutoLoadVideoFromContacts:d,canAutoLoadVideoInPrivateChats:h,canAutoLoadVideoInGroups:Z,canAutoLoadVideoInChannels:P,canAutoLoadFileFromContacts:g,canAutoLoadFileInPrivateChats:v,canAutoLoadFileInGroups:p,canAutoLoadFileInChannels:E,canAutoPlayGifs:C,canAutoPlayVideos:f,autoLoadFileMaxSizeMb:b,setSettingOption:I})=>{const y=(0,u.Z)();(0,m.ZP)(e,n,t,o.MT.General);const S=(0,a.I4)((e=>y("AutodownloadSizeLimitUpTo",y("FileSize.MB",String(i.by[e]),"i"))),[y]),w=(0,a.I4)((e=>{I({autoLoadFileMaxSizeMb:i.by[e]})}),[I]);function k(e,t,n,s,r,o){return a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:y.isRtl?"rtl":void 0},e),a.ZP.createElement(un.Z,{label:y("AutoDownloadSettings.Contacts"),checked:n,onCheck:e=>I({[`canAutoLoad${t}FromContacts`]:e})}),a.ZP.createElement(un.Z,{label:y("AutoDownloadSettings.PrivateChats"),checked:s,onCheck:e=>I({[`canAutoLoad${t}InPrivateChats`]:e})}),a.ZP.createElement(un.Z,{label:y("AutoDownloadSettings.GroupChats"),checked:r,onCheck:e=>I({[`canAutoLoad${t}InGroups`]:e})}),a.ZP.createElement(un.Z,{label:y("AutoDownloadSettings.Channels"),checked:o,onCheck:e=>I({[`canAutoLoad${t}InChannels`]:e})}),"File"===t&&function(){const e=i.by.indexOf(b);return a.ZP.createElement("div",{className:"pt-5"},a.ZP.createElement(hn.Z,{label:y("AutoDownloadMaxFileSize"),min:0,max:5,value:-1!==e?e:2,renderValue:S,onChange:w}))}())}return a.ZP.createElement("div",{className:"settings-content custom-scroll"},k(y("AutoDownloadPhotosTitle"),"Photo",s,r,l,c),k(y("AutoDownloadVideosTitle"),"Video",d,h,Z,P),k("Auto-download files","File",g,v,p,E),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:y.isRtl?"rtl":void 0},y("AutoplayMedia")),a.ZP.createElement(un.Z,{label:y("GifsTab2"),checked:C,onCheck:e=>I({canAutoPlayGifs:e})}),a.ZP.createElement(un.Z,{label:y("DataAndStorage.Autoplay.Videos"),checked:f,onCheck:e=>I({canAutoPlayVideos:e})})))})));var Pn=n(7324),gn=n(7799);const vn=(0,G.P2)((e=>e()),6e4,!0),pn=(0,a.X$)((0,s.c$)((e=>{const{chats:{listIds:t,byId:n},users:{byId:a}}=e,{orderedIds:s,byId:r,recommended:o}=e.chatFolders;return{allListIds:t,chatsById:n,usersById:a,orderedFolderIds:s,foldersById:r,recommendedChatFolders:o,notifySettings:(0,v.dZ)(e),notifyExceptions:(0,v.NJ)(e)}}),((e,t)=>(0,b.ei)(t,["loadRecommendedChatFolders","addChatFolder","showDialog"])))((({isActive:e,allListIds:t,chatsById:n,usersById:s,orderedFolderIds:r,foldersById:l,recommendedChatFolders:c,notifySettings:d,notifyExceptions:h,onCreateFolder:Z,onEditFolder:P,onScreenSelect:v,onReset:p,loadRecommendedChatFolders:E,addChatFolder:C,showDialog:f})=>{const[b,I]=(0,a.eJ)(),[y,S]=(0,a.eJ)(!1),w=(0,a.I4)((()=>S(!0)),[]);(0,a.d4)((()=>{b||(0,Pn.Z)("FoldersAll").then(I)}),[b]),(0,a.d4)((()=>{vn((()=>{E()}))}),[E]);const k=(0,a.I4)((()=>{Object.keys(l).length>=10?f({data:{message:"DIALOG_FILTERS_TOO_MUCH",hasErrorKey:!0}}):Z()}),[l,f,Z]),N=(0,u.Z)();(0,m.ZP)(e,p,v,o.MT.Folders);const M=(0,a.Ye)((()=>{if(r)return r.map((e=>{const a=l[e];return{id:a.id,title:a.title,subtitle:(0,g.SB)(N,t,n,s,a,d,h)}}))}),[N,t,l,n,s,r,d,h]),T=(0,a.I4)((e=>{Object.keys(l).length>=10?f({data:{message:"DIALOG_FILTERS_TOO_MUCH",hasErrorKey:!0}}):C({folder:e})}),[l,C,f]);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"},b&&a.ZP.createElement(gn.Z,{id:"settingsFoldersMain",size:i.ku,animationData:b,play:y,noLoop:!0,onLoad:w})),a.ZP.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},N("CreateNewFilterInfo")),a.ZP.createElement(F.Z,{className:"with-icon mb-2",color:"primary",size:"smaller",pill:!0,fluid:!0,onClick:k,isRtl:N.isRtl},a.ZP.createElement("i",{className:"icon-add"}),N("CreateNewFilter"))),a.ZP.createElement("div",{className:"settings-item pt-3"},a.ZP.createElement("h4",{className:"settings-item-header mb-3",dir:N.isRtl?"rtl":void 0},N("Filters")),null!=M&&M.length?M.map((e=>a.ZP.createElement(Te.Z,{className:"mb-2 no-icon",narrow:!0,multiline:!0,onClick:()=>P(l[e.id])},a.ZP.createElement("span",{className:"title"},e.title),a.ZP.createElement("span",{className:"subtitle"},e.subtitle)))):M&&!M.length?a.ZP.createElement("p",{className:"settings-item-description my-4",dir:"auto"},"You have no folders yet."):a.ZP.createElement(we.Z,null)),c&&!!c.length&&a.ZP.createElement("div",{className:"settings-item pt-3"},a.ZP.createElement("h4",{className:"settings-item-header mb-3",dir:N.isRtl?"rtl":void 0},N("FilterRecommended")),c.map((e=>a.ZP.createElement(Te.Z,{className:"mb-2",narrow:!0,onClick:()=>T(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(F.Z,{className:"px-3",color:"primary",size:"tiny",pill:!0,fluid:!0,isRtl:N.isRtl},N("Add"))))))))})));var En=n(3455);const Cn=({count:e,itemName:t,itemPluralName:n,isLoading:s,onClick:r})=>{const o=(0,u.Z)();return a.ZP.createElement(F.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)},fn="Please provide a title for this folder.",bn="ChatList.Filter.Error.Empty",In=(0,a.X$)((0,s.c$)((e=>{const{listIds:t}=e.chats;return{loadedActiveChatIds:t.active,loadedArchivedChatIds:t.archived}}),((e,t)=>(0,b.ei)(t,["editChatFolder","addChatFolder","loadMoreChats"])))((({state:e,dispatch:t,onAddIncludedChats:n,onAddExcludedChats:s,isActive:r,onScreenSelect:l,onReset:c,onBack:d,loadedActiveChatIds:h,loadedArchivedChatIds:Z,editChatFolder:P,addChatFolder:v,loadMoreChats:p})=>{const[E,C]=(0,a.eJ)(),[f,I]=(0,a.eJ)(!1),y=(0,a.I4)((()=>I(!0)),[]),[S,w]=(0,a.eJ)(!1),[k,N]=(0,a.eJ)(!1),{selectedChatIds:M,selectedChatTypes:T}=(0,En.vb)(e,"included"),{selectedChatIds:F,selectedChatTypes:A}=(0,En.vb)(e,"excluded");(0,a.d4)((()=>{E||(0,Pn.Z)("FoldersNew").then(C)}),[E]),(0,a.d4)((()=>{w(!1),N(!1)}),[e.folderId]);const[L,R]=(0,a.Ye)((()=>{const e=new Set([...h||[],...Z||[]]),t=(0,b.eL)(M,e),n=(0,b.eL)(F,e);return[S?t:t.slice(0,5-T.length),k?n:n.slice(0,5-A.length)]}),[F,M,T,A,k,S,h,Z]);(0,a.d4)((()=>{(L.lengthw(!0):()=>N(!0);return a.ZP.createElement(a.ZP.Fragment,null,t.map((t=>function(e,t){const n="included"===t?En.fi.find((({key:t})=>t===e)):En.Yy.find((({key:t})=>t===e));if(n)return a.ZP.createElement(Te.Z,{key:n.key,className:"settings-folders-list-item mb-1",icon:n.icon,narrow:!0,inactive:!0},B(n.title))}(t,e))),n.map((e=>a.ZP.createElement(Te.Z,{className:"settings-folders-list-item mb-1",narrow:!0,inactive:!0},(0,g.YC)(e)?a.ZP.createElement(Ae.Z,{avatarSize:"small",userId:e}):a.ZP.createElement(Fe.Z,{avatarSize:"small",chatId:e})))),!s&&r>0&&a.ZP.createElement(Cn,{count:r,itemName:"chat",onClick:o}))}return(0,m.ZP)(r,d,l,"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"},E&&a.ZP.createElement(gn.Z,{id:"settingsFoldersEdit",size:i.ku,animationData:E,play:f&&String(e.folderId),noLoop:!0,onLoad:y})),"create"===e.mode&&a.ZP.createElement("p",{className:"settings-item-description mb-3",dir:B.isRtl?"rtl":void 0},B("FilterIncludeInfo")),a.ZP.createElement(Ne.Z,{className:"mb-0",label:B("FilterNameHint"),value:e.folder.title,onChange:function(e){const{currentTarget:n}=e;t({type:"setTitle",payload:n.value.trim()})},error:e.error&&e.error===fn?fn:void 0})),a.ZP.createElement("div",{className:"settings-item no-border pt-3"},e.error&&e.error===bn&&a.ZP.createElement("p",{className:"settings-item-description color-danger mb-2",dir:B.isRtl?"rtl":void 0},B(e.error)),a.ZP.createElement("h4",{className:"settings-item-header mb-3",dir:B.isRtl?"rtl":void 0},B("FilterInclude")),a.ZP.createElement(Te.Z,{className:"settings-folders-list-item color-primary mb-0",icon:"add",onClick:n},B("FilterAddChats")),$("included")),a.ZP.createElement("div",{className:"settings-item no-border pt-3"},a.ZP.createElement("h4",{className:"settings-item-header mb-3",dir:B.isRtl?"rtl":void 0},B("FilterExclude")),a.ZP.createElement(Te.Z,{className:"settings-folders-list-item color-primary mb-0",icon:"add",onClick:s},B("FilterAddChats")),$("excluded"))),a.ZP.createElement(tn.Z,{isShown:!!e.isTouched,disabled:e.isLoading,onClick:function(){const{title:n}=e.folder;n?M.length||Object.keys(T).length?(t({type:"setIsLoading",payload:!0}),"edit"===e.mode?P({id:e.folderId,folderUpdate:e.folder}):v({folder:e.folder}),setTimeout((()=>{c()}),500)):t({type:"setError",payload:bn}):t({type:"setError",payload:fn})},ariaLabel:"edit"===e.mode?"Save changes":"Create folder"},e.isLoading?a.ZP.createElement(z.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})))})));var yn=n(5765);const Sn=(0,a.X$)((({mode:e,chatIds:t,selectedIds:n,selectedChatTypes:s,filterValue:r,onSelectedIdsChange:o,onSelectedChatTypesChange:i,onFilterChange:l,onLoadMore:c})=>{const d=(0,a.sO)(null),m="included"===e?En.fi:En.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]),v=(0,a.I4)((e=>{const t=[...s];t.includes(e)?t.splice(t.indexOf(e),1):t.push(e),i(t)}),[s,i]),p=(0,a.I4)((e=>{const{value:t}=e.currentTarget;l(t)}),[l]),E=(0,u.Z)(),[C,f]=(0,Ie.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:E(t.title),isMinimized:h,canClose:!0,onClick:v,clickArg:t.key})})),n.map(((e,t)=>a.ZP.createElement(Ct.Z,{chatOrUserId:e,isMinimized:h&&tv(e.key),ripple:!0},a.ZP.createElement("i",{className:`icon-${e.icon}`}),a.ZP.createElement("h3",{className:"chat-type",dir:"auto"},E(e.title)),a.ZP.createElement(un.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:E.isRtl?"rtl":void 0},E("FilterChats"))),null!=C&&C.length?C.map((function(e){const t=n.includes(e);return a.ZP.createElement(Te.Z,{key:e,className:"chat-item-clickable picker-list-item chat-item",onClick:()=>P(e),ripple:!0,disabled:!t&&Z},(0,g.YC)(e)?a.ZP.createElement(Ae.Z,{userId:e}):a.ZP.createElement(Fe.Z,{chatId:e,withChatType:!0}),a.ZP.createElement(un.Z,{label:"",checked:t,round:!0}))})):C&&!C.length?a.ZP.createElement("p",{className:"no-results",key:"no-results"},"Sorry, nothing found."):a.ZP.createElement(we.Z,{key:"loading"})))})),wn=(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,b.ei)(t,["loadMoreChats"])))((({isActive:e,onScreenSelect:t,onReset:n,mode:s,state:r,dispatch:i,chatsById:l,listIds:c,orderedPinnedIds:d,archivedListIds:h,archivedPinnedIds:Z,loadMoreChats:P})=>{const{chatFilter:v}=r,{selectedChatIds:p,selectedChatTypes:E}=(0,En.vb)(r,s,!0),C=(0,u.Z)(),f=(0,a.Ye)((()=>{const e=c?(0,g.O)(l,c,d,"all"):void 0,t=h?(0,g.O)(l,h,Z,"archived"):void 0;if(e||t)return[...(null==e?void 0:e.pinnedChats)||[],...(null==e?void 0:e.otherChats)||[],...(null==t?void 0:t.otherChats)||[]]}),[l,c,d,h,Z]),b=(0,a.Ye)((()=>{if(f)return f.filter((e=>!v||(0,yn.Z)((0,g.U)(C,e),v)||p.includes(e.id))).map((({id:e})=>e))}),[f,v,C,p]),I=(0,a.I4)((e=>{i({type:"setChatFilter",payload:e})}),[i]),y=(0,a.I4)((e=>{i("included"===s?{type:"setIncludeFilters",payload:{...r.includeFilters,includedChatIds:e}}:{type:"setExcludeFilters",payload:{...r.excludeFilters,excludedChatIds:e}})}),[s,r,i]),S=(0,a.I4)((e=>{const t={};e.forEach((e=>{t[e]=!0})),i("included"===s?{type:"setIncludeFilters",payload:{includedChatIds:p,...t}}:{type:"setExcludeFilters",payload:{excludedChatIds:p,...t}})}),[s,p,i]);return(0,m.ZP)(e,n,t,"included"===s?o.MT.FoldersIncludedChats:o.MT.FoldersExcludedChats),b?a.ZP.createElement(Sn,{mode:s,chatIds:b,selectedIds:p,selectedChatTypes:E,filterValue:v,onSelectedIdsChange:y,onSelectedChatTypesChange:S,onFilterChange:I,onLoadMore:P}):a.ZP.createElement(we.Z,null)}))),kn=(0,a.X$)((({currentScreen:e,shownScreen:t,state:n,dispatch:s,isActive:r,onScreenSelect:i,onReset:l})=>{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?l():"create"===n.mode?i(o.MT.FoldersCreateFolder):i(o.MT.FoldersEditFolder)}),[n.mode,s,e,l,i]),d=(0,a.I4)((()=>{s({type:"reset"}),i(o.MT.FoldersCreateFolder)}),[i,s]),m=(0,a.I4)((e=>{s({type:"editFolder",payload:e}),i(o.MT.FoldersEditFolder)}),[s,i]),u=(0,a.I4)((()=>{s({type:"editIncludeFilters"}),i(e===o.MT.FoldersEditFolderFromChatList?o.MT.FoldersIncludedChatsFromChatList:o.MT.FoldersIncludedChats)}),[e,s,i]),h=(0,a.I4)((()=>{s({type:"editExcludeFilters"}),i(e===o.MT.FoldersEditFolderFromChatList?o.MT.FoldersExcludedChatsFromChatList:o.MT.FoldersExcludedChats)}),[e,s,i]);switch(e){case o.MT.Folders:return a.ZP.createElement(pn,{onCreateFolder:d,onEditFolder:m,onScreenSelect:i,isActive:r||[o.MT.FoldersCreateFolder,o.MT.FoldersEditFolder,o.MT.FoldersIncludedChats,o.MT.FoldersExcludedChats].includes(t),onReset:l});case o.MT.FoldersCreateFolder:case o.MT.FoldersEditFolder:case o.MT.FoldersEditFolderFromChatList:return a.ZP.createElement(In,{state:n,dispatch:s,onAddIncludedChats:u,onAddExcludedChats:h,onReset:c,onScreenSelect:i,isActive:r||[o.MT.FoldersIncludedChats,o.MT.FoldersExcludedChats].includes(t),onBack:l});case o.MT.FoldersIncludedChats:case o.MT.FoldersIncludedChatsFromChatList:return a.ZP.createElement(wn,{mode:"included",state:n,dispatch:s,onReset:c,onScreenSelect:i,isActive:r});case o.MT.FoldersExcludedChats:case o.MT.FoldersExcludedChatsFromChatList:return a.ZP.createElement(wn,{mode:"excluded",state:n,dispatch:s,onReset:c,onScreenSelect:i,isActive:r});default:return}}));var Nn=n(663),Mn=n(3657),Tn=n(692),Fn=n(2155);const An=(0,a.X$)((({size:e=i.DC,stickerSet:t,observeIntersection:n})=>{const s=(0,a.sO)(null),o=(0,Mn.Op)(s,n),l=`stickerSet${t.id}`,c=(0,h.Z)(l,!o,r.IU.Lottie),d=(0,Tn.Z)(c),m=(0,a.Ye)((()=>{if(!c)return(0,Fn.Xv)(t.title,2)}),[c,t.title]);return a.ZP.createElement("div",{ref:s,className:"sticker-set-cover"},m,c&&a.ZP.createElement(gn.Z,{id:l,size:e,animationData:c,className:d}))})),Ln=(0,a.X$)((({stickerSet:e,observeIntersection:t})=>{const n=(0,a.sO)(null),s=(0,Mn.Op)(n,t),r=(0,h.Z)(e.hasThumbnail&&`stickerSet${e.id}`,!s),o=(0,Tn.Z)(r),i=(0,a.Ye)((()=>{if(!r)return(0,Fn.Xv)(e.title,2)}),[r,e.title]);return a.ZP.createElement("div",{ref:n,className:"sticker-set-cover"},i,a.ZP.createElement("img",{src:r,className:o,alt:""}))}));var Rn=n(3547);const Bn=(0,a.X$)((({stickerSet:e,observeIntersection:t,onClick:n})=>{var s;const r=(0,u.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(Te.Z,{narrow:!0,className:"SettingsStickerSet",inactive:!o,onClick:()=>o&&n(o)},a.ZP.createElement(F.Z,{ariaLabel:e.title,color:"translucent",isRtl:r.isRtl},e.isAnimated?a.ZP.createElement(An,{size:i.Mw,stickerSet:e,observeIntersection:t}):a.ZP.createElement(Ln,{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(Te.Z,{narrow:!0,className:"SettingsStickerSet",onClick:()=>n(o)},a.ZP.createElement(Rn.Z,{sticker:o,size:i.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 $n=n(4851);const Dn=["Solid and Steady","Nice and Fast","Lots of Stuff"],xn=[{label:"12-hour",value:"12h"},{label:"24-hour",value:"24h"}],Un=(0,a.X$)((0,s.c$)((e=>({...(0,b.ei)(e.settings.byKey,["messageTextSize","animationLevel","messageSendKeyCombo","shouldSuggestStickers","shouldLoopStickers","isSensitiveEnabled","canChangeSensitive","timeFormat"]),stickerSetIds:e.stickers.added.setIds,stickerSetsById:e.stickers.setsById})),((e,t)=>(0,b.ei)(t,["setSettingOption","loadStickerSets","loadAddedStickers"])))((({isActive:e,onScreenSelect:t,onReset:n,stickerSetIds:s,stickerSetsById:r,messageTextSize:i,animationLevel:l,messageSendKeyCombo:c,shouldSuggestStickers:d,shouldLoopStickers:h,timeFormat:Z,setSettingOption:P,loadStickerSets:g,loadAddedStickers:v})=>{const p=(0,a.sO)(null),{observe:E}=(0,Mn.S1)({rootRef:p}),[C,b,I]=(0,Xe.Z)(),[y,S]=(0,a.eJ)(),w=(0,u.Z)(),k=f.$b?void 0:[{value:"enter",label:w("lng_settings_send_enter"),subLabel:"New line by Shift + Enter"},{value:"ctrl-enter",label:w(f.jm?"lng_settings_send_cmdenter":"lng_settings_send_ctrlenter"),subLabel:"New line by Enter"}];(0,a.d4)((()=>{g()}),[g]),(0,a.d4)((()=>{null!=s&&s.length&&v()}),[s,v]);const N=(0,a.I4)((e=>{Dn.forEach(((t,n)=>{document.body.classList.toggle(`animation-level-${n}`,e===n)})),P({animationLevel:e})}),[P]),M=(0,a.I4)((e=>{document.documentElement.style.setProperty("--composer-text-size",`${Math.max(e,f.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()),P({messageTextSize:e})}),[P]),T=(0,a.I4)((e=>{P({timeFormat:e}),P({wasTimeFormatSetManually:!0}),(0,Nn.qf)(e)}),[P]),F=(0,a.I4)((e=>{S(e),b()}),[b]),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,m.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:w.isRtl?"rtl":void 0},w("SETTINGS")),a.ZP.createElement(hn.Z,{label:w("TextSize"),min:12,max:20,value:i,onChange:M}),a.ZP.createElement(Te.Z,{icon:"photo",onClick:()=>t(o.MT.GeneralChatBackground)},w("ChatBackground"))),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:w.isRtl?"rtl":void 0},"Time Format"),a.ZP.createElement(tt.Z,{name:"timeformat",options:xn,selected:Z,onChange:T})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:w.isRtl?"rtl":void 0},"Animation Level"),a.ZP.createElement("p",{className:"settings-item-description",dir:w.isRtl?"rtl":void 0},"Choose the desired animations amount."),a.ZP.createElement(hn.Z,{options:Dn,value:l,onChange:N})),k&&a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:w.isRtl?"rtl":void 0},w("VoiceOver.Keyboard")),a.ZP.createElement(tt.Z,{name:"keyboard-send-settings",options:k,onChange:e=>P({messageSendKeyCombo:e}),selected:c})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:w.isRtl?"rtl":void 0},w("AccDescrStickers")),a.ZP.createElement(un.Z,{label:w("SuggestStickers"),checked:d,onCheck:e=>P({shouldSuggestStickers:e})}),a.ZP.createElement(un.Z,{label:w("LoopAnimatedStickers"),checked:h,onCheck:e=>P({shouldLoopStickers:e})}),a.ZP.createElement("div",{className:"mt-4",ref:p},A&&A.map((e=>a.ZP.createElement(Bn,{key:e.id,stickerSet:e,observeIntersection:E,onClick:F})))),y&&a.ZP.createElement($n.Z,{isOpen:C,fromSticker:y,onClose:I})))})));let On;function Gn(e="*",t,n=!1){On||(On=document.createElement("input"),On.setAttribute("type","file")),On.setAttribute("accept",e),n?On.removeAttribute("multiple"):On.setAttribute("multiple","multiple"),On.onchange=null,On.value="",On.onchange=t,On.click()}var zn=n(1394);function Xn(e){return[parseInt(e.substring(0,2),16),parseInt(e.substring(2,4),16),parseInt(e.substring(4,6),16)]}function Jn(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 _n([e,t,n]){e/=255,t/=255,n/=255;let a,s,r=Math.max(e,t,n),o=Math.min(e,t,n),i=r,l=r-o;if(s=0==r?0:l/r,r==o)a=0;else{switch(r){case e:a=(t-n)/l+(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 Yn=n(9524),jn=n(5866);const Kn=(0,a.X$)((({wallpaper:e,theme:t,isSelected:n,onClick:s})=>{var r;const{slug:l,document:c}=e,d=`wallpaper${c.id}`,m=c.previewBlobUrl,u=(0,h.Z)(`${d}?size=m`),g=(0,jn.Z)(null===(r=c.thumbnail)||void 0===r?void 0:r.dataUri,Boolean(u),!0),{transitionClassNames:v}=(0,_.Z)(Boolean(u||m),void 0,void 0,"slow"),[p,E]=(0,a.eJ)(!1),{mediaData:C,loadProgress:f}=(0,Z.Z)(d,!p),b=!1===(0,P.Z)(p),{shouldRender:I,transitionClassNames:y}=(0,_.Z)(p&&!C||l===o.mp,void 0,b,"slow"),S=(0,a.sO)();S.current=t;const w=(0,a.I4)((()=>{(async()=>{const e=await(0,zn.gm)(C);await Yn.save(i.fo,S.current,e),s(l)})()}),[C,s,l]);(0,a.d4)((()=>{C&&w()}),[C,w]);const k=(0,a.I4)((()=>{C?w():E((e=>!e))}),[C,w]),N=(0,X.Z)("WallpaperTile",n&&"selected");return a.ZP.createElement("div",{className:N,onClick:k},a.ZP.createElement("div",{className:"media-inner"},a.ZP.createElement("canvas",{ref:g,className:"thumbnail"}),a.ZP.createElement("img",{src:u||m,className:(0,X.Z)("full-media",v),alt:""}),I&&a.ZP.createElement("div",{className:(0,X.Z)("spinner-container",y)},a.ZP.createElement($.Z,{progress:f,onClick:k}))))})),qn=(0,G.P2)((e=>e()),6e4,!0),Wn=(0,a.X$)((0,s.c$)((e=>{const t=(0,v.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,b.ei)(t,["loadWallpapers","uploadWallpaper","setThemeSettings"])))((({isActive:e,onScreenSelect:t,onReset:n,background:s,isBlurred:r,loadedWallpapers:l,theme:c,loadWallpapers:d,uploadWallpaper:h,setThemeSettings:Z})=>{const P=(0,a.sO)();P.current=c,(0,a.d4)((()=>{qn((()=>{d()}))}),[d]);const g=(0,a.I4)((e=>{const{files:t}=e.target;t&&t.length>0&&h(t[0])}),[h]),v=(0,a.I4)((()=>{Gn("image/jpeg",g,!0)}),[g]),p=(0,a.I4)((()=>{t(o.MT.GeneralChatBackgroundColor)}),[t]),E=(0,a.I4)((()=>{Z({theme:c,background:void 0,backgroundColor:void 0,isBlurred:!0,patternColor:"dark"===c?i.Vv:i.g})}),[Z,c]),C=(0,a.I4)((e=>{Z({theme:P.current,background:e});const t=l&&l.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,i=[0,0,0],l=0;const c=document.createElement("canvas"),d=c.getContext&&c.getContext("2d");if(!d)return t;const m=await(0,zn.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=Hn(e),n=`#${Jn(e)}`;Z({theme:P.current,backgroundColor:n,patternColor:t})}))}),[l,Z]),f=(0,a.I4)((e=>{Z({theme:P.current,isBlurred:e.target.checked})}),[Z]),b=(0,u.Z)();(0,m.ZP)(e,n,t,o.MT.GeneralChatBackground);const I=(null==l?void 0:l[0])&&l[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(Te.Z,{icon:"camera-add",className:"mb-0",disabled:I,onClick:v},b("UploadImage")),a.ZP.createElement(Te.Z,{icon:"colorize",className:"mb-0",onClick:p},b("SetColor")),a.ZP.createElement(Te.Z,{icon:"favorite",onClick:E},b("ThemeResetToDefaults")),a.ZP.createElement(un.Z,{label:b("BackgroundBlurred"),checked:Boolean(r),onChange:f})),l?a.ZP.createElement("div",{className:"settings-wallpapers"},l.map((e=>a.ZP.createElement(Kn,{wallpaper:e,theme:c,isSelected:s===e.slug,onClick:C})))):a.ZP.createElement(we.Z,null))}))),Qn=_n(Xn("e6ebee")),ea=["#e6ebee","#b2cee1","#008dd0","#c6e7cb","#c4e1a6","#60b16e","#ccd0af","#a6a997","#7a7072","#fdd7af","#fdb76e","#dd8851"];function ta(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 na({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 aa=(0,a.X$)((0,s.c$)((e=>{const t=(0,v.Pu)(e),{backgroundColor:n}=e.settings.themes[t]||{};return{backgroundColor:n,theme:t}}),((e,t)=>(0,b.ei)(t,["setThemeSettings"])))((({isActive:e,onScreenSelect:t,onReset:n,theme:s,backgroundColor:r,setThemeSettings:i})=>{const l=(0,a.sO)();l.current=s;const c=(0,a.sO)(null),d=(0,a.sO)(null),u=(0,a.sO)(null),h=(0,a.sO)(!0),[Z,P]=(0,a.eJ)(function(e){return e&&e.startsWith("#")?_n(Xn(e.replace("#",""))):Qn}(r)),g=(0,a.sO)(Z);(0,a.d4)((()=>{g.current=Z}),[Z]);const[v,p,E]=(0,Xe.Z)(),[f,I]=(0,a.eJ)(""),[y,S]=(0,a.eJ)(""),w=(0,a.sO)(),k=(0,a.sO)();(0,a.d4)((()=>{const e={offsetLeft:d.current.offsetLeft,...(0,b.ei)(d.current.getBoundingClientRect(),["top","width","height"])},t={offsetLeft:u.current.offsetLeft,...(0,b.ei)(u.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}=ta(g.current,w.current);return P(na({colorPosition:n,huePosition:a},w.current)),p(),!0}function a(e){const{colorPosition:n}=ta(g.current,w.current),a=Math.min(Math.max(0,e.pageX-t.offsetLeft),t.width-1);return P(na({colorPosition:n,huePosition:a},w.current)),p(),!0}w.current={colorRect:e,hueRect:t},(0,C.s)(d.current,{onCapture:n,onDrag:n,onRelease:E,onClick:E,selectorToPreventScroll:".SettingsGeneralBackgroundColor",withCursor:!0}),(0,C.s)(u.current,{onCapture:a,onDrag:a,onRelease:E,onClick:E,selectorToPreventScroll:".SettingsGeneralBackgroundColor",withCursor:!0})}),[p,E]);const{colorPosition:N=[0,0],huePosition:M=0}=w.current?ta(Z,w.current):{},T=Jn(Vn(Z)),F=Z[0],A=Jn(Vn([F,1,1]));(0,a.d4)((()=>{const e=Vn(Z),t=`#${Jn(e)}`;if(I(e.join(", ")),S(t),!h.current){const n=Hn(e);i({theme:l.current,background:void 0,backgroundColor:t,patternColor:n})}h.current=!1}),[Z,i]),(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 i=o.createImageData(s,r),l=i.data,c=Vn([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())));P(_n(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}$/)&&P(_n(Xn(t.replace("#","")))),e.currentTarget.value=t}),[]),B=(0,a.I4)((e=>{P(_n(Xn(e.currentTarget.dataset.color.replace("#",""))))}),[]),$=(0,X.Z)("SettingsGeneralBackgroundColor settings-content custom-scroll",v&&"is-dragging");return(0,m.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(${N[0]}px, ${N[1]}px); background-color: #${T};`})),a.ZP.createElement("div",{ref:u,className:"hue-picker"},a.ZP.createElement("canvas",null),a.ZP.createElement("div",{className:"handle",style:`transform: translateX(${M}px); background-color: #${A};`})),a.ZP.createElement("div",{className:"tools"},a.ZP.createElement(Ne.Z,{value:y,label:"HEX",onChange:R}),a.ZP.createElement(Ne.Z,{value:f,label:"RGB",onChange:L}))),a.ZP.createElement("div",{className:"predefined-colors"},ea.map((e=>a.ZP.createElement("div",{className:e===`#${T}`?"active":void 0,"data-color":e,style:`background-color: ${e};`,onClick:B})))))})));var sa=n(8406);const ra=(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,b.ei)(t,["loadNotificationSettings","updateContactSignUpNotification","updateNotificationSettings","updateWebNotificationSettings"])))((({isActive:e,onScreenSelect:t,onReset:n,hasPrivateChatsNotifications:s,hasPrivateChatsMessagePreview:r,hasGroupNotifications:i,hasGroupMessagePreview:l,hasBroadcastNotifications:c,hasBroadcastMessagePreview:d,hasContactJoinedNotifications:h,hasPushNotifications:Z,hasWebNotifications:P,notificationSoundVolume:g,loadNotificationSettings:v,updateContactSignUpNotification:p,updateNotificationSettings:E,updateWebNotificationSettings:C})=>{(0,a.d4)((()=>{v()}),[v]);const f=(0,x.Z)(500,!1,!0),b=(0,a.I4)(((e,t,n)=>{const a="contact"===t?!s:!("group"===t?i:c),o="contact"===t?r:"group"===t?l:d;E({peerType:t,..."silent"===n&&{isSilent:!e.target.checked,shouldShowPreviews:o},..."showPreviews"===n&&{shouldShowPreviews:e.target.checked,isSilent:a}})}),[d,c,l,i,r,s,E]),I=(0,a.I4)((e=>{p({isSilent:!e.target.checked})}),[p]),y=(0,u.Z)();return(0,m.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:y.isRtl?"rtl":void 0},"Web notifications"),a.ZP.createElement(un.Z,{label:"Web notifications",subLabel:y(P?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:P,onChange:e=>{C({hasWebNotifications:e.target.checked})}}),a.ZP.createElement(un.Z,{label:"Offline notifications",disabled:!P,subLabel:y(Z?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:Z,onChange:e=>{C({hasPushNotifications:e.target.checked})}}),a.ZP.createElement("div",{className:"settings-item-slider"},a.ZP.createElement(hn.Z,{label:"Sound",min:0,max:10,value:g,onChange:e=>{C({notificationSoundVolume:e}),f((()=>(0,sa.q3)(void 0,e)))}}))),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:y.isRtl?"rtl":void 0},y("AutodownloadPrivateChats")),a.ZP.createElement(un.Z,{label:y("NotificationsForPrivateChats"),subLabel:y(s?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:s,onChange:e=>{b(e,"contact","silent")}}),a.ZP.createElement(un.Z,{label:y("MessagePreview"),disabled:!s,subLabel:y(r?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:r,onChange:e=>{b(e,"contact","showPreviews")}})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:y.isRtl?"rtl":void 0},y("FilterGroups")),a.ZP.createElement(un.Z,{label:y("NotificationsForGroups"),subLabel:y(i?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:i,onChange:e=>{b(e,"group","silent")}}),a.ZP.createElement(un.Z,{label:y("MessagePreview"),disabled:!i,subLabel:y(l?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:l,onChange:e=>{b(e,"group","showPreviews")}})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:y.isRtl?"rtl":void 0},y("FilterChannels")),a.ZP.createElement(un.Z,{label:y("NotificationsForChannels"),subLabel:y(c?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:c,onChange:e=>{b(e,"broadcast","silent")}}),a.ZP.createElement(un.Z,{label:y("MessagePreview"),disabled:!c,subLabel:y(d?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:d,onChange:e=>{b(e,"broadcast","showPreviews")}})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:y.isRtl?"rtl":void 0},y("PhoneOther")),a.ZP.createElement(un.Z,{label:y("ContactJoined"),checked:h,onChange:I})))}))),oa=(0,a.X$)((0,s.c$)((e=>{var t,n,a,s,r;const{settings:{byKey:{hasPassword:o,isSensitiveEnabled:i,canChangeSensitive:l},privacy:c},blocked:d,activeSessions:m}=e;return{hasPassword:o,blockedCount:d.totalCount,sessionsCount:m.length,isSensitiveEnabled:i,canChangeSensitive:l,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,b.ei)(t,["loadBlockedContacts","loadAuthorizations","loadPrivacySettings","loadContentSettings","updateContentSettings"])))((({isActive:e,onScreenSelect:t,onReset:n,hasPassword:s,blockedCount:r,sessionsCount:i,isSensitiveEnabled:l,canChangeSensitive:c,visibilityPrivacyPhoneNumber:d,visibilityPrivacyLastSeen:h,visibilityPrivacyProfilePhoto:Z,visibilityPrivacyForwarding:P,visibilityPrivacyGroupChats:g,loadPrivacySettings:v,loadBlockedContacts:p,loadAuthorizations:E,loadContentSettings:C,updateContentSettings:f})=>{(0,a.d4)((()=>{p(),E(),v(),C()}),[p,E,v,C]);const b=(0,u.Z)();function I(e){switch(e){case"everybody":return b("P2PEverybody");case"contacts":return b("P2PContacts");case"nobody":return b("P2PNobody")}}return(0,m.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(Te.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"},b("BlockedUsers")),r>0&&a.ZP.createElement("span",{className:"subtitle",dir:"auto"},b("Users",r)))),a.ZP.createElement(Te.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"},b("TwoStepVerification")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},b(s?"PasswordOn":"PasswordOff")))),a.ZP.createElement(Te.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"},b("SessionsTitle")),i>0&&a.ZP.createElement("span",{className:"subtitle",dir:"auto"},1===i?"1 session":`${i} sessions`)))),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header mb-4",dir:b.isRtl?"rtl":void 0},b("PrivacyTitle")),a.ZP.createElement(Te.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"},b("PrivacyPhoneTitle")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},I(d)))),a.ZP.createElement(Te.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"},b("LastSeenTitle")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},I(h)))),a.ZP.createElement(Te.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"},b("PrivacyProfilePhotoTitle")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},I(Z)))),a.ZP.createElement(Te.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"},b("PrivacyForwardsTitle")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},I(P)))),a.ZP.createElement(Te.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"},b("WhoCanAddMe")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},I(g))))),c&&a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:b.isRtl?"rtl":void 0},b("lng_settings_sensitive_title")),a.ZP.createElement(un.Z,{label:b("lng_settings_sensitive_disable_filtering"),subLabel:b("lng_settings_sensitive_about"),checked:Boolean(l),disabled:!c,onCheck:f})))}))),ia=(0,a.X$)((0,s.c$)((e=>({languages:e.settings.byKey.languages,language:e.settings.byKey.language})),((e,t)=>(0,b.ei)(t,["loadLanguages","setSettingOption"])))((({isActive:e,onScreenSelect:t,onReset:n,languages:s,language:r,loadLanguages:i,setSettingOption:l})=>{const[c,d]=(0,a.eJ)(r),[u,h,Z]=(0,Xe.Z)();(0,a.d4)((()=>{i()}),[i]);const P=(0,a.I4)((e=>{d(e),h(),(0,Nn.m0)(e,(()=>{Z(),l({language:e})}))}),[h,Z,l]),g=(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,m.ZP)(e,n,t,o.MT.Language),a.ZP.createElement("div",{className:"settings-content settings-item settings-language custom-scroll"},g?a.ZP.createElement(tt.Z,{name:"keyboard-send-settings",options:g,selected:c,loadingOption:u?c:void 0,onChange:P}):a.ZP.createElement(we.Z,null))})));function la(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 ca=(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,b.ei)(t,["setPrivacyVisibility"])))((({screen:e,isActive:t,onScreenSelect:n,onReset:s,visibility:r,allowUserIds:i,allowChatIds:l,blockUserIds:c,blockChatIds:d,chatsById:h,setPrivacyVisibility:Z})=>{const P=(0,u.Z)(),g=(0,a.Ye)((()=>{switch(e){case o.MT.PrivacyProfilePhoto:case o.MT.PrivacyGroupChats:return[{value:"everybody",label:P("P2PEverybody")},{value:"contacts",label:P("P2PContacts")}];default:return[{value:"everybody",label:P("P2PEverybody")},{value:"contacts",label:P("P2PContacts")},{value:"nobody",label:P("P2PNobody")}]}}),[P,e]),v={shouldShowDenied:"nobody"!==r,shouldShowAllowed:"everybody"!==r},p=la(e),E=(0,a.Ye)((()=>{switch(e){case o.MT.PrivacyPhoneNumber:return P("PrivacyPhoneTitle");case o.MT.PrivacyLastSeen:return P("LastSeenTitle");case o.MT.PrivacyProfilePhoto:return P("PrivacyProfilePhotoTitle");case o.MT.PrivacyForwarding:return P("PrivacyForwardsTitle");case o.MT.PrivacyGroupChats:return P("WhoCanAddMe");default:return}}),[P,e]);(0,m.ZP)(t,s,n,e);const C=(0,a.Ye)((()=>{switch(e){case o.MT.PrivacyLastSeen:return P("CustomHelp");default:return}}),[P,e]),f=(()=>{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}})(),b=(()=>{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}})(),I=(0,a.Ye)((()=>i&&l&&h?l.reduce(((e,t)=>e+(h[t]?h[t].membersCount:0)),i.length):0),[l,i,h]),y=(0,a.Ye)((()=>c&&d&&h?d.reduce(((e,t)=>e+(h[t]?h[t].membersCount:0)),c.length):0),[d,c,h]),S=(0,a.I4)((e=>{Z({privacyKey:p,visibility:e})}),[p,Z]);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:P.isRtl?"rtl":void 0},E),a.ZP.createElement(tt.Z,{name:`visibility-${p}`,options:g,onChange:S,selected:r}),C&&a.ZP.createElement("p",{className:"settings-item-description-larger",dir:P.isRtl?"rtl":void 0},C)),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header mb-4",dir:P.isRtl?"rtl":void 0},P("PrivacyExceptions")),v.shouldShowAllowed&&a.ZP.createElement(Te.Z,{narrow:!0,icon:"add-user",onClick:()=>{n(f)}},a.ZP.createElement("div",{className:"multiline-menu-item full-size"},I>0&&a.ZP.createElement("span",{className:"date",dir:"auto"},"+",I),a.ZP.createElement("span",{className:"title"},P("AlwaysShareWith")),a.ZP.createElement("span",{className:"subtitle"},P("EditAdminAddUsers")))),v.shouldShowDenied&&a.ZP.createElement(Te.Z,{narrow:!0,icon:"delete-user",onClick:()=>{n(b)}},a.ZP.createElement("div",{className:"multiline-menu-item full-size"},y>0&&a.ZP.createElement("span",{className:"date",dir:"auto"},"−",y),a.ZP.createElement("span",{className:"title"},P("NeverShareWith")),a.ZP.createElement("span",{className:"subtitle"},P("EditAdminAddUsers"))))))})));function da(e){return[e.region,e.country].filter(Boolean).join(", ")}function ma(e){return`${e.deviceModel}${e.deviceModel?", ":""} ${e.platform} ${e.systemVersion}`}const ua=(0,a.X$)((0,s.c$)((e=>({activeSessions:e.activeSessions})),((e,t)=>(0,b.ei)(t,["loadAuthorizations","terminateAuthorization","terminateAllAuthorizations"])))((({isActive:e,onScreenSelect:t,onReset:n,activeSessions:s,loadAuthorizations:r,terminateAuthorization:i,terminateAllAuthorizations:l})=>{const[c,d,h]=(0,Xe.Z)();(0,a.d4)((()=>{r()}),[r]);const Z=(0,a.I4)((e=>{i({hash:e})}),[i]),P=(0,a.I4)((()=>{h(),l()}),[h,l]),g=(0,a.Ye)((()=>s.find((e=>e.isCurrent))),[s]),v=(0,a.Ye)((()=>s.filter((e=>!e.isCurrent))),[s]),p=(0,u.Z)();return(0,m.ZP)(e,n,t,o.MT.PrivacyActiveSessions),a.ZP.createElement("div",{className:"settings-content custom-scroll"},g&&(C=g,a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header mb-4",dir:p.isRtl?"rtl":void 0},p("AuthSessions.CurrentSession")),a.ZP.createElement(Te.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"},C.appName),a.ZP.createElement("span",{className:"subtitle black tight"},ma(C)),a.ZP.createElement("span",{className:"subtitle"},C.ip," - ",da(C)))),a.ZP.createElement(Te.Z,{className:"destructive mb-0 no-icon",icon:"stop",ripple:!0,narrow:!0,onClick:d},p("TerminateAllSessions")))),v&&(E=v,a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header mb-4",dir:p.isRtl?"rtl":void 0},p("OtherSessions")),E.map((function(e){return a.ZP.createElement(Te.Z,{key:e.hash,ripple:!0,narrow:!0,contextActions:[{title:"Terminate",icon:"stop",handler:()=>{Z(e.hash)}}],className:"no-icon"},a.ZP.createElement("div",{className:"multiline-menu-item full-size",dir:"auto"},a.ZP.createElement("span",{className:"date"},(0,K.VX)(p,1e3*e.dateActive)),a.ZP.createElement("span",{className:"title"},e.appName),a.ZP.createElement("span",{className:"subtitle black tight"},ma(e)),a.ZP.createElement("span",{className:"subtitle"},e.ip," - ",da(e))))})))),v&&a.ZP.createElement(Ge.Z,{isOpen:c,onClose:h,text:"Are you sure you want to terminate all other sessions?",confirmLabel:"Terminate All Other Sessions",confirmHandler:P,confirmIsDestructive:!0}));var E,C})));var ha=n(6272);const Za=(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,b.ei)(t,["loadContactList","setUserSearchQuery","blockContact"])))((({usersById:e,blockedIds:t,contactIds:n,localContactIds:s,currentUserId:r,isOpen:o,onClose:i,loadContactList:l,setUserSearchQuery:c,blockContact:d})=>{const m=(0,u.Z)(),[h,Z]=(0,a.eJ)(""),P=(0,a.sO)(null);(0,a.d4)((()=>{c({query:h})}),[h,c]);const v=(0,a.Ye)((()=>{const a=(0,b.Tw)([...n||[],...s||[]].filter((e=>e!==r&&!t.includes(e))));return(0,g.kK)(a,e,h).sort(((t,n)=>{const a=(0,g.Js)(e[t])||"",s=(0,g.Js)(e[n])||"";return a.localeCompare(s)}))}),[t,n,r,h,s,e]),p=(0,a.I4)((t=>{const{id:n,accessHash:a}=e[t]||{};n&&a&&(d({contactId:n,accessHash:a}),i())}),[d,i,e]);return a.ZP.createElement(Le,{isOpen:o,chatOrUserIds:v,filterRef:P,filterPlaceholder:m("BlockedUsers.BlockUser"),filter:h,onFilterChange:Z,loadMore:l,onSelectChatOrUser:p,onClose:i})}))),Pa=(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,b.ei)(t,["unblockContact"])))((({isActive:e,onScreenSelect:t,onReset:n,chatsByIds:s,usersByIds:r,blockedIds:l,phoneCodeList:c,unblockContact:d})=>{const h=(0,u.Z)(),[Z,P,v]=(0,Xe.Z)(),p=(0,a.I4)((e=>{d({contactId:e})}),[d]);return(0,m.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:h.isRtl?"rtl":void 0},h("BlockedUsersInfo"))),a.ZP.createElement("div",{className:"chat-list custom-scroll"},null!=l&&l.length?a.ZP.createElement("div",{className:"scroll-container"},l.map(((e,t)=>function(e,t,n){const o=(0,g.YC)(e),l=o?r[e]:void 0,d=o?void 0:s[e],m=(0,X.Z)("Chat chat-item-clickable blocked-list-item small-icon",o?"private":"group");return a.ZP.createElement(Te.Z,{key:e,className:m,ripple:!0,narrow:!0,contextActions:[{title:"Unblock",icon:"unlock",handler:()=>{p(e)}}],style:`top: ${(0+t)*i.rS}px;`},a.ZP.createElement(ge.Z,{size:"medium",user:l,chat:d}),a.ZP.createElement("div",{className:"contact-info",dir:"auto"},a.ZP.createElement("h3",{dir:"auto"},(0,Pe.Z)((o?(0,g.Js)(l):(0,g.U)(h,d))||"")),(null==l?void 0:l.phoneNumber)&&a.ZP.createElement("div",{className:"contact-phone",dir:"auto"},(0,ha.WZ)(c,l.phoneNumber)),l&&!l.phoneNumber&&l.username&&a.ZP.createElement("div",{className:"contact-username",dir:"auto"},"@",l.username)))}(e,t)))):l&&!l.length?a.ZP.createElement("div",{className:"no-results",dir:"auto"},h("NoBlocked")):a.ZP.createElement(we.Z,{key:"loading"}))),a.ZP.createElement(tn.Z,{isShown:!0,onClick:P,ariaLabel:h("BlockContact")},a.ZP.createElement("i",{className:"icon-add"})),a.ZP.createElement(Za,{isOpen:Z,onClose:v}))})));var ga=n(7854);const va=(0,a.X$)((0,s.c$)((e=>({animatedEmoji:(0,v.zB)(e,"🔐")})))((({isActive:e,onReset:t,animatedEmoji:n,onScreenSelect:s})=>{const r=(0,u.Z)();return(0,m.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(ga.Z,{sticker:n,size:"large"}),a.ZP.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},(0,Pe.Z)(r("EnabledPasswordText"),["br"]))),a.ZP.createElement("div",{className:"settings-item pt-0 no-border"},a.ZP.createElement(Te.Z,{icon:"edit",onClick:()=>s(o.MT.TwoFaChangePasswordCurrent)},r("ChangePassword")),a.ZP.createElement(Te.Z,{icon:"password-off",onClick:()=>s(o.MT.TwoFaTurnOff)},r("TurnPasswordOff")),a.ZP.createElement(Te.Z,{icon:"email",onClick:()=>s(o.MT.TwoFaRecoveryEmailCurrentPassword)},r("SetRecoveryEmail"))))})));var pa=n(3490),Ea=n(9364);const Ca=(0,a.X$)((({screen:e,isActive:t,onScreenSelect:n,onReset:s,error:r,isLoading:o,expectedPassword:i,placeholder:l="Current Password",hint:c,submitLabel:d,clearError:h,onSubmit:Z})=>{const[P,g]=(0,a.eJ)(""),[v,p]=(0,a.eJ)(!1),E=(0,a.I4)((e=>{i&&e!==i?g("Passwords Should Be Equal"):Z(e)}),[Z,i]),C=(0,a.I4)((()=>{h&&h(),g("")}),[h]),f=(0,u.Z)();return(0,m.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(pa.Z,{isBig:!0,isPasswordVisible:v})),a.ZP.createElement("div",{className:"settings-item pt-0 no-border"},a.ZP.createElement(Ea.Z,{error:P||r,hint:c,placeholder:l,submitLabel:d||f("Next"),clearError:C,isLoading:o,isPasswordVisible:v,onChangePasswordVisibility:p,onSubmit:E})))})),fa=(0,a.X$)((0,s.c$)((e=>({animatedEmoji:(0,v.zB)(e,"🔐")})))((({isActive:e,onScreenSelect:t,onReset:n,animatedEmoji:s,onStart:r})=>{const i=(0,u.Z)();return(0,m.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(ga.Z,{sticker:s,size:"large"}),a.ZP.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},i("SetAdditionalPasswordInfo"))),a.ZP.createElement("div",{className:"settings-item pt-0 no-border"},a.ZP.createElement(F.Z,{onClick:r},i("EditAdminTransferSetPassword"))))}))),ba=f.wB?550:400,Ia=(0,a.X$)((0,s.c$)(((e,{icon:t})=>({animatedEmoji:(0,v.zB)(e,"email"===t?"💌":"💡")})))((({animatedEmoji:e,type:t="text",isLoading:n,error:s,placeholder:r,shouldConfirm:o,clearError:i,onSubmit:l,isActive:c,onScreenSelect:d,onReset:h,screen:Z})=>{const P=(0,a.sO)(null),[g,v]=(0,a.eJ)(""),[p,E,C]=(0,Xe.Z)(!1);(0,a.d4)((()=>{f.$b||setTimeout((()=>{P.current.focus()}),ba)}),[]);const b=(0,u.Z)();return(0,m.ZP)(c,h,d,Z),a.ZP.createElement("div",{className:"settings-content two-fa custom-scroll"},a.ZP.createElement("div",{className:"settings-content-header"},a.ZP.createElement(ga.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(),P.current&&l(g)}},a.ZP.createElement(Ne.Z,{ref:P,value:g,inputMode:t,label:r,error:s,onChange:e=>{s&&i&&i(),v(e.target.value)}}),g?a.ZP.createElement(F.Z,{type:"submit",isLoading:n,ripple:!0},b("Continue")):a.ZP.createElement(F.Z,{isText:!0,isLoading:n,ripple:!0,onClick:o?E:()=>{l()}},b("YourEmailSkip"))),o&&a.ZP.createElement(ke.Z,{className:"narrow",isOpen:p,title:b("YourEmailSkipWarning"),onClose:C},(0,Pe.Z)(b("YourEmailSkipWarningText"),["br","simple_markdown"]),a.ZP.createElement("div",{className:"dialog-buttons"},a.ZP.createElement(F.Z,{color:"danger",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:()=>{C(),l()}},b("YourEmailSkip")),a.ZP.createElement(F.Z,{color:"primary",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:C},b("Cancel"))))))}))),ya=(0,a.X$)((0,s.c$)((e=>({animatedEmoji:(0,v.zB)(e,"🥳")})))((({isActive:e,onReset:t,animatedEmoji:n,onScreenSelect:s})=>{const r=(0,u.Z)();return(0,m.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(ga.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(F.Z,{onClick:()=>{s(o.MT.Privacy)}},r("TwoStepVerificationPasswordReturnSettings"))))}))),Sa=f.wB?550:400,wa=(0,a.X$)((0,s.c$)((e=>({animatedEmoji:(0,v.zB)(e,"💌"),codeLength:e.twoFaSettings.waitingEmailCodeLength})))((({animatedEmoji:e,codeLength:t,isLoading:n,error:s,clearError:r,onSubmit:o,isActive:i,onScreenSelect:l,onReset:c,screen:d})=>{const h=(0,a.sO)(null),[Z,P]=(0,a.eJ)("");(0,a.d4)((()=>{f.$b||setTimeout((()=>{h.current.focus()}),Sa)}),[]);const g=(0,u.Z)();return(0,m.ZP)(i,c,l,d),a.ZP.createElement("div",{className:"settings-content two-fa custom-scroll"},a.ZP.createElement("div",{className:"settings-content-header"},a.ZP.createElement(ga.Z,{sticker:e,size:"large"})),a.ZP.createElement("div",{className:"settings-item pt-0 no-border"},a.ZP.createElement(Ne.Z,{value:Z,ref:h,inputMode:"decimal",label:g("YourEmailCode"),error:s,onChange:e=>{s&&r&&r();const n=e.target.value.slice(0,t);n.length===t&&o(n),P(n),e.target.value=n}}),n&&a.ZP.createElement(we.Z,null)))}))),ka=(0,a.X$)((0,s.c$)((e=>({...e.twoFaSettings})),((e,t)=>(0,b.ei)(t,["updatePassword","updateRecoveryEmail","clearPassword","provideTwoFaEmailCode","checkPassword","clearTwoFaError"])))((({currentScreen:e,shownScreen:t,state:n,hint:s,isLoading:r,error:i,waitingEmailCodeLength:l,dispatch:c,isActive:d,onScreenSelect:m,onReset:h,updatePassword:Z,checkPassword:P,clearTwoFaError:g,updateRecoveryEmail:v,provideTwoFaEmailCode:p,clearPassword:E})=>{(0,a.d4)((()=>{l&&(e===o.MT.TwoFaNewPasswordEmail?m(o.MT.TwoFaNewPasswordEmailCode):e===o.MT.TwoFaRecoveryEmail&&m(o.MT.TwoFaRecoveryEmailCode))}),[e,m,l]);const C=(0,a.I4)((()=>{c({type:"reset"}),m(o.MT.TwoFaNewPassword)}),[c,m]),f=(0,a.I4)((e=>{c({type:"setPassword",payload:e}),m(o.MT.TwoFaNewPasswordConfirm)}),[c,m]),b=(0,a.I4)((()=>{m(o.MT.TwoFaNewPasswordHint)}),[m]),I=(0,a.I4)((e=>{c({type:"setHint",payload:e}),m(o.MT.TwoFaNewPasswordEmail)}),[c,m]),y=(0,a.I4)((e=>{c({type:"setEmail",payload:e}),Z({...n,email:e,onSuccess:()=>{m(o.MT.TwoFaCongratulations)}})}),[c,m,n,Z]),S=(0,a.I4)((e=>{c({type:"setCurrentPassword",payload:e}),P({currentPassword:e,onSuccess:()=>{m(o.MT.TwoFaChangePasswordNew)}})}),[P,c,m]),w=(0,a.I4)((e=>{c({type:"setPassword",payload:e}),m(o.MT.TwoFaChangePasswordConfirm)}),[c,m]),k=(0,a.I4)((()=>{m(o.MT.TwoFaChangePasswordHint)}),[m]),N=(0,a.I4)((e=>{c({type:"setHint",payload:e}),Z({...n,hint:e,onSuccess:()=>{m(o.MT.TwoFaCongratulations)}})}),[c,m,n,Z]),M=(0,a.I4)((e=>{E({currentPassword:e,onSuccess:()=>{m(o.MT.Privacy)}})}),[E,m]),T=(0,a.I4)((e=>{c({type:"setCurrentPassword",payload:e}),P({currentPassword:e,onSuccess:()=>{m(o.MT.TwoFaRecoveryEmail)}})}),[P,c,m]),F=(0,a.I4)((e=>{c({type:"setEmail",payload:e}),v({...n,email:e,onSuccess:()=>{m(o.MT.TwoFaCongratulations)}})}),[c,m,n,v]),A=(0,a.I4)((e=>{p({code:e})}),[p]),L=(0,u.Z)();switch(e){case o.MT.TwoFaDisabled:return a.ZP.createElement(fa,{onStart:C,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:h});case o.MT.TwoFaNewPassword:return a.ZP.createElement(Ca,{screen:e,placeholder:L("PleaseEnterPassword"),submitLabel:L("Continue"),onSubmit:f,onScreenSelect:m,isActive:d||[o.MT.TwoFaNewPasswordConfirm,o.MT.TwoFaNewPasswordHint,o.MT.TwoFaNewPasswordEmail,o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:h});case o.MT.TwoFaNewPasswordConfirm:return a.ZP.createElement(Ca,{screen:e,expectedPassword:n.password,placeholder:L("PleaseReEnterPassword"),submitLabel:L("Continue"),onSubmit:b,onScreenSelect:m,isActive:d||[o.MT.TwoFaNewPasswordHint,o.MT.TwoFaNewPasswordEmail,o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:h});case o.MT.TwoFaNewPasswordHint:return a.ZP.createElement(Ia,{icon:"hint",placeholder:L("PasswordHintPlaceholder"),onSubmit:I,screen:e,onScreenSelect:m,isActive:d||[o.MT.TwoFaNewPasswordEmail,o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:h});case o.MT.TwoFaNewPasswordEmail:return a.ZP.createElement(Ia,{icon:"email",type:"email",isLoading:r,error:i,clearError:g,placeholder:L("RecoveryEmailTitle"),shouldConfirm:!0,onSubmit:y,screen:e,onScreenSelect:m,isActive:d||[o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:h});case o.MT.TwoFaNewPasswordEmailCode:return a.ZP.createElement(wa,{isLoading:r,error:i,clearError:g,onSubmit:A,screen:e,onScreenSelect:m,isActive:d||t===o.MT.TwoFaCongratulations,onReset:h});case o.MT.TwoFaCongratulations:return a.ZP.createElement(ya,{onScreenSelect:m,isActive:d,onReset:h});case o.MT.TwoFaEnabled:return a.ZP.createElement(va,{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:h});case o.MT.TwoFaChangePasswordCurrent:return a.ZP.createElement(Ca,{screen:e,isLoading:r,error:i,clearError:g,hint:s,onSubmit:S,onScreenSelect:m,isActive:d||[o.MT.TwoFaChangePasswordNew,o.MT.TwoFaChangePasswordConfirm,o.MT.TwoFaChangePasswordHint,o.MT.TwoFaCongratulations].includes(t),onReset:h});case o.MT.TwoFaChangePasswordNew:return a.ZP.createElement(Ca,{screen:e,placeholder:L("PleaseEnterNewFirstPassword"),onSubmit:w,onScreenSelect:m,isActive:d||[o.MT.TwoFaChangePasswordConfirm,o.MT.TwoFaChangePasswordHint,o.MT.TwoFaCongratulations].includes(t),onReset:h});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:h});case o.MT.TwoFaChangePasswordHint:return a.ZP.createElement(Ia,{isLoading:r,error:i,clearError:g,icon:"hint",placeholder:L("PasswordHintPlaceholder"),onSubmit:N,onScreenSelect:m,isActive:d||t===o.MT.TwoFaCongratulations,onReset:h,screen:e});case o.MT.TwoFaTurnOff:return a.ZP.createElement(Ca,{isLoading:r,error:i,clearError:g,hint:s,onSubmit:M,onScreenSelect:m,isActive:d,onReset:h,screen:e});case o.MT.TwoFaRecoveryEmailCurrentPassword:return a.ZP.createElement(Ca,{screen:e,isLoading:r,error:i,clearError:g,hint:s,onSubmit:T,onScreenSelect:m,isActive:d||[o.MT.TwoFaRecoveryEmail,o.MT.TwoFaRecoveryEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:h});case o.MT.TwoFaRecoveryEmail:return a.ZP.createElement(Ia,{screen:e,icon:"email",type:"email",placeholder:L("RecoveryEmailTitle"),onSubmit:F,onScreenSelect:m,isActive:d||[o.MT.TwoFaRecoveryEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:h});case o.MT.TwoFaRecoveryEmailCode:return a.ZP.createElement(wa,{screen:e,isLoading:r,error:i,clearError:g,onSubmit:A,onScreenSelect:m,isActive:d||t===o.MT.TwoFaCongratulations,onReset:h});default:return}})));var Na=n(1820);function Ma(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 Ta=(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:Ma(e,t)}}),((e,t)=>(0,b.ei)(t,["setPrivacySettings"])))((({currentUserId:e,isAllowList:t,screen:n,settings:s,chatsById:r,listIds:i,orderedPinnedIds:l,archivedListIds:c,archivedPinnedIds:d,setPrivacySettings:h,isActive:Z,onScreenSelect:P,onReset:v})=>{const p=(0,u.Z)(),E=(0,a.Ye)((()=>s?t?[...s.allowUserIds,...s.allowChatIds]:[...s.blockUserIds,...s.blockChatIds]:[]),[t,s]),[C,f]=(0,a.eJ)(""),[b,I]=(0,a.eJ)(!1),[y,S]=(0,a.eJ)(E),w=(0,a.Ye)((()=>{const e=i?(0,g.O)(r,i,l,"all"):void 0,t=c?(0,g.O)(r,c,d,"archived"):void 0;if(e||t)return[...e?[...e.pinnedChats,...e.otherChats]:[],...t?t.otherChats:[]]}),[r,i,l,c,d]),k=(0,a.Ye)((()=>{if(w)return w.filter((t=>((0,g.YC)(t.id)&&t.id!==e||(0,g.Bf)(t))&&(!C||(0,yn.Z)((0,g.U)(p,t),C)||E.includes(t.id)))).map((({id:e})=>e))}),[w,e,p,C,E]),N=(0,a.I4)((e=>{S(e),I(!0)}),[]),M=(0,a.I4)((()=>{h({privacyKey:la(n),isAllowList:Boolean(t),contactsIds:y}),P(o.MT.Privacy)}),[t,y,P,n,h]);return(0,m.ZP)(Z,v,P,n),a.ZP.createElement("div",{className:"NewChat-inner step-1"},a.ZP.createElement(Na.Z,{itemIds:k||[],selectedIds:y,filterValue:C,filterPlaceholder:p(t?"AlwaysShareWithPlaceholder":"NeverShareWithPlaceholder"),searchInputId:"new-group-picker-search",onSelectedIdsChange:N,onFilterChange:f}),a.ZP.createElement(tn.Z,{isShown:b,onClick:M,ariaLabel:p(t?"AlwaysShareWithTitle":"NeverShareWithTitle")},a.ZP.createElement("i",{className:"icon-arrow-right"})))}))),Fa=Object.keys(o.MT).length/2,Aa=[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],La=[o.MT.Folders,o.MT.FoldersCreateFolder,o.MT.FoldersEditFolder,o.MT.FoldersEditFolderFromChatList,o.MT.FoldersIncludedChats,o.MT.FoldersIncludedChatsFromChatList,o.MT.FoldersExcludedChats,o.MT.FoldersExcludedChatsFromChatList],Ra=[o.MT.PrivacyBlockedUsers,o.MT.PrivacyActiveSessions],Ba=[o.MT.PrivacyPhoneNumberAllowedContacts,o.MT.PrivacyPhoneNumberDeniedContacts],$a=[o.MT.PrivacyLastSeenAllowedContacts,o.MT.PrivacyLastSeenDeniedContacts],Da=[o.MT.PrivacyProfilePhotoAllowedContacts,o.MT.PrivacyProfilePhotoDeniedContacts],xa=[o.MT.PrivacyForwardingAllowedContacts,o.MT.PrivacyForwardingDeniedContacts],Ua=[o.MT.PrivacyGroupChatsAllowedContacts,o.MT.PrivacyGroupChatsDeniedContacts],Oa=(0,a.X$)((({isActive:e,currentScreen:t,foldersState:n,foldersDispatch:s,onScreenSelect:r,onReset:i,shouldSkipTransition:l})=>{const[c,d]=(0,Ht.Z)(jt,Yt),m=(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?i():"create"===n.mode?r(o.MT.FoldersCreateFolder):r(o.MT.FoldersEditFolder)}),[n.mode,s,t,i,r]),u=(0,a.I4)((()=>{s({type:"saveFilters"}),m()}),[s,m]);function h(i,l,h){return a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(Kt,{currentScreen:t,onReset:m,onSaveFilter:u,onScreenSelect:r,editedFolderId:n.folderId}),function(i,l){const u={[o.MT.PrivacyPhoneNumber]:Ba.includes(l),[o.MT.PrivacyLastSeen]:$a.includes(l),[o.MT.PrivacyProfilePhoto]:Da.includes(l),[o.MT.PrivacyForwarding]:xa.includes(l),[o.MT.PrivacyGroupChats]:Ua.includes(l)},h=Aa.includes(l),Z=La.includes(l),P=Ra.includes(l)||h||Object.keys(u).includes(l.toString())||Object.values(u).find((e=>!0===e));switch(t){case o.MT.Main:return a.ZP.createElement(Qt,{onScreenSelect:r,isActive:e,onReset:m});case o.MT.EditProfile:return a.ZP.createElement(mn,{onScreenSelect:r,isActive:e&&i,onReset:m});case o.MT.General:return a.ZP.createElement(Un,{onScreenSelect:r,isActive:i||l===o.MT.GeneralChatBackgroundColor||l===o.MT.GeneralChatBackground||P||Z,onReset:m});case o.MT.Notifications:return a.ZP.createElement(ra,{onScreenSelect:r,isActive:i,onReset:m});case o.MT.DataStorage:return a.ZP.createElement(Zn,{onScreenSelect:r,isActive:i,onReset:m});case o.MT.Privacy:return a.ZP.createElement(oa,{onScreenSelect:r,isActive:i||P||h,onReset:m});case o.MT.Language:return a.ZP.createElement(ia,{onScreenSelect:r,isActive:i,onReset:m});case o.MT.GeneralChatBackground:return a.ZP.createElement(Wn,{onScreenSelect:r,isActive:i||l===o.MT.GeneralChatBackgroundColor,onReset:m});case o.MT.GeneralChatBackgroundColor:return a.ZP.createElement(aa,{onScreenSelect:r,isActive:i,onReset:m});case o.MT.PrivacyActiveSessions:return a.ZP.createElement(ua,{onScreenSelect:r,isActive:i,onReset:m});case o.MT.PrivacyBlockedUsers:return a.ZP.createElement(Pa,{onScreenSelect:r,isActive:i,onReset:m});case o.MT.PrivacyPhoneNumber:case o.MT.PrivacyLastSeen:case o.MT.PrivacyProfilePhoto:case o.MT.PrivacyForwarding:case o.MT.PrivacyGroupChats:return a.ZP.createElement(ca,{screen:t,onScreenSelect:r,isActive:i||u[t],onReset:m});case o.MT.PrivacyPhoneNumberAllowedContacts:case o.MT.PrivacyLastSeenAllowedContacts:case o.MT.PrivacyProfilePhotoAllowedContacts:case o.MT.PrivacyForwardingAllowedContacts:case o.MT.PrivacyGroupChatsAllowedContacts:return a.ZP.createElement(Ta,{isAllowList:!0,screen:t,onScreenSelect:r,isActive:i||u[t],onReset:m});case o.MT.PrivacyPhoneNumberDeniedContacts:case o.MT.PrivacyLastSeenDeniedContacts:case o.MT.PrivacyProfilePhotoDeniedContacts:case o.MT.PrivacyForwardingDeniedContacts:case o.MT.PrivacyGroupChatsDeniedContacts:return a.ZP.createElement(Ta,{screen:t,onScreenSelect:r,isActive:i,onReset:m});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(kn,{currentScreen:t,shownScreen:l,state:n,dispatch:s,isActive:i,onScreenSelect:r,onReset:m});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(ka,{currentScreen:t,state:c,dispatch:d,shownScreen:l,isActive:i,onScreenSelect:r,onReset:m});default:return}}(i,h))}return a.ZP.createElement(L.Z,{id:"Settings",name:l?"none":f.s0,activeKey:t,renderCount:Fa},h)})),Ga=(0,G.P2)((e=>e()),6e4,!0),za=(0,a.X$)((0,s.c$)((e=>{const{userIds:t}=e.contactList||{},{byId:n,statusesById:a}=e.users;return{usersById:n,userStatusesById:a,contactIds:t,serverTimeOffset:e.serverTimeOffset}}),((e,t)=>(0,b.ei)(t,["loadContactList","openChat"])))((({isActive:e,filter:t,usersById:n,userStatusesById:s,contactIds:r,serverTimeOffset:o,onReset:i,loadContactList:l,openChat:c})=>{(0,a.d4)((()=>{Ga((()=>{l()}))})),(0,m.ZP)(e,i);const d=(0,a.I4)((e=>{c({id:e,shouldReplaceHistory:!0})}),[c]),u=(0,a.Ye)((()=>{if(!r)return;const e=(0,g.kK)(r,n,t);return(0,g.Z0)(e,n,s,void 0,o)}),[r,t,n,s,o]),[h,Z]=(0,Ie.Z)(void 0,u,Boolean(t));return a.ZP.createElement(Me.Z,{items:h,onLoadMore:Z,className:"chat-list custom-scroll"},null!=h&&h.length?h.map((e=>a.ZP.createElement(Te.Z,{key:e,className:"chat-item-clickable",onClick:()=>d(e),ripple:!f.wB},a.ZP.createElement(Ae.Z,{userId:e,forceShowSelf:!0,avatarSize:"large"})))):h&&!h.length?a.ZP.createElement("p",{className:"no-results",key:"no-results",dir:"auto"},t.length?"No contacts matched your search.":"Contact list is empty."):a.ZP.createElement(we.Z,{key:"loading"}))}))),Xa=(0,G.P2)((e=>e()),6e4,!0),Ja=(0,a.X$)((0,s.c$)((e=>{const{userIds:t}=e.contactList||{},{byId:n}=e.chats,{query:a,fetchingStatus:s,globalResults:r,localResults:o}=e.globalSearch,{userIds:i}=r||{},{userIds:l}=o||{};return{chatsById:n,localContactIds:t,searchQuery:a,isSearching:null==s?void 0:s.chats,globalUserIds:i,localUserIds:l}}),((e,t)=>(0,b.ei)(t,["loadContactList","setGlobalSearchQuery"])))((({isChannel:e,isActive:t,selectedMemberIds:n,onSelectedMemberIdsChange:r,onNextStep:o,onReset:i,chatsById:l,localContactIds:c,searchQuery:d,isSearching:h,localUserIds:Z,globalUserIds:P,loadContactList:v,setGlobalSearchQuery:p})=>{(0,a.d4)((()=>{Xa((()=>{v()}))}));const E=(0,u.Z)();(0,m.ZP)(t,i);const C=(0,a.I4)((e=>{p({query:e})}),[p]),f=(0,a.Ye)((()=>{const e=(0,s.Rd)().users.byId,t=c?(0,g.kK)(c,e,d):[];return(0,g.ih)((0,b.Tw)([...t,...Z||[],...P||[]]).filter((t=>{const n=e[t];return!n||n.canBeInvitedToGroup&&!n.isSelf&&!(0,g.cS)(n)})),l,!1,n)}),[c,l,d,Z,P,n]),I=(0,a.I4)((()=>{(n.length||e)&&(p({query:""}),o())}),[n.length,e,p,o]);return a.ZP.createElement("div",{className:"NewChat step-1"},a.ZP.createElement("div",{className:"left-header"},a.ZP.createElement(F.Z,{round:!0,size:"smaller",color:"translucent",onClick:i,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(Na.Z,{itemIds:f,selectedIds:n,filterValue:d,filterPlaceholder:E("SendMessageTo"),searchInputId:"new-group-picker-search",isLoading:h,onSelectedIdsChange:r,onFilterChange:C}),a.ZP.createElement(tn.Z,{isShown:Boolean(n.length||e),onClick:I,ariaLabel:e?"Continue To Channel Info":"Continue To Group Info"},a.ZP.createElement("i",{className:"icon-arrow-right"}))))}))),_a=(0,a.X$)((0,s.c$)((e=>{const{progress:t,error:n}=e.chatCreation||{};return{creationProgress:t,creationError:n}}),((e,t)=>(0,b.ei)(t,["createGroupChat","createChannel"])))((({isChannel:e,isActive:t,memberIds:n,onReset:s,creationProgress:r,creationError:i,createGroupChat:l,createChannel:c})=>{const d=(0,u.Z)();(0,m.ZP)(t,s);const[h,Z]=(0,a.eJ)(""),[P,g]=(0,a.eJ)(""),[v,p]=(0,a.eJ)(),[E,C]=(0,a.eJ)(),f="Chat title can't be empty",b="Channel title can't be empty",I="Sorry, creating supergroups is not yet supported",y=r===o.Nh.InProgress,S=(0,a.I4)((e=>{const{value:t}=e.currentTarget,n=t.replace(/^\s+/,"");Z(n),n!==t&&(e.currentTarget.value=n)}),[]),w=(0,a.I4)((e=>{g(e.currentTarget.value)}),[]),k=(0,a.I4)((()=>{h.length?n.length>199?C(I):l({title:h,photo:v,memberIds:n}):C(f)}),[h,n,l,v,f,I]),N=(0,a.I4)((()=>{h.length?c({title:h,about:P,photo:v,memberIds:n}):C(b)}),[h,c,P,v,n,b]);(0,a.d4)((()=>{r===o.Nh.Complete&&s(!0)}),[r,s]);const M=i&&d(i)||(E!==f&&E!==b?E:void 0);return a.ZP.createElement("div",{className:"NewChat"},a.ZP.createElement("div",{className:"left-header"},a.ZP.createElement(F.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(en.Z,{onChange:p,title:d("AddPhoto")}),a.ZP.createElement(Ne.Z,{value:h,onChange:S,label:d(e?"EnterChannelName":"GroupName"),error:E===f||E===b?E:void 0}),e&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(Ne.Z,{value:P,onChange:w,label:d("DescriptionOptionalPlaceholder")}),a.ZP.createElement("p",{className:"note"},d("DescriptionInfo"))),M&&a.ZP.createElement("p",{className:"error"},M),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(Te.Z,{inactive:!0,className:"chat-item-clickable"},a.ZP.createElement(Ae.Z,{userId:e}))))))),a.ZP.createElement(tn.Z,{isShown:0!==h.length,onClick:e?N:k,disabled:y,ariaLabel:e?d("ChannelIntro.CreateChannel"):"Create Group"},y?a.ZP.createElement(z.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-arrow-right"})))}))),Va=Object.keys(o.du).length/2,Ha=(0,a.X$)((({isActive:e,isChannel:t=!1,content:n,onContentChange:s,onReset:r})=>{const[i,l]=(0,a.eJ)([]),c=(0,a.I4)((()=>{s(t?o.du.NewChannelStep2:o.du.NewGroupStep2)}),[t,s]);return a.ZP.createElement(L.Z,{id:"NewChat",name:f.s0,renderCount:Va,activeKey:n},(s=>{switch(n){case o.du.NewChannelStep1:case o.du.NewGroupStep1:return a.ZP.createElement(Ja,{isChannel:t,isActive:e,selectedMemberIds:i,onSelectedMemberIdsChange:l,onNextStep:c,onReset:r});case o.du.NewChannelStep2:case o.du.NewGroupStep2:return a.ZP.createElement(_a,{isChannel:t,isActive:s&&e,memberIds:i,onReset:r});default:return}}))}));var Ya=n(1080);const ja=(0,a.X$)((({isActive:e,onReset:t,onContentChange:n})=>{const s=(0,u.Z)();return(0,m.ZP)(e,t,n,o.du.Archived),a.ZP.createElement("div",{className:"ArchivedChats"},a.ZP.createElement("div",{className:"left-header"},a.ZP.createElement(F.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(Ya.Z,{folderType:"archived",isActive:e}))}));var Ka=n(1218);const qa=(0,a.X$)((0,s.c$)((e=>{const{byId:t,orderedIds:n}=e.chatFolders;return{foldersById:t,folderOrderedIds:n}}),((e,t)=>(0,b.ei)(t,["editChatFolders"])))((({isOpen:e,chatId:t,foldersById:n,folderOrderedIds:s,onClose:r,onCloseAnimationEnd:o,editChatFolders:i})=>{const l=(0,u.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),h=(0,a.Ye)((()=>(null==s?void 0:s.map((e=>({label:n?n[e].title:"",value:String(e)}))))||[]),[s,n]),Z=(0,a.I4)((()=>{const e=c.filter((e=>!d.includes(e))).map(Number),n=d.filter((e=>!c.includes(e))).map(Number);i({chatId:t,idsToRemove:e,idsToAdd:n}),r()}),[t,i,c,r,d]);if(n&&s)return a.ZP.createElement(ke.Z,{isOpen:e,onClose:r,onCloseAnimationEnd:o,onEnter:Z,className:"delete",title:l("FilterAddTo")},a.ZP.createElement(Ka.Z,{options:h,selected:d,onChange:m,round:!0}),a.ZP.createElement(F.Z,{color:"primary",className:"confirm-dialog-button",isText:!0,onClick:Z},l("FilterAddTo")),a.ZP.createElement(F.Z,{className:"confirm-dialog-button",isText:!0,onClick:r},l("Cancel")))})));var Wa=n(4319),Qa=n(647);function es(e){return e?"lng_context_copy_selected":"lng_context_copy_text"}let ts;const ns={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},as=e=>{const t="deltaY"in e?e.deltaY:(e=>"changedTouches"in e?e.changedTouches[0].clientY:0)(e);(!ts||!ts.contains(e.target)||ts.scrollTop<=0&&t<=0||ts.scrollTop>=ts.scrollHeight-ts.offsetHeight&&t>=0)&&e.preventDefault()};function ss(e){ns[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 rs(e){ts=e,document.addEventListener("wheel",as,{passive:!1}),document.addEventListener("touchmove",as,{passive:!1}),document.onkeydown=ss}function os(){ts=void 0,document.removeEventListener("wheel",as),document.removeEventListener("touchmove",as),document.onkeydown=null}var is=n(3394),ls=n(2328);const cs=(0,a.X$)((({isOpen:e,message:t,anchor:n,canSendNow:s,canReschedule:o,canReply:i,canEdit:l,canPin:c,canUnpin:d,canDelete:m,canReport:h,canForward:Z,canFaveSticker:P,canUnfaveSticker:v,canCopy:p,canCopyLink:E,canSelect:C,canDownload:f,isDownloading:b,canShowSeenBy:I,seenByRecentUsers:y,onReply:S,onEdit:w,onPin:k,onUnpin:N,onForward:M,onDelete:T,onReport:F,onFaveSticker:A,onUnfaveSticker:L,onSelect:R,onSend:$,onReschedule:D,onClose:x,onCloseAnimationEnd:U,onCopyLink:O,onDownload:G,onShowSeenBy:z})=>{var X,J;const _=(0,a.sO)(null),V=function(e,t,n){const a=[],s=(0,g.UD)(e),o=(0,g.O$)(e)||((0,g.Cg)(e)?void 0:(0,g.F$)(e)),i=(0,g.Ti)(e,"inline"),l=o&&(i||(0,g.BM)(e))&&Wa.yl,c=window.getSelection();if(l&&a.push({label:"lng_context_copy_image",handler:()=>{Promise.resolve(i?Qa.he(i,r.IU.BlobUrl):o.blobUrl).then(Wa.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:es(e),handler:()=>{const n=e&&c?c.toString():s;(0,Wa.TE)(n),t&&t()}})}return n&&a.push({label:"lng_context_copy_message_link",handler:()=>{n(),t&&t()}}),a}(t,x,E?O:void 0),H=(0,a.I4)((()=>document.querySelector(`.Transition__slide--active > .MessageList div[data-message-id="${t.id}"]`)),[t.id]),Y=(0,a.I4)((()=>document.querySelector(".Transition__slide--active > .MessageList")),[]),j=(0,a.I4)((()=>document.querySelector(".MessageContextMenu .bubble")),[]),{positionX:K,positionY:q,style:W,menuStyle:Q,withScroll:ee}=(0,is.Z)(n,H,Y,j,10,document.querySelector(".MiddleHeader").offsetHeight);(0,a.d4)((()=>(rs(ee?_.current:void 0),os)),[ee]);const te=(0,u.Z)();return a.ZP.createElement(ls.Z,{ref:_,isOpen:e,positionX:K,positionY:q,style:W,menuStyle:Q,className:"MessageContextMenu fluid",onClose:x,onCloseAnimationEnd:U},s&&a.ZP.createElement(B.Z,{icon:"send-outline",onClick:$},te("MessageScheduleSend")),o&&a.ZP.createElement(B.Z,{icon:"schedule",onClick:D},te("MessageScheduleEditTime")),i&&a.ZP.createElement(B.Z,{icon:"reply",onClick:S},te("Reply")),l&&a.ZP.createElement(B.Z,{icon:"edit",onClick:w},te("Edit")),P&&a.ZP.createElement(B.Z,{icon:"favorite",onClick:A},te("AddToFavorites")),v&&a.ZP.createElement(B.Z,{icon:"favorite",onClick:L},te("Stickers.RemoveFromFavorites")),p&&V.map((e=>a.ZP.createElement(B.Z,{key:e.label,icon:"copy",onClick:e.handler},te(e.label)))),c&&a.ZP.createElement(B.Z,{icon:"pin",onClick:k},te("DialogPin")),d&&a.ZP.createElement(B.Z,{icon:"unpin",onClick:N},te("DialogUnpin")),f&&a.ZP.createElement(B.Z,{icon:"download",onClick:G},te(b?"lng_context_cancel_download":"lng_media_download")),Z&&a.ZP.createElement(B.Z,{icon:"forward",onClick:M},te("Forward")),C&&a.ZP.createElement(B.Z,{icon:"select",onClick:R},te("Common.Select")),h&&a.ZP.createElement(B.Z,{icon:"flag",onClick:F},te("lng_context_report_msg")),I&&a.ZP.createElement(B.Z,{icon:"group",onClick:z,disabled:!(null!==(X=t.seenByUserIds)&&void 0!==X&&X.length)},null!==(J=t.seenByUserIds)&&void 0!==J&&J.length?te("Conversation.ContextMenuSeen",t.seenByUserIds.length,"i"):te("Conversation.ContextMenuNoViews"),a.ZP.createElement("div",{className:"avatars"},null==y?void 0:y.map((e=>a.ZP.createElement(ge.Z,{size:"micro",user:e}))))),m&&a.ZP.createElement(B.Z,{destructive:!0,icon:"delete",onClick:T},te("Delete")))})),ds=(0,a.X$)((0,s.c$)(((e,{message:t,messageListType:n})=>{const{threadId:a}=(0,v.Bt)(e)||{},s=(0,v.xs)(e,t.chatId),r=(0,v.Z1)(e,t.chatId),{noOptions:o,canReply:l,canPin:c,canUnpin:d,canDelete:m,canReport:u,canEdit:h,canForward:Z,canFaveSticker:P,canUnfaveSticker:p,canCopy:E,canCopyLink:C,canSelect:f,canDownload:b}=a&&(0,v._k)(e,t,a)||{},I="pinned"===n,y="scheduled"===n;return{noOptions:o,canSendNow:y,canReschedule:y,canReply:!I&&!y&&l,canPin:!y&&c,canUnpin:!y&&d,canDelete:m,canReport:u,canEdit:!I&&h,canForward:!y&&Z,canFaveSticker:!y&&P,canUnfaveSticker:!y&&p,canCopy:E,canCopyLink:!y&&C,canSelect:f,canDownload:b,activeDownloads:s,canShowSeenBy:Boolean(r&&(0,g.Bf)(r)&&(0,g.B4)(t)&&r.membersCount&&r.membersCountDate.now()/1e3-i.EH)}}),((e,t)=>(0,b.ei)(t,["setReplyingToId","setEditingId","pinMessage","openForwardMenu","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","downloadMessageMedia","cancelMessageMediaDownload","loadSeenBy","openSeenByModal"])))((({isOpen:e,messageListType:t,chatUsername:n,message:r,album:o,anchor:i,onClose:l,onCloseAnimationEnd:c,noOptions:d,canSendNow:m,canReschedule:u,canReply:h,canPin:Z,canUnpin:P,canDelete:g,canReport:v,canEdit:p,canForward:E,canFaveSticker:C,canUnfaveSticker:f,canCopy:b,canCopyLink:I,canSelect:y,canDownload:S,activeDownloads:w,canShowSeenBy:k,setReplyingToId:N,setEditingId:M,pinMessage:T,openForwardMenu:F,faveSticker:A,unfaveSticker:L,toggleMessageSelection:R,sendScheduledMessages:B,rescheduleMessage:$,downloadMessageMedia:D,cancelMessageMediaDownload:x,loadSeenBy:U,openSeenByModal:O})=>{const{transitionClassNames:G}=(0,_.Z)(e,c,void 0,!1),[z,X]=(0,a.eJ)(!0),[J,V]=(0,a.eJ)(!1),[H,Y]=(0,a.eJ)(!1),[j,q]=(0,a.eJ)(!1),[W,Q,ee]=(0,Xe.Z)();(0,a.d4)((()=>{k&&e&&U({chatId:r.chatId,messageId:r.id})}),[U,e,r.chatId,r.id,k]);const te=(0,a.Ye)((()=>{var e;if(!r.seenByUserIds)return;const t=(0,s.Rd)().users.byId;return null===(e=r.seenByUserIds)||void 0===e?void 0:e.slice(0,3).map((e=>t[e])).filter(Boolean)}),[r.seenByUserIds]),ne=o?o.messages.some((e=>w.includes(e.id))):w.includes(r.id),ae=(0,a.I4)((()=>{X(!1),V(!0)}),[]),se=(0,a.I4)((()=>{X(!1),Y(!0)}),[]),re=(0,a.I4)((()=>{X(!1),l()}),[l]),oe=(0,a.I4)((()=>{V(!1),l()}),[l]),ie=(0,a.I4)((()=>{Y(!1),l()}),[l]),le=(0,a.I4)((()=>{q(!1),l()}),[l]),ce=(0,a.I4)((()=>{ee(),l()}),[ee,l]),de=(0,a.I4)((()=>{N({messageId:r.id}),re()}),[N,r.id,re]),me=(0,a.I4)((()=>{M({messageId:r.id}),re()}),[M,r.id,re]),ue=(0,a.I4)((()=>{X(!1),q(!0)}),[]),he=(0,a.I4)((()=>{T({messageId:r.id,isUnpin:!0}),re()}),[T,r.id,re]),Ze=(0,a.I4)((()=>{if(re(),null!=o&&o.messages){const e=o.messages.map((({id:e})=>e));F({fromChatId:r.chatId,messageIds:e})}else F({fromChatId:r.chatId,messageIds:[r.id]})}),[F,r,re,o]),Pe=(0,a.I4)((()=>{re(),A({sticker:r.content.sticker})}),[re,r.content.sticker,A]),ge=(0,a.I4)((()=>{re(),L({sticker:r.content.sticker})}),[re,r.content.sticker,L]),ve=(0,a.I4)((()=>{const e=null!=o&&o.messages?{messageId:r.id,childMessageIds:o.messages.map((({id:e})=>e)),withShift:!1}:{messageId:r.id,withShift:!1};R(e),re()}),[re,r.id,R,o]),pe=(0,a.I4)((()=>{B({chatId:r.chatId,id:r.id}),re()}),[re,r.chatId,r.id,B]),Ee=(0,a.I4)((()=>{X(!1),Q()}),[Q]),Ce=(0,a.I4)((()=>{re(),O({chatId:r.chatId,messageId:r.id})}),[re,r.chatId,r.id,O]),fe=(0,a.I4)((e=>{$({chatId:r.chatId,messageId:r.id,scheduledAt:Math.round(e.getTime()/1e3)})}),[r.chatId,r.id,$]),be=(0,a.I4)((()=>{(0,Wa.TE)(`https://t.me/${n||`c/${r.chatId.replace("-","")}`}/${r.id}`),re()}),[n,re,r.chatId,r.id]),Ie=(0,a.I4)((()=>{((null==o?void 0:o.messages)||[r]).forEach((e=>{ne?x({message:e}):D({message:e})})),re()}),[o,r,re,ne,x,D]),ye=(0,a.Ye)((()=>(o?o.messages:[r]).map((({id:e})=>e))),[o,r]);if(d)return void re();const Se=new Date;return Se.setFullYear(Se.getFullYear()+1),a.ZP.createElement("div",{className:["ContextMenuContainer",G].join(" ")},a.ZP.createElement(cs,{message:r,isOpen:z,anchor:i,canSendNow:m,canReschedule:u,canReply:h,canDelete:g,canReport:v,canPin:Z,canUnpin:P,canEdit:p,canForward:E,canFaveSticker:C,canUnfaveSticker:f,canCopy:b,canCopyLink:I,canSelect:y,canDownload:S,canShowSeenBy:k,isDownloading:ne,seenByRecentUsers:te,onReply:de,onEdit:me,onPin:ue,onUnpin:he,onForward:Ze,onDelete:ae,onReport:se,onFaveSticker:Pe,onUnfaveSticker:ge,onSelect:ve,onSend:pe,onReschedule:Ee,onClose:re,onCopyLink:be,onDownload:Ie,onShowSeenBy:Ce}),a.ZP.createElement(Ke,{isOpen:J,isSchedule:"scheduled"===t,onClose:oe,album:o,message:r}),a.ZP.createElement(nt,{isOpen:H,onClose:ie,messageIds:ye}),a.ZP.createElement(qe,{isOpen:j,messageId:r.id,chatId:r.chatId,onClose:le}),a.ZP.createElement(Ye,{isOpen:W,withTimePicker:!0,selectedAt:1e3*r.date,maxAt:(0,K._F)(Se),isFutureMode:!0,onClose:ce,onSubmit:fe}))}))),ms=(0,a.X$)((0,s.c$)(((e,{fromSticker:t,stickerSetShortName:n})=>{const a=(0,v.Bt)(e),{chatId:s,threadId:r}=a||{},o=s&&(0,v.Z1)(e,s),i=o?(0,g.H5)(o):void 0;return{canSendStickers:Boolean(o&&r&&(0,g.Qm)(o,r)&&(null==i?void 0:i.canSendStickers)),stickerSet:t?(0,v.Ny)(e,t.stickerSetId):n?(0,v.E_)(e,n):void 0}}),((e,t)=>(0,b.ei)(t,["loadStickers","toggleStickerSet","sendMessage"])))((({isOpen:e,fromSticker:t,stickerSetShortName:n,stickerSet:s,canSendStickers:r,onClose:o,loadStickers:l,toggleStickerSet:c,sendMessage:d})=>{const m=(0,a.sO)(null),h=(0,u.Z)(),{observe:Z}=(0,Mn.S1)({rootRef:m,throttleMs:200,isDisabled:!e});(0,a.d4)((()=>{if(e)if(t){const{stickerSetId:e,stickerSetAccessHash:n}=t;l({stickerSetId:e,stickerSetAccessHash:n})}else n&&l({stickerSetShortName:n})}),[e,t,l,n]);const P=(0,a.I4)((e=>{e={...e,isPreloadedGlobally:!0},d({sticker:e}),o()}),[o,d]),g=(0,a.I4)((()=>{s&&(c({stickerSetId:s.id}),o())}),[o,s,c]);return a.ZP.createElement(ke.Z,{className:"StickerSetModal",isOpen:e,onClose:o,hasCloseButton:!0,title:s?(0,Pe.Z)(s.title,["emoji","links"]):h("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(Rn.Z,{sticker:e,size:i.yK,observeIntersection:Z,onClick:r?P:void 0,clickArg:e})))),a.ZP.createElement("div",{className:"button-wrapper"},a.ZP.createElement(F.Z,{size:"smaller",fluid:!0,color:s.installedDate?"danger":"primary",onClick:g},h(s.installedDate?"StickerPack.RemoveStickerCount":"StickerPack.AddStickerCount",s.count,"i")))):a.ZP.createElement(we.Z,null))})));var us=n(2898);const hs=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,v.Z1)(e,t);if(!a||a.isRestricted)return{};const s=(0,g.YC)(a.id),r=s?(0,v.dy)(e,t):void 0,o=r&&(0,g.kw)(r);return{chat:a,isMuted:(0,g.i4)(a,(0,v.dZ)(e),(0,v.NJ)(e)),isPrivate:s,canAddContact:o,canDeleteChat:(0,g.cc)(a),hasLinkedChat:Boolean(null==a||null===(n=a.fullInfo)||void 0===n?void 0:n.linkedChatId)}}),((e,t)=>(0,b.ei)(t,["updateChatMutedState","enterMessageSelectMode","sendBotCommand","restartBot","joinGroupCall","createGroupCall","openLinkedChat","addContact","openCallFallbackConfirm"])))((({chatId:e,isOpen:t,withExtraActions:n,anchor:s,isChannel:r,canStartBot:o,canRestartBot:i,canSubscribe:l,canSearch:c,canCall:d,canMute:m,canLeave:h,canEnterVoiceChat:Z,canCreateVoiceChat:P,chat:g,isPrivate:v,isMuted:p,canDeleteChat:E,hasLinkedChat:C,canAddContact:b,onSubscribeChannel:I,onSearchClick:y,onClose:S,onCloseAnimationEnd:w,updateChatMutedState:k,enterMessageSelectMode:N,sendBotCommand:M,restartBot:T,joinGroupCall:F,createGroupCall:A,openLinkedChat:L,addContact:R,openCallFallbackConfirm:$})=>{const[D,x]=(0,a.eJ)(!0),[U,O]=(0,a.eJ)(!1),{x:G,y:z}=s;(0,_.Z)(t,w,void 0,!1);const X=(0,a.I4)((()=>{x(!1),O(!0)}),[]),J=(0,a.I4)((()=>{x(!1),S()}),[S]),V=(0,a.I4)((()=>{O(!1),S()}),[S]),H=(0,a.I4)((()=>{M({command:"/start"})}),[M]),Y=(0,a.I4)((()=>{T({chatId:e})}),[e,T]),j=(0,a.I4)((()=>{k({chatId:e,isMuted:!p}),J()}),[e,J,p,k]),K=(0,a.I4)((()=>{P?A({chatId:e}):F({chatId:e}),J()}),[J,P,e,F,A]),q=(0,a.I4)((()=>{L({id:e}),J()}),[e,J,L]),W=(0,a.I4)((()=>{R({userId:e}),J()}),[R,e,J]),Q=(0,a.I4)((()=>{I(),J()}),[J,I]),ee=(0,a.I4)((()=>{$(),J()}),[J,$]),te=(0,a.I4)((()=>{y(),J()}),[J,y]),ne=(0,a.I4)((()=>{N(),J()}),[J,N]);(0,a.d4)((()=>(rs(),os)),[]);const ae=(0,u.Z)();return a.ZP.createElement(us.Z,null,a.ZP.createElement("div",{className:"HeaderMenuContainer"},a.ZP.createElement(ls.Z,{isOpen:D,positionX:"right",style:`left: ${G}px;top: ${z}px;`,onClose:J},n&&o&&a.ZP.createElement(B.Z,{icon:"bots",onClick:H},ae("BotStart")),n&&i&&a.ZP.createElement(B.Z,{icon:"bots",onClick:Y},ae("BotRestart")),n&&l&&a.ZP.createElement(B.Z,{icon:r?"channel":"group",onClick:Q},ae(r?"ProfileJoinChannel":"ProfileJoinGroup")),b&&a.ZP.createElement(B.Z,{icon:"add-user",onClick:W},ae("AddContact")),f.wB&&d&&a.ZP.createElement(B.Z,{icon:"phone",onClick:ee},ae("Call")),f.wB&&c&&a.ZP.createElement(B.Z,{icon:"search",onClick:te},ae("Search")),m&&a.ZP.createElement(B.Z,{icon:p?"unmute":"mute",onClick:j},ae(p?"ChatsUnmute":"ChatsMute")),(Z||P)&&a.ZP.createElement(B.Z,{icon:"voice-chat",onClick:K},ae(P?"StartVoipChat":"VoipGroupJoinCall")),C&&a.ZP.createElement(B.Z,{icon:r?"comments":"channel",onClick:q},ae(r?"ViewDiscussion":"lng_profile_view_channel")),a.ZP.createElement(B.Z,{icon:"select",onClick:ne},ae("ReportSelectMessages")),h&&a.ZP.createElement(B.Z,{destructive:!0,icon:"delete",onClick:X},ae(v?"DeleteChatUser":E?"GroupInfo.DeleteAndExit":r?"LeaveChannel":"Group.LeaveGroup"))),g&&a.ZP.createElement(ct.Z,{isOpen:U,onClose:V,chat:g})))})));var Zs=n(9589);const Ps=(0,G.Ds)((e=>e()),200,!1),gs=(0,a.X$)((0,s.c$)((e=>{const t=(0,v.jr)(e);if(!t)return{};const{query:n,results:a}=(0,v.n5)(e)||{},{totalCount:s,foundIds:r}=a||{};return{chat:t,query:n,totalCount:s,foundIds:r,isHistoryCalendarOpen:Boolean(e.historyCalendarSelectedAt)}}),((e,t)=>(0,b.ei)(t,["setLocalTextSearchQuery","searchTextMessagesLocal","focusMessage","closeLocalTextSearch","openHistoryCalendar"])))((({isActive:e,chat:t,query:n,totalCount:s,foundIds:r,isHistoryCalendarOpen:o,setLocalTextSearchQuery:i,searchTextMessagesLocal:l,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=>{i({query:e}),e.length&&Ps(l)}),[l,i]),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(F.Z,{size:"smaller",round:!0,color:"translucent",onClick:d},a.ZP.createElement("i",{className:"icon-arrow-left"})),a.ZP.createElement(Zs.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(F.Z,{round:!0,size:"smaller",color:"translucent",onClick:()=>m({selectedAt:(0,K._F)(Date.now())}),ariaLabel:"Search messages by date"},a.ZP.createElement("i",{className:"icon-calendar"}))),a.ZP.createElement(F.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(F.Z,{round:!0,size:"smaller",color:"translucent",onClick:v,disabled:!r||!r.length||0===h},a.ZP.createElement("i",{className:"icon-down"}))))})));var vs=n(5376),ps=n(9295),Es=n(3575),Cs=n(7002),fs=n(3616);function bs(e,t,n=0,a=!1,s=!1,r=!1){const o=e[r?"scrollLeft":"scrollTop"],i=o+e[r?"offsetWidth":"offsetHeight"],l="string"==typeof t?e.querySelectorAll(t):t,{length:c}=l,d=[];let m=!1;for(let e=0;e=o-n&&u<=i+n:c<=i+n&&u>=o-n)d.push(e),m=!0;else if(m&&!a)break}return{allElements:l,visibleIndexes:d}}const Is=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,ys.Z)(a,r[t],e,10)}}var ws=n(3570);function ks({isActive:e,isHorizontal:t,shouldSaveSelectionOnUpdateItems:n,shouldRemoveSelectionOnReset:s,noArrowNavigation:r,items:o,shouldSelectOnTab:i,onSelect:l,onClose:c}){const[d,m]=(0,a.eJ)(-1),u=(0,a.I4)((e=>o?(0,ws.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(),l(t))}}),[o,l,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,Qe.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:i?Z:void 0,onEnter:Z}):void 0),[r,h,Z,e,t,c,i]),d}const Ns=(0,a.X$)((({isOpen:e,onClose:t,onInsertUserName:n,usersById:s,filteredUsers:r})=>{const o=(0,a.sO)(null),{shouldRender:i,transitionClassNames:l}=(0,_.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=ks({isActive:e,items:r,onSelect:d,shouldSelectOnTab:!0,shouldSaveSelectionOnUpdateItems:!0,onClose:t});(0,a.d4)((()=>{Ss(".chat-item-clickable",m,o)}),[m]),(0,a.d4)((()=>{r&&!r.length&&t()}),[r,t]);const u=(0,P.Z)(null!=r&&r.length?r:void 0,i),h=r&&!r.length?u:r;if(!i||h&&!h.length)return;const Z=(0,X.Z)("MentionTooltip composer-tooltip custom-scroll",l);return a.ZP.createElement("div",{className:Z,ref:o},null==h?void 0:h.map((({id:e},t)=>a.ZP.createElement(Te.Z,{key:e,className:"chat-item-clickable scroll-item",onClick:()=>c(e),focus:m===t},a.ZP.createElement(Ae.Z,{userId:e,avatarSize:"small",withUsername:!0})))))}));var Ms=n(9830);const Ts=(0,a.X$)((({chatId:e,threadId:t,attachments:n,caption:s,isReady:r,currentUserId:o,groupChatMembers:l,usersById:c,recentEmojis:d,baseEmojiKeywords:m,emojiKeywords:h,addRecentEmoji:Z,onCaptionUpdate:g,onSend:v,onFileAppend:p,onClear:C})=>{const f=(0,a.sO)(null),b=(0,P.Z)(n),I=n.length?n:b,y=Boolean(n.length),[S,w,k]=(0,Xe.Z)(),N=Boolean(I&&I.every((e=>e.quick))),M=(0,u.Z)(),{isMentionTooltipOpen:T,closeMentionTooltip:A,insertMention:L,mentionFilteredUsers:R}=(0,ps.Z)(y,s,g,i.nY,l,void 0,o),{isEmojiTooltipOpen:B,closeEmojiTooltip:$,filteredEmojis:D,insertEmoji:x}=(0,Es.Z)(y,s,d,i.nY,g,m,h,!r);(0,a.d4)((()=>y?(0,E.Z)(C):void 0),[y,C]);const U=(0,a.I4)((()=>{y&&v()}),[y,v]),O=(0,a.I4)((e=>{e.preventDefault(),k();const{dataTransfer:{files:t}}=e;if(null!=t&&t.length){const e=N?Array.from(t).filter((e=>e.type&&i.dI.has(e.type))):Array.from(t);p(e,N)}}),[N,p,k]);if(!I)return;const G=I.every((e=>i.oG.has(e.mimeType))),z=I.every((e=>i.wG.has(e.mimeType))),X=I.every((e=>e.mimeType.startsWith("audio/")));let J="";return J=M(G?"PreviewSender.SendPhoto":z?"PreviewSender.SendVideo":X?"PreviewSender.SendAudio":"PreviewSender.SendFile",I.length,"i"),a.ZP.createElement(ke.Z,{isOpen:y,onClose:C,header:function(){if(I)return a.ZP.createElement("div",{className:"modal-header-condensed",dir:M.isRtl?"rtl":void 0},a.ZP.createElement(F.Z,{round:!0,color:"translucent",size:"smaller",ariaLabel:"Cancel attachments",onClick:C},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement("div",{className:"modal-title"},J),a.ZP.createElement(F.Z,{color:"primary",size:"smaller",className:"modal-action-button",onClick:U},M("Send")))}(),className:"AttachmentModal "+(S?"hovered":"")},a.ZP.createElement("div",{className:"drop-target",onDragEnter:w,onDrop:O,onDragOver:function(e){e.preventDefault(),e.stopPropagation(),f.current&&window.clearTimeout(f.current)},onDragLeave:e=>{const{relatedTarget:t,target:n}=e;n.matches(".drop-target")&&!t&&(f.current=window.setTimeout(k,150)),n&&n.closest(".AttachmentModal.hovered")||(t&&e.stopPropagation(),k())},"data-attach-description":M("Preview.Dragging.AddItems",10)},N?a.ZP.createElement("div",{className:"media-wrapper custom-scroll"},I.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"},I.map((e=>a.ZP.createElement(Cs.Z,{name:e.filename,extension:(0,vs.mD)(e.filename,e.mimeType),previewData:e.previewBlobUrl,size:e.size,smaller:!0})))),a.ZP.createElement("div",{className:"attachment-caption-wrapper"},a.ZP.createElement(Ns,{isOpen:T,onClose:A,onInsertUserName:L,filteredUsers:R,usersById:c}),a.ZP.createElement(Ms.Z,{isOpen:B,emojis:D,onClose:$,onEmojiSelect:x,addRecentEmoji:Z}),a.ZP.createElement(fs.Z,{id:"caption-input-text",chatId:e,threadId:t,isAttachmentModalInput:!0,html:s,editableInputId:i.nY,placeholder:M("Caption"),onUpdate:g,onSend:v,canAutoFocus:Boolean(r&&n.length)}))))}));var Fs=n(3099);const As=(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),[i,l]=(0,a.eJ)(""),[c,d]=(0,a.eJ)([""]),[m,h]=(0,a.eJ)(!0),[Z,P]=(0,a.eJ)(!1),[g,v]=(0,a.eJ)(!1),[p,C]=(0,a.eJ)(),[f,b]=(0,a.eJ)(),[I,y]=(0,a.eJ)(!1),S=(0,u.Z)(),w=(0,a.I4)((t=>{e&&t.current&&t.current.focus()}),[e]);(0,a.d4)((()=>e?(0,E.Z)(n):void 0),[e,n]),(0,a.d4)((()=>{e||(l(""),d([""]),h(!0),P(!1),v(!1),C(""),b(""),y(!1))}),[e]),(0,a.d4)((()=>w(s)),[w,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"}))}))}),[]),N=(0,a.I4)((()=>{if(y(!1),!e)return;const n=i.trim().substring(0,255),a=c.map((e=>e.trim().substring(0,100))).filter((e=>e.length));if(!n||a.length<2)return l(n),a.length?a.length<2?k(a):d(a):k(),void y(!0);if(g&&(!f||!a[Number(f)]))return void y(!0);const s={summary:{question:n,answers:a.map(((e,t)=>({text:e.trim(),option:String(t),...String(t)===f&&{correct:!0}}))),...!m&&{isPublic:!0},...Z&&{multipleChoice:!0},...g&&{quiz:!0}}};if(g){const{text:e,entities:t}=p&&(0,Fs.Z)(p.substring(0,200))||{};s.quiz={correctAnswers:[f],...e&&{solution:e},...t&&{solutionEntities:t}}}t(s)}),[e,i,c,g,f,m,Z,t,k,p]),M=(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]),A=(0,a.I4)((e=>{b(e)}),[b]),L=(0,a.I4)((e=>{h(e.target.checked)}),[]),R=(0,a.I4)((e=>{P(e.target.checked)}),[]),B=(0,a.I4)((e=>{v(e.target.checked)}),[]),$=(0,a.I4)((e=>{13===e.keyCode&&N()}),[N]),D=(0,a.I4)((()=>{if(I&&!i.trim().length)return S("lng_polls_choose_question")}),[I,S,i]),x=(0,a.I4)((e=>{const t=c.map((e=>e.trim())).filter((e=>e.length));if(I&&t.length<2&&!c[e].trim().length)return S("lng_polls_choose_answers")}),[I,S,c]);function U(){return c.map(((e,t)=>a.ZP.createElement("div",{className:"option-wrapper"},a.ZP.createElement(Ne.Z,{label:t!==c.length-1||10===c.length?S("OptionHint"):S("CreatePoll.AddOption"),error:x(t),value:e,onChange:e=>M(t,e.currentTarget.value),onKeyPress:$}),t!==c.length-1&&a.ZP.createElement(F.Z,{className:"option-remove-button",round:!0,color:"translucent",size:"smaller",ariaLabel:S("Delete"),onClick:()=>T(t)},a.ZP.createElement("i",{className:"icon-close"})))))}return a.ZP.createElement(ke.Z,{isOpen:e,onClose:n,header:a.ZP.createElement("div",{className:"modal-header-condensed"},a.ZP.createElement(F.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"},S("NewPoll")),a.ZP.createElement(F.Z,{color:"primary",size:"smaller",className:"modal-action-button",onClick:N},S("Create"))),className:"PollModal"},a.ZP.createElement(Ne.Z,{ref:s,label:S("AskAQuestion"),value:i,error:D(),onChange:e=>l(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"},S("PollOptions")),I&&function(){const e=c.map((e=>e.trim())).filter((e=>e.length));return g&&(!f||!e[Number(f)])&&a.ZP.createElement("p",{className:"error"},S("lng_polls_choose_correct"))}(),g?a.ZP.createElement(tt.Z,{name:"correctOption",options:U().map(((e,t)=>({value:String(t),label:e,hidden:t===c.length-1}))),onChange:A}):U()),a.ZP.createElement("div",{className:"options-divider"}),a.ZP.createElement("div",{className:"quiz-mode"},a.ZP.createElement(un.Z,{label:S("PollAnonymous"),checked:m,onChange:L}),a.ZP.createElement(un.Z,{label:S("PollMultiple"),checked:Z,disabled:g,onChange:R}),a.ZP.createElement(un.Z,{label:S("PollQuiz"),checked:g,disabled:Z,onChange:B}),g&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("h3",{className:"options-header"},S("lng_polls_solution_title")),a.ZP.createElement("div",{ref:o,className:"form-control",contentEditable:!0,dir:"auto",onChange:e=>C(e.currentTarget.innerHTML)}),a.ZP.createElement("div",{className:"note"},S("CreatePoll.ExplanationInfo")))))}));var Ls=n(6503),Rs=n(4284),Bs=n(1367);const $s=(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]}:`},f.op?e.native:a.ZP.createElement("img",{src:`./img-apple-64/${e.image}.png`,alt:"",loading:"lazy"}))})),Ds=(0,a.X$)((({category:e,index:t,allEmojis:n,observeIntersection:s,shouldRender:r,onEmojiSelect:o})=>{const i=(0,a.sO)(null);(0,Mn._N)(i,s);const l=(0,Tn.Z)(r),c=(0,u.Z)(),d=f.wB?Math.floor((I.Z.get().width-8)/44):9,m=44*Math.ceil(e.emojis.length/d);return a.ZP.createElement("div",{ref:i,key:e.id,id:`emoji-category-${t}`,className:"symbol-set"},a.ZP.createElement("p",{className:"symbol-set-name",dir:"auto"},c("recent"===e.id?"RecentStickers":`Emoji${t}`)),a.ZP.createElement("div",{className:(0,X.Z)("symbol-set-container",l),style:`height: ${m}px;`,dir:c.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($s,{key:s.id,emoji:s,onClick:o})}))))})),xs={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"},Us=[];let Os,Gs,zs;const Xs=(0,a.X$)((0,s.c$)((e=>(0,b.ei)(e,["recentEmojis"])))((({className:e,onEmojiSelect:t,recentEmojis:s})=>{const r=(0,a.sO)(null),o=(0,a.sO)(null),[l,c]=(0,a.eJ)(),[d,m]=(0,a.eJ)(),[h,Z]=(0,a.eJ)(0),{observe:P}=(0,Mn.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-",""));Us[n]=e.isIntersecting}));const t=Us.map(((e,t)=>({index:t,isIntersecting:e}))).filter((({isIntersecting:e})=>e));t.length&&Z(t[Math.floor(t.length/2)].index)}));(0,ut.Z)(o.current,!f.wB),(0,a.d4)((()=>{if(!l)return;const e=o.current;if(!e)return;const t=42*h-e.offsetWidth/2+21;(0,Bs.Z)(e,t)}),[l,h]);const g=(0,u.Z)(),v=(0,a.Ye)((()=>{if(!l)return ot.D;const e=[...l];return null!=s&&s.length&&e.unshift({id:"recent",name:g("RecentStickers"),emojis:s}),e}),[l,g,s]);(0,a.d4)((()=>{setTimeout((()=>{const e=()=>{c(zs.categories),m(zs.emojis)};zs?e():async function(){return Os||(Os=n.e(501).then(n.t.bind(n,7501,19)),Gs=(await Os).default,zs=(0,Rs.NM)(Gs)),Os}().then(e)}),200)}),[]);const p=(0,a.I4)((e=>{Z(e);const t=document.getElementById(`emoji-category-${e}`);(0,ys.Z)(r.current,t,"start",50,800)}),[]),E=(0,a.I4)(((e,n)=>{t(e,n)}),[t]),C=(0,wt.Z)([],i.kU),b=(0,X.Z)("EmojiPicker",e);return d&&C?a.ZP.createElement("div",{className:b},a.ZP.createElement("div",{ref:o,className:"EmojiPicker-header",dir:g.isRtl?"rtl":""},v.map((function(e,t){const n=xs[e.id];return n&&a.ZP.createElement(F.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",f.$b?"no-scrollbar":"custom-scroll")},v.map(((e,t)=>a.ZP.createElement(Ds,{category:e,index:t,allEmojis:d,observeIntersection:P,shouldRender:h>=t-1&&h<=t+1,onEmojiSelect:E}))))):a.ZP.createElement("div",{className:b},a.ZP.createElement(we.Z,null))}))),Js=f.wB?8:16,_s=(0,a.X$)((({stickerSet:e,loadAndPlay:t,index:n,observeIntersection:s,shouldRender:r,onStickerSelect:o,onStickerUnfave:l})=>{const c=(0,a.sO)(null);(0,Mn._N)(c,s);const d=(0,Tn.Z)(r),m=f.wB?Math.floor((I.Z.get().width-8)/(i.Q+Js)):5,u=Math.ceil(e.count/m)*(i.Q+Js);return a.ZP.createElement("div",{ref:c,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",d),style:`height: ${u}px;`},r&&e.stickers&&e.stickers.map((n=>a.ZP.createElement(Rn.Z,{key:n.id,sticker:n,size:i.Q,observeIntersection:s,noAnimate:!t,onClick:o,clickArg:n,onUnfaveClick:"favorite"===e.id?l:void 0})))))})),Vs=[],Hs=(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,b.ei)(t,["loadStickerSets","loadRecentStickers","loadFavoriteStickers","loadAddedStickers","addRecentSticker","unfaveSticker"])))((({className:e,loadAndPlay:t,canSendStickers:n,recentStickers:s,favoriteStickers:r,addedSetIds:o,stickerSetsById:l,shouldPlay:c,onStickerSelect:d,loadStickerSets:m,loadRecentStickers:h,loadFavoriteStickers:Z,loadAddedStickers:P,addRecentSticker:g,unfaveSticker:v})=>{const p=(0,a.sO)(null),E=(0,a.sO)(null),[C,b]=(0,a.eJ)(0),{observe:I}=(0,Mn.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-",""));Vs[n]=e.isIntersecting}));const t=Vs.map(((e,t)=>({index:t,isIntersecting:e}))).filter((({isIntersecting:e})=>e));t.length&&b(t[Math.floor(t.length/2)].index)})),{observe:y}=(0,Mn.S1)({rootRef:E}),S=(0,u.Z)(),w=Boolean(o),k=(0,a.Ye)((()=>o?[{id:"recent",title:S("RecentStickers"),stickers:s,count:s.length},{id:"favorite",title:S("FavoriteStickers"),stickers:r,count:r.length},...o.map((e=>l[e])).filter(Boolean)]:ot.D),[o,S,s,r,l]),N=(0,a.Ye)((()=>w&&0===k.filter((e=>{var t;return null===(t=e.stickers)||void 0===t?void 0:t.length})).length),[k,w]);(0,a.d4)((()=>{t&&(m(),h(),Z())}),[t,Z,h,m]),(0,a.d4)((()=>{null!=o&&o.length&&P()}),[o,P]),(0,ut.Z)(E.current),(0,a.d4)((()=>{if(!w)return;const e=E.current;if(!e)return;const t=52*C-(e.offsetWidth/2-26);(0,Bs.Z)(e,t)}),[w,C]);const M=(0,a.I4)((e=>{b(e);const t=document.getElementById(`sticker-set-${e}`);(0,ys.Z)(p.current,t,"start",void 0,500)}),[]),T=(0,a.I4)((e=>{d(e),g({sticker:e})}),[g,d]),A=(0,a.I4)((e=>{v({sticker:e})}),[v]),L=(0,wt.Z)([],i.Y),R=(0,X.Z)("StickerPicker",e);return w&&L&&!N&&n?a.ZP.createElement("div",{className:R},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(F.Z,{key:e.id,className:r,ariaLabel:e.title,round:!0,faded:"recent"===e.id||"favorite"===e.id,color:"translucent",onClick:()=>M(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(An,{stickerSet:e,observeIntersection:y}):a.ZP.createElement(Ln,{stickerSet:e,observeIntersection:y})):a.ZP.createElement(Rn.Z,{key:e.id,sticker:s,size:i.DC,title:e.title,className:r,observeIntersection:y,onClick:M,clickArg:t})}))),a.ZP.createElement("div",{ref:p,className:(0,X.Z)("StickerPicker-main no-selection",f.$b?"no-scrollbar":"custom-scroll")},k.map(((e,n)=>a.ZP.createElement(_s,{key:e.id,stickerSet:e,loadAndPlay:Boolean(c&&t),index:n,observeIntersection:I,shouldRender:C>=n-1&&C<=n+1,onStickerSelect:T,onStickerUnfave:A}))))):a.ZP.createElement("div",{className:R},n?N?a.ZP.createElement("div",{className:"picker-disabled"},S("NoStickers")):a.ZP.createElement(we.Z,null):a.ZP.createElement("div",{className:"picker-disabled"},S("ErrorSendRestrictedStickersAll")))})));var Ys=n(386);function js(){return(js=Object.assign||function(e){for(var t=1;t{var i,l;const c=(0,a.sO)(null),d=(0,a.sO)(null),m=Boolean(null===(i=e.thumbnail)||void 0===i?void 0:i.dataUri),u=`gif${e.id}`,Z=(0,Mn.Op)(c,t)&&!n,P=(0,h.Z)(`${u}?size=m`,!Z,r.IU.BlobUrl),g=(0,jn.Z)(null===(l=e.thumbnail)||void 0===l?void 0:l.dataUri,Boolean(P)),v=(0,h.Z)(u,!Z,r.IU.BlobUrl),p=Boolean(Z&&v),{isBuffered:E,bufferingHandlers:C}=(0,V.Z)(!0),f=Z&&!E,b=Z&&E;(0,Y.Z)(d,[p]);const I=(0,a.I4)((()=>o({...e,blobUrl:v})),[o,e,v]),y=(0,X.Z)("GifButton",e.width&&e.height&&e.width({savedGifs:e.gifs.saved.gifs})),((e,t)=>(0,b.ei)(t,["loadSavedGifs"])))((({className:e,loadAndPlay:t,canSendGifs:n,savedGifs:s,onGifSelect:r,loadSavedGifs:o})=>{const l=(0,a.sO)(null),{observe:c}=(0,Mn.S1)({rootRef:l,debounceMs:300});(0,a.d4)((()=>{t&&o()}),[t,o]);const d=(0,wt.Z)([],i.Y);return a.ZP.createElement("div",{ref:l,className:(0,X.Z)("GifPicker",e,f.$b?"no-scrollbar":"custom-scroll")},n?d&&s&&s.length?s.map((e=>a.ZP.createElement(Ks,{key:e.id,gif:e,observeIntersection:c,isDisabled:!t,onClick:r}))):d&&s?a.ZP.createElement("div",{className:"picker-disabled"},"No saved GIFs."):a.ZP.createElement(we.Z,null):a.ZP.createElement("div",{className:"picker-disabled"},"Sending GIFs is not allowed in this chat."))})));let Ws;!function(e){e[e.Emoji=0]="Emoji",e[e.Stickers=1]="Stickers",e[e.GIFs=2]="GIFs"}(Ws||(Ws={}));const Qs=Object.values(Ws).filter((e=>"string"==typeof e)),er={[Ws.Emoji]:"icon-smile",[Ws.Stickers]:"icon-stickers",[Ws.GIFs]:"icon-gifs"},tr=(0,a.X$)((({activeTab:e,onSwitchTab:t,onRemoveSymbol:n,onSearchOpen:s})=>{const r=(0,u.Z)();function o(n){return a.ZP.createElement(F.Z,{className:"symbol-tab-button "+(e===n?"activated":""),onClick:()=>t(n),ariaLabel:Qs[n],round:!0,faded:!0,color:"translucent"},a.ZP.createElement("i",{className:er[n]}))}const i=(0,a.I4)((()=>{s(e===Ws.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!==Ws.Emoji&&a.ZP.createElement(F.Z,{className:"symbol-search-button",ariaLabel:e===Ws.Stickers?"Search Stickers":"Search GIFs",round:!0,faded:!0,color:"translucent",onClick:i},a.ZP.createElement("i",{className:"icon-search"})),o(Ws.Emoji),o(Ws.Stickers),o(Ws.GIFs),e===Ws.Emoji&&a.ZP.createElement(F.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 nr=!1;const ar=(0,a.X$)((0,s.c$)((e=>({isLeftColumnShown:e.isLeftColumnShown})))((({isOpen:e,allowedAttachmentOptions:t,isLeftColumnShown:n,onLoad:s,onClose:r,onEmojiSelect:o,onStickerSelect:i,onGifSelect:l,onRemoveSymbol:c,onSearchOpen:d,addRecentEmoji:m})=>{const[h,Z]=(0,a.eJ)(0),[P,g]=(0,a.eJ)([]),[v,p]=(0,Ls.Z)(e,r,void 0,f.wB),{shouldRender:E,transitionClassNames:C}=(0,_.Z)(e,r,!1,!1);!nr&&e&&(nr=!0),(0,a.d4)((()=>{s()}),[s]),(0,a.bt)((()=>{if(f.wB)return e&&(document.body.classList.add("enable-symbol-menu-transforms"),document.body.classList.add("is-symbol-menu-open")),()=>{e&&(0,G.T2)((()=>{document.body.classList.remove("is-symbol-menu-open"),setTimeout((()=>{document.body.classList.remove("enable-symbol-menu-transforms")}),350)}))}}),[e]);const b=(0,a.sO)(P);b.current=P,(0,a.d4)((()=>{b.current.length&&(b.current.forEach((e=>{m({emoji:e})})),g([]))}),[e,h,m]);const I=(0,a.I4)(((e,t)=>{g((e=>[...e,t])),o(e)}),[o]),y=(0,a.I4)((e=>{r(),d(e)}),[r,d]),S=(0,a.I4)((e=>{i(e,!0)}),[i]),w=(0,u.Z)(),{canSendStickers:k,canSendGifs:N}=t;function M(t,n){switch(h){case Ws.Emoji:return a.ZP.createElement(Xs,{className:"picker-tab",onEmojiSelect:I});case Ws.Stickers:return a.ZP.createElement(Hs,{className:"picker-tab",loadAndPlay:!!k&&e&&(t||n),canSendStickers:k,onStickerSelect:S});case Ws.GIFs:return a.ZP.createElement(qs,{className:"picker-tab",loadAndPlay:!!N&&e&&(t||n),canSendGifs:N,onGifSelect:l})}}const T=a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("div",{className:"SymbolMenu-main",onClick:function(e){e.stopPropagation()}},nr&&a.ZP.createElement(L.Z,{name:"slide",activeKey:h,renderCount:Qs.length},M)),f.wB&&a.ZP.createElement(F.Z,{round:!0,faded:!0,color:"translucent",ariaLabel:w("Close"),className:"symbol-close-button",size:"tiny",onClick:r},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement(tr,{activeTab:h,onSwitchTab:Z,onRemoveSymbol:c,onSearchOpen:y}));if(f.wB){if(!E)return;const e=(0,X.Z)("SymbolMenu mobile-menu",C,!n&&"middle-column-open");return a.ZP.createElement(us.Z,null,a.ZP.createElement("div",{className:e},T))}return a.ZP.createElement(ls.Z,{isOpen:e,positionX:"left",positionY:"bottom",onClose:r,className:"SymbolMenu",onCloseAnimationEnd:r,onMouseEnter:f.$b?void 0:v,onMouseLeave:f.$b?void 0:p,noCloseOnBackdrop:!f.$b},T)}))),sr=(0,a.X$)((({isOpen:e,allowedAttachmentOptions:t,onFileSelect:n,onPollCreate:s,onClose:r})=>{const[o,l]=(0,Ls.Z)(e,r),c=(0,a.I4)(((e,t)=>{const{files:a}=e.target;a&&a.length>0&&n(Array.from(a),t)}),[n]),d=(0,a.I4)((()=>{Gn(Array.from(i.dI).join(","),(e=>c(e,!0)))}),[c]),m=(0,a.I4)((()=>{Gn("*",(e=>c(e,!1)))}),[c]),h=(0,u.Z)(),{canAttachMedia:Z,canAttachPolls:P}=t;return a.ZP.createElement(ls.Z,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",onClose:r,className:"AttachMenu fluid",onCloseAnimationEnd:r,onMouseEnter:f.$b?void 0:o,onMouseLeave:f.$b?void 0:l,noCloseOnBackdrop:!f.$b},!Z&&a.ZP.createElement(B.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(B.Z,{icon:"photo",onClick:d},h("AttachmentMenu.PhotoOrVideo")),a.ZP.createElement(B.Z,{icon:"document",onClick:m},h("AttachDocument"))),P&&a.ZP.createElement(B.Z,{icon:"poll",onClick:s},h("Poll")))})),rr=(0,a.X$)((({withAvatar:e,focus:t,botCommand:n,bot:s,onClick:r})=>a.ZP.createElement(Te.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(ge.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,Pe.Z)(n.description)))))),or=(0,a.X$)((0,s.c$)((e=>({usersById:e.users.byId})),((e,t)=>(0,b.ei)(t,["sendBotCommand"])))((({usersById:e,isOpen:t,withUsername:n,botCommands:s,onClick:r,onClose:o,sendBotCommand:i})=>{const l=(0,a.sO)(null),{shouldRender:c,transitionClassNames:d}=(0,_.Z)(t,void 0,void 0,!1),m=(0,a.I4)((({botId:t,command:a})=>{const s=e[t];i({command:`/${a}${n&&s?`@${s.username}`:""}`,botId:t}),r()}),[r,i,e,n]),u=ks({isActive:t,items:s,onSelect:m,onClose:o});(0,a.d4)((()=>{s&&!s.length&&o()}),[s,o]),(0,a.d4)((()=>{Ss(".chat-item-clickable",u,l)}),[u]);const h=(0,P.Z)(s&&s.length?s:void 0,c),Z=s&&!s.length?h:s;if(!c||Z&&!Z.length)return;const g=(0,X.Z)("BotCommandTooltip composer-tooltip custom-scroll",d);return a.ZP.createElement("div",{className:g,ref:l},Z&&Z.map(((t,n)=>a.ZP.createElement(rr,{key:`${t.botId}_${t.command}`,botCommand:t,bot:e[t.botId],withAvatar:!0,onClick:m,focus:u===n}))))}))),ir=(0,a.X$)((0,s.c$)(void 0,((e,t)=>(0,b.ei)(t,["sendBotCommand"])))((({isOpen:e,botCommands:t,onClose:n,sendBotCommand:s})=>{const[r,o]=(0,Ls.Z)(e,n,void 0,f.wB),i=(0,a.I4)((e=>{s({command:`/${e.command}`,botId:e.botId}),n()}),[n,s]);return a.ZP.createElement(ls.Z,{isOpen:e,positionX:"left",positionY:"bottom",onClose:n,className:"BotCommandMenu",onCloseAnimationEnd:n,onMouseEnter:f.$b?void 0:r,onMouseLeave:f.$b?void 0:o,noCloseOnBackdrop:!f.$b},t.map((e=>a.ZP.createElement(rr,{key:e.command,botCommand:e,onClick:i}))))}))),lr=(0,a.X$)((0,s.c$)((e=>{const{stickers:t}=e.stickers.forEmoji;return{stickers:t}}),((e,t)=>(0,b.ei)(t,["clearStickersForEmoji"])))((({isOpen:e,onStickerSelect:t,stickers:n,clearStickersForEmoji:s})=>{const r=(0,a.sO)(null),{shouldRender:o,transitionClassNames:l}=(0,_.Z)(e,void 0,void 0,!1),c=(0,P.Z)(n,!0),d=n||c,{observe:m}=(0,Mn.S1)({rootRef:r,throttleMs:200});(0,a.d4)((()=>e?(0,E.Z)(s):void 0),[e,s]);const u=(0,X.Z)("StickerTooltip composer-tooltip custom-scroll",l,!(null!=d&&d.length)&&"hidden");return a.ZP.createElement("div",{ref:r,className:u,onMouseEnter:f.$b?void 0:()=>{document.body.classList.add("no-select")},onMouseLeave:f.$b?void 0:()=>{document.body.classList.remove("no-select")}},o&&d?d.map((e=>a.ZP.createElement(Rn.Z,{key:e.id,sticker:e,size:i.Q,observeIntersection:m,onClick:t,clickArg:e}))):o?a.ZP.createElement(we.Z,null):void 0)}))),cr=(0,a.X$)((({isOpen:e,onSilentSend:t,onScheduleSend:n,onClose:s,onCloseAnimationEnd:r})=>{const[o,i]=(0,Ls.Z)(e,s),l=(0,u.Z)();return a.ZP.createElement(ls.Z,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",className:"CustomSendMenu",onClose:s,onCloseAnimationEnd:r,onMouseEnter:f.$b?void 0:o,onMouseLeave:f.$b?void 0:i,noCloseOnBackdrop:!f.$b},t&&a.ZP.createElement(B.Z,{icon:"mute",onClick:t},l("SendWithoutSound")),n&&a.ZP.createElement(B.Z,{icon:"schedule",onClick:n},l("ScheduleMessage")))}));var dr=n(2420),mr=n(3283),ur=n(2678);const hr=(0,a.X$)((({isOpen:e,emojis:t,onClose:n,onEmojiSelect:s,addRecentEmoji:r})=>{const o=(0,a.sO)(null),{shouldRender:i,transitionClassNames:l}=(0,_.Z)(e,void 0,void 0,!1),c=(0,ur.Z)(t.length?t:void 0,350)||[],d=(0,a.I4)((e=>{s(e.native),r({emoji:e.id})}),[r,s]),m=(0,a.I4)(((e,t)=>{s(e),r({emoji:t})}),[r,s]),u=ks({isActive:e,isHorizontal:!0,items:t,onSelect:d,onClose:n});(0,a.d4)((()=>{!function(e,t){const n=t.current;if(!n)return;const{visibleIndexes:a,allElements:s}=bs(n,".EmojiButton",8,!0,!0,!0);if(!s.length||!s[e])return;const r=a[0];if(!a.includes(e)||e===r&&!Is(n,s[r],!0)){const t="start"==(e>a[a.length-1]?"start":"end")?44*e:0;(0,Bs.Z)(n,t)}}(u,o)}),[u]);const h=(0,X.Z)("EmojiTooltip composer-tooltip custom-scroll-x",l);return a.ZP.createElement("div",{ref:o,className:h,onMouseEnter:f.$b?void 0:()=>{document.body.classList.add("no-select")},onMouseLeave:f.$b?void 0:()=>{document.body.classList.remove("no-select")}},i&&c?c.map(((e,t)=>a.ZP.createElement($s,{key:e.id,emoji:e,focus:u===t,onClick:m}))):i?a.ZP.createElement(we.Z,null):void 0)})),Zr=(0,a.X$)((({title:e,description:t,thumbnail:n,thumbUrl:s,focus:r,transitionClassNames:o="",onClick:i})=>{let l="";const c=(0,h.Z)(n?`webDocument:${n.url}`:void 0);return(s=s||c)?l=a.ZP.createElement("img",{src:s,className:o,alt:"",decoding:"async",draggable:"false"}):e&&(l=(0,Fn.Xv)(e,1)),a.ZP.createElement(Te.Z,{focus:r,className:"BaseResult chat-item-clickable",onMouseDown:Ys.b,onClick:i},a.ZP.createElement("span",{className:"thumb"},"string"==typeof l?(0,Pe.Z)(l):l),a.ZP.createElement("div",{className:"content-inner"},e&&a.ZP.createElement("div",{className:"title"},e),t&&a.ZP.createElement("div",{className:"description"},t)))})),Pr=(0,a.X$)((({focus:e,isForGallery:t,inlineResult:n,onClick:s})=>{var r;let o,i,l;"photo"in n&&(o=n.photo),"thumbnail"in n&&(i=n.thumbnail),"webThumbnail"in n&&t&&(l=n.webThumbnail);const c=(0,h.Z)(l?`webDocument:${l.url}`:void 0),d=(0,h.Z)(o&&`photo${o.id}?size=m`),m=(0,Tn.Z)(d),u=(0,a.I4)((()=>{s(n)}),[n,s]);var Z,P;if(t)return a.ZP.createElement("div",{className:"MediaResult chat-item-clickable",onClick:u},a.ZP.createElement("img",{src:(null===(Z=o)||void 0===Z||null===(P=Z.thumbnail)||void 0===P?void 0:P.dataUri)||c,alt:""}),a.ZP.createElement("img",{src:d,className:(0,X.Z)("full-media",m),alt:""}));const{title:g,description:v}=n;return a.ZP.createElement(Zr,{focus:e,thumbUrl:d||(null===(r=i)||void 0===r?void 0:r.dataUri)||c,transitionClassNames:m,title:g,description:v,onClick:u})})),gr=(0,a.X$)((({focus:e,inlineResult:t,onClick:n})=>{const{title:s,url:r,description:o,webThumbnail:i}=t,l=(0,a.I4)((()=>{n(t)}),[t,n]);return a.ZP.createElement(Zr,{focus:e,thumbnail:i,title:s||r,description:o,onClick:l})})),vr=(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(Ks,{gif:s,observeIntersection:t,className:"chat-item-clickable",onClick:r})})),pr=(0,a.X$)((({inlineResult:e,observeIntersection:t,onClick:n})=>{const{sticker:s}=e;if(s)return a.ZP.createElement(Rn.Z,{sticker:s,size:i.zq,observeIntersection:t,title:s.emoji,className:"chat-item-clickable",onClick:n,clickArg:e})})),Er=(0,G.P2)((e=>e()),500,!0),Cr=(0,a.X$)((0,s.c$)(void 0,((e,t)=>(0,b.ei)(t,["startBot","openChat","sendInlineBotResult"])))((({isOpen:e,botId:t,isGallery:n,inlineBotResults:s,switchPm:r,loadMore:i,onClose:l,openChat:c,startBot:d,onSelectResult:m})=>{const u=(0,a.sO)(null),{shouldRender:h,transitionClassNames:Z}=(0,_.Z)(e,void 0,void 0,!1),{observe:g}=(0,Mn.S1)({rootRef:u,debounceMs:200,isDisabled:!e}),v=(0,a.I4)((({direction:e})=>{e===o.Uq.Backwards&&Er(i)}),[i]),p=ks({isActive:e,shouldRemoveSelectionOnReset:n,noArrowNavigation:n,items:s,onSelect:m,onClose:l});(0,a.d4)((()=>{Ss(".chat-item-clickable",p,u)}),[p]);const E=(0,a.I4)((()=>{c({id:t}),d({botId:t,param:r.startParam})}),[t,c,d,r]),C=(0,P.Z)(null!=s&&s.length?s:void 0,h),b=s&&!s.length?C:s;if(!h||!b||!b.length&&!r)return;const I=(0,X.Z)("InlineBotTooltip composer-tooltip",f.$b?"no-scrollbar":"custom-scroll",n&&"gallery",Z);return a.ZP.createElement(Me.Z,{ref:u,className:I,items:b,itemSelector:".chat-item-clickable",noFastList:!0,onLoadMore:v,sensitiveArea:160},r&&a.ZP.createElement(Te.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(vr,{key:e.id,inlineResult:e,observeIntersection:g,onClick:m});case"photo":return a.ZP.createElement(Pr,{key:e.id,isForGallery:n,inlineResult:e,onClick:m});case"sticker":return a.ZP.createElement(pr,{key:e.id,inlineResult:e,observeIntersection:g,onClick:m});case"video":case"game":return a.ZP.createElement(Pr,{key:e.id,focus:p===t,inlineResult:e,onClick:m});case"article":case"audio":return a.ZP.createElement(gr,{key:e.id,focus:p===t,inlineResult:e,onClick:m});default:return}})))})));var fr=n(6844);const br=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,v.Z1)(e,t),a=n&&(0,v.Zw)(e,n.id);if(!n||!a)return{};const{query:s,results:r}=(0,v.n5)(e)||{},{totalCount:o,foundIds:i}=r||{};return{chat:n,messagesById:a,query:s,totalCount:o,foundIds:i}}),((e,t)=>(0,b.ei)(t,["searchTextMessagesLocal","focusMessage"])))((({chatId:e,threadId:t,onClose:n,isActive:r,chat:o,messagesById:i,query:l,totalCount:c,foundIds:d,searchTextMessagesLocal:h,focusMessage:Z})=>{const P=(0,u.Z)(),p=(0,a.Ye)((()=>{if(!(l&&d&&d.length&&i))return ot.D;const n=d.map((n=>{const a=i[n];if(!a)return;const r=a.senderId?(0,v.dy)((0,s.Rd)(),a.senderId):void 0;let l;if(o&&(0,g.eA)(o))l=o;else if(a.forwardInfo){const{isChannelPost:e,fromChatId:t}=a.forwardInfo;l=e&&t?(0,v.Z1)((0,s.Rd)(),t):void 0}else l=a.senderId?(0,v.Z1)((0,s.Rd)(),a.senderId):void 0;return{message:a,senderUser:r,senderChat:l,onClick:()=>Z({chatId:e,threadId:t,messageId:n})}})).filter(Boolean);return(0,b.Xo)(n,(({message:e})=>e.date),"desc")}),[e,t,Z,d,o,i,l]);(0,m.ZP)(r,n);const E=(0,a.sO)(null),C=(0,ye.Z)(E,!0,(e=>{const t=null==p?void 0:p[-1===e?0:e];t&&t.onClick()}),".ListItem-button",!0);return a.ZP.createElement(Me.Z,{className:"RightSearch custom-scroll",items:p,preloadBackwards:0,onLoadMore:h,noFastList:!0,onKeyDown:C,ref:E},a.ZP.createElement("p",{className:"helper-text",dir:"auto"},l?0!==c&&p.length?1===c?"1 message found":`${p.length&&(c||p.length)} messages found`:P("lng_search_no_results"):P("lng_dlg_search_for_messages")),p.map((({message:e,senderUser:t,senderChat:n,onClick:s})=>{const r=n?(0,g.U)(P,n):(0,g.Js)(t),o=(0,g.MK)(P,e);return a.ZP.createElement(Te.Z,{className:"chat-item-clickable search-result-message m-0",onClick:s},a.ZP.createElement(ge.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,Pe.Z)(r)),a.ZP.createElement(fr.Z,{message:e})),a.ZP.createElement("div",{className:"subtitle",dir:"auto"},(0,Pe.Z)(o,["emoji","highlight"],{highlight:l}))))})))})));var Ir=n(9290);const yr=(0,a.X$)((0,s.c$)(((e,{stickerSetId:t})=>({set:(0,v.Ny)(e,t),shouldPlay:(0,v.yB)(e)})),((e,t)=>(0,b.ei)(t,["loadStickers","toggleStickerSet"])))((({stickerSetId:e,observeIntersection:t,set:n,shouldPlay:s,loadStickers:r,toggleStickerSet:o,isSomeModalOpen:l,onModalToggle:c})=>{const d=(0,u.Z)(),m=n&&Boolean(n.installedDate),h=Boolean(null==n?void 0:n.stickers),[Z,P,g]=(0,Xe.Z)();(0,Ir.Z)((()=>{c(Z)}),[Z,c]);const v=(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)((()=>{!h&&v.length<5&&r({stickerSetId:e})}),[h,v.length,r,e]);const p=(0,a.I4)((()=>{o({stickerSetId:e})}),[o,e]);if(!n)return;const E=v.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(F.Z,{className:m?"is-added":void 0,color:"primary",size:"tiny",pill:!0,fluid:!0,onClick:p},d(m?"Stickers.Installed":"Stickers.Install"))),a.ZP.createElement("div",{className:"sticker-set-main"},!E&&a.ZP.createElement(z.Z,null),E&&v.map((e=>a.ZP.createElement(Rn.Z,{sticker:e,size:i.Y7,observeIntersection:t,noAnimate:!s||Z||l,onClick:P})))),E&&a.ZP.createElement($n.Z,{isOpen:Z,fromSticker:v[0],onClose:g}))}))),Sr=(0,G.P2)((e=>e()),6e4,!0),wr=(0,a.X$)((0,s.c$)((e=>{const t=(0,v.y5)(e),{query:n,resultIds:a}=t||{},{featured:s}=e.stickers;return{query:n,featuredIds:s.setIds,resultIds:a}}),((e,t)=>(0,b.ei)(t,["loadFeaturedStickers"])))((({onClose:e,isActive:t,query:n,featuredIds:s,resultIds:r,loadFeaturedStickers:o})=>{const i=(0,a.sO)(null),l=(0,u.Z)(),[c,d]=(0,a.eJ)(!1),{observe:h}=(0,Mn.S1)({rootRef:i,throttleMs:200});return(0,a.d4)((()=>{Sr((()=>{o()}))})),(0,m.ZP)(t,e),a.ZP.createElement("div",{ref:i,className:"StickerSearch custom-scroll",dir:l.isRtl?"rtl":void 0},function(){if(void 0!==n)return!n&&s?s.map((e=>a.ZP.createElement(yr,{key:e,stickerSetId:e,observeIntersection:h,isSomeModalOpen:c,onModalToggle:d}))):r?r.length?r.map((e=>a.ZP.createElement(yr,{key:e,stickerSetId:e,observeIntersection:h,isSomeModalOpen:c,onModalToggle:d}))):a.ZP.createElement("p",{className:"helper-text",dir:"auto"},"Nothing found."):a.ZP.createElement(we.Z,null)}())}))),kr=(0,a.X$)((0,s.c$)((e=>{const t=(0,v.yN)(e),{query:n,results:a}=t||{},{chatId:s}=(0,v.Bt)(e)||{},r=s?(0,v.Z1)(e,s):void 0;return{query:n,results:a,chat:r,isChatWithBot:r?(0,v.xo)(e,r):void 0}}),((e,t)=>(0,b.ei)(t,["searchMoreGifs","sendMessage","setGifSearchQuery"])))((({onClose:e,isActive:t,query:n,results:s,chat:r,isChatWithBot:o,searchMoreGifs:i,sendMessage:l,setGifSearchQuery:c})=>{const d=(0,a.sO)(null),{observe:h}=(0,Mn.S1)({rootRef:d,debounceMs:300}),{canSendGifs:Z}=(0,g.H5)(r,o),P=(0,a.I4)((e=>{Z&&l({gif:e}),f.$b&&c({query:void 0})}),[Z,l,c]),v=(0,u.Z)();(0,m.ZP)(t,e);const p=Boolean(void 0!==n&&s&&s.length);return a.ZP.createElement("div",{className:"GifSearch",dir:v.isRtl?"rtl":void 0},a.ZP.createElement(Me.Z,{ref:d,className:(0,X.Z)("gif-container custom-scroll",p&&"grid"),items:s,itemSelector:".GifButton",preloadBackwards:96,noFastList:!0,onLoadMore:i},function(){if(void 0!==n)return s?s.length?s.map((e=>a.ZP.createElement(Ks,{key:e.id,gif:e,observeIntersection:h,onClick:P}))):a.ZP.createElement("p",{className:"helper-text",dir:"auto"},v("NoGIFsFound")):a.ZP.createElement(we.Z,null)}()))}))),Nr=(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,b.ei)(t,["loadPollOptionResults","openChat","closePollResults"])))((({chat:e,message:t,answer:n,answerVote:s,totalVoters:r,voters:o,offset:i,loadPollOptionResults:l,openChat:c,closePollResults:d})=>{const m=(0,P.Z)(s.votersCount),[h,Z]=(0,a.eJ)(!0),g=Boolean(o),{option:v,text:p}=n,E=(0,u.Z)();(0,a.d4)((()=>{g&&m===s.votersCount||l({chat:e,messageId:t.id,option:v,offset:i,limit:4,shouldResetVoters:!0})}),[s.votersCount,g]);const C=(0,a.I4)((()=>{Z(!0),l({chat:e,messageId:t.id,option:v,offset:i,limit:50})}),[e,l,t.id,i,v]);(0,a.d4)((()=>{Z(!1)}),[o]);const f=(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(Te.Z,{key:e,className:"chat-item-clickable",onClick:()=>f(e)},a.ZP.createElement(Ae.Z,{avatarSize:"tiny",userId:e,forceShowSelf:!0,noStatusOrTyping:!0})))):a.ZP.createElement(we.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:h,onClick:C})}()),a.ZP.createElement("div",{className:"answer-head",dir:E.isRtl?"rtl":void 0},a.ZP.createElement("span",{className:"answer-title",dir:"auto"},p),a.ZP.createElement("span",{className:"answer-percent",dir:E.isRtl?"auto":void 0},(b=s.votersCount,(I=r)>0?(b/I*100).toFixed():0),"%")));var b,I}))),Mr=(0,a.X$)((0,s.c$)((e=>{const{pollResults:{chatId:t,messageId:n},lastSyncTime:a}=e;return t&&n?{chat:(0,v.Z1)(e,t),message:(0,v.hj)(e,t,n),lastSyncTime:a}:{}}))((({onClose:e,isActive:t,chat:n,message:s,lastSyncTime:r})=>{const o=(0,u.Z)();if((0,m.ZP)(t,e),!s||!n)return a.ZP.createElement(we.Z,null);const{summary:i,results:l}=(0,g.t9)(s);if(!l.results)return;const c=(0,b.ee)(l.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,Pe.Z)(i.question,["emoji","br"])),a.ZP.createElement("div",{className:"poll-results-list custom-scroll"},r&&i.answers.map((e=>a.ZP.createElement(Nr,{key:`${s.id}-${e.option}`,chat:n,message:s,answer:e,answerVote:c[e.option],totalVoters:l.totalVoters}))),!r&&a.ZP.createElement(we.Z,null)))}))),Tr="Please provide first name",Fr=(0,a.X$)((0,s.c$)(((e,{userId:t})=>{const n=(0,v.dy)(e,t),a=(0,v.Z1)(e,t),{progress:s}=e.management;return{user:n,chat:a,progress:s,isMuted:(0,g.i4)(a,(0,v.dZ)(e),(0,v.NJ)(e))}}),((e,t)=>(0,b.ei)(t,["updateContact","deleteUser","closeManagement","openChat","deleteHistory"])))((({userId:e,user:t,chat:n,progress:s,isMuted:r,updateContact:i,deleteUser:l,deleteHistory:c,closeManagement:d,openChat:h,onClose:Z,isActive:P})=>{const[g,v,p]=(0,Xe.Z)(),[E,C]=(0,a.eJ)(!1),[f,b]=(0,a.eJ)(),I=(0,u.Z)();(0,m.ZP)(P,Z);const y=t&&t.firstName||"",S=t&&t.lastName||"",[w,k]=(0,a.eJ)(y),[N,M]=(0,a.eJ)(S),[T,F]=(0,a.eJ)(!r);(0,a.d4)((()=>{F(!r)}),[r]),(0,a.d4)((()=>{C(!1),p()}),[p,e]),(0,a.d4)((()=>{k(y),M(S)}),[y,S,t]),(0,a.d4)((()=>{s===o.wv.Complete&&(C(!1),b(void 0),p())}),[p,s]);const A=(0,a.I4)((e=>{k(e.target.value),C(!0)}),[]),L=(0,a.I4)((e=>{M(e.target.value),C(!0)}),[]),R=(0,a.I4)((e=>{F(e.target.checked),C(!0)}),[]),B=(0,a.I4)((()=>{const t=w.trim(),n=N.trim();t.length||b(Tr),i({userId:e,isMuted:!T,firstName:t,lastName:n})}),[w,N,i,e,T]),$=(0,a.I4)((()=>{c({chatId:n.id,shouldDeleteForAll:!1}),l({userId:e}),p(),d(),h({id:void 0})}),[n.id,p,d,c,l,h,e]);if(!t)return;const D=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(Ae.Z,{userId:t.id,avatarSize:"jumbo",status:"original name",withFullInfo:!0}),a.ZP.createElement(Ne.Z,{id:"user-first-name",label:I("UserInfo.FirstNamePlaceholder"),onChange:A,value:w,error:f===Tr?f:void 0}),a.ZP.createElement(Ne.Z,{id:"user-last-name",label:I("UserInfo.LastNamePlaceholder"),onChange:L,value:N}),a.ZP.createElement("div",{className:"ListItem no-selection narrow"},a.ZP.createElement(un.Z,{checked:T,label:I("Notifications"),subLabel:I(T?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),onChange:R}))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Te.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:v},I("DeleteContact")))),a.ZP.createElement(tn.Z,{isShown:E,onClick:B,disabled:D,ariaLabel:I("Save")},D?a.ZP.createElement(z.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Ge.Z,{isOpen:g,onClose:p,text:I("AreYouSureDeleteContact"),confirmLabel:I("DeleteContact"),confirmHandler:$,confirmIsDestructive:!0}))}))),Ar="Group title can't be empty",Lr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,v.Z1)(e,t),{progress:s}=e.management,r=Boolean(null===(n=a.fullInfo)||void 0===n?void 0:n.linkedChatId),o=(0,g.G9)(a);return{chat:a,progress:s,isBasicGroup:o,hasLinkedChannel:r,canChangeInfo:o?a.isCreator:(0,g.VE)(a,"changeInfo"),canBanUsers:o?a.isCreator:(0,g.VE)(a,"banUsers")}}),((e,t)=>(0,b.ei)(t,["togglePreHistoryHidden","updateChat","closeManagement","leaveChannel","deleteChannel","deleteChat","openChat"])))((({chatId:e,chat:t,progress:n,isBasicGroup:s,hasLinkedChannel:i,canChangeInfo:l,canBanUsers:c,onScreenSelect:d,togglePreHistoryHidden:Z,updateChat:P,deleteChat:v,leaveChannel:p,deleteChannel:E,closeManagement:C,openChat:f,onClose:b,isActive:I})=>{var y,S,w;const[k,N,M]=(0,Xe.Z)(),T=t.title,F=t.fullInfo&&t.fullInfo.about||"",[A,L]=(0,a.eJ)(!1),[R,B]=(0,a.eJ)(T),[$,D]=(0,a.eJ)(F),[x,U]=(0,a.eJ)(),[O,G]=(0,a.eJ)(),X=(0,g.RT)(t),J=(0,h.Z)(X,!1,r.IU.BlobUrl),_=(0,u.Z)();(0,m.ZP)(I,b),(0,a.d4)((()=>{n===o.wv.Complete&&(L(!1),G(void 0))}),[n]);const V=(0,a.I4)((()=>{d(o.u1.ChatPrivacyType)}),[d]),H=(0,a.I4)((()=>{d(o.u1.Discussion)}),[d]),Y=(0,a.I4)((()=>{d(o.u1.GroupPermissions)}),[d]),j=(0,a.I4)((()=>{d(o.u1.ChatAdministrators)}),[d]),K=(0,a.I4)((e=>{U(e),L(!0)}),[]),q=(0,a.I4)((e=>{B(e.target.value),L(!0)}),[]),W=(0,a.I4)((e=>{D(e.target.value),L(!0)}),[]),Q=(0,a.I4)((()=>{const t=R.trim(),n=$.trim();t.length?P({chatId:e,title:t,about:n,photo:x}):G(Ar)}),[$,e,x,R,P]),ee=(0,a.I4)((()=>{d(o.u1.GroupMembers)}),[d]),te=(0,a.I4)((()=>{if(!t.fullInfo)return;const{isPreHistoryHidden:e}=t.fullInfo;Z({chatId:t.id,isEnabled:!e})}),[t,Z]),ne=(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]),ae=(null===(y=t.fullInfo)||void 0===y||null===(S=y.adminMembers)||void 0===S?void 0:S.length)||0,se=(0,a.I4)((()=>{s?v({chatId:t.id}):t.isCreator?E({chatId:t.id}):p({chatId:t.id}),M(),C(),f({id:void 0})}),[s,t.isCreator,t.id,M,C,p,E,v,f]);if(t.isRestricted)return;const re=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(en.Z,{currentAvatarBlobUrl:J,onChange:K,disabled:!l}),a.ZP.createElement(Ne.Z,{id:"group-title",label:_("GroupName"),onChange:q,value:R,error:O===Ar?O:void 0,disabled:!l}),a.ZP.createElement(Ne.Z,{id:"group-about",className:"mb-2",label:_("DescriptionPlaceholder"),onChange:W,value:$,disabled:!l}),t.isCreator&&a.ZP.createElement(Te.Z,{icon:"lock",multiline:!0,onClick:V},a.ZP.createElement("span",{className:"title"},_("GroupType")),a.ZP.createElement("span",{className:"subtitle"},t.username?_("TypePublic"):_("TypePrivate"))),i&&a.ZP.createElement(Te.Z,{icon:"message",multiline:!0,onClick:H},a.ZP.createElement("span",{className:"title"},_("LinkedChannel")),a.ZP.createElement("span",{className:"subtitle"},_("DiscussionUnlink"))),a.ZP.createElement(Te.Z,{icon:"permissions",multiline:!0,onClick:Y,disabled:!c},a.ZP.createElement("span",{className:"title"},_("ChannelPermissions")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},ne,"/",8)),a.ZP.createElement(Te.Z,{icon:"admin",multiline:!0,onClick:j},a.ZP.createElement("span",{className:"title"},_("ChannelAdministrators")),a.ZP.createElement("span",{className:"subtitle"},(0,Fn.kh)(ae)))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Te.Z,{icon:"group",multiline:!0,onClick:ee},a.ZP.createElement("span",{className:"title"},_("GroupMembers")),a.ZP.createElement("span",{className:"subtitle"},(0,Fn.kh)(null!==(w=t.membersCount)&&void 0!==w?w:0))),t.fullInfo&&a.ZP.createElement("div",{className:"ListItem narrow no-selection"},a.ZP.createElement(un.Z,{checked:!t.fullInfo.isPreHistoryHidden,label:_("ChatHistory"),onChange:te,disabled:!c}))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Te.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:N},_("DeleteMega")))),a.ZP.createElement(tn.Z,{isShown:A,onClick:Q,disabled:re,ariaLabel:_("Save")},re?a.ZP.createElement(z.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Ge.Z,{isOpen:k,onClose:M,textParts:(0,Pe.Z)(s||!t.isCreator?_("AreYouSureDeleteAndExit"):_("AreYouSureDeleteThisChatWithGroup",t.title),["br","simple_markdown"]),confirmLabel:s||!t.isCreator?_("DeleteMega"):_("DeleteGroupForAll"),confirmHandler:se,confirmIsDestructive:!0}))}))),Rr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>({chat:(0,v.Z1)(e,t),currentUserId:e.currentUserId})),((e,t)=>(0,b.ei)(t,["updateChatDefaultBannedRights"])))((({onScreenSelect:e,onChatMemberSelect:t,chat:n,currentUserId:s,updateChatDefaultBannedRights:r,onClose:i,isActive:l})=>{const[c,d]=(0,a.eJ)({}),[h,Z]=(0,a.eJ)(!1),[P,g]=(0,a.eJ)(!1),v=(0,u.Z)();(0,m.ZP)(l,i);const p=(0,a.I4)((()=>{e(o.u1.GroupRemovedUsers)}),[e]),E=(0,a.I4)((()=>{e(o.u1.GroupUserPermissionsCreate)}),[e]),C=(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)||{}),Z(!1),setTimeout((()=>{g(!1)}),250)}),[n]);const f=(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])}}))),Z(!0)}),[]),b=(0,a.I4)((()=>{n&&(g(!0),r({chatId:n.id,bannedRights:c}))}),[n,c,r]),I=(0,a.Ye)((()=>n&&n.fullInfo&&n.fullInfo.kickedMembers?n.fullInfo.kickedMembers.length:0),[n]),y=(0,a.Ye)((()=>n&&n.fullInfo&&n.fullInfo.members?n.fullInfo.members.filter((({bannedRights:e})=>!!e)):[]),[n]),S=(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=v(s);return`${e}${e.length?`, ${r}`:r}`}),"")}),[n,v]);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"},v("ChannelPermissionsHeader")),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"sendMessages",checked:!c.sendMessages,label:v("UserRestrictionsSend"),blocking:!0,onChange:f})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"sendMedia",checked:!c.sendMedia,label:v("UserRestrictionsSendMedia"),blocking:!0,onChange:f})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"sendStickers",checked:!c.sendStickers&&!c.sendGifs,label:v("UserRestrictionsSendStickers"),blocking:!0,onChange:f})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"sendPolls",checked:!c.sendPolls,label:v("UserRestrictionsSendPolls"),blocking:!0,onChange:f})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"embedLinks",checked:!c.embedLinks,label:v("UserRestrictionsEmbedLinks"),blocking:!0,onChange:f})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"inviteUsers",checked:!c.inviteUsers,label:v("UserRestrictionsInviteUsers"),blocking:!0,onChange:f})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"pinMessages",checked:!c.pinMessages,label:v("UserRestrictionsPinMessages"),blocking:!0,onChange:f})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"changeInfo",checked:!c.changeInfo,label:v("UserRestrictionsChangeInfo"),blocking:!0,onChange:f}))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Te.Z,{icon:"delete-user",multiline:!0,narrow:!0,onClick:p},a.ZP.createElement("span",{className:"title"},v("ChannelBlockedUsers")),a.ZP.createElement("span",{className:"subtitle"},I))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement("h3",{className:"section-heading",dir:"auto"},v("PrivacyExceptions")),a.ZP.createElement(Te.Z,{icon:"add-user",onClick:E},v("ChannelAddException")),y.map((e=>a.ZP.createElement(Te.Z,{key:e.userId,className:"chat-item-clickable exceptions-member",onClick:()=>C(e)},a.ZP.createElement(Ae.Z,{userId:e.userId,status:S(e)})))))),a.ZP.createElement(tn.Z,{isShown:h,onClick:b,ariaLabel:v("Save"),disabled:P},P?a.ZP.createElement(z.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})))}))),Br=(0,a.X$)((0,s.c$)((e=>{const{currentUserId:t}=e;return{currentUserId:t}}),((e,t)=>(0,b.ei)(t,["loadMoreMembers","deleteChatMember"])))((({chat:e,currentUserId:t,isOpen:n,onClose:r,loadMoreMembers:o,deleteChatMember:i})=>{var l;const c=(0,u.Z)(),[d,m]=(0,a.eJ)(""),h=(0,a.sO)(null),Z=(0,a.Ye)((()=>{var n;const a=((null===(n=e.fullInfo)||void 0===n?void 0:n.members)||[]).reduce(((e,n)=>(n.isAdmin||n.isOwner||n.userId===t||e.push(n.userId),e)),[]),r=(0,s.Rd)().users.byId;return(0,g.kK)(a,r,d)}),[null===(l=e.fullInfo)||void 0===l?void 0:l.members,t,d]),P=(0,a.I4)((t=>{i({chatId:e.id,userId:t}),r()}),[e.id,i,r]);return a.ZP.createElement(Le,{isOpen:n,chatOrUserIds:Z,filterRef:h,filterPlaceholder:c("ChannelBlockUser"),filter:d,onFilterChange:m,loadMore:o,onSelectChatOrUser:P,onClose:r})}))),$r=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,v.Z1)(e,t),{byId:a}=e.users;return{chat:n,usersById:a,canDeleteMembers:n&&((0,g.VE)(n,"banUsers")||n.isCreator)}}),((e,t)=>(0,b.ei)(t,["updateChatMemberBannedRights"])))((({chat:e,usersById:t,canDeleteMembers:n,updateChatMemberBannedRights:s,onClose:r,isActive:o})=>{const i=(0,u.Z)(),[l,c,d]=(0,Xe.Z)();(0,m.ZP)(o,r);const h=(0,a.Ye)((()=>e&&e.fullInfo&&e.fullInfo.kickedMembers?e.fullInfo.kickedMembers:[]),[e]),Z=(0,a.I4)((e=>{if(!e.kickedByUserId)return;const n=t[e.kickedByUserId];return n?i("UserRemovedBy",(0,g.Js)(n)):void 0}),[i,t]),P=(0,a.I4)((t=>{if(e)return[{title:i("Unblock"),icon:"delete",destructive:!0,handler:()=>s({chatId:e.id,userId:t.userId,bannedRights:{}})}]}),[i,e,s]);return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section",dir:i.isRtl?"rtl":void 0},a.ZP.createElement("p",{className:"text-muted"},i("NoBlockedGroup2")),h.map((e=>a.ZP.createElement(Te.Z,{key:e.userId,className:"chat-item-clickable",ripple:!0,contextActions:P(e)},a.ZP.createElement(Ae.Z,{userId:e.userId,status:Z(e)})))),n&&a.ZP.createElement(tn.Z,{isShown:!0,onClick:c,ariaLabel:i("Channel.EditAdmin.Permission.BanUsers")},a.ZP.createElement("i",{className:"icon-add-user-filled"})),e&&n&&a.ZP.createElement(Br,{chat:e,isOpen:l,onClose:d}))))}))),Dr="Channel title can't be empty",xr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,v.Z1)(e,t),{progress:a}=e.management;return{chat:n,progress:a,isSignaturesShown:Boolean(null==n?void 0:n.isSignaturesShown),canChangeInfo:(0,g.VE)(n,"changeInfo")}}),((e,t)=>(0,b.ei)(t,["toggleSignatures","updateChat","closeManagement","leaveChannel","deleteChannel","openChat"])))((({chatId:e,chat:t,progress:n,isSignaturesShown:s,canChangeInfo:i,onScreenSelect:l,updateChat:c,toggleSignatures:d,closeManagement:Z,leaveChannel:P,deleteChannel:v,openChat:p,onClose:E,isActive:C})=>{var f,b,I,y;const S=t&&t.title||"",w=null!=t&&t.fullInfo&&t.fullInfo.about||"",k=null==t||null===(f=t.fullInfo)||void 0===f?void 0:f.linkedChatId,[N,M,T]=(0,Xe.Z)(),[F,A]=(0,a.eJ)(!1),[L,R]=(0,a.eJ)(S),[B,$]=(0,a.eJ)(w),[D,x]=(0,a.eJ)(),[U,O]=(0,a.eJ)(),G=t&&(0,g.RT)(t),X=(0,h.Z)(G,!1,r.IU.BlobUrl),J=(0,u.Z)();(0,m.ZP)(C,E),(0,a.d4)((()=>{n===o.wv.Complete&&(A(!1),O(void 0))}),[n]);const _=(null==t||null===(b=t.fullInfo)||void 0===b||null===(I=b.adminMembers)||void 0===I?void 0:I.length)||0,V=(0,a.I4)((()=>{l(o.u1.ChatPrivacyType)}),[l]),H=(0,a.I4)((()=>{l(o.u1.Discussion)}),[l]),Y=(0,a.I4)((()=>{l(o.u1.ChatAdministrators)}),[l]),j=(0,a.I4)((e=>{x(e),A(!0)}),[]),K=(0,a.I4)((e=>{R(e.target.value),A(!0)}),[]),q=(0,a.I4)((e=>{$(e.target.value),A(!0)}),[]),W=(0,a.I4)((()=>{const t=L.trim(),n=B.trim();t.length?c({chatId:e,title:t,about:n,photo:D}):O(Dr)}),[B,e,D,L,c]),Q=(0,a.I4)((()=>{d({chatId:e,isEnabled:!s})}),[e,s,d]),ee=(0,a.I4)((()=>{l(o.u1.ChannelSubscribers)}),[l]),te=(0,a.I4)((()=>{t.isCreator?v({chatId:t.id}):P({chatId:t.id}),T(),Z(),p({id:void 0})}),[t.isCreator,t.id,T,Z,P,v,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(en.Z,{currentAvatarBlobUrl:X,onChange:j,disabled:!i}),a.ZP.createElement(Ne.Z,{id:"channel-title",label:J("EnterChannelName"),onChange:K,value:L,error:U===Dr?U:void 0,disabled:!i}),a.ZP.createElement(Ne.Z,{id:"channel-about",className:"mb-2",label:J("DescriptionPlaceholder"),onChange:q,value:B,disabled:!i}),t.isCreator&&a.ZP.createElement(Te.Z,{icon:"lock",multiline:!0,onClick:V},a.ZP.createElement("span",{className:"title"},J("ChannelType")),a.ZP.createElement("span",{className:"subtitle"},t.username?J("TypePublic"):J("TypePrivate"))),a.ZP.createElement(Te.Z,{icon:"message",multiline:!0,onClick:H,disabled:!i},a.ZP.createElement("span",{className:"title"},J("Discussion")),a.ZP.createElement("span",{className:"subtitle"},J(k?"DiscussionUnlink":"Add"))),a.ZP.createElement(Te.Z,{icon:"admin",multiline:!0,onClick:Y},a.ZP.createElement("span",{className:"title"},J("ChannelAdministrators")),a.ZP.createElement("span",{className:"subtitle"},_)),a.ZP.createElement("div",{className:"ListItem no-selection narrow"},a.ZP.createElement(un.Z,{checked:s,label:J("ChannelSignMessages"),onChange:Q}))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Te.Z,{icon:"group",multiline:!0,onClick:ee},a.ZP.createElement("span",{className:"title",dir:"auto"},J("ChannelSubscribers")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},J("Subscribers",null!==(y=t.membersCount)&&void 0!==y?y:0,"i")))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Te.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:M},t.isCreator?J("ChannelDelete"):J("LeaveChannel")))),a.ZP.createElement(tn.Z,{isShown:F,onClick:W,disabled:ne,ariaLabel:J("Save")},ne?a.ZP.createElement(z.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Ge.Z,{isOpen:N,onClose:T,text:t.isCreator?J("ChannelDeleteAlert"):J("ChannelLeaveAlert"),confirmLabel:t.isCreator?J("ChannelDelete"):J("LeaveChannel"),confirmHandler:te,confirmIsDestructive:!0}))})));var Ur=n(88);const Or=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,v.Z1)(e,t),{isUsernameAvailable:a}=(0,v.aW)(e,t);return{chat:n,isChannel:(0,g.eA)(n),progress:e.management.progress,isUsernameAvailable:a}}),((e,t)=>(0,b.ei)(t,["checkPublicLink","updatePublicLink","updatePrivateLink"])))((({chat:e,onClose:t,isActive:n,isChannel:s,progress:r,isUsernameAvailable:i,checkPublicLink:l,updatePublicLink:c,updatePrivateLink:d})=>{var h;const Z=Boolean(e.username),P=null===(h=e.fullInfo)||void 0===h?void 0:h.inviteLink,[g,v]=(0,a.eJ)(Z?"public":"private"),[p,E]=(0,a.eJ)(),[C,f,b]=(0,Xe.Z)(),I=Boolean("public"===g&&p&&i||"private"===g&&Z);(0,m.ZP)(n,t),(0,a.d4)((()=>{g&&!P&&d()}),[g,P,d]);const y=(0,a.I4)((e=>{v(e)}),[]),S=(0,a.I4)((()=>{c({username:"public"===g?p:""})}),[g,c,p]),w=(0,a.I4)((()=>{b(),d()}),[b,d]),k=(0,u.Z)(),N=s?"Channel":"Mega",M=s?"Channel":"Group",T=[{value:"private",label:k(`${N}Private`),subLabel:k(`${N}PrivateInfo`)},{value:"public",label:k(`${N}Public`),subLabel:k(`${N}PublicInfo`)}],F=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:k.isRtl?"rtl":void 0},a.ZP.createElement("h3",{className:"section-heading"},k(`${M}Type`)),a.ZP.createElement(tt.Z,{selected:g,name:"channel-type",options:T,onChange:y})),"private"===g?a.ZP.createElement("div",{className:"section",dir:k.isRtl?"rtl":void 0},P?a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(Ur.Z,{url:P,className:"group-link",text:P}),a.ZP.createElement("p",{className:"section-info",dir:k.isRtl?"rtl":void 0},k(`${N}PrivateLinkHelp`)),a.ZP.createElement(Te.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:f},k("RevokeLink")),a.ZP.createElement(Ge.Z,{isOpen:C,onClose:b,text:k("RevokeAlert"),confirmLabel:k("RevokeButton"),confirmHandler:w,confirmIsDestructive:!0})):a.ZP.createElement(we.Z,null)):a.ZP.createElement("div",{className:"section no-border"},a.ZP.createElement(on,{asLink:!0,currentUsername:e.username,isLoading:F,isUsernameAvailable:i,checkUsername:l,onChange:E}),a.ZP.createElement("p",{className:"section-info",dir:"auto"},k(`${M}.Username.CreatePublicLinkHelp`)))),a.ZP.createElement(tn.Z,{isShown:I,disabled:F,ariaLabel:k("Save"),onClick:S},F?a.ZP.createElement(z.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})))}))),Gr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,v.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,v.Z1)(e,a.fullInfo.linkedChatId):void 0,isChannel:a&&(0,g.eA)(a)}}),((e,t)=>(0,b.ei)(t,["loadGroupsForDiscussion","linkDiscussionGroup","unlinkDiscussionGroup"])))((({chat:e,onClose:t,isActive:n,chatId:s,chatsByIds:r,linkedChat:l,forDiscussionIds:c,isChannel:d,onScreenSelect:h,loadGroupsForDiscussion:Z,linkDiscussionGroup:P,unlinkDiscussionGroup:g})=>{const[v,p]=(0,a.eJ)(),[E,C]=(0,a.eJ)(),[f,b]=(0,a.eJ)(!1),I=(0,a.I4)((()=>b(!0)),[]),[y,S,w]=(0,Xe.Z)(),[k,N,M]=(0,Xe.Z)(),T=(0,u.Z)(),F=null==l?void 0:l.id;(0,m.ZP)(n,t),(0,a.d4)((()=>{Z()}),[Z]),(0,a.d4)((()=>{E||(0,Pn.Z)("DiscussionGroups").then(C)}),[E]);const A=(0,a.I4)((()=>{w(),g({channelId:d?s:F}),d||h(o.u1.Initial)}),[w,g,d,s,F,h]),L=(0,a.I4)((()=>{M(),P({channelId:s,chatId:v})}),[M,P,s,v]);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"},E&&a.ZP.createElement(gn.Z,{id:"discussionGroupsDucks",size:i.bM,animationData:E,play:f,noLoop:!0,onLoad:I})),l&&a.ZP.createElement("div",null,a.ZP.createElement(Te.Z,{className:"chat-item-clickable",inactive:!0},a.ZP.createElement(Fe.Z,{chatId:l.id})),a.ZP.createElement(Te.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:S},T(d?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel")),a.ZP.createElement(Ge.Z,{isOpen:y,onClose:w,header:a.ZP.createElement("div",{className:"modal-header"},a.ZP.createElement(ge.Z,{size:"tiny",chat:l}),a.ZP.createElement("div",{className:"modal-title"},T(d?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"))),textParts:(0,Pe.Z)(T(d?"DiscussionUnlinkChannelAlert":"DiscussionUnlinkGroupAlert",l.title),["br","simple_markdown"]),confirmLabel:T(d?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"),confirmHandler:A,confirmIsDestructive:!0})),!l&&a.ZP.createElement("div",null,a.ZP.createElement("p",{className:"section-help",dir:"auto"},T("DiscussionChannelHelp")),a.ZP.createElement("div",{teactFastList:!0},a.ZP.createElement(Te.Z,{key:"create-group",icon:"group",ripple:!0,teactOrderKey:0,className:"not-implemented"},T("DiscussionCreateGroup")),c?c.map(((e,t)=>a.ZP.createElement(Te.Z,{key:e,teactOrderKey:t+1,className:"chat-item-clickable scroll-item",onClick:()=>{p(e),N()}},a.ZP.createElement(Fe.Z,{chatId:e})))):a.ZP.createElement(Et.Z,{key:"nothing-found",teactOrderKey:0,text:"No discussion groups found"})),a.ZP.createElement("p",{className:"mt-4 mb-0 section-help",dir:"auto"},T("DiscussionChannelHelp2")),a.ZP.createElement(Ge.Z,{isOpen:k,onClose:M,header:function(){const e=r[v];if(e)return a.ZP.createElement("div",{className:"modal-header"},a.ZP.createElement(ge.Z,{size:"tiny",chat:e}),a.ZP.createElement("div",{className:"modal-title"},T("Channel.DiscussionGroup.LinkGroup")))}(),textParts:function(){const t=r[v];if(t)return t.hasPrivateLink?(0,Pe.Z)(`Do you want to make **${t.title}** the discussion board for **${e.title}**?`,["br","simple_markdown"]):(0,Pe.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:T("DiscussionLinkGroup"),confirmHandler:L,isButtonsInOneRow:!0})))))}))),zr=(0,a.X$)((0,s.c$)(((e,{chatId:t,isPromotedByCurrentUser:n})=>{const a=(0,v.Z1)(e,t);return{chat:a,isFormFullyDisabled:!(a.isCreator||n)}}),((e,t)=>(0,b.ei)(t,["updateChatMemberBannedRights"])))((({chat:e,selectedChatMemberId:t,onScreenSelect:n,updateChatMemberBannedRights:s,isFormFullyDisabled:r,onClose:i,isActive:l})=>{const[c,d]=(0,a.eJ)({}),[h,Z]=(0,a.eJ)(!1),[P,g]=(0,a.eJ)(!1),[v,p,E]=(0,Xe.Z)(),C=(0,u.Z)();(0,m.ZP)(l,i);const f=(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&&!f&&n(o.u1.GroupPermissions)}),[e,n,f,t]),(0,a.d4)((()=>{d((null==f?void 0:f.bannedRights)||(null==e?void 0:e.defaultBannedRights)||{}),Z(!1),g(!1)}),[e,f]);const b=(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])}}))),Z(!0)}),[]),I=(0,a.I4)((()=>{e&&t&&(g(!0),s({chatId:e.id,userId:t,bannedRights:c}))}),[e,t,c,s]),y=(0,a.I4)((()=>{e&&t&&s({chatId:e.id,userId:t,bannedRights:{viewMessages:!0}})}),[e,t,s]),S=(0,a.I4)((t=>!!r||!(!e||!e.defaultBannedRights)&&e.defaultBannedRights[t]),[e,r]);if(f)return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Te.Z,{inactive:!0,className:"chat-item-clickable"},a.ZP.createElement(Ae.Z,{userId:f.userId})),a.ZP.createElement("h3",{className:"section-heading mt-4",dir:"auto"},C("UserRestrictionsCanDo")),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"sendMessages",checked:!c.sendMessages,label:C("UserRestrictionsSend"),blocking:!0,disabled:S("sendMessages"),onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"sendMedia",checked:!c.sendMedia,label:C("UserRestrictionsSendMedia"),blocking:!0,disabled:S("sendMedia"),onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"sendStickers",checked:!c.sendStickers&&!c.sendGifs,label:C("UserRestrictionsSendStickers"),blocking:!0,disabled:S("sendStickers"),onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"sendPolls",checked:!c.sendPolls,label:C("UserRestrictionsSendPolls"),blocking:!0,disabled:S("sendPolls"),onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"embedLinks",checked:!c.embedLinks,label:C("UserRestrictionsEmbedLinks"),blocking:!0,disabled:S("embedLinks"),onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"inviteUsers",checked:!c.inviteUsers,label:C("UserRestrictionsInviteUsers"),blocking:!0,disabled:S("inviteUsers"),onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"pinMessages",checked:!c.pinMessages,label:C("UserRestrictionsPinMessages"),blocking:!0,disabled:S("pinMessages"),onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"changeInfo",checked:!c.changeInfo,label:C("UserRestrictionsChangeInfo"),blocking:!0,disabled:S("changeInfo"),onChange:b}))),!r&&a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Te.Z,{icon:"delete-user",ripple:!0,destructive:!0,onClick:p},C("UserRestrictionsBlock")))),a.ZP.createElement(tn.Z,{isShown:h,onClick:I,ariaLabel:C("Save"),disabled:P},P?a.ZP.createElement(z.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Ge.Z,{isOpen:v,onClose:E,text:"Are you sure you want to ban and remove this user from the group?",confirmLabel:"Remove",confirmHandler:y,confirmIsDestructive:!0}))}))),Xr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,v.Z1)(e,t),{byId:a}=e.users;return{chat:n,currentUserId:e.currentUserId,isChannel:(0,g.eA)(n),usersById:a}}))((({chat:e,isChannel:t,currentUserId:n,usersById:s,onScreenSelect:r,onChatMemberSelect:i,onClose:l,isActive:c})=>{const d=(0,u.Z)();(0,m.ZP)(c,l);const h=(0,a.Ye)((()=>e.fullInfo&&e.fullInfo.adminMembers?e.fullInfo.adminMembers.sort(((e,t)=>e.isOwner?-1:t.isOwner?1:0)):[]),[e]),Z=(0,a.I4)((e=>{i(e.userId,e.promotedByUserId===n),r(o.u1.ChatAdminRights)}),[n,i,r]),P=(0,a.I4)((e=>{if(e.isOwner)return d("ChannelCreator");const t=e.promotedByUserId?s[e.promotedByUserId]:void 0;return t?d("EditAdminPromotedBy",(0,g.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(Te.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."),h.map((e=>a.ZP.createElement(Te.Z,{key:e.userId,className:"chat-item-clickable",onClick:()=>Z(e)},a.ZP.createElement(Ae.Z,{userId:e.userId,status:P(e),forceShowSelf:!0})))))))}))),Jr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>({chat:(0,v.Z1)(e,t)})))((({chat:e,onClose:t,isActive:n})=>{const s=(0,u.Z)();(0,m.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(un.Z,{name:"changeInfo",checked:!0,label:s("EventLogAllEvents"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterNewAdmins"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterNewMembers"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterChannelInfo"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterDeletedMessages"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterEditedMessages"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.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(un.Z,{name:"changeInfo",checked:!0,label:s("EventLogAllAdmins"),onChange:void 0})),r.map((e=>a.ZP.createElement(Te.Z,{key:e.userId,className:"chat-item-clickable picker-list-item",onClick:void 0,ripple:!0},a.ZP.createElement(un.Z,{label:"",checked:!0}),a.ZP.createElement(Ae.Z,{userId:e.userId,status:o(e),forceShowSelf:!0})))))))}))),_r=(0,a.X$)((0,s.c$)(((e,{chatId:t,isPromotedByCurrentUser:n})=>{const a=(0,v.Z1)(e,t),{byId:s}=e.users,{currentUserId:r}=e;return{chat:a,usersById:s,currentUserId:r,isChannel:(0,g.eA)(a),isFormFullyDisabled:!(a.isCreator||n)}}),((e,t)=>(0,b.ei)(t,["updateChatAdmin"])))((({selectedChatMemberId:e,onScreenSelect:t,chat:n,usersById:s,currentUserId:r,isChannel:i,isFormFullyDisabled:l,updateChatAdmin:c,onClose:d,isActive:h})=>{const[Z,P]=(0,a.eJ)({}),[v,p]=(0,a.eJ)(!1),[E,C]=(0,a.eJ)(!1),[f,b,I]=(0,Xe.Z)(),[y,S]=(0,a.eJ)(""),w=(0,u.Z)();(0,m.ZP)(h,d);const k=(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&&!k&&t(o.u1.ChatAdministrators)}),[n,t,k,e]),(0,a.d4)((()=>{P((null==k?void 0:k.adminRights)||{}),S(((null==k?void 0:k.customTitle)||"").substr(0,16)),p(!1),C(!1)}),[k]);const N=(0,a.I4)((e=>{const{name:t}=e.target;P((e=>{return{...e,[t]:(n=e[t],!n||void 0)};var n})),p(!0)}),[]),M=(0,a.I4)((()=>{e&&(C(!0),c({chatId:n.id,userId:e,adminRights:Z,customTitle:y}))}),[n,e,Z,y,c]),T=(0,a.I4)((()=>{e&&(c({chatId:n.id,userId:e,adminRights:{}}),I())}),[n.id,I,e,c]),F=(0,a.I4)((e=>!((0,g.G9)(n)||!l&&n.adminRights&&n.adminRights[e])),[n,l]),A=(0,a.Ye)((()=>{if(!k)return;if(k.isOwner)return w("ChannelCreator");const e=k.promotedByUserId?s[k.promotedByUserId]:void 0;return e?w("EditAdminPromotedBy",(0,g.Js)(e)):w("ChannelAdmin")}),[k,s,w]),L=(0,a.I4)((e=>{const{value:t}=e.target;S(t),p(!0)}),[]);if(k)return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Te.Z,{inactive:!0,className:"chat-item-clickable"},a.ZP.createElement(Ae.Z,{userId:k.userId,status:A,forceShowSelf:!0})),a.ZP.createElement("h3",{className:"section-heading mt-4",dir:"auto"},w("EditAdminWhatCanDo")),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"changeInfo",checked:!!Z.changeInfo,label:w(i?"EditAdminChangeChannelInfo":"EditAdminChangeGroupInfo"),blocking:!0,disabled:F("changeInfo"),onChange:N})),i&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"postMessages",checked:!!Z.postMessages,label:w("EditAdminPostMessages"),blocking:!0,disabled:F("postMessages"),onChange:N})),i&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"editMessages",checked:!!Z.editMessages,label:w("EditAdminEditMessages"),blocking:!0,disabled:F("editMessages"),onChange:N})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"deleteMessages",checked:!!Z.deleteMessages,label:w(i?"EditAdminDeleteMessages":"EditAdminGroupDeleteMessages"),blocking:!0,disabled:F("deleteMessages"),onChange:N})),!i&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"banUsers",checked:!!Z.banUsers,label:w("EditAdminBanUsers"),blocking:!0,disabled:F("banUsers"),onChange:N})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"inviteUsers",checked:!!Z.inviteUsers,label:w("EditAdminAddUsers"),blocking:!0,disabled:F("inviteUsers"),onChange:N})),!i&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"pinMessages",checked:!!Z.pinMessages,label:w("EditAdminPinMessages"),blocking:!0,disabled:F("pinMessages"),onChange:N})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"addAdmins",checked:!!Z.addAdmins,label:w("EditAdminAddAdmins"),blocking:!0,disabled:F("addAdmins"),onChange:N})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"manageCall",checked:!!Z.manageCall,label:w("StartVoipChatPermission"),blocking:!0,disabled:F("manageCall"),onChange:N})),!i&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"anonymous",checked:!!Z.anonymous,label:w("EditAdminSendAnonymously"),blocking:!0,disabled:F("anonymous"),onChange:N})),l&&a.ZP.createElement("p",{className:"section-info mb-4",dir:"auto"},w("Channel.EditAdmin.CannotEdit")),!i&&a.ZP.createElement(Ne.Z,{id:"admin-title",label:w("EditAdminRank"),onChange:L,value:y,disabled:l,maxLength:16}),r!==e&&!l&&a.ZP.createElement(Te.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:b},w("EditAdminRemoveAdmin")))),a.ZP.createElement(tn.Z,{isShown:v,onClick:M,ariaLabel:w("Save"),disabled:E},E?a.ZP.createElement(z.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Ge.Z,{isOpen:f,onClose:I,text:"Are you sure you want to dismiss this admin?",confirmLabel:"Dismiss",confirmHandler:T,confirmIsDestructive:!0}))}))),Vr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,v.Z1)(e,t),{byId:s,statusesById:r}=e.users;return{members:null==a||null===(n=a.fullInfo)||void 0===n?void 0:n.members,usersById:s,userStatusesById:r,isChannel:a&&(0,g.eA)(a),serverTimeOffset:e.serverTimeOffset}}),((e,t)=>(0,b.ei)(t,["openUserInfo"])))((({members:e,usersById:t,userStatusesById:n,isChannel:s,openUserInfo:r,onClose:o,isActive:i,serverTimeOffset:l})=>{const c=(0,a.Ye)((()=>{if(e&&t)return(0,g.Z0)(e.map((({userId:e})=>e)),t,n,void 0,l)}),[e,l,t,n]),d=(0,a.I4)((e=>{r({id:e})}),[r]);return(0,m.ZP)(i,o),a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section",teactFastList:!0},c?c.map(((e,t)=>a.ZP.createElement(Te.Z,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>d(e)},a.ZP.createElement(Ae.Z,{userId:e,forceShowSelf:!0})))):a.ZP.createElement(Et.Z,{teactOrderKey:0,key:"nothing-found",text:s?"No subscribers found":"No members found"}))))}))),Hr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,v.Z1)(e,t),{byId:s,statusesById:r}=e.users;return{members:null==a||null===(n=a.fullInfo)||void 0===n?void 0:n.members,usersById:s,userStatusesById:r,isChannel:a&&(0,g.eA)(a),serverTimeOffset:e.serverTimeOffset}}))((({usersById:e,userStatusesById:t,members:n,isChannel:s,onScreenSelect:r,onChatMemberSelect:i,onClose:l,isActive:c,serverTimeOffset:d})=>{(0,m.ZP)(c,l);const u=(0,a.Ye)((()=>{if(n&&e)return(0,g.Z0)(n.filter((e=>!e.isOwner)).map((({userId:e})=>e)),e,t,void 0,d)}),[n,d,e,t]),h=(0,a.I4)((e=>{i(e),r(o.u1.GroupUserPermissions)}),[i,r]);return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section",teactFastList:!0},u?u.map(((e,t)=>a.ZP.createElement(Te.Z,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>h(e)},a.ZP.createElement(Ae.Z,{userId:e,forceShowSelf:!0})))):a.ZP.createElement(Et.Z,{teactOrderKey:0,key:"nothing-found",text:s?"No subscribers found":"No members found"}))))}))),Yr=(0,a.X$)((0,s.c$)((e=>({managementType:(0,v.pP)(e)})))((({chatId:e,currentScreen:t,selectedChatMemberId:n,isPromotedByCurrentUser:s,onScreenSelect:r,onChatMemberSelect:i,onClose:l,isActive:c,managementType:d})=>{switch(t){case o.u1.Initial:switch(d){case"user":return a.ZP.createElement(Fr,{key:e,userId:e,onClose:l,isActive:c});case"group":return a.ZP.createElement(Lr,{key:e,chatId:e,onScreenSelect:r,onClose:l,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(xr,{key:e,chatId:e,onScreenSelect:r,onClose:l,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(Or,{chatId:e,isActive:c,onClose:l});case o.u1.Discussion:return a.ZP.createElement(Gr,{chatId:e,onScreenSelect:r,isActive:c,onClose:l});case o.u1.GroupPermissions:return a.ZP.createElement(Rr,{chatId:e,onScreenSelect:r,onChatMemberSelect:i,isActive:c||[o.u1.GroupRemovedUsers,o.u1.GroupUserPermissionsCreate,o.u1.GroupUserPermissions].includes(t),onClose:l});case o.u1.GroupRemovedUsers:return a.ZP.createElement($r,{chatId:e,isActive:c,onClose:l});case o.u1.GroupUserPermissionsCreate:return a.ZP.createElement(Hr,{chatId:e,onChatMemberSelect:i,onScreenSelect:r,isActive:c||[o.u1.GroupUserPermissions].includes(t),onClose:l});case o.u1.GroupUserPermissions:return a.ZP.createElement(zr,{chatId:e,selectedChatMemberId:n,isPromotedByCurrentUser:s,onScreenSelect:r,isActive:c,onClose:l});case o.u1.ChatAdministrators:return a.ZP.createElement(Xr,{chatId:e,onScreenSelect:r,onChatMemberSelect:i,isActive:c||[o.u1.ChatAdminRights,o.u1.GroupRecentActions].includes(t),onClose:l});case o.u1.GroupRecentActions:return a.ZP.createElement(Jr,{chatId:e,isActive:c,onClose:l});case o.u1.ChatAdminRights:return a.ZP.createElement(_r,{chatId:e,selectedChatMemberId:n,isPromotedByCurrentUser:s,onScreenSelect:r,isActive:c,onClose:l});case o.u1.ChannelSubscribers:case o.u1.GroupMembers:return a.ZP.createElement(Vr,{chatId:e,isActive:c,onClose:l})}})));var jr=n(9937);const Kr=/^4[0-9]{12}(?:[0-9]{1,3})?$/,qr=/^5[1-5][0-9]{11,14}$/,Wr=/^2[2-7][0-9]{11,14}$/;let Qr;!function(e){e[e.Default=0]="Default",e[e.Visa=1]="Visa",e[e.Mastercard=2]="Mastercard"}(Qr||(Qr={}));const eo={[Qr.Default]:"",[Qr.Visa]:"visa",[Qr.Mastercard]:"mastercard"};function to(e){return e=e.replace(/\s/g,""),Kr.test(e)?Qr.Visa:qr.test(e)||Wr.test(e)?Qr.Mastercard:Qr.Default}const no={},ao=/(\d{1,3})(\d{1,3})?(\d{1,3})?(\d{1,3})?(\d{1,3})?/,so="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 ao;const t=e[0];let n;if(!no[t]){const e=t.split("").map(Number);n=e.reduce(((e,t,n)=>`${e}(\\d{1,${t}})${n>0?"?":""}`),""),no[t]=new RegExp(`${n}${"()?".repeat(5-e.length)}`)}return no[t]}(e.match(/\d+$/))}))),ro={streetLine1:"",streetLine2:"",city:"",state:"",countryIso2:"",postCode:"",fullName:"",email:"",phone:"",shipping:"",cardNumber:"",cardholder:"",expiry:"",cvv:"",billingCountry:"",billingZip:"",saveInfo:!0,saveCredentials:!1,formErrors:{}},oo=(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:io(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:io(t.payload.countryIso2)}:{...e,...t.payload};case"setFormErrors":return{...e,formErrors:{...e.formErrors,...t.payload}};default:return e}};function io(e){const t=so.find((({id:t})=>t===e));return t?t.name:""}function lo(e,t=400){(0,a.d4)((()=>{f.$b||setTimeout((()=>{(0,G.T2)((()=>{e.current&&e.current.focus()}))}),t)}),[e,t])}const co=(0,a.X$)((e=>{const{id:t,value:n,label:s,hasArrow:r,error:o,ref:i,placeholder:l,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:l||s,ref:i},d),m&&t&&a.ZP.createElement("label",{htmlFor:t},m))})),mo=(0,a.X$)((({state:e,needEmail:t,needPhone:n,needName:s,needAddress:r,dispatch:o})=>{const i=(0,a.sO)(null),l=(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,u.Z)();lo(i);const m=(0,a.I4)((e=>{o({type:"changeAddress1",payload:e.target.value})}),[o]),h=(0,a.I4)((e=>{o({type:"changeAddress2",payload:e.target.value})}),[o]),Z=(0,a.I4)((e=>{o({type:"changeCity",payload:e.target.value})}),[o]),P=(0,a.I4)((e=>{o({type:"changeState",payload:e.target.value})}),[o]),g=(0,a.I4)((e=>{o({type:"changeCountry",payload:e.target.value})}),[o]),v=(0,a.I4)((e=>{o({type:"changePostCode",payload:e.target.value})}),[o]),p=(0,a.I4)((e=>{o({type:"changeFullName",payload:e.target.value})}),[o]),E=(0,a.I4)((e=>{o({type:"changeEmail",payload:e.target.value})}),[o]),C=(0,a.I4)((e=>{let{value:t}=e.target;t=`+${t.replace(/\D/g,"")}`,l.current&&(l.current.value=t),o({type:"changePhone",payload:t})}),[o]),f=(0,a.I4)((e=>{o({type:"changeSaveInfo",payload:e.target.value})}),[o]),{formErrors:b}=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(Ne.Z,{ref:i,label:"Address1 (Street)",onChange:m,value:e.streetLine1,inputMode:"text",error:b.streetLine1}),a.ZP.createElement(Ne.Z,{label:"Address2 (Street)",onChange:h,value:e.streetLine2,inputMode:"text",error:b.streetLine2}),a.ZP.createElement(Ne.Z,{label:"City",onChange:Z,value:e.city,inputMode:"text",error:b.city}),a.ZP.createElement(Ne.Z,{label:"State",onChange:P,value:e.state,inputMode:"text",error:b.state}),a.ZP.createElement(co,{label:"Country",placeholder:"Country",onChange:g,value:e.countryIso2,hasArrow:Boolean(!0),id:"shipping-country",error:b.countryIso2,ref:c},so.map((({name:e,id:t})=>a.ZP.createElement("option",{value:t,className:"county-item"},e)))),a.ZP.createElement(Ne.Z,{label:"Post Code",onChange:v,value:e.postCode,inputMode:"text",error:b.postCode})):void 0,s||t||n?a.ZP.createElement("h5",null,d("PaymentShippingReceiver")):void 0,s&&a.ZP.createElement(Ne.Z,{label:"Full name",onChange:p,value:e.fullName,inputMode:"text",error:b.fullName}),t&&a.ZP.createElement(Ne.Z,{label:"Email",onChange:E,value:e.email,inputMode:"email",error:b.email}),n&&a.ZP.createElement(Ne.Z,{label:"Phone number",onChange:C,value:e.phone,inputMode:"tel",error:b.phone,ref:l}),a.ZP.createElement(un.Z,{label:d("PaymentShippingSave"),subLabel:d("PaymentShippingSaveInfo"),checked:Boolean(e.saveInfo),onChange:f})))})),uo=(0,a.X$)((({state:e,shippingOptions:t,currency:n,dispatch:s})=>{const r=(0,u.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]),i=(0,a.Ye)((()=>t.map((({id:e,title:t,amount:a})=>({label:t,subLabel:(0,jr.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(tt.Z,{name:"shipping-options",options:i,onChange:o,selected:e.shipping})))}));function ho(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,jr.x)(n,s,e)))}function Zo(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 Po=(0,a.X$)((({invoiceContent:e,prices:t,shippingPrices:n,checkoutInfo:s,currency:r,totalPrice:o})=>{const i=(0,u.Z)(),{photoUrl:l,title:c,text:d}=e||{},{paymentMethod:m,paymentProvider:h,shippingAddress:Z,name:P,phone:g,shippingMethod:v}=s||{};return a.ZP.createElement("div",{className:"Checkout"},a.ZP.createElement("div",{className:"description has-image"},l&&a.ZP.createElement("img",{src:l,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=>ho(i.code,e.label,e.amount,r))),n&&n.map((e=>ho(i.code,e.label,e.amount,r))),void 0!==o&&ho(i.code,i("Checkout.TotalAmount"),o,r,!0)),a.ZP.createElement("div",{className:"invoice-info"},m&&Zo("icon-card",m,"Payment method"),h&&Zo("stripe-provider",h,"Payment provider"),Z&&Zo("icon-location",Z,"Shipping address"),P&&Zo("icon-user",P,"Name"),g&&Zo("icon-phone",g,"Phone number"),v&&Zo("icon-truck",v,"Shipping method")))})),go=(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(Ne.Z,{label:"Expiry date",ref:s,onChange:o,onKeyDown:r,value:e,error:t,inputMode:"numeric",maxLength:5})}));var vo=n(6352),po=n(5753);const Eo=(0,a.X$)((({value:e,error:t,onChange:n})=>{const s=(0,a.sO)(null);lo(s);const[r,o]=(0,a.eJ)(Qr.Default);(0,a.d4)((()=>{const t=to(e);o(t)}),[]);const i=(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=to(e.target.value);o(a),n(t),s.current&&(s.current.value=t)}),[n,s]),l=function(e){switch(e){case Qr.Mastercard:return a.ZP.createElement("img",{src:vo,alt:""});case Qr.Visa:return a.ZP.createElement("img",{src:po,alt:""});default:return}}(r);return a.ZP.createElement("div",{className:"CardInput"},a.ZP.createElement("span",{className:"left-addon"},l),a.ZP.createElement(Ne.Z,{ref:s,label:"Card number",onChange:i,value:e,inputMode:"numeric",className:r?"has-left-addon":"",error:t,maxLength:23}))})),Co=(0,a.X$)((({state:e,canSaveCredentials:t,needCardholderName:n,needCountry:s,needZip:r,dispatch:o})=>{const i=(0,a.sO)(null);(0,a.d4)((()=>{i.current&&i.current.value!==e.billingCountry&&(i.current.value=e.billingCountry)}),[e.billingCountry]);const l=(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]),h=(0,a.I4)((e=>{o({type:"changeBillingCountry",payload:e.target.value})}),[o]),Z=(0,a.I4)((e=>{o({type:"changeBillingZip",payload:e.target.value})}),[o]),P=(0,a.I4)((e=>{o({type:"changeSaveCredentials",payload:e.target.value})}),[o]),g=(0,u.Z)(),{formErrors:v={}}=e;return a.ZP.createElement("div",{className:"PaymentInfo"},a.ZP.createElement("form",null,a.ZP.createElement("h5",null,g("PaymentCardTitle")),a.ZP.createElement(Eo,{onChange:l,value:e.cardNumber,error:v.cardNumber}),n&&a.ZP.createElement(Ne.Z,{label:"Name on card",onChange:c,value:e.cardholder,inputMode:"text",error:v.cardholder}),a.ZP.createElement("section",{className:"inline-inputs"},a.ZP.createElement(go,{value:e.expiry,onChange:d,error:v.expiry}),a.ZP.createElement(Ne.Z,{label:"CVV code",onChange:m,value:e.cvv,inputMode:"numeric",maxLength:3,error:v.cvv})),s||r?a.ZP.createElement("h5",null,g("PaymentBillingAddress")):void 0,s&&a.ZP.createElement(co,{label:"Country",placeholder:"Country",onChange:h,value:e.billingCountry,hasArrow:Boolean(!0),id:"billing-country",error:v.billingCountry,ref:i},so.map((({name:e})=>a.ZP.createElement("option",{value:e,className:"county-item"},e)))),r&&a.ZP.createElement(Ne.Z,{label:"Post Code",onChange:Z,value:e.billingZip,inputMode:"text",error:v.billingZip}),t&&a.ZP.createElement(un.Z,{label:g("PaymentCardSavePaymentInformation"),checked:e.saveCredentials,onChange:P})))})),fo=(0,a.X$)((0,s.c$)((e=>{const{step:t,shippingOptions:n,savedInfo:a,canSaveCredentials:s,invoice:r,invoiceContent:o,nativeProvider:i,nativeParams:l,passwordMissing:c,error:d}=e.payment,m=Boolean(r&&(!i||"stripe"!==i)),{needCardholderName:u,needCountry:h,needZip:Z}=l||{},{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:i,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,b.ei)(t,["validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError"])))((({isOpen:e,onClose:t,step:n,shippingOptions:s,savedInfo:r,canSaveCredentials:i,nameRequested:l,shippingAddressRequested:c,phoneRequested:d,emailRequested:m,phoneToProvider:h,emailToProvider:Z,currency:P,passwordMissing:g,isProviderError:v,invoiceContent:p,nativeProvider:E,prices:C,needCardholderName:f,needCountry:b,needZip:I,error:y,validateRequestedInfo:S,sendPaymentForm:w,setPaymentStep:k,sendCredentialsInfo:N,clearPaymentError:M})=>{const[T,A]=(0,Ht.Z)(oo,ro),[R,B]=(0,a.eJ)(!1),$=(0,u.Z)();(0,a.d4)((()=>{(n||y)&&B(!1)}),[n,y]),(0,a.d4)((()=>{null!=y&&y.field&&A({type:"setFormErrors",payload:{[y.field]:y.message}})}),[y,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 D=(0,a.I4)((()=>{M()}),[M]),x=(0,a.Ye)((()=>n!==o.KB.Checkout?0:function(e=[],t,n){const a=t?Io(t,n):[];let s=0;return s=e.concat(a||[]).reduce(((e,t)=>e+t.amount),s),s}(C,s,T.shipping)),[n,T.shipping,C,s]),U=(0,a.Ye)((()=>{if(n===o.KB.Checkout)return function(e,t,n){const a=`${function(e){const t=to(e);return eo[t]||""}(e.cardNumber)} *${e.cardNumber.slice(-4)}`,s=e.streetLine1?`${e.streetLine1}, ${e.city}, ${e.countryIso2}`:void 0,{phone:r,fullName:o}=e,i=t?bo(t,e.shipping):void 0;return{paymentMethod:a,paymentProvider:n,shippingAddress:s,name:o,phone:r,shippingMethod:null==i?void 0:i.title}}(T,s,E||"")}),[n,T,s,E]),O=(0,a.I4)((()=>{const{saveInfo:e}=T,t=function(e){const{streetLine1:t,streetLine2:n,city:a,state:s,countryIso2:r,postCode:o,fullName:i,phone:l,email:c}=e;return{name:i,phone:l,email:c,shippingAddress:{streetLine1:t,streetLine2:n,city:a,state:s,countryIso2:r,postCode:o}}}(T);S({requestInfo:t,saveInfo:e})}),[S,T]),G=(0,a.I4)((()=>{const e=function(e){const{cardNumber:t,cardholder:n,expiry:a,cvv:s,billingCountry:r,billingZip:o}=e,[i,l]=a.split("/");return{data:{cardNumber:t,cardholder:n,expiryMonth:i,expiryYear:l,cvv:s,country:r,zip:o}}}(T);N({credentials:e})}),[N,T]),X=(0,a.I4)((()=>{w({shippingOptionId:T.shipping,saveCredentials:T.saveCredentials})}),[w,T]),J=(0,a.I4)((e=>{k({step:e})}),[k]),_=(0,a.I4)((()=>{switch(B(!0),n){case o.KB.ShippingInfo:return O();case o.KB.Shipping:return J(o.KB.PaymentInfo);case o.KB.PaymentInfo:return G();case o.KB.Checkout:return X();default:return()=>{}}}),[n,O,J,G,X]),V=(0,a.Ye)((()=>{switch(n){case o.KB.ShippingInfo:return $("PaymentShippingInfo");case o.KB.Shipping:return $("PaymentShippingMethod");case o.KB.PaymentInfo:return $("PaymentCardInfo");case o.KB.Checkout:return $("PaymentCheckout");default:return""}}),[n,$]),H=(0,a.Ye)((()=>{switch(n){case o.KB.Checkout:return $("Checkout.PayPrice",(0,jr.x)(x,P,$.code));default:return $("Next")}}),[n,$,P,x]);return v?a.ZP.createElement(ke.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(F.Z,{isText:!0,onClick:t},$("OK"))):a.ZP.createElement(ke.Z,{className:"PaymentModal",isOpen:e,onClose:t},a.ZP.createElement("div",{className:"header",dir:$.isRtl?"rtl":void 0},a.ZP.createElement(F.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,V)),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(mo,{state:T,dispatch:A,needAddress:Boolean(c),needEmail:Boolean(m||Z),needPhone:Boolean(d||h),needName:Boolean(l)});case o.KB.Shipping:return a.ZP.createElement(uo,{state:T,dispatch:A,shippingOptions:s||[],currency:P});case o.KB.PaymentInfo:return a.ZP.createElement(Co,{state:T,dispatch:A,canSaveCredentials:Boolean(!g&&i),needCardholderName:f,needCountry:b,needZip:I});case o.KB.Checkout:return a.ZP.createElement(Po,{prices:C,shippingPrices:T.shipping&&s?Io(s,T.shipping):void 0,totalPrice:x,invoiceContent:p,checkoutInfo:U,currency:P});default:return}}(n)))):a.ZP.createElement("div",{className:"empty-content"},a.ZP.createElement(z.Z,{color:"gray"})),a.ZP.createElement("div",{className:"footer"},a.ZP.createElement(F.Z,{type:"submit",onClick:_,disabled:R,isLoading:R},H)),y&&!y.field&&function(){if(y)return a.ZP.createElement(ke.Z,{className:"error",isOpen:Boolean(y),onClose:D},a.ZP.createElement("h4",null,y.description||"Error"),a.ZP.createElement("p",null,y.description||"Error"),a.ZP.createElement(F.Z,{isText:!0,onClick:M},$("OK")))}())})));function bo(e,t){return e.find((({id:e})=>e===t))}function Io(e,t){const n=bo(e,t);return null==n?void 0:n.prices}const yo=(0,a.X$)((0,s.c$)((e=>{const{receipt:t}=e.payment,{currency:n,prices:a,info:s,totalAmount:r,credentialsTitle:o,shippingPrices:i,shippingMethod:l,photoUrl:c,text:d,title:m}=t||{};return{currency:n,prices:a,info:s,totalAmount:r,credentialsTitle:o,shippingPrices:i,shippingMethod:l,photoUrl:c,text:d,title:m}}))((({isOpen:e,onClose:t,prices:n,shippingPrices:s,totalAmount:r,currency:o,info:i,photoUrl:l,text:c,title:d,credentialsTitle:m,shippingMethod:h})=>{const Z=(0,u.Z)(),P=(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,i,h)),[i,h,m]);return a.ZP.createElement(ke.Z,{className:"PaymentModal PaymentModal-receipt",isOpen:e,onClose:t},a.ZP.createElement("div",null,a.ZP.createElement("div",{className:"header",dir:Z.isRtl?"rtl":void 0},a.ZP.createElement(F.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," ",Z("PaymentReceipt")," ")),a.ZP.createElement("div",{className:"receipt-content custom-scroll"},a.ZP.createElement(Po,{prices:n,shippingPrices:s,totalPrice:r,invoiceContent:{photoUrl:l,text:c,title:d},checkoutInfo:P,currency:o}))))})))},9364:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(4050),s=n(3716),r=n(7361),o=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:m="Password",submitLabel:u="Next",clearError:h,onChangePasswordVisibility:Z,onInputChange:P,onSubmit:g})=>{const v=(0,a.sO)(null),p=(0,i.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(l.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),i=n(7799);const l=[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(i.Z,{id:"closeMonkey",size:t?s.K2:m,className:g?"hidden":"shown",animationData:n,playSegment:l,noLoop:!0,onLoad:p}),u&&a.ZP.createElement(i.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),i=n(9107),l=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,i.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(l.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,i]=(0,a.eJ)(),[l,c]=(0,a.eJ)(n);(0,a.d4)((()=>{c(n)}),[n]);const d=(0,s.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(P,{file:o,onClose:function(){i(void 0)},onChange:function(e){i(void 0),r(e),l&&URL.revokeObjectURL(l),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=477.51d8c60b6925b9015068.js.map \ No newline at end of file diff --git a/dist/477.51d8c60b6925b9015068.js.map b/dist/477.51d8c60b6925b9015068.js.map new file mode 100644 index 000000000..82610a913 --- /dev/null +++ b/dist/477.51d8c60b6925b9015068.js.map @@ -0,0 +1 @@ +{"version":3,"file":"477.51d8c60b6925b9015068.js","mappings":"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","sources":["webpack://telegram-t/./src/components/mediaViewer/helpers/ghostAnimation.ts","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/MediaViewerContent.tsx","webpack://telegram-t/./src/components/mediaViewer/MediaViewerSlides.tsx","webpack://telegram-t/./src/components/mediaViewer/PanZoom.tsx","webpack://telegram-t/./src/components/mediaViewer/SenderInfo.tsx","webpack://telegram-t/./src/components/mediaViewer/SlideTransition.tsx","webpack://telegram-t/./src/components/mediaViewer/ZoomControls.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/components/common/SeenByModal.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 '.MediaViewerSlide--active img, .MediaViewerSlide--active 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('.Transition__slide--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 = `.Transition__slide--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 .Transition__slide--active .ChatInfo .Avatar';\n mediaSelector = 'img.avatar-media';\n break;\n\n case MediaViewerOrigin.SettingsAvatar:\n containerSelector = '#Settings .ProfileInfo .Transition__slide--active .ProfilePhoto';\n mediaSelector = 'img.avatar-media';\n break;\n\n case MediaViewerOrigin.ProfileAvatar:\n containerSelector = '#RightColumn .ProfileInfo .Transition__slide--active .ProfilePhoto';\n mediaSelector = 'img.avatar-media';\n break;\n\n case MediaViewerOrigin.ScheduledInline:\n case MediaViewerOrigin.Inline:\n default:\n containerSelector = `.Transition__slide--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, {\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, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiDimensions, ApiMediaFormat, ApiMessage, ApiUser,\n} from '../../api/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport useBlurSync from '../../hooks/useBlurSync';\nimport useMedia from '../../hooks/useMedia';\nimport useMediaWithLoadProgress from '../../hooks/useMediaWithLoadProgress';\nimport {\n getChatAvatarHash,\n getMessageDocument,\n getMessageFileSize,\n getMessageMediaFormat,\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n getMessagePhoto,\n getMessageVideo,\n getMessageWebPagePhoto,\n getMessageWebPageVideo,\n getPhotoFullDimensions,\n getVideoDimensions,\n isMessageDocumentPhoto,\n isMessageDocumentVideo,\n} from '../../modules/helpers';\nimport {\n selectChat, selectChatMessage, selectScheduledMessage, selectUser,\n} from '../../modules/selectors';\nimport { AVATAR_FULL_DIMENSIONS, calculateMediaViewerDimensions } from '../common/helpers/mediaDimensions';\nimport { renderMessageText } from '../common/helpers/renderMessageText';\n\nimport Spinner from '../ui/Spinner';\nimport MediaViewerFooter from './MediaViewerFooter';\nimport VideoPlayer from './VideoPlayer';\n\nimport './MediaViewerContent.scss';\n\ntype OwnProps = {\n messageId?: number;\n chatId?: string;\n threadId?: number;\n avatarOwnerId?: string;\n profilePhotoIndex?: number;\n origin?: MediaViewerOrigin;\n isActive?: boolean;\n animationLevel: 0 | 1 | 2;\n onClose: () => void;\n onFooterClick: () => void;\n isFooterHidden?: boolean;\n};\n\ntype StateProps = {\n chatId?: string;\n messageId?: number;\n senderId?: string;\n threadId?: number;\n avatarOwner?: ApiChat | ApiUser;\n profilePhotoIndex?: number;\n message?: ApiMessage;\n origin?: MediaViewerOrigin;\n};\n\nconst ANIMATION_DURATION = 350;\n\nconst MediaViewerContent: FC = (props) => {\n const {\n messageId,\n isActive,\n avatarOwner,\n chatId,\n message,\n profilePhotoIndex,\n origin,\n animationLevel,\n onClose,\n onFooterClick,\n isFooterHidden,\n } = props;\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\n const isOpen = Boolean(avatarOwner || messageId);\n const isAvatar = Boolean(avatarOwner);\n\n const isFromSharedMedia = origin === MediaViewerOrigin.SharedMedia;\n const isFromSearch = origin === MediaViewerOrigin.SearchResult;\n\n const isGhostAnimation = animationLevel === 2;\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 {\n mediaData: fullMediaBlobUrl,\n loadProgress,\n } = 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\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 if (isAvatar) {\n return (\n
\n {renderPhoto(\n fullMediaBlobUrl || previewBlobUrl,\n calculateMediaViewerDimensions(AVATAR_FULL_DIMENSIONS, false),\n false,\n )}\n
\n );\n }\n\n if (!message) return undefined;\n const textParts = renderMessageText(message);\n const hasFooter = Boolean(textParts);\n return (\n \n {isPhoto && renderPhoto(\n localBlobUrl || fullMediaBlobUrl || previewBlobUrl || pictogramBlobUrl,\n message && calculateMediaViewerDimensions(dimensions!, hasFooter),\n false,\n )}\n {isVideo && (isActive ? (\n \n ) : renderVideoPreview(\n bestImageData,\n message && calculateMediaViewerDimensions(dimensions!, hasFooter, true),\n false,\n ))}\n {textParts && (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global, ownProps): StateProps => {\n const {\n chatId,\n threadId,\n messageId,\n avatarOwnerId,\n profilePhotoIndex,\n origin,\n } = ownProps;\n\n if (origin === MediaViewerOrigin.SearchResult) {\n if (!(chatId && messageId)) {\n return {};\n }\n\n const message = selectChatMessage(global, chatId, messageId);\n if (!message) {\n return {};\n }\n\n return {\n chatId,\n messageId,\n senderId: message.senderId,\n origin,\n message,\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 origin,\n };\n }\n\n if (!(chatId && threadId && messageId)) {\n return {};\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 {};\n }\n\n return {\n chatId,\n threadId,\n messageId,\n senderId: message.senderId,\n origin,\n message,\n };\n },\n)(MediaViewerContent));\n\nfunction renderPhoto(blobUrl?: string, imageSize?: ApiDimensions, canDrag?: boolean) {\n return blobUrl\n ? (\n \n )\n : (\n \n \n \n );\n}\n\nfunction renderVideoPreview(blobUrl?: string, imageSize?: ApiDimensions, canDrag?: boolean) {\n const wrapperStyle = imageSize && `width: ${imageSize.width}px; height: ${imageSize.height}px`;\n const videoStyle = `background-image: url(${blobUrl})`;\n return blobUrl\n ? (\n \n \n {/* eslint-disable-next-line jsx-a11y/media-has-caption */}\n \n \n \n )\n : (\n \n \n \n );\n}\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { MediaViewerOrigin } from '../../types';\n\nimport useDebounce from '../../hooks/useDebounce';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport { animateNumber, timingFunctions } from '../../util/animation';\nimport arePropsShallowEqual from '../../util/arePropsShallowEqual';\nimport { captureEvents } from '../../util/captureEvents';\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport { debounce } from '../../util/schedulers';\n\nimport MediaViewerContent from './MediaViewerContent';\n\nimport './MediaViewerSlides.scss';\n\ntype OwnProps = {\n messageId?: number;\n getMessageId: (fromId?: number, direction?: number) => number | undefined;\n isVideo?: boolean;\n isGif?: boolean;\n isPhoto?: boolean;\n isOpen?: boolean;\n selectMessage: (id?: number) => void;\n chatId?: string;\n threadId?: number;\n isActive?: boolean;\n avatarOwnerId?: string;\n profilePhotoIndex?: number;\n origin?: MediaViewerOrigin;\n isZoomed?: boolean;\n animationLevel: 0 | 1 | 2;\n onClose: () => void;\n hasFooter?: boolean;\n onFooterClick: () => void;\n};\n\nconst SWIPE_X_THRESHOLD = 50;\nconst SWIPE_Y_THRESHOLD = 50;\nconst SLIDES_GAP = 40;\nconst ANIMATION_DURATION = 350;\nconst DEBOUNCE_MESSAGE = 350;\nconst DEBOUNCE_SWIPE = 500;\nconst DEBOUNCE_ACTIVE = 800;\nconst MAX_ZOOM = 4;\nconst MIN_ZOOM = 0.6;\nconst DOUBLE_TAP_ZOOM = 3;\nlet cancelAnimation: Function | undefined;\n\ntype Transform = {\n x: number;\n y: number;\n scale: number;\n};\n\nconst INITIAL_TRANSFORM = {\n x: 0,\n y: 0,\n scale: 1,\n};\n\nconst MediaViewerSlides: FC = ({\n messageId,\n getMessageId,\n selectMessage,\n isVideo,\n isGif,\n isPhoto,\n isOpen,\n isActive,\n hasFooter,\n ...rest\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 activeSlideRef = useRef(null);\n const transformRef = useRef(INITIAL_TRANSFORM);\n const isSwipingRef = useRef(false);\n const isActiveRef = useRef(true);\n const [activeMessageId, setActiveMessageId] = useState(messageId);\n const forceUpdate = useForceUpdate();\n const [isFooterHidden, setIsFooterHidden] = useState(false);\n\n const {\n isZoomed,\n onClose,\n } = rest;\n\n const setTransform = useCallback((value: Transform) => {\n transformRef.current = value;\n forceUpdate();\n }, [forceUpdate]);\n\n const setIsSwiping = useCallback((value: boolean) => {\n isSwipingRef.current = value;\n forceUpdate();\n }, [forceUpdate]);\n\n const setIsActive = useCallback((value: boolean) => {\n isActiveRef.current = value;\n forceUpdate();\n }, [forceUpdate]);\n\n const debounceSetMessage = useDebounce(DEBOUNCE_MESSAGE, false);\n const debounceSwipe = useDebounce(DEBOUNCE_SWIPE, false);\n const debounceActive = useDebounce(DEBOUNCE_ACTIVE, false);\n\n const handleToggleFooterVisibility = useCallback(() => {\n if (IS_TOUCH_ENV && (isPhoto || isGif) && hasFooter) {\n setIsFooterHidden(!isFooterHidden);\n }\n }, [hasFooter, isFooterHidden, isGif, isPhoto]);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV || !containerRef.current || isZoomed || !activeMessageId) {\n return undefined;\n }\n let lastTransform = { ...transformRef.current };\n const lastDragOffset = {\n x: 0,\n y: 0,\n };\n const lastZoomCenter = { x: 0, y: 0 };\n const panDelta = {\n x: 0,\n y: 0,\n };\n let lastGestureTime = Date.now();\n let initialContentRect: DOMRect;\n let content: HTMLElement | null;\n const setLastGestureTime = debounce(() => {\n lastGestureTime = Date.now();\n }, 500, false, true);\n return captureEvents(containerRef.current, {\n isNotPassive: true,\n excludedClosestSelector: '.VideoPlayerControls, .MediaViewerFooter',\n onCapture: (event) => {\n // Prevent safari back swipe on mobile\n if (event.type === 'touchstart'\n && 'pageX' in event\n && !(event.pageX > 10 && event.pageX < window.innerWidth - 10)) {\n event.preventDefault();\n }\n lastGestureTime = Date.now();\n if (arePropsShallowEqual(transformRef.current, INITIAL_TRANSFORM)) {\n if (!activeSlideRef.current) return;\n content = activeSlideRef.current.querySelector('img, video');\n if (!content) return;\n // Store initial content rect, without transformations\n initialContentRect = content.getBoundingClientRect();\n }\n },\n onDrag: (event, captureEvent, {\n dragOffsetX,\n dragOffsetY,\n }) => {\n if (cancelAnimation) {\n cancelAnimation();\n cancelAnimation = undefined;\n }\n panDelta.x = lastDragOffset.x - dragOffsetX;\n panDelta.y = lastDragOffset.y - dragOffsetY;\n lastDragOffset.x = dragOffsetX;\n lastDragOffset.y = dragOffsetY;\n const absOffsetX = Math.abs(dragOffsetX);\n const absOffsetY = Math.abs(dragOffsetY);\n const { scale, x, y } = transformRef.current;\n const h = 10;\n\n // If user is inactive but is still touching the screen\n // we reset last gesture time\n setLastGestureTime();\n\n // If image is scaled we just need to pan it\n if (scale !== 1) {\n if ('touches' in event && event.touches.length === 1) {\n setTransform({\n x: lastTransform.x + dragOffsetX,\n y: lastTransform.y + dragOffsetY,\n scale,\n });\n }\n return;\n }\n // If user is swiping horizontally or horizontal shift is dominant\n // we change only horizontal position\n if (isSwipingRef.current || Math.abs(x) > h || (absOffsetX > h && absOffsetY < h)) {\n isSwipingRef.current = true;\n isActiveRef.current = false;\n setTransform({\n x: dragOffsetX,\n y: 0,\n scale,\n });\n return;\n }\n if (isSwipingRef.current) return;\n // If vertical shift is dominant we change only vertical position\n if (Math.abs(y) > h || (absOffsetY > h && absOffsetX < h)) {\n setTransform({\n x: 0,\n y: dragOffsetY,\n scale,\n });\n }\n },\n onZoom: (e, {\n zoomFactor,\n initialCenterX,\n initialCenterY,\n dragOffsetX,\n dragOffsetY,\n currentCenterX,\n currentCenterY,\n }) => {\n // Calculate current scale based on zoom factor and limits, add max zoom margin for bounce back effect\n const scale = Math.min(MAX_ZOOM * 3, Math.max(lastTransform.scale * zoomFactor, MIN_ZOOM));\n const scaleFactor = scale / lastTransform.scale;\n const offsetX = Math.abs(Math.min(lastTransform.x, 0));\n const offsetY = Math.abs(Math.min(lastTransform.y, 0));\n\n // Calculate new center relative to the shifted image\n const scaledCenterX = offsetX + initialCenterX;\n const scaledCenterY = offsetY + initialCenterY;\n\n // Save last zoom center for bounce back effect\n lastZoomCenter.x = currentCenterX;\n lastZoomCenter.y = currentCenterY;\n\n // Calculate how much we need to shift the image to keep the zoom center at the same position\n const scaleOffsetX = (scaledCenterX - scaleFactor * scaledCenterX);\n const scaleOffsetY = (scaledCenterY - scaleFactor * scaledCenterY);\n\n setTransform({\n x: lastTransform.x + scaleOffsetX + dragOffsetX,\n y: lastTransform.y + scaleOffsetY + dragOffsetY,\n scale,\n });\n },\n onDoubleClick(e, {\n centerX,\n centerY,\n }) {\n // Calculate how much we need to shift the image to keep the zoom center at the same position\n const scaleOffsetX = (centerX - DOUBLE_TAP_ZOOM * centerX);\n const scaleOffsetY = (centerY - DOUBLE_TAP_ZOOM * centerY);\n const { scale, x, y } = transformRef.current;\n if (scale === 1) {\n if (x !== 0 || y !== 0) return undefined;\n lastTransform = {\n x: scaleOffsetX,\n y: scaleOffsetY,\n scale: DOUBLE_TAP_ZOOM,\n };\n } else {\n lastTransform = { x: 0, y: 0, scale: 1 };\n }\n return animateNumber({\n from: [x, y, scale],\n to: [lastTransform.x, lastTransform.y, lastTransform.scale],\n duration: ANIMATION_DURATION,\n timing: timingFunctions.easeOutCubic,\n onUpdate: (value) => setTransform({\n x: value[0],\n y: value[1],\n scale: value[2],\n }),\n });\n },\n onRelease: () => {\n const absX = Math.abs(transformRef.current.x);\n const absY = Math.abs(transformRef.current.y);\n const { scale, x, y } = transformRef.current;\n\n // If scale is less than 1 we need to bounce back\n if (scale < 1) {\n lastTransform = INITIAL_TRANSFORM;\n return animateNumber({\n from: [x, y, scale],\n to: [0, 0, 1],\n duration: ANIMATION_DURATION,\n timing: timingFunctions.easeOutCubic,\n onUpdate: (value) => setTransform({\n x: value[0],\n y: value[1],\n scale: value[2],\n }),\n });\n }\n if (scale > 1) {\n if (!content || !initialContentRect) {\n lastTransform = { x, y, scale };\n return undefined;\n }\n // Get current content boundaries\n const boundaries = content.getBoundingClientRect();\n const s1 = Math.min(scale, MAX_ZOOM);\n const scaleFactor = s1 / scale;\n\n // Calculate new position based on the last zoom center to keep the zoom center\n // at the same position when bouncing back from max zoom\n let x1 = x * scaleFactor + (lastZoomCenter.x - scaleFactor * lastZoomCenter.x);\n let y1 = y * scaleFactor + (lastZoomCenter.y - scaleFactor * lastZoomCenter.y);\n\n // Arbitrary pan velocity coefficient\n const k = 0.15;\n\n // If scale didn't change, we need to add inertia to pan gesture\n if (lastTransform.scale === scale) {\n // Calculate user gesture velocity\n const Vx = Math.abs(lastDragOffset.x) / (Date.now() - lastGestureTime);\n const Vy = Math.abs(lastDragOffset.y) / (Date.now() - lastGestureTime);\n\n // Add extra distance based on gesture velocity and last pan delta\n x1 -= Math.abs(lastDragOffset.x) * Vx * k * panDelta.x;\n y1 -= Math.abs(lastDragOffset.y) * Vy * k * panDelta.y;\n }\n\n // If content is outside window we calculate offset boundaries\n // based on initial content rect and current scale\n if (boundaries.width > window.innerWidth) {\n const minOffsetX = -initialContentRect.left * s1;\n const maxOffsetX = window.innerWidth - initialContentRect.right * s1;\n x1 = Math.min(minOffsetX, Math.max(maxOffsetX, x1));\n } else {\n // Else we center the content on the screen\n x1 = (window.innerWidth - window.innerWidth * s1) / 2;\n }\n\n if (boundaries.height > window.innerHeight) {\n const minOffsetY = -initialContentRect.top * s1;\n const maxOffsetY = window.innerHeight - initialContentRect.bottom * s1;\n y1 = Math.min(minOffsetY, Math.max(maxOffsetY, y1));\n } else {\n y1 = (window.innerHeight - window.innerHeight * s1) / 2;\n }\n lastTransform = {\n x: x1,\n y: y1,\n scale: s1,\n };\n cancelAnimation = animateNumber({\n from: [x, y, scale],\n to: [x1, y1, s1],\n duration: ANIMATION_DURATION,\n timing: timingFunctions.easeOutCubic,\n onUpdate: (value) => setTransform({\n x: value[0],\n y: value[1],\n scale: value[2],\n }),\n });\n return undefined;\n }\n lastTransform = { x, y, scale };\n if (absY >= SWIPE_Y_THRESHOLD) return onClose();\n // Bounce back if vertical swipe is below threshold\n if (absY > 0) {\n return animateNumber({\n from: y,\n to: 0,\n duration: ANIMATION_DURATION,\n timing: timingFunctions.easeOutCubic,\n onUpdate: (value) => setTransform({\n x: 0,\n y: value,\n scale,\n }),\n });\n }\n // Get horizontal swipe direction\n const direction = x < 0 ? 1 : -1;\n const mId = getMessageId(activeMessageId, x < 0 ? 1 : -1);\n // Get the direction of the last pan gesture.\n // Could be different from the total horizontal swipe direction\n // if user starts a swipe in one direction and then changes the direction\n // we need to cancel slide transition\n const dirX = panDelta.x < 0 ? -1 : 1;\n if (mId && absX >= SWIPE_X_THRESHOLD && direction === dirX) {\n const offset = (window.innerWidth + SLIDES_GAP) * direction;\n // If image is shifted by more than SWIPE_X_THRESHOLD,\n // We shift everything by one screen width and then set new active message id\n transformRef.current.x += offset;\n setActiveMessageId(mId);\n debounceSetMessage(() => selectMessage(mId));\n }\n debounceSwipe(() => setIsSwiping(false));\n debounceActive(() => setIsActive(true));\n // Then we always return to the original position\n cancelAnimation = animateNumber({\n from: transformRef.current.x,\n to: 0,\n duration: ANIMATION_DURATION,\n timing: timingFunctions.easeOutCubic,\n onUpdate: (value) => setTransform({\n y: 0,\n x: value,\n scale: transformRef.current.scale,\n }),\n });\n return undefined;\n },\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n isZoomed,\n onClose,\n setTransform,\n getMessageId,\n activeMessageId,\n setIsSwiping,\n setIsActive,\n ]);\n\n if (!activeMessageId) return undefined;\n\n const nextMessageId = getMessageId(activeMessageId, 1);\n const previousMessageId = getMessageId(activeMessageId, -1);\n const offsetX = transformRef.current.x;\n const offsetY = transformRef.current.y;\n const { scale } = transformRef.current;\n\n return (\n
\n {previousMessageId && scale === 1 && /* @ts-ignore */ (\n
\n {/* eslint-disable-next-line react/jsx-props-no-spreading */}\n \n
\n )}\n {activeMessageId && (\n \n \n
\n )}\n {nextMessageId && scale === 1 && /* @ts-ignore */ (\n
\n {/* eslint-disable-next-line react/jsx-props-no-spreading */}\n \n
\n )}\n \n );\n};\n\nexport default memo(MediaViewerSlides);\n\nfunction getAnimationStyle(x = 0, y = 0, scale = 1) {\n return `transform: translate3d(${x.toFixed(3)}px, ${y.toFixed(3)}px, 0px) scale(${scale.toFixed(3)});`;\n}\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('.Transition__slide--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, { 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, { FC } from '../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\n\nimport Transition, { TransitionProps } from '../ui/Transition';\n\nconst SlideTransition: FC = ({ children, ...props }) => {\n if (IS_TOUCH_ENV) {\n // Return dummy container to keep existing DOM structure, needed to preserve ghost animation\n return (\n
\n
\n {children(true, true, 1)}\n
\n
\n );\n }\n // eslint-disable-next-line react/jsx-props-no-spreading\n return {children};\n};\n\nexport default SlideTransition;\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","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, ApiDimensions, ApiMediaFormat, ApiMessage, ApiUser,\n} from '../../api/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { ANIMATION_END_DELAY } from '../../config';\n\nimport useBlurSync from '../../hooks/useBlurSync';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport useHistoryBack from '../../hooks/useHistoryBack';\nimport useLang from '../../hooks/useLang';\nimport useMedia from '../../hooks/useMedia';\nimport useMediaWithLoadProgress from '../../hooks/useMediaWithLoadProgress';\nimport usePrevious from '../../hooks/usePrevious';\nimport {\n getChatAvatarHash,\n getChatMediaMessageIds,\n getMessageDocument,\n getMessageFileName,\n getMessageMediaFormat,\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n getMessagePhoto,\n getMessageVideo,\n getMessageWebPagePhoto,\n getMessageWebPageVideo,\n getPhotoFullDimensions,\n getVideoDimensions,\n isMessageDocumentPhoto,\n isMessageDocumentVideo,\n} from '../../modules/helpers';\nimport {\n selectChat,\n selectChatMessage,\n selectChatMessages,\n selectCurrentMediaSearch,\n selectListedIds,\n selectOutlyingIds,\n selectScheduledMessage,\n selectScheduledMessages,\n selectUser,\n} from '../../modules/selectors';\nimport { stopCurrentAudio } from '../../util/audioPlayer';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { captureEvents } from '../../util/captureEvents';\nimport { IS_IOS, IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../util/environment';\nimport { pick } from '../../util/iteratees';\nimport windowSize from '../../util/windowSize';\nimport { AVATAR_FULL_DIMENSIONS, MEDIA_VIEWER_MEDIA_QUERY } from '../common/helpers/mediaDimensions';\nimport { renderMessageText } from '../common/helpers/renderMessageText';\nimport { animateClosing, animateOpening } from './helpers/ghostAnimation';\n\nimport Button from '../ui/Button';\nimport ShowTransition from '../ui/ShowTransition';\nimport Transition from '../ui/Transition';\nimport MediaViewerActions from './MediaViewerActions';\nimport MediaViewerSlides from './MediaViewerSlides';\nimport PanZoom from './PanZoom';\nimport SenderInfo from './SenderInfo';\nimport SlideTransition from './SlideTransition';\nimport ZoomControls from './ZoomControls';\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 { isGif } = video || webPageVideo || {};\n const isPhoto = Boolean(!isVideo && (photo || webPagePhoto || isDocumentPhoto));\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 && !IS_TOUCH_ENV ? 'mv-slide' : 'none';\n const headerAnimation = animationLevel === 2 ? 'slide-fade' : 'none';\n const isGhostAnimation = animationLevel === 2;\n\n /* Controls */\n const [canPanZoomWrap, setCanPanZoomWrap] = useState(false);\n const [isZoomed, setIsZoomed] = useState(false);\n const [zoomLevel, setZoomLevel] = useState(1);\n const [panDelta, setPanDelta] = useState({\n x: 0,\n y: 0,\n });\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 } = 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 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 const textParts = message ? renderMessageText(message) : undefined;\n const hasFooter = Boolean(textParts);\n\n useEffect(() => {\n if (isGhostAnimation && isOpen && !prevMessage && !prevAvatarOwner) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY);\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, hasFooter,\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({\n x: 0,\n y: 0,\n });\n };\n\n const handleZoomToggle = useCallback(() => {\n setIsZoomed(!isZoomed);\n setZoomLevel(!isZoomed ? 1.5 : 1);\n if (isZoomed) {\n setPanDelta({\n x: 0,\n y: 0,\n });\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({\n chatId,\n threadId,\n messageId,\n });\n }, [close, chatId, threadId, focusMessage, messageId]);\n\n const handleForward = useCallback(() => {\n openForwardMenu({\n fromChatId: chatId,\n messageIds: [messageId],\n });\n closeZoom();\n }, [openForwardMenu, chatId, messageId]);\n\n const selectMessage = useCallback((id?: number) => openMediaViewer({\n chatId,\n threadId,\n messageId: id,\n origin,\n }, {\n forceOnHeavyAnimation: true,\n }), [chatId, openMediaViewer, origin, threadId]);\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 | undefined => {\n if (!fromId) return undefined;\n const index = messageIds.indexOf(fromId);\n if ((direction === -1 && index > 0) || (direction === 1 && index < messageIds.length - 1)) {\n return messageIds[index + direction];\n }\n return undefined;\n }, [messageIds]);\n\n const nextMessageId = getMessageId(messageId, 1);\n const previousMessageId = getMessageId(messageId, -1);\n\n const handlePan = useCallback((x: number, y: number) => {\n setPanDelta({\n x,\n y,\n });\n }, []);\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 useEffect(() => {\n if (!isOpen) {\n return undefined;\n }\n\n function handleKeyDown(e: KeyboardEvent) {\n switch (e.key) {\n case 'Left': // IE/Edge specific value\n case 'ArrowLeft':\n selectMessage(previousMessageId);\n break;\n\n case 'Right': // IE/Edge specific value\n case 'ArrowRight':\n selectMessage(nextMessageId);\n break;\n }\n }\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n }, [isOpen, nextMessageId, previousMessageId, selectMessage]);\n\n useEffect(() => {\n if (isZoomed || IS_TOUCH_ENV) return undefined;\n const element = document.querySelector('.MediaViewerSlide--active');\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: close,\n });\n }, [close, isGif, isZoomed, messageId]);\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 {(isActive: boolean) => (\n \n )}\n \n \n {!isFirst && !IS_TOUCH_ENV && (\n selectMessage(previousMessageId)}\n />\n )}\n {!isLast && !IS_TOUCH_ENV && (\n selectMessage(nextMessageId)}\n />\n )}\n \n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chatId,\n threadId,\n messageId,\n avatarOwnerId,\n profilePhotoIndex,\n 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 const resetFilter = useCallback(() => {\n onFilterChange('');\n }, [onFilterChange]);\n useInputFocusOnOpen(filterRef, isOpen, resetFilter);\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 { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, MAIN_THREAD_ID } from '../../api/types';\n\nimport {\n filterChatsByName,\n filterUsersByName,\n getCanPostInChat,\n sortChatIds,\n} from '../../modules/helpers';\nimport { pick, unique } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\n\nimport ChatOrUserPicker from '../common/ChatOrUserPicker';\n\nexport type OwnProps = {\n isOpen: boolean;\n};\n\ntype StateProps = {\n chatsById: Record;\n activeListIds?: string[];\n archivedListIds?: string[];\n pinnedIds?: string[];\n contactIds?: string[];\n currentUserId?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst ForwardPicker: FC = ({\n chatsById,\n activeListIds,\n archivedListIds,\n pinnedIds,\n contactIds,\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 chatAndContactIds = useMemo(() => {\n if (!isOpen) {\n return undefined;\n }\n\n let priorityIds = pinnedIds || [];\n if (currentUserId) {\n priorityIds = unique([currentUserId, ...priorityIds]);\n }\n\n const chatIds = [\n ...(activeListIds || []),\n ...(archivedListIds || []),\n ].filter((id) => {\n const chat = chatsById[id];\n\n return chat && getCanPostInChat(chat, MAIN_THREAD_ID);\n });\n\n // No need for expensive global updates on users, so we avoid them\n const usersById = getGlobal().users.byId;\n\n return sortChatIds(unique([\n ...filterChatsByName(lang, chatIds, chatsById, filter, currentUserId),\n ...(contactIds ? filterUsersByName(contactIds, usersById, filter) : []),\n ]), chatsById, undefined, priorityIds);\n }, [activeListIds, archivedListIds, chatsById, contactIds, currentUserId, filter, isOpen, lang, pinnedIds]);\n\n const handleSelectUser = useCallback((userId: string) => {\n setForwardChatId({ id: userId });\n }, [setForwardChatId]);\n\n const renderingChatAndContactIds = useCurrentOrPrev(chatAndContactIds)!;\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 activeListIds: listIds.active,\n archivedListIds: listIds.archived,\n pinnedIds: orderedPinnedIds.active,\n contactIds: global.contactList?.userIds,\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 React, { FC, useCallback, memo } 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 { selectChatMessage } from '../../modules/selectors';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\nimport PrivateChatInfo from './PrivateChatInfo';\nimport ListItem from '../ui/ListItem';\n\nexport type OwnProps = {\n isOpen: boolean;\n};\n\nexport type StateProps = {\n memberIds?: string[];\n};\n\ntype DispatchProps = Pick;\n\nconst CLOSE_ANIMATION_DURATION = 100;\n\nconst SeenByModal: FC = ({\n isOpen,\n memberIds,\n openChat,\n closeSeenByModal,\n}) => {\n const lang = useLang();\n\n const handleClick = useCallback((userId: string) => {\n closeSeenByModal();\n\n setTimeout(() => {\n openChat({ id: userId });\n }, CLOSE_ANIMATION_DURATION);\n }, [closeSeenByModal, openChat]);\n\n const renderingMemberIds = useCurrentOrPrev(memberIds, true);\n\n return (\n \n
\n {renderingMemberIds && renderingMemberIds.map((userId) => (\n handleClick(userId)}\n >\n \n \n ))}\n
\n \n {lang('Close')}\n \n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { chatId, messageId } = global.seenByModal || {};\n if (!chatId || !messageId) {\n return {};\n }\n\n return {\n memberIds: selectChatMessage(global, chatId, messageId)?.seenByUserIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['openChat', 'closeSeenByModal']),\n)(SeenByModal));\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 user?: ApiUser;\n isPinned?: boolean;\n isMuted?: boolean;\n};\n\nconst LeftSearchResultChat: FC = ({\n chatId,\n chat,\n user,\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 user,\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 user = 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 user,\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 { getGlobal, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiMessage } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { unique, pick } from '../../../util/iteratees';\nimport { getMessageSummaryText, sortChatIds, filterUsersByName } 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 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 = 5;\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, 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 contactIdsWithMe = [\n ...(currentUserId ? [currentUserId] : []),\n ...(localContactIds || []),\n ];\n // No need for expensive global updates on users, so we avoid them\n const usersById = getGlobal().users.byId;\n const foundContactIds = filterUsersByName(contactIdsWithMe, usersById, searchQuery);\n\n return [\n ...sortChatIds(unique([\n ...(foundContactIds || []),\n ...(localChatIds || []),\n ...(localUserIds || []),\n ]), chatsById, undefined, currentUserId ? [currentUserId] : undefined),\n ];\n }, [searchQuery, localContactIds, currentUserId, localChatIds, localUserIds, chatsById]);\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(\n unique([...globalChatIds, ...globalUserIds]),\n chatsById,\n true,\n );\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\n const { userIds: localContactIds } = global.contactList || {};\n\n if (!localContactIds) {\n return {\n chatsById,\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 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, GlobalState } 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 isActive?: boolean;\n onCreateFolder: () => void;\n onEditFolder: (folder: ApiChatFolder) => void;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n allListIds: GlobalState['chats']['listIds'];\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 isActive,\n allListIds,\n chatsById,\n usersById,\n orderedFolderIds,\n foldersById,\n recommendedChatFolders,\n notifySettings,\n notifyExceptions,\n onCreateFolder,\n onEditFolder,\n onScreenSelect,\n onReset,\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 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, allListIds, chatsById, usersById, folder, notifySettings, notifyExceptions,\n ),\n };\n });\n }, [lang, allListIds, foldersById, chatsById, usersById, orderedFolderIds, notifySettings, notifyExceptions]);\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: { listIds: allListIds, 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 allListIds,\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?.pinnedChats || []),\n ...(activeChatArrays?.otherChats || []),\n ...(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(\n isActive, onReset, onScreenSelect,\n mode === 'included' ? SettingsScreens.FoldersIncludedChats : SettingsScreens.FoldersExcludedChats,\n );\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 { filterUsersByName, getUserFullName } from '../../../modules/helpers';\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 filteredContactIds = useMemo(() => {\n const availableContactIds = unique([\n ...(contactIds || []),\n ...(localContactIds || []),\n ].filter((contactId) => {\n return contactId !== currentUserId && !blockedIds.includes(contactId);\n }));\n\n return filterUsersByName(availableContactIds, usersById, filter)\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, ApiUserStatus } from '../../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { throttle } from '../../../util/schedulers';\nimport { pick } from '../../../util/iteratees';\nimport { filterUsersByName, 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 userStatusesById: 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,\n filter,\n usersById,\n userStatusesById,\n contactIds,\n serverTimeOffset,\n onReset,\n loadContactList,\n openChat,\n}) => {\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadContactList();\n });\n });\n\n 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 filteredIds = filterUsersByName(contactIds, usersById, filter);\n\n return sortUserIds(filteredIds, usersById, userStatusesById, undefined, serverTimeOffset);\n }, [contactIds, filter, usersById, userStatusesById, 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, statusesById: userStatusesById } = global.users;\n\n return {\n usersById,\n userStatusesById,\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 { getGlobal, withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\n\nimport { pick, unique } from '../../../util/iteratees';\nimport { throttle } from '../../../util/schedulers';\nimport { filterUsersByName, 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 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 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 // No need for expensive global updates on users, so we avoid them\n const usersById = getGlobal().users.byId;\n const foundContactIds = localContactIds ? filterUsersByName(localContactIds, usersById, searchQuery) : [];\n\n return sortChatIds(\n unique([\n ...foundContactIds,\n ...(localUserIds || []),\n ...(globalUserIds || []),\n ]).filter((contactId) => {\n const user = usersById[contactId];\n if (!user) {\n return true;\n }\n\n return user.canBeInvitedToGroup && !user.isSelf && !isUserBot(user);\n }),\n chatsById,\n false,\n selectedMemberIds,\n );\n }, [localContactIds, chatsById, searchQuery, localUserIds, globalUserIds, selectedMemberIds]);\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: chatsById } = global.chats;\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 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)).map(Number);\n const idsToAdd = selectedFolderIds.filter((id) => !initialSelectedFolderIds.includes(id)).map(Number);\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, memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { ApiMessage, ApiUser } 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';\nimport Avatar from '../../common/Avatar';\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 canShowSeenBy?: boolean;\n seenByRecentUsers?: ApiUser[];\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 onShowSeenBy?: () => 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 canShowSeenBy,\n seenByRecentUsers,\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 onShowSeenBy,\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(`.Transition__slide--active > .MessageList div[data-message-id=\"${message.id}\"]`);\n }, [message.id]);\n\n const getRootElement = useCallback(\n () => document.querySelector('.Transition__slide--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 {canShowSeenBy && (\n \n {message.seenByUserIds?.length\n ? lang('Conversation.ContextMenuSeen', message.seenByUserIds.length, 'i')\n : lang('Conversation.ContextMenuNoViews')}\n
\n {seenByRecentUsers?.map((user) => (\n \n ))}\n
\n
\n )}\n {canDelete && {lang('Delete')}}\n \n );\n};\n\nexport default memo(MessageContextMenu);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { getGlobal, 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 selectChat,\n selectCurrentMessageList,\n} from '../../../modules/selectors';\nimport { isChatGroup, isOwnMessage } from '../../../modules/helpers';\nimport { SEEN_BY_MEMBERS_EXPIRE, SEEN_BY_MEMBERS_CHAT_MAX } from '../../../config';\nimport { pick } from '../../../util/iteratees';\nimport { getDayStartAt } from '../../../util/dateFormat';\nimport { copyTextToClipboard } from '../../../util/clipboard';\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';\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 canShowSeenBy?: boolean;\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 canShowSeenBy,\n setReplyingToId,\n setEditingId,\n pinMessage,\n openForwardMenu,\n faveSticker,\n unfaveSticker,\n toggleMessageSelection,\n sendScheduledMessages,\n rescheduleMessage,\n downloadMessageMedia,\n cancelMessageMediaDownload,\n loadSeenBy,\n openSeenByModal,\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 useEffect(() => {\n if (canShowSeenBy && isOpen) {\n loadSeenBy({ chatId: message.chatId, messageId: message.id });\n }\n }, [loadSeenBy, isOpen, message.chatId, message.id, canShowSeenBy]);\n\n const seenByRecentUsers = useMemo(() => {\n if (!message.seenByUserIds) {\n return undefined;\n }\n\n // No need for expensive global updates on users, so we avoid them\n const usersById = getGlobal().users.byId;\n return message.seenByUserIds?.slice(0, 3).map((id) => usersById[id]).filter(Boolean);\n }, [message.seenByUserIds]);\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 handleOpenSeenByModal = useCallback(() => {\n closeMenu();\n openSeenByModal({ chatId: message.chatId, messageId: message.id });\n }, [closeMenu, message.chatId, message.id, openSeenByModal]);\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 chat = selectChat(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 const canShowSeenBy = Boolean(chat\n && isChatGroup(chat)\n && isOwnMessage(message)\n && chat.membersCount\n && chat.membersCount < SEEN_BY_MEMBERS_CHAT_MAX\n && message.date > Date.now() / 1000 - SEEN_BY_MEMBERS_EXPIRE);\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 canShowSeenBy,\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 'loadSeenBy',\n 'openSeenByModal',\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 chatId: string;\n threadId: number;\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 chatId,\n threadId,\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 );\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 { getGlobal, withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\n\nimport { filterUsersByName } from '../../../modules/helpers';\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 currentUserId?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst RemoveGroupUserModal: FC = ({\n chat,\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 availableMemberIds = (chat.fullInfo?.members || [])\n .reduce((acc: string[], member) => {\n if (!member.isAdmin && !member.isOwner && member.userId !== currentUserId) {\n acc.push(member.userId);\n }\n return acc;\n }, []);\n\n // No need for expensive global updates on users, so we avoid them\n const usersById = getGlobal().users.byId;\n\n return filterUsersByName(availableMemberIds, usersById, filter);\n }, [chat.fullInfo?.members, currentUserId, filter]);\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 { currentUserId } = global;\n\n return { 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, ApiUserStatus } 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 userStatusesById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n serverTimeOffset: number;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupMembers: FC = ({\n members,\n usersById,\n userStatusesById,\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(\n members.map(({ userId }) => userId),\n usersById,\n userStatusesById,\n undefined,\n serverTimeOffset,\n );\n }, [members, serverTimeOffset, usersById, userStatusesById]);\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, statusesById: userStatusesById } = global.users;\n const members = chat?.fullInfo?.members;\n const isChannel = chat && isChatChannel(chat);\n\n return {\n members,\n usersById,\n userStatusesById,\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, ApiUserStatus } 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 userStatusesById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n serverTimeOffset: number;\n};\n\nconst ManageGroupUserPermissionsCreate: FC = ({\n usersById,\n userStatusesById,\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,\n userStatusesById,\n undefined,\n serverTimeOffset,\n );\n }, [members, serverTimeOffset, usersById, userStatusesById]);\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, statusesById: userStatusesById } = global.users;\n const members = chat?.fullInfo?.members;\n const isChannel = chat && isChatChannel(chat);\n\n return {\n members,\n usersById,\n userStatusesById,\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","memo","withGlobal","global","isDownloading","selectIsDownloading","setGlobal","actions","pick","mediaData","isVideo","isZoomed","fileName","isAvatar","onCloseMediaViewer","onForward","onZoomToggle","downloadMessageMedia","cancelMessageMediaDownload","loadProgress","downloadProgress","useMediaWithLoadProgress","getMessageMediaHash","handleDownloadClick","useCallback","lang","useLang","MenuButton","useMemo","onTrigger","isOpen","Button","round","size","color","className","undefined","onClick","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","dir","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","key","preventDefault","wrapperStyle","videoStyle","onMouseOver","onMouseOut","autoPlay","playsInline","loop","muted","onPlay","onEnded","onDoubleClick","onTimeUpdate","join","square","ownProps","chatId","threadId","messageId","avatarOwnerId","profilePhotoIndex","selectChatMessage","senderId","avatarOwner","selectUser","selectChat","selectScheduledMessage","props","isActive","animationLevel","onFooterClick","isFooterHidden","photo","getMessagePhoto","getMessageVideo","webPagePhoto","getMessageWebPagePhoto","webPageVideo","getMessageWebPageVideo","isDocumentPhoto","isMessageDocumentPhoto","isDocumentVideo","isMessageDocumentVideo","isPhoto","isFromSharedMedia","isFromSearch","isGhostAnimation","getMediaHash","isFull","photos","getChatAvatarHash","pictogramBlobUrl","useMedia","ApiMediaFormat","previewMediaHash","previewBlobUrl","fullMediaBlobUrl","getMessageMediaFormat","localBlobUrl","blobUrl","bestImageData","thumbDataUri","useBlurSync","getMessageMediaThumbDataUri","videoSize","getMessageFileSize","dimensions","getMessageDocument","mediaSize","getPhotoFullDimensions","getVideoDimensions","AVATAR_FULL_DIMENSIONS","renderPhoto","calculateMediaViewerDimensions","textParts","renderMessageText","hasFooter","imageSize","canDrag","draggable","Spinner","renderVideoPreview","alt","ANIMATION_DURATION","cancelAnimation","INITIAL_TRANSFORM","x","y","scale","getMessageId","selectMessage","rest","containerRef","activeSlideRef","transformRef","isSwipingRef","isActiveRef","activeMessageId","setActiveMessageId","forceUpdate","useForceUpdate","setIsFooterHidden","setTransform","value","setIsSwiping","setIsActive","debounceSetMessage","useDebounce","debounceSwipe","debounceActive","handleToggleFooterVisibility","lastTransform","lastDragOffset","lastZoomCenter","panDelta","initialContentRect","content","lastGestureTime","Date","now","setLastGestureTime","debounce","isNotPassive","excludedClosestSelector","event","type","pageX","innerWidth","arePropsShallowEqual","captureEvent","dragOffsetX","dragOffsetY","absOffsetX","abs","absOffsetY","h","touches","onZoom","zoomFactor","initialCenterX","initialCenterY","currentCenterX","currentCenterY","MAX_ZOOM","scaleFactor","scaledCenterX","scaledCenterY","scaleOffsetX","scaleOffsetY","centerX","centerY","animateNumber","from","to","timing","timingFunctions","onUpdate","absX","absY","boundaries","s1","x1","y1","k","Vx","Vy","minOffsetX","maxOffsetX","right","innerHeight","minOffsetY","top","maxOffsetY","bottom","direction","mId","dirX","offset","nextMessageId","previousMessageId","offsetX","offsetY","getAnimationStyle","INITIAL_MATRIX","SCALE_VALUES","ZOOM_SAFE_AREA","children","noWrap","canPan","zoomLevel","panDeltaX","panDeltaY","onPan","tunedZoomLevel","isDragging","setIsDragging","dragData","setDragData","dx","dy","matrixData","setMatrixData","panWrapperRef","panContainerRef","newZoomLevel","newPandx","newPandy","newMatrixData","areSortedArraysEqual","oldScale","wrapper","image","wrapperRect","imageRect","newImgWidth","newImgHeight","newImgX","newImgY","calculateSafeZoneOnZoom","transform","toString","onMouseDown","newDragData","pageY","onMouseUp","onMouseMove","deltaX","deltaY","getNewMatrixData","sender","isUserId","selectSender","closeMediaViewer","focusMessage","handleFocusMessage","senderTitle","getSenderTitle","Avatar","user","chat","renderText","formatMediaDateTime","date","Transition","isShown","onChangeZoom","prevIsShown","usePrevious","inputRef","setZoomLevel","disabled","step","onChange","Number","target","mediaViewer","settings","byKey","chatMessages","collectionIds","selectScheduledMessages","selectChatMessages","selectOutlyingIds","selectListedIds","currentSearch","selectCurrentMediaSearch","foundIds","resultsByType","media","openMediaViewer","openForwardMenu","isSingleSlide","messageIds","getChatMediaMessageIds","selectedMediaMessageIndex","indexOf","isFirst","isLast","animationKey","prevSenderId","slideAnimation","headerAnimation","canPanZoomWrap","setCanPanZoomWrap","setIsZoomed","setPanDelta","getMessageFileName","toggle","mql","matchMedia","MEDIA_VIEWER_MEDIA_QUERY","addListener","removeListener","prevMessage","prevOrigin","prevAvatarOwner","prevBestImageData","dispatchHeavyAnimationEvent","ANIMATION_END_DELAY","fromImage","windowWidth","windowSize","availableWidth","availableHeight","getMediaViewerAvailableDimensions","toWidth","toHeight","calculateDimensions","toLeft","toTop","topOffsetRem","matches","getTopOffset","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","forceOnHeavyAnimation","captureEscKeyListener","stopCurrentAudio","fromId","index","handlePan","renderSenderInfo","useHistoryBack","handleKeyDown","shouldCloseOnVideo","ShowTransition","isRtl","activeKey","name","currentUserId","chatOrUserIds","filterRef","filter","filterPlaceholder","onFilterChange","loadMore","onSelectChatOrUser","viewportIds","getMore","useInfiniteScroll","resetFilter","useInputFocusOnOpen","handleFilterChange","useKeyboardListNavigation","modalHeader","InputText","onKeyDown","placeholder","Modal","header","InfiniteScroll","items","onLoadMore","noScrollRestore","map","ListItem","PrivateChatInfo","status","userId","GroupChatInfo","Loading","chats","byId","chatsById","listIds","orderedPinnedIds","activeListIds","active","archivedListIds","archived","pinnedIds","contactIds","contactList","userIds","setForwardChatId","exitForwardMode","loadMoreChats","setFilter","chatAndContactIds","priorityIds","unique","chatIds","getCanPostInChat","MAIN_THREAD_ID","usersById","getGlobal","users","sortChatIds","filterChatsByName","filterUsersByName","handleSelectUser","renderingChatAndContactIds","useCurrentOrPrev","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","ConfirmDialog","confirmLabel","confirmHandler","WEEKDAY_LETTERS","isDisabledDay","year","month","day","minDate","maxDate","selectedDay","fixedMinDate","getFullYear","getMonth","getDate","fixedMaxDate","formatInputTime","String","padStart","formatDay","selectedAt","maxAt","isFutureMode","isPastMode","withTimePicker","submitButtonLabel","secondButtonLabel","onSubmit","onSecondButtonClick","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","seenByModal","memberIds","seenByUserIds","openChat","closeSeenByModal","handleClick","renderingMemberIds","noStatusOrTyping","onSelect","buttonRef","activeElement","privateChatUserId","isPinned","selectIsChatPinned","isMuted","selectIsChatMuted","selectNotifySettings","selectNotifyExceptions","withUsername","isChatFolderModalOpen","openChatFolderModal","closeChatFolderModal","contextActions","useChatContextActions","handleDelete","handleChatFolderChange","useSelectWithEnter","avatarSize","DeleteChatModal","runThrottled","cb","topUserIds","topPeers","recentlyFoundChatIds","globalSearch","onReset","loadTopUsers","loadContactList","addRecentlyFoundChatId","clearRecentlyFoundChats","topUsersRef","useHorizontalScroll","shouldReplaceHistory","lastSyncTime","privateChatUser","searchQuery","mediaThumbnail","mediaBlobUrl","isRoundVideo","getMessageRoundVideo","isSavedMessages","isSelf","getChatTitle","isVerified","VerifiedIcon","Link","formatPastTimeShort","getMessageSummaryText","highlight","renderMessageSummary","searchDate","suggestions","match","suggestion","currentDate","latestYear","getSuggestionsFromDate","localContactIds","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","contactIdsWithMe","foundContactIds","foundMessages","split","sort","a","b","handleClickShowMoreLocal","handleClickShowMoreGlobal","nothingFound","noScrollRestoreOnTop","noFastList","NothingFound","PickerSelectedItem","chatOrUserId","clickArg","createMapStateToProps","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","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","currentUsername","asLink","isUsernameAvailable","checkUsername","username","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","allListIds","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","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","searchWords","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","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","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","userSearch","setUserSearchQuery","blockContact","filteredContactIds","availableContactIds","contactId","firstId","secondId","getUserFullName","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","statusesById","userStatusesById","serverTimeOffset","filteredIds","sortUserIds","isSearching","selectedMemberIds","onSelectedMemberIdsChange","onNextStep","setGlobalSearchQuery","canBeInvitedToGroup","isUserBot","handleNextStep","creationProgress","creationError","chatCreation","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","canShowSeenBy","seenByRecentUsers","onReply","onEdit","onPin","onReport","onFaveSticker","onUnfaveSticker","onSend","onReschedule","onCopyLink","onDownload","onShowSeenBy","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","isOwnMessage","SEEN_BY_MEMBERS_CHAT_MAX","SEEN_BY_MEMBERS_EXPIRE","chatUsername","setReplyingToId","setEditingId","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","loadSeenBy","openSeenByModal","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","handleOpenSeenByModal","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","input","div","contentEditable","blur","handleMessageSearchQueryChange","newQuery","handleUp","newFocusIndex","handleDown","SearchInput","findInViewport","selectorOrElements","margin","isDense","shouldContainBottom","isHorizontal","viewportY1","viewportY2","allElements","visibleIndexes","isFound","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","canAutoFocus","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","senderChat","forwardInfo","isChannelPost","orderBy","foundResult","preloadBackwards","LastMessageMeta","selectShouldLoopStickers","isSomeModalOpen","onModalToggle","isAdded","areStickersLoaded","useOnChange","coverStickerIds","covers","otherStickers","handleAddClick","canRenderStickers","STICKER_SIZE_SEARCH","selectCurrentStickerSearch","resultIds","featured","featuredIds","loadFeaturedStickers","setIsModalOpen","selectCurrentGifSearch","isChatWithBot","selectIsChatWithBot","searchMoreGifs","setGifSearchQuery","handleGifClick","hasResults","answer","voters","offsets","pollResults","answerVote","totalVoters","loadPollOptionResults","closePollResults","prevVotersCount","votersCount","setIsLoading","areVotersLoaded","limit","shouldResetVoters","handleViewMoreClick","handleMemberClick","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","availableMemberIds","acc","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","fullName","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","concat","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/477.a474b061825f5523f240.js b/dist/477.a474b061825f5523f240.js deleted file mode 100644 index b5ebf407a..000000000 --- a/dist/477.a474b061825f5523f240.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunktelegram_t=self.webpackChunktelegram_t||[]).push([[477],{9477:(e,t,n)=>{n.r(t),n.d(t,{ArchivedChats:()=>ja,AttachMenu:()=>sr,AttachmentModal:()=>Ts,BotCommandMenu:()=>ir,BotCommandTooltip:()=>or,CalendarModal:()=>Ye,ChatFolderModal:()=>qa,ContactList:()=>za,ContextMenuContainer:()=>ds,CustomSendMenu:()=>cr,DeleteMessageModal:()=>Ke,Dialogs:()=>De,DropArea:()=>dr.Z,EmojiTooltip:()=>hr,ForwardPicker:()=>Re,GifSearch:()=>kr,HeaderMenuContainer:()=>hs,HistoryCalendar:()=>je,InlineBotTooltip:()=>Cr,LeftSearch:()=>Vt,Management:()=>Yr,MediaViewer:()=>fe,MentionTooltip:()=>Ns,MessageSelectToolbar:()=>at,MobileSearch:()=>gs,NewChat:()=>Ha,NewChatStep1:()=>Ja,NewChatStep2:()=>_a,Notifications:()=>Ue,PaymentModal:()=>fo,PinMessageModal:()=>qe,PollModal:()=>As,PollResults:()=>Mr,ReceiptModal:()=>yo,RightSearch:()=>br,SafeLinkModal:()=>ze,SeenByModal:()=>st,Settings:()=>Oa,StickerSearch:()=>wr,StickerSetModal:()=>ms,StickerTooltip:()=>lr,SymbolMenu:()=>ar,TextFormatter:()=>mr.Z,UnpinAllMessagesModal:()=>We});var a=n(4050),s=n(5116),r=n(6137),o=n(1713),i=n(3716),l=n(2937),c=n(5326),d=n(8674),m=n(6590),u=n(9107),h=n(6202),Z=n(2566),P=n(7204),g=n(2858),v=n(1638),p=n(396),E=n(3989),C=n(1174),f=n(7361),b=n(782),I=n(3858),y=n(4399),S=n(935);function w(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 k(e,t){const n=document.querySelector(".Transition__slide--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 .Transition__slide--active .ProfilePhoto",a="img.avatar-media";break;case o.bZ.ProfileAvatar:n="#RightColumn .ProfileInfo .Transition__slide--active .ProfilePhoto",a="img.avatar-media";break;case o.bZ.ScheduledInline:case o.bZ.Inline:default:n=`.Transition__slide--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 T(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 F=n(231),A=n(126),L=n(2255),R=n(3106),B=n(8964),$=n(9196);const D=(0,a.X$)((0,s.c$)(((e,{message:t})=>({isDownloading:!!t&&(0,v.te)(e,t)})),((e,t)=>(0,b.ei)(t,["downloadMessageMedia","cancelMessageMediaDownload"])))((({mediaData:e,isVideo:t,isZoomed:n,message:s,fileName:r,isAvatar:o,isDownloading:i,onCloseMediaViewer:l,onForward:c,onZoomToggle:d,downloadMessageMedia:m,cancelMessageMediaDownload:h})=>{const{loadProgress:P}=(0,Z.Z)(s&&(0,g.Ti)(s,"download"),!i),v=(0,a.I4)((()=>{i?h({message:s}):m({message:s})}),[h,m,i,s]),p=(0,u.Z)(),E=(0,a.Ye)((()=>({onTrigger:e,isOpen:t})=>a.ZP.createElement(F.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 f.wB?a.ZP.createElement("div",{className:"MediaViewerActions-mobile"},a.ZP.createElement(R.Z,{trigger:E,positionX:"right"},!o&&a.ZP.createElement(B.Z,{icon:"forward",onClick:c},p("Forward")),t?a.ZP.createElement(B.Z,{icon:i?"close":"download",onClick:v},i?`${Math.round(100*P)}% Downloading...`:"Download"):a.ZP.createElement(B.Z,{icon:"download",href:e,download:r},p("AccActionDownload"))),i&&a.ZP.createElement($.Z,{progress:P,size:"s",noCross:!0})):a.ZP.createElement("div",{className:"MediaViewerActions"},!o&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(F.Z,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:p("Forward"),onClick:c},a.ZP.createElement("i",{className:"icon-forward"}))),t?a.ZP.createElement(F.Z,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:p("AccActionDownload"),onClick:v},i?a.ZP.createElement($.Z,{progress:P,size:"s",onClick:v}):a.ZP.createElement("i",{className:"icon-download"})):a.ZP.createElement(F.Z,{href:e,download:r,round:!0,size:"smaller",color:"translucent-white",ariaLabel:p("AccActionDownload")},a.ZP.createElement("i",{className:"icon-download"})),a.ZP.createElement(F.Z,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:n?"Zoom Out":"Zoom In",onClick:d},a.ZP.createElement("i",{className:n?"icon-zoom-out":"icon-zoom-in"})),a.ZP.createElement(F.Z,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:p("Close"),onClick:l},a.ZP.createElement("i",{className:"icon-close"})))})));var x=n(2202),U=n(9933),O=n(275),G=n(9118),z=n(9204),X=n(6752);const J=({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*y.Gw)};t();const n=(0,G.P2)(t,500,!0);return window.addEventListener("resize",n,!1),()=>{window.removeEventListener("resize",n,!1)}}),[]);const i=(0,X.Z)("MediaViewerFooter",n&&"is-for-video",t&&"is-hidden");return a.ZP.createElement("div",{className:i,onClick:function(t){e&&t.stopPropagation()}},e&&a.ZP.createElement("div",{className:"media-viewer-footer-content",onClick:f.wB?void 0:s},a.ZP.createElement("p",{className:"media-text custom-scroll "+(r?"multiline":""),dir:"auto"},e)))};var _=n(1212),V=n(2019);const H=void 0!==document.fullscreenElement?"fullscreenElement":void 0!==document.mozFullScreenElement?"mozFullScreenElement":void 0!==document.webkitFullscreenElement?"webkitFullscreenElement":"";var Y=n(6898),j=n(4753),K=n(790);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:i,isFullscreenSupported:l,isFullscreen:c,onChangeFullscreen:d,onPlayPause:m,onSeek:h})=>{const[Z,P]=(0,a.eJ)(!0),g=(0,a.sO)(null),v=(0,a.sO)(!1);(0,a.d4)((()=>{r&&P(r)}),[r]),(0,a.d4)((()=>{let e;return r||(f.wB?P(!1):e=window.setTimeout((()=>{P(!1)}),800)),()=>{e&&window.clearTimeout(e)}}),[r]),(0,a.d4)((()=>((Z||r)&&document.body.classList.add("video-controls-visible"),()=>{document.body.classList.remove("video-controls-visible")})),[r,Z]);const p=(0,u.Z)(),E=(0,a.I4)((e=>{if(v.current&&g.current){const{width:t,left:a}=g.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]),b=(0,a.I4)((e=>{v.current=!0,E(e)}),[E]),I=(0,a.I4)((()=>{v.current=!1}),[]);var y,S;if((0,a.d4)((()=>{if(g.current&&Z)return(0,C.s)(g.current,{onCapture:b,onRelease:I,onClick:I,onDrag:E})}),[Z,b,E,I]),Z||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,g),a.ZP.createElement(F.Z,{ariaLabel:p("AccActionPlay"),size:"tiny",ripple:!f.wB,color:"translucent-white",className:"play",onClick:m},a.ZP.createElement("i",{className:i?"icon-pause":"icon-play"})),function(e,t){return a.ZP.createElement("div",{className:"player-time"},`${(0,K.k9)(e)} / ${(0,K.k9)(t)}`)}(t,n),e<1&&(y=e,S=s,a.ZP.createElement("div",{className:"player-file-size"},`${W(S*y)} / ${W(S)}`)),l&&a.ZP.createElement(F.Z,{ariaLabel:"Fullscreen",size:"tiny",color:"translucent-white",className:"fullscreen",onClick:d},a.ZP.createElement("i",{className:c?"icon-smallscreen":"icon-fullscreen"})))};function te(){return(te=Object.assign||function(e){for(var t=1;t{const d=(0,a.sO)(null),[m,u]=(0,a.eJ)(!f.$b||!f.cj),[h,Z]=(0,a.eJ)(0),[P,g]=(0,a.eJ)(!0),[v,p,E]=function(e,t){const[n,s]=(0,a.eJ)(Boolean(H&&document[H]));return(0,a.bt)((()=>{const n=()=>{s(Boolean(H&&document[H]))},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))}}),[]),H||"iOS"===f.Lt?[n,()=>{e.current&&(H||"iOS"===f.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]}(d,u),{isBuffered:C,bufferedProgress:b,bufferingHandlers:I}=(0,V.Z)(),{shouldRender:y,transitionClassNames:S}=(0,_.Z)(!C,void 0,void 0,"slow"),{shouldRender:w,transitionClassNames:k}=(0,_.Z)(f.cj&&!m&&!y,void 0,void 0,"slow");(0,a.d4)((()=>{l||!i?d.current.pause():e&&!f.$b&&(0,j.Z)(d.current)}),[l,i,e]),(0,a.d4)((()=>{d.current.currentTime===d.current.duration?(Z(0),u(!1)):Z(d.current.currentTime)}),[h]);const N=(0,a.I4)((e=>{e.stopPropagation(),m?(d.current.pause(),u(!1)):((0,j.Z)(d.current),u(!0),f.wB&&g(!1))}),[m]);(0,Y.Z)(d,[]);const M=(0,a.I4)((()=>{g(!0)}),[]),T=(0,a.I4)((()=>{g(!1)}),[]),A=(0,a.I4)((e=>{Z(e.currentTarget.currentTime)}),[]),L=(0,a.I4)((()=>{Z(0),u(!1),g(!0)}),[]),R=(0,a.I4)((()=>{v&&E?E():!v&&p&&p()}),[E,v,p]),B=(0,a.I4)((e=>{d.current.currentTime=e}),[]),D=(0,a.I4)((e=>{e.stopPropagation(),g(!P),P||(d.current.pause(),u(!1))}),[P]);(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 x=s&&`width: ${s.width}px; height: ${s.height}px`,U=`background-image: url(${n})`;return a.ZP.createElement("div",{className:"VideoPlayer",onClick:!t&&f.wB?D:void 0,onMouseOver:t||f.$b?void 0:M,onMouseOut:t||f.$b?void 0:T},a.ZP.createElement("div",{style:x},a.ZP.createElement("video",te({ref:d,autoPlay:f.$b,playsInline:!0,loop:t,muted:t,id:"media-viewer-video",style:U,onPlay:f.cj?()=>u(!0):void 0,onEnded:L,onClick:f.wB?void 0:N,onDoubleClick:R},I,{onTimeUpdate:A}),e&&a.ZP.createElement("source",{src:e}))),w&&a.ZP.createElement(F.Z,{round:!0,className:`play-button ${k}`,onClick:N},a.ZP.createElement("i",{className:"icon-play"})),y&&a.ZP.createElement("div",{className:["spinner-container",S].join(" ")},!C&&a.ZP.createElement("div",{className:"buffering"},"Buffering..."),a.ZP.createElement($.Z,{size:"xl",progress:C?1:r,square:!0,onClick:c})),!t&&!y&&a.ZP.createElement(ee,{isPlayed:m,bufferedProgress:b,currentTime:h,isFullscreenSupported:Boolean(p),isFullscreen:v,fileSize:o,duration:d.current?d.current.duration:0,isForceVisible:P,isForceMobileVersion:s&&s.width<400,onSeek:B,onChangeFullscreen:R,onPlayPause:N}))})),ae=(0,a.X$)((0,s.c$)(((e,t)=>{const{chatId:n,threadId:a,messageId:s,avatarOwnerId:r,profilePhotoIndex:i,origin:l}=t;if(l===o.bZ.SearchResult){if(!n||!s)return{};const t=(0,v.hj)(e,n,s);return t?{chatId:n,messageId:s,senderId:t.senderId,origin:l,message:t}:{}}if(r)return{messageId:-1,senderId:r,avatarOwner:(0,v.dy)(e,r)||(0,v.Z1)(e,r),profilePhotoIndex:i||0,origin:l};if(!(n&&a&&s))return{};let c;return c=l&&[o.bZ.ScheduledAlbum,o.bZ.ScheduledInline].includes(l)?(0,v.Tm)(e,n,s):(0,v.hj)(e,n,s),c?{chatId:n,threadId:a,messageId:s,senderId:c.senderId,origin:l,message:c}:{}}))((e=>{const{messageId:t,isActive:n,avatarOwner:s,chatId:i,message:c,profilePhotoIndex:d,origin:m,animationLevel:u,onClose:P,onFooterClick:v,isFooterHidden:p}=e,E=c?(0,g.O$)(c):void 0,C=c?(0,g.b7)(c):void 0,f=c?(0,g.F$)(c):void 0,b=c?(0,g.Cg)(c):void 0,I=!!c&&(0,g.rl)(c),w=!!c&&(0,g.hC)(c),k=Boolean(C||b||w),N=Boolean(!k&&(E||f||I)),{isGif:M}=C||b||{},T=Boolean(s||t),F=Boolean(s),A=m===o.bZ.SharedMedia,L=m===o.bZ.SearchResult,R=2===u;function B(e){if(F&&void 0!==d){const{photos:t}=s;return t&&t[d]?`photo${t[d].id}?size=c`:(0,g.RT)(s,e?"big":"normal")}return c&&(0,g.Ti)(c,e?"viewerFull":"viewerPreview")}const $=(0,h.Z)(c&&(A||L)&&(0,g.Ti)(c,"pictogram"),void 0,r.IU.BlobUrl,void 0,R&&350),D=B(),x=(0,h.Z)(D,void 0,r.IU.BlobUrl,void 0,R&&350),{mediaData:U,loadProgress:O}=(0,Z.Z)(B(!0),void 0,c&&(0,g.kG)(c,"viewerFull"),void 0,R&&350),G=E||C?(E||C).blobUrl:void 0;let X=!k&&(G||U)||x||$;const _=(0,l.Z)(!X&&c&&(0,g.DH)(c));X||m===o.bZ.SearchResult||(X=_);const V=c?(0,g.c0)(c):void 0;let H;if(c?I||w?H=(0,g.aE)(c).mediaSize:E||f?H=(0,g.bV)(E||f):(C||b)&&(H=(0,g.jC)(C||b)):H=y.vY,F)return a.ZP.createElement("div",{key:i,className:"MediaViewerContent"},se(U||x,(0,y.PA)(y.vY,!1),!1));if(!c)return;const Y=(0,S.X)(c),j=Boolean(Y);return a.ZP.createElement("div",{className:"MediaViewerContent "+(j?"has-footer":"")},N&&se(G||U||x||$,c&&(0,y.PA)(H,j),!1),k&&(n?a.ZP.createElement(ne,{key:t,url:G||U,isGif:M,posterData:X,posterSize:c&&(0,y.PA)(H,j,!0),loadProgress:O,fileSize:V,isMediaViewerOpen:T,noPlay:!n,onClose:P}):function(e,t,n){const s=t&&`width: ${t.width}px; height: ${t.height}px`,r=`background-image: url(${e})`;return e?a.ZP.createElement("div",{className:"VideoPlayer"},a.ZP.createElement("div",{style:s},a.ZP.createElement("video",{style:r,draggable:Boolean(!1)}))):a.ZP.createElement("div",{className:"spinner-wrapper",style:t?`width: ${t.width}px`:""},a.ZP.createElement(z.Z,{color:"white"}))}(X,c&&(0,y.PA)(H,j,!0))),Y&&a.ZP.createElement(J,{text:Y,onClick:v,isHidden:p&&(!k||M),isForVideo:k&&!M}))})));function se(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(z.Z,{color:"white"}))}function re(){return(re=Object.assign||function(e){for(var t=1;t{const u=(0,a.sO)(null),h=(0,a.sO)(null),Z=(0,a.sO)(le),P=(0,a.sO)(!1),g=(0,a.sO)(!0),[v,p]=(0,a.eJ)(e),E=(0,c.Z)(),[b,I]=(0,a.eJ)(!1),{isZoomed:y,onClose:S}=m,w=(0,a.I4)((e=>{Z.current=e,E()}),[E]),k=(0,a.I4)((e=>{P.current=e,E()}),[E]),N=(0,a.I4)((e=>{g.current=e,E()}),[E]),M=(0,x.Z)(350,!1),T=(0,x.Z)(500,!1),F=(0,x.Z)(800,!1),A=(0,a.I4)((()=>{f.$b&&(o||r)&&d&&I(!b)}),[d,b,r,o]);if((0,a.d4)((()=>{if(!f.$b||!u.current||y||!v)return;let e={...Z.current};const a={x:0,y:0},s={x:0,y:0},r={x:0,y:0};let o,i,l=Date.now();const c=(0,G.Ds)((()=>{l=Date.now()}),500,!1,!0);return(0,C.s)(u.current,{isNotPassive:!0,excludedClosestSelector:".VideoPlayerControls, .MediaViewerFooter",onCapture:e=>{if("touchstart"!==e.type||!("pageX"in e)||e.pageX>10&&e.pageX{ie&&(ie(),ie=void 0),r.x=a.x-s,r.y=a.y-o,a.x=s,a.y=o;const i=Math.abs(s),l=Math.abs(o),{scale:d,x:m,y:u}=Z.current,h=10;if(c(),1===d)return P.current||Math.abs(m)>h||i>h&&lh||l>h&&i{const d=Math.min(12,Math.max(e.scale*n,.6)),m=d/e.scale,u=Math.abs(Math.min(e.x,0))+a,h=Math.abs(Math.min(e.y,0))+r;s.x=l,s.y=c;const Z=u-m*u,P=h-m*h;w({x:e.x+Z+o,y:e.y+P+i,scale:d})},onDoubleClick(t,{centerX:n,centerY:a}){const s=n-3*n,r=a-3*a,{scale:o,x:i,y:l}=Z.current;if(1===o){if(0!==i||0!==l)return;e={x:s,y:r,scale:3}}else e={x:0,y:0,scale:1};return(0,U.vr)({from:[i,l,o],to:[e.x,e.y,e.scale],duration:oe,timing:U.M8.easeOutCubic,onUpdate:e=>w({x:e[0],y:e[1],scale:e[2]})})},onRelease:()=>{const c=Math.abs(Z.current.x),d=Math.abs(Z.current.y),{scale:m,x:u,y:h}=Z.current;if(m<1)return e=le,(0,U.vr)({from:[u,h,m],to:[0,0,1],duration:oe,timing:U.M8.easeOutCubic,onUpdate:e=>w({x:e[0],y:e[1],scale:e[2]})});if(m>1){if(!i||!o)return void(e={x:u,y:h,scale:m});const t=i.getBoundingClientRect(),n=Math.min(m,4),c=n/m;let d=u*c+(s.x-c*s.x),Z=h*c+(s.y-c*s.y);const P=.15;if(e.scale===m){const e=Math.abs(a.x)/(Date.now()-l),t=Math.abs(a.y)/(Date.now()-l);d-=Math.abs(a.x)*e*P*r.x,Z-=Math.abs(a.y)*t*P*r.y}if(t.width>window.innerWidth){const e=-o.left*n,t=window.innerWidth-o.right*n;d=Math.min(e,Math.max(t,d))}else d=(window.innerWidth-window.innerWidth*n)/2;if(t.height>window.innerHeight){const e=-o.top*n,t=window.innerHeight-o.bottom*n;Z=Math.min(e,Math.max(t,Z))}else Z=(window.innerHeight-window.innerHeight*n)/2;return e={x:d,y:Z,scale:n},void(ie=(0,U.vr)({from:[u,h,m],to:[d,Z,n],duration:oe,timing:U.M8.easeOutCubic,onUpdate:e=>w({x:e[0],y:e[1],scale:e[2]})}))}if(e={x:u,y:h,scale:m},d>=50)return S();if(d>0)return(0,U.vr)({from:h,to:0,duration:oe,timing:U.M8.easeOutCubic,onUpdate:e=>w({x:0,y:e,scale:m})});const P=u<0?1:-1,g=t(v,u<0?1:-1),E=r.x<0?-1:1;if(g&&c>=50&&P===E){const e=(window.innerWidth+40)*P;Z.current.x+=e,p(g),M((()=>n(g)))}T((()=>k(!1))),F((()=>N(!0))),ie=(0,U.vr)({from:Z.current.x,to:0,duration:oe,timing:U.M8.easeOutCubic,onUpdate:e=>w({y:0,x:e,scale:Z.current.scale})})}})}),[y,S,w,t,v,k,N]),!v)return;const L=t(v,1),R=t(v,-1),B=Z.current.x,$=Z.current.y,{scale:D}=Z.current;return a.ZP.createElement("div",{className:"MediaViewerSlides",ref:u},R&&1===D&&a.ZP.createElement("div",{className:"MediaViewerSlide",style:de(-window.innerWidth+B-40)},a.ZP.createElement(ae,re({},m,{messageId:R,isFooterHidden:b}))),v&&a.ZP.createElement("div",{className:"MediaViewerSlide "+(l?"MediaViewerSlide--active":""),onClick:A,ref:h,style:de(B,$,D)},a.ZP.createElement(ae,re({},m,{messageId:v,isActive:g.current,isFooterHidden:b||y||1!==D}))),L&&1===D&&a.ZP.createElement("div",{className:"MediaViewerSlide",style:de(window.innerWidth+B+40)},a.ZP.createElement(ae,re({},m,{messageId:L,isFooterHidden:b}))))}));function de(e=0,t=0,n=1){return`transform: translate3d(${e.toFixed(3)}px, ${t.toFixed(3)}px, 0px) scale(${n.toFixed(3)});`}const me=[1,0,0,1,0,0],ue={1:1,1.5:1.5,2:2.2,2.5:3.3,3:5.5},he=150,Ze=(0,a.X$)((({children:e,className:t,noWrap:n,canPan:s,zoomLevel:r,panDeltaX:o,panDeltaY:i,onPan:l})=>{const c=ue[r]||r,[d,m]=(0,a.eJ)(!1),[u,h]=(0,a.eJ)({dx:o,dy:i,x:0,y:0}),[Z,P]=(0,a.eJ)(me),g=(0,a.sO)(null),v=(0,a.sO)(null);return(0,a.d4)((()=>{const e=c||Z[0],t=o||Z[4],n=i||Z[5],a=[...Z];Z[0]!==e&&(a[0]=e||a[0],a[3]=e||a[3]),Z[4]!==t&&(a[4]=t),Z[5]!==n&&(a[5]=n),(0,b.et)(Z,a)||P(function(e,t,n){const a=n&&n.querySelector(".Transition__slide--active img");if(!n||!a)return t;const s=n.getBoundingClientRect(),r=a.getBoundingClientRect(),o=r.width/e*t[0],i=r.height/e*t[3],l=(s.width-o)/2+t[4],c=(s.height-i)/2+t[5];return s.width&&s.width-he{s||P(me)}),[s]),(0,a.d4)((()=>{v.current&&(v.current.style.transform=`matrix(${Z.toString()})`)}),[n,Z]),n?e:a.ZP.createElement("div",{ref:g,className:`pan-wrapper ${t||""}`,onMouseDown:e=>{if(!s)return;e.stopPropagation(),e.preventDefault();const t={dx:Z[4],dy:Z[5],x:e.pageX,y:e.pageY};h(t),m(!0),g.current&&g.current.classList.add("move")},onMouseUp:()=>{m(!1),g.current&&g.current.classList.remove("move"),l&&l(Z[4],Z[5])},onMouseMove:e=>{if(d){const t=function(e,t){const n=[...Z],a=u.x-e,s=u.y-t;return n[4]=u.dx-a,n[5]=u.dy-s,n}(e.pageX,e.pageY);P(t),v.current&&(v.current.style.transform=`matrix(${Z.toString()})`)}}},a.ZP.createElement("div",{ref:v,className:"pan-container"},e))}));var Pe=n(2340),ge=n(172);const ve=(0,s.c$)(((e,{chatId:t,messageId:n,isAvatar:a})=>{if(a&&t)return{sender:(0,g.YC)(t)?(0,v.dy)(e,t):(0,v.Z1)(e,t)};if(!n||!t)return{};const s=(0,v.hj)(e,t,n);return{message:s,sender:s&&(0,v.Ur)(e,s)}}),((e,t)=>(0,b.ei)(t,["closeMediaViewer","focusMessage"])))((({chatId:e,messageId:t,sender:n,isAvatar:s,message:r,closeMediaViewer:o,focusMessage:i})=>{const l=(0,a.I4)((()=>{o(),i({chatId:e,messageId:t})}),[e,i,t,o]),c=(0,u.Z)();if(!n||!r&&!s)return;const d=(0,g.OU)(c,n);return a.ZP.createElement("div",{className:"SenderInfo",onClick:l},(0,g.YC)(n.id)?a.ZP.createElement(ge.Z,{key:n.id,size:"medium",user:n}):a.ZP.createElement(ge.Z,{key:n.id,size:"medium",chat:n}),a.ZP.createElement("div",{className:"meta"},a.ZP.createElement("div",{className:"title",dir:"auto"},d&&(0,Pe.Z)(d)),a.ZP.createElement("div",{className:"date",dir:"auto"},s?c("lng_mediaview_profile_photo"):(0,K.ZK)(c,1e3*r.date,!0))))})),pe=({children:e,...t})=>f.$b?a.ZP.createElement("div",{className:"Transition"},a.ZP.createElement("div",{className:"Transition__slide--active"},e(!0,!0,1))):a.ZP.createElement(L.Z,t,e),Ee=(0,a.X$)((({isShown:e,onChangeZoom:t})=>{const{transitionClassNames:n}=(0,_.Z)(e),s=(0,P.Z)(e),r=(0,a.sO)(null),[o,i]=(0,a.eJ)(1),l=(0,a.sO)(!1);(0,a.d4)((()=>{e&&!s&&i(1.5)}),[e,s]);const c=(0,a.I4)((()=>{l.current=!0}),[]),d=(0,a.I4)((()=>{l.current=!1,1===o&&t(o,!l.current)}),[t,o]);(0,a.d4)((()=>{t(o,!l.current)}),[o,t]);const m=(0,u.Z)(),h=(0,X.Z)("ZoomControls",n);return a.ZP.createElement("div",{className:h},a.ZP.createElement(F.Z,{disabled:1===o,size:"tiny",color:"translucent-white",ariaLabel:m("ZoomOut"),className:"zoom-out",ripple:!f.wB,onClick:()=>{r.current&&i(Math.max(1,o-.5))}},a.ZP.createElement("i",{className:"icon-zoom-out"})),a.ZP.createElement(F.Z,{disabled:3===o,size:"tiny",color:"translucent-white",ariaLabel:"Zoom In",className:"zoom-in",ripple:!f.wB,onClick:()=>{r.current&&i(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=>{i(Math.min(3,Math.max(Number(e.target.value),1)))},onMouseDown:c,onMouseUp:d}))))})),Ce=350,fe=(0,a.X$)((0,s.c$)((e=>{const{chatId:t,threadId:n,messageId:a,avatarOwnerId:s,profilePhotoIndex:r,origin:i}=e.mediaViewer,{animationLevel:l}=e.settings.byKey;if(i===o.bZ.SearchResult){if(!t||!a)return{animationLevel:l};const n=(0,v.hj)(e,t,a);return n?{chatId:t,messageId:a,senderId:n.senderId,origin:i,message:n,animationLevel:l}:{animationLevel:l}}if(s)return{messageId:-1,senderId:s,avatarOwner:(0,v.dy)(e,s)||(0,v.Z1)(e,s),profilePhotoIndex:r||0,animationLevel:l,origin:i};if(!(t&&n&&a))return{animationLevel:l};let c,d,m;if(c=i&&[o.bZ.ScheduledAlbum,o.bZ.ScheduledInline].includes(i)?(0,v.Tm)(e,t,a):(0,v.hj)(e,t,a),!c)return{animationLevel:l};if(d=i&&[o.bZ.ScheduledAlbum,o.bZ.ScheduledInline].includes(i)?(0,v.Fn)(e,t):(0,v.Zw)(e,t),i===o.bZ.Inline||i===o.bZ.Album)m=(0,v.qC)(e,t,n)||(0,v.gb)(e,t,n);else if(i===o.bZ.SharedMedia){const t=(0,v.we)(e),{foundIds:n}=t&&t.resultsByType&&t.resultsByType.media||{};m=n}return{chatId:t,threadId:n,messageId:a,senderId:c.senderId,origin:i,message:c,chatMessages:d,collectionIds:m,animationLevel:l}}),((e,t)=>(0,b.ei)(t,["openMediaViewer","closeMediaViewer","openForwardMenu","focusMessage"])))((({chatId:e,threadId:t,messageId:n,senderId:s,origin:v,avatarOwner:b,profilePhotoIndex:R,message:B,chatMessages:$,collectionIds:x,openMediaViewer:U,closeMediaViewer:O,openForwardMenu:G,focusMessage:z,animationLevel:X})=>{const J=Boolean(b||n),_=v===o.bZ.SharedMedia,V=v===o.bZ.SearchResult,H=B?(0,g.O$)(B):void 0,Y=B?(0,g.b7)(B):void 0,j=B?(0,g.F$)(B):void 0,K=B?(0,g.Cg)(B):void 0,q=!!B&&(0,g.rl)(B),W=!!B&&(0,g.hC)(B),Q=Boolean(Y||K||W),{isGif:ee}=Y||K||{},te=Boolean(!Q&&(H||j||q)),ne=Boolean(b),ae=Boolean(j||K),se=(0,a.Ye)((()=>ae&&n?[n]:(0,g.N0)($||{},x||[],_)),[ae,n,$,x,_]),re=n?se.indexOf(n):-1,oe=0===re||-1===re,ie=re===se.length-1||-1===re,le=(0,a.sO)(),de=(0,P.Z)(s);!J||de&&de===s&&le.current||(le.current=re);const me=X>=1&&!f.$b?"mv-slide":"none",ue=2===X?"slide-fade":"none",he=2===X,[Pe,ge]=(0,a.eJ)(!1),[fe,be]=(0,a.eJ)(!1),[Ie,ye]=(0,a.eJ)(1),[Se,we]=(0,a.eJ)({x:0,y:0});function ke(e){if(ne&&void 0!==R){const{photos:t}=b;return t&&t[R]?`photo${t[R].id}?size=c`:(0,g.RT)(b,e?"big":"normal")}return B&&(0,g.Ti)(B,e?"viewerFull":"viewerPreview")}const Ne=(0,h.Z)(B&&(_||V)&&(0,g.Ti)(B,"pictogram"),void 0,r.IU.BlobUrl,void 0,he&&Ce),Me=ke(),Te=(0,h.Z)(Me,void 0,r.IU.BlobUrl,void 0,he&&Ce),{mediaData:Fe}=(0,Z.Z)(ke(!0),void 0,B&&(0,g.kG)(B,"viewerFull"),void 0,he&&Ce),Ae=H||Y?(H||Y).blobUrl:void 0;let Le=!Q&&(Ae||Fe)||Te||Ne;const Re=(0,l.Z)(!Le&&B&&(0,g.DH)(B));Le||v===o.bZ.SearchResult||(Le=Re);const Be=B?(0,g.ep)(B):ne?`avatar${b.id}-${R}.jpg`:void 0;let $e;B?q||W?$e=(0,g.aE)(B).mediaSize:H||j?$e=(0,g.bV)(H||j):(Y||K)&&($e=(0,g.jC)(Y||K)):$e=y.vY,(0,a.d4)((()=>{f.wB&&document.body.classList.toggle("is-media-viewer-open",J)}),[J]);const De=(0,c.Z)();(0,a.d4)((()=>{const e=window.matchMedia(y.L6);return"function"==typeof e.addEventListener?e.addEventListener("change",De):"function"==typeof e.addListener&&e.addListener(De),()=>{"function"==typeof e.removeEventListener?e.removeEventListener("change",De):"function"==typeof e.removeListener&&e.removeListener(De)}}),[De]);const xe=(0,P.Z)(B),Ue=(0,P.Z)(v),Oe=(0,P.Z)(b),Ge=(0,P.Z)(Le),ze=B?(0,S.X)(B):void 0,Xe=Boolean(ze);(0,a.d4)((()=>{he&&J&&!xe&&!Oe&&((0,d.YW)(Ce+i.fK),function(e,t,n,a,s,r){const{mediaEl:l}=M(t,r);if(!l)return;const{width:c}=I.Z.get(),{width:d,height:m}=(0,y.fM)(e,s),{width:u,height:h}=(0,y.jg)(d,m,a.width,a.height),Z=(c-u)/2,P=function(e){const t=window.matchMedia(y.L6);let n=4.125;return e&&(n+=t.matches?.875:3.375),n*y.Gw}(e)+(m-h)/2;let{top:g,left:v,width:p,height:E}=l.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}}(u,h,g,v,p,E);g=e.top,v=e.left,p=e.width,E=e.height}const C=v+p/2-(Z+u/2),f=g+E/2-(P+h/2),b=p/u,S=E/h,k=w(n||l);N(k,{top:`${P}px`,left:`${Z}px`,width:`${u}px`,height:`${h}px`,transform:`translate3d(${C}px, ${f}px, 0) scale(${b}, ${S})`}),T(k,t),document.body.classList.add("ghost-animating"),requestAnimationFrame((()=>{document.body.appendChild(k),requestAnimationFrame((()=>{k.style.transform="",function(e){e.firstChild.style.objectFit="default",e.classList.remove("rounded-corners","circle")}(k),setTimeout((()=>{requestAnimationFrame((()=>{document.body.contains(k)&&document.body.removeChild(k),document.body.classList.remove("ghost-animating")}))}),200+i.fK)}))}))}(Xe,v,Le,$e,Q,B)),he&&!J&&(xe||Oe)&&((0,d.YW)(Ce+i.fK),function(e,t,n){const{container:a,mediaEl:s}=M(e,n);if(!s)return;const r=document.getElementById("MediaViewer").querySelector(".MediaViewerSlide--active img, .MediaViewerSlide--active video");if(!r||!s)return;const{top:l,left:c,width:d,height:m}=r.getBoundingClientRect(),{top:u,left:h,width:Z,height:P}=s.getBoundingClientRect();let g=u;if(!function(e){if("none"===e.style.display)return!1;const t=e.getBoundingClientRect(),{height:n}=I.Z.get();return t.top<=n&&t.top+t.height>=0}(a)){const{height:e}=I.Z.get();g=uC?E=C:C>E&&(C=E));const b=document.getElementsByClassName("ghost")[0],y=b||w(t||s,e);b||N(y,{top:`${g}px`,left:`${h}px`,width:`${Z}px`,height:`${P}px`,transform:`translate3d(${v}px, ${p}px, 0) scale(${E}, ${C})`}),requestAnimationFrame((()=>{if(b){const{top:e,left:t,width:n,height:a}=b.getBoundingClientRect();N(y,{transition:"none",top:`${g}px`,left:`${h}px`,transformOrigin:"top left",transform:`translate3d(${t-h}px, ${e-g}px, 0) scale(${n/Z}, ${a/P})`,width:`${Z}px`,height:`${P}px`})}document.body.classList.add("ghost-animating"),b||document.body.appendChild(y),requestAnimationFrame((()=>{b&&(b.style.transition=""),y.style.transform="",f&&(y.style.opacity="0"),T(y,e),setTimeout((()=>{requestAnimationFrame((()=>{document.body.contains(y)&&document.body.removeChild(y),document.body.classList.remove("ghost-animating")}))}),200+i.fK)}))}))}(Ue,Ge,xe||void 0))}),[he,J,v,Ue,B,xe,Oe,Le,Ge,$e,Q,Xe]),(0,a.d4)((()=>{let e;return fe?ge(!0):e=window.setTimeout((()=>{ge(!1)}),Ce),()=>{e&&window.clearTimeout(e)}}),[fe]);const Je=()=>{be(!1),ye(1),we({x:0,y:0})},_e=(0,a.I4)((()=>{be(!fe),ye(fe?1:1.5),fe&&we({x:0,y:0})}),[fe]),Ve=(0,a.I4)(((e,t=!1)=>{ye(e),1===e&&t&&Je()}),[]),He=(0,a.I4)((()=>{O(),Je()}),[O]),Ye=(0,a.I4)((()=>{He(),z({chatId:e,threadId:t,messageId:n})}),[He,e,t,z,n]),je=(0,a.I4)((()=>{G({fromChatId:e,messageIds:[n]}),Je()}),[G,e,n]),Ke=(0,a.I4)((n=>U({chatId:e,threadId:t,messageId:n,origin:v},{forceOnHeavyAnimation:!0})),[e,U,v,t]);(0,a.d4)((()=>J?(0,E.Z)((()=>{fe?Je():He()})):void 0),[He,J,fe]),(0,a.d4)((()=>{Q&&!ee&&(0,p.Es)()}),[ee,Q]),(0,a.d4)((()=>{if(J)return I.Z.disableRefresh(),()=>{I.Z.enableRefresh()}}),[J]);const qe=(0,a.I4)(((e,t)=>{if(!e)return;const n=se.indexOf(e);return-1===t&&n>0||1===t&&n{we({x:e,y:t})}),[]),tt=(0,u.Z)();function nt(){return ne?a.ZP.createElement(ve,{key:b.id,chatId:b.id,isAvatar:!0}):a.ZP.createElement(ve,{key:n,chatId:e,messageId:n})}return(0,m.ZP)(J,O,U,{chatId:e,threadId:t,messageId:n,origin:v,avatarOwnerId:b&&b.id}),(0,a.d4)((()=>{const e=e=>{switch(e.key){case"Left":case"ArrowLeft":Ke(Qe);break;case"Right":case"ArrowRight":Ke(We)}};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}}),[We,Qe,Ke]),(0,a.d4)((()=>{if(fe||f.$b)return;const e=document.querySelector(".MediaViewerSlide--active");if(!e)return;const t=ee&&!f.cj;return(0,C.s)(e,{excludedClosestSelector:".backdrop, .navigation, .media-viewer-head, .media-viewer-footer"+(t?"":", .VideoPlayer"),onClick:He})}),[He,ee,fe,n]),a.ZP.createElement(A.Z,{id:"MediaViewer",className:fe?"zoomed":"",isOpen:J},(()=>a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("div",{className:"media-viewer-head",dir:tt.isRtl?"rtl":void 0},f.wB&&a.ZP.createElement(F.Z,{className:"media-viewer-close",round:!0,size:"smaller",color:"translucent-white",ariaLabel:tt("Close"),onClick:He},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement(L.Z,{activeKey:le.current,name:ue},nt),a.ZP.createElement(D,{mediaData:Fe||Te,isVideo:Q,isZoomed:fe,message:B,fileName:Be,onCloseMediaViewer:He,onForward:je,onZoomToggle:_e,isAvatar:ne})),a.ZP.createElement(Ze,{noWrap:!Pe,canPan:fe,panDeltaX:Se.x,panDeltaY:Se.y,zoomLevel:Ie,onPan:et},a.ZP.createElement(pe,{activeKey:re,name:me},(s=>a.ZP.createElement(ce,{messageId:n,getMessageId:qe,chatId:e,isPhoto:te,isGif:ee,threadId:t,avatarOwnerId:b&&b.id,profilePhotoIndex:R,origin:v,isOpen:J,hasFooter:Xe,isZoomed:fe,isActive:s,animationLevel:X,onClose:He,selectMessage:Ke,onFooterClick:Ye})))),!oe&&!f.$b&&a.ZP.createElement("button",{type:"button",className:`navigation prev ${Q&&!ee&&"inline"}`,"aria-label":tt("AccDescrPrevious"),dir:tt.isRtl?"rtl":void 0,onClick:()=>Ke(Qe)}),!ie&&!f.$b&&a.ZP.createElement("button",{type:"button",className:`navigation next ${Q&&!ee&&"inline"}`,"aria-label":tt("Next"),dir:tt.isRtl?"rtl":void 0,onClick:()=>Ke(We)}),a.ZP.createElement(Ee,{isShown:fe,onChangeZoom:Ve}))))})));var be=n(8360),Ie=n(7407),ye=n(2313),Se=n(2515),we=n(4288),ke=n(3103),Ne=n(7687),Me=n(1273),Te=n(1876),Fe=n(8799),Ae=n(6058);const Le=(0,a.X$)((({isOpen:e,currentUserId:t,chatOrUserIds:n,filterRef:s,filter:r,filterPlaceholder:o,onFilterChange:i,onClose:l,loadMore:c,onSelectChatOrUser:d})=>{const m=(0,u.Z)(),[h,Z]=(0,Ie.Z)(c,n,Boolean(r)),P=(0,a.I4)((()=>{i("")}),[i]);(0,Se.Z)(s,e,P);const v=(0,a.sO)(null),p=(0,a.I4)((e=>{i(e.currentTarget.value)}),[i]),E=(0,ye.Z)(v,e,(e=>{h&&h.length>0&&d(h[-1===e?0:e])}),".ListItem-button",!0),C=a.ZP.createElement("div",{className:"modal-header",dir:m.isRtl?"rtl":void 0},a.ZP.createElement(F.Z,{round:!0,color:"translucent",size:"smaller",ariaLabel:m("Close"),onClick:l},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement(Ne.Z,{ref:s,value:r,onChange:p,onKeyDown:E,placeholder:o}));return a.ZP.createElement(ke.Z,{isOpen:e,onClose:l,className:"ChatOrUserPicker",header:C},null!=h&&h.length?a.ZP.createElement(Me.Z,{className:"picker-list custom-scroll",items:h,onLoadMore:Z,noScrollRestore:Boolean(r),ref:v,onKeyDown:E},h.map((e=>a.ZP.createElement(Te.Z,{key:e,className:"chat-item-clickable force-rounded-corners",onClick:()=>d(e)},(0,g.YC)(e)?a.ZP.createElement(Ae.Z,{status:e===t?m("SavedMessagesInfo"):void 0,userId:e}):a.ZP.createElement(Fe.Z,{chatId:e}))))):h&&!h.length?a.ZP.createElement("p",{className:"no-results"},m("lng_blocked_list_not_found")):a.ZP.createElement(we.Z,null))})),Re=(0,a.X$)((0,s.c$)((e=>{var t;const{chats:{byId:n,listIds:a,orderedPinnedIds:s},currentUserId:r}=e;return{chatsById:n,activeListIds:a.active,archivedListIds:a.archived,pinnedIds:s.active,contactIds:null===(t=e.contactList)||void 0===t?void 0:t.userIds,currentUserId:r}}),((e,t)=>(0,b.ei)(t,["setForwardChatId","exitForwardMode","loadMoreChats"])))((({chatsById:e,activeListIds:t,archivedListIds:n,pinnedIds:o,contactIds:i,currentUserId:l,isOpen:c,setForwardChatId:d,exitForwardMode:m,loadMoreChats:h})=>{const Z=(0,u.Z)(),[P,v]=(0,a.eJ)(""),p=(0,a.sO)(null),E=(0,a.Ye)((()=>{if(!c)return;let a=o||[];l&&(a=(0,b.Tw)([l,...a]));const d=[...t||[],...n||[]].filter((t=>{const n=e[t];return n&&(0,g.Qm)(n,r._f)})),m=(0,s.Rd)().users.byId;return(0,g.ih)((0,b.Tw)([...(0,g.$l)(Z,d,e,P,l),...i?(0,g.kK)(i,m,P):[]]),e,void 0,a)}),[t,n,e,i,l,P,c,Z,o]),C=(0,a.I4)((e=>{d({id:e})}),[d]),f=(0,be.Z)(E);return a.ZP.createElement(Le,{currentUserId:l,isOpen:c,chatOrUserIds:f,filterRef:p,filterPlaceholder:Z("ForwardTo"),filter:P,onFilterChange:v,loadMore:h,onSelectChatOrUser:C,onClose:m})})));var Be=n(1947);function $e(e){return e.isSlowMode?"Slowmode enabled":e.hasErrorKey?"Something went wrong":"Telegram"}const De=(0,a.X$)((0,s.c$)((e=>(0,b.ei)(e,["dialogs"])),((e,t)=>(0,b.ei)(t,["dismissDialog","acceptInviteConfirmation"])))((({dialogs:e,dismissDialog:t,acceptInviteConfirmation:n})=>{const s=(0,u.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:i,isChannel:l}=e,c=s(l?"Subscribers":"Members",i,"i"),d=s(l?"ChannelJoin":"JoinGroup");return a.ZP.createElement(ke.Z,{isOpen:!0,onClose:t,className:"error",title:o},void 0!==i&&a.ZP.createElement("p",null,c),a.ZP.createElement(F.Z,{isText:!0,className:"confirm-dialog-button",onClick:()=>{n({hash:r}),t()}},d),a.ZP.createElement(F.Z,{isText:!0,className:"confirm-dialog-button",onClick:t},s("Cancel")))})(e):(r=e,a.ZP.createElement(ke.Z,{isOpen:!0,onClose:t,className:"error",title:$e(r)},r.hasErrorKey?(0,Be.ZP)(r):(0,Pe.Z)(r.message,["emoji","br"]),a.ZP.createElement("div",null,a.ZP.createElement(F.Z,{isText:!0,onClick:t},s("OK")))));var r})))})));var xe=n(6937);const Ue=(0,a.X$)((0,s.c$)((e=>(0,b.ei)(e,["notifications"])),((e,t)=>(0,b.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(xe.Z,{message:(0,Pe.Z)(e,["emoji","br","links","simple_markdown"]),onDismiss:()=>t({localId:n})}))))})));var Oe=n(1396),Ge=n(7551);const ze=(0,a.X$)((0,s.c$)(void 0,((e,t)=>(0,b.ei)(t,["toggleSafeLinkModal"])))((({url:e,toggleSafeLinkModal:t})=>{const n=(0,u.Z)(),s=(0,a.I4)((()=>{window.open((0,Oe.X)(e)),t({url:void 0})}),[t,e]),r=(0,a.I4)((()=>{t({url:void 0})}),[t]),o=(0,be.Z)(e);return a.ZP.createElement(Ge.Z,{isOpen:Boolean(e),onClose:r,title:n("OpenUrlTitle"),textParts:(0,Pe.Z)(n("OpenUrlAlert2",o),["links"]),confirmLabel:n("OpenUrlTitle"),confirmHandler:s})})));var Xe=n(706);const Je=["lng_weekday1","lng_weekday2","lng_weekday3","lng_weekday4","lng_weekday5","lng_weekday6","lng_weekday7"];function _e(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),i=s&&new Date(s.getFullYear(),s.getMonth(),s.getDate(),0,0,0,0);return!!(i&&r>i)||!!(o&&r{const h=(0,u.Z)(),Z=new Date,g=(0,a.Ye)((()=>e?new Date(e):new Date),[e]),v=t?new Date(t):void 0,p=(0,P.Z)(r),[E,C,f]=(0,Xe.Z)(!1),[b,I]=(0,a.eJ)(g),[y,S]=(0,a.eJ)(new Date(b.getFullYear(),b.getMonth(),1)),[w,k]=(0,a.eJ)(Ve(g.getHours())),[N,M]=(0,a.eJ)(Ve(g.getMinutes())),T=He(b.getFullYear(),b.getMonth(),b.getDate()),A=y.getFullYear(),L=y.getMonth();(0,a.d4)((()=>{!p&&r&&(I(g),S(new Date(g.getFullYear(),g.getMonth(),1)))}),[g,r,p]),(0,a.d4)((()=>{n&&!E&&b.getTime()=Z.getFullYear()&&L>=Z.getMonth()||v&&A>=v.getFullYear()&&L>=v.getMonth(),B=n&&A<=Z.getFullYear()&&L<=Z.getMonth(),{prevMonthGrid:$,currentMonthGrid:D,nextMonthGrid:x}=(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(),i=new Date(e,t,0).getDate();for(let e=1;e0)for(let e=1;e<=7-l;e++)s.push(e);return{prevMonthGrid:n,currentMonthGrid:a,nextMonthGrid:s}}(A,L)),[L,A]),U=(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(b.getTime());a.setHours(n),I(a);const s=Ve(n);k(s),e.target.value=s}),[b]),O=(0,a.I4)((e=>{const t=e.target.value.replace(/[^\d]+/g,"");if(!t.length)return M(""),void(e.target.value="");const n=Math.max(0,Math.min(Number(t),59)),a=new Date(b.getTime());a.setMinutes(n),I(a);const s=Ve(n);M(s),e.target.value=s}),[b]);return a.ZP.createElement(ke.Z,{isOpen:r,onClose:c,className:"CalendarModal"},a.ZP.createElement("div",{className:"container"},a.ZP.createElement("div",{className:"month-selector"},a.ZP.createElement(F.Z,{round:!0,size:"smaller",color:"translucent",onClick:c},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement("h4",null,h(`lng_month${L+1}`)," ",A),a.ZP.createElement(F.Z,{round:!0,size:"smaller",color:"translucent",disabled:B,onClick:B?void 0:function(){S((e=>{const t=new Date(e);return t.setMonth(t.getMonth()-1),t}))}},a.ZP.createElement("i",{className:"icon-previous"})),a.ZP.createElement(F.Z,{round:!0,size:"smaller",color:"translucent",disabled:R,onClick:R?void 0:function(){S((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"},Je.map((e=>a.ZP.createElement("div",{className:"day-button faded weekday"},a.ZP.createElement("span",null,h(e))))),$.map((e=>a.ZP.createElement("div",{className:"day-button disabled"},a.ZP.createElement("span",null,e)))),D.map((e=>a.ZP.createElement("div",{role:"button",tabIndex:0,onClick:()=>{return t=e,void I((e=>{const n=new Date(e);return n.setDate(t),n.setMonth(L),n.setFullYear(A),n}));var t},className:(0,X.Z)("day-button",_e(A,L,e,n?Z:void 0,s?Z:v)?"disabled":e?"clickable":"",T===He(A,L,e)&&"selected")},!!e&&a.ZP.createElement("span",null,e)))),x.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:w,onChange:U,onFocus:C,onBlur:f}),":",a.ZP.createElement("input",{type:"text",className:"form-control",inputMode:"decimal",value:N,onChange:O,onFocus:C,onBlur:f})),a.ZP.createElement("div",{className:"footer"},a.ZP.createElement(F.Z,{onClick:function(){d(b)}},o?function(e,t){const n=(0,K.xH)(t,e.code);return n===(0,K.xH)(new Date,e.code)?e("Conversation.ScheduleMessage.SendToday",(0,K.mr)(t,e)):e("Conversation.ScheduleMessage.SendOn",[n,(0,K.mr)(t,e)])}(h,b):i),l&&a.ZP.createElement(F.Z,{onClick:m,isText:!0},l)))})),je=(0,a.X$)((0,s.c$)((e=>({selectedAt:e.historyCalendarSelectedAt})),((e,t)=>(0,b.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,u.Z)();return a.ZP.createElement(Ye,{isOpen:e,selectedAt:t,isPastMode:!0,submitButtonLabel:o("JumpToDate"),onClose:s,onSubmit:r})}))),Ke=(0,a.X$)((0,s.c$)(((e,{message:t,isSchedule:n})=>{const{threadId:a}=(0,v.Bt)(e)||{},{canDeleteForAll:s}=a&&(0,v._k)(e,t,a)||{},r=(0,v.Z1)(e,t.chatId);return{canDeleteForAll:!n&&s,contactName:r&&(0,g.YC)(r.id)?(0,g.Vl)((0,v.dy)(e,(0,g.zX)(r))):void 0,willDeleteForCurrentUserOnly:r&&(0,g.G9)(r)&&!s,willDeleteForAll:r&&(0,g.ZV)(r)}}),((e,t)=>(0,b.ei)(t,["deleteMessages","deleteScheduledMessages"])))((({isOpen:e,isSchedule:t,message:n,album:s,canDeleteForAll:r,contactName:o,willDeleteForCurrentUserOnly:i,willDeleteForAll:l,onClose:c,deleteMessages:d,deleteScheduledMessages:m})=>{const h=(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]),Z=(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]),P=(0,u.Z)();return a.ZP.createElement(ke.Z,{isOpen:e,onClose:c,onEnter:e&&!r?Z:void 0,className:"delete",title:P("DeleteSingleMessagesTitle")},a.ZP.createElement("p",null,P("AreYouSureDeleteSingleMessage")),i&&a.ZP.createElement("p",null,P("lng_delete_for_me_chat_hint",1,"i")),l&&a.ZP.createElement("p",null,P("lng_delete_for_everyone_hint",1,"i")),r&&a.ZP.createElement(F.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:h},o&&(0,Pe.Z)(P("Conversation.DeleteMessagesFor",o)),!o&&P("Conversation.DeleteMessagesForEveryone")),a.ZP.createElement(F.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:Z},P(r?"ChatList.DeleteForCurrentUser":"Delete")),a.ZP.createElement(F.Z,{className:"confirm-dialog-button",isText:!0,onClick:c},P("Cancel")))}))),qe=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,g.YC)(t),a=(0,v.FM)(e,t),s=(0,v.Z1)(e,t),r=!!s&&(0,g.eA)(s),o=!!s&&(0,g.G9)(s),i=!!s&&(0,g.ZV)(s);return{isPrivateChat:n,isChatWithSelf:a,isChannel:r,isGroup:o,isSuperGroup:i,canPinForAll:n&&!a||i||o,contactName:s&&(0,g.YC)(s.id)?(0,g.Vl)((0,v.dy)(e,(0,g.zX)(s))):void 0}}),((e,t)=>(0,b.ei)(t,["pinMessage"])))((({isOpen:e,messageId:t,chatId:n,isChannel:s,isGroup:r,isSuperGroup:o,canPinForAll:i,contactName:l,onClose:c,pinMessage:d})=>{const m=(0,a.I4)((()=>{d({chatId:n,messageId:t,isUnpin:!1}),c()}),[d,n,t,c]),h=(0,a.I4)((()=>{d({chatId:n,messageId:t,isUnpin:!1,isOneSide:!0,isSilent:!0}),c()}),[n,t,c,d]),Z=(0,u.Z)();return a.ZP.createElement(ke.Z,{isOpen:e,onClose:c,className:"pin",title:Z("PinMessageAlertTitle")},a.ZP.createElement("p",null,Z(s?"PinMessageAlertChannel":r||o?"PinMessageAlert":"PinMessageAlertChat")),a.ZP.createElement(F.Z,{className:"confirm-dialog-button",isText:!0,onClick:h},Z("DialogPin")),i&&a.ZP.createElement(F.Z,{className:"confirm-dialog-button",isText:!0,onClick:m},l?(0,Pe.Z)(Z("Conversation.PinMessagesFor",l)):Z("Conversation.PinMessageAlert.PinAndNotifyMembers")),a.ZP.createElement(F.Z,{className:"confirm-dialog-button",isText:!0,onClick:c},Z("Cancel")))}))),We=(0,a.X$)((({isOpen:e,pinnedMessagesCount:t=0,onClose:n,onUnpin:s})=>{const r=(0,u.Z)();return a.ZP.createElement(ke.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(F.Z,{className:"confirm-dialog-button",isText:!0,onClick:s},r("DialogUnpin")),a.ZP.createElement(F.Z,{className:"confirm-dialog-button",isText:!0,onClick:n},r("Cancel")))}));var Qe=n(517);const et=(0,a.X$)((0,s.c$)(((e,{isSchedule:t})=>{const{messageIds:n}=e.selectedMessages||{},{canDeleteForAll:a}=(0,v.xl)(e),s=(0,v.jr)(e);return{selectedMessageIds:n,canDeleteForAll:!t&&a,contactName:s&&(0,g.YC)(s.id)?(0,g.Vl)((0,v.dy)(e,(0,g.zX)(s))):void 0,willDeleteForCurrentUserOnly:s&&(0,g.G9)(s)&&!a,willDeleteForAll:s&&(0,g.ZV)(s)}}),((e,t)=>(0,b.ei)(t,["deleteMessages","deleteScheduledMessages","exitMessageSelectMode"])))((({isOpen:e,isSchedule:t,selectedMessageIds:n,canDeleteForAll:s,contactName:r,willDeleteForCurrentUserOnly:o,willDeleteForAll:i,onClose:l,deleteMessages:c,deleteScheduledMessages:d,exitMessageSelectMode:m})=>{const h=(0,P.Z)(e),Z=(0,a.I4)((()=>{l(),c({messageIds:n,shouldDeleteForAll:!0})}),[c,n,l]),g=(0,a.I4)((()=>{t?d({messageIds:n}):c({messageIds:n,shouldDeleteForAll:!1}),l()}),[t,l,d,n,c]),v=(0,u.Z)();if((0,a.d4)((()=>{!e&&h&&m()}),[m,e,h]),n)return a.ZP.createElement(ke.Z,{isOpen:e,onClose:l,onEnter:s?void 0:g,className:"delete",title:v("Conversation.DeleteManyMessages")},a.ZP.createElement("p",null,v("AreYouSureDeleteFewMessages")),o&&a.ZP.createElement("p",null,"This will delete them just for you, not for other participants in the chat."),i&&a.ZP.createElement("p",null,"This will delete them for everyone in this chat."),s&&a.ZP.createElement(F.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:Z},r?(0,Pe.Z)(v("ChatList.DeleteForEveryone",r)):v("Conversation.DeleteMessagesForEveryone")),a.ZP.createElement(F.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:g},v(s?"ChatList.DeleteForCurrentUser":"Delete")),a.ZP.createElement(F.Z,{className:"confirm-dialog-button",isText:!0,onClick:l},v("Cancel")))})));var tt=n(4434);const nt=(0,a.X$)((0,s.c$)(void 0,((e,t)=>(0,b.ei)(t,["reportMessages","exitMessageSelectMode"])))((({isOpen:e,messageIds:t,reportMessages:n,exitMessageSelectMode:s,onClose:r})=>{const[o,i]=(0,a.eJ)("spam"),[l,c]=(0,a.eJ)(""),d=()=>{n({messageIds:t,reason:o,description:l}),s(),r()},m=(0,a.I4)((e=>{i(e)}),[]),h=(0,a.I4)((e=>{c(e.target.value)}),[]),Z=(0,u.Z)(),P=[{value:"spam",label:Z("lng_report_reason_spam")},{value:"violence",label:Z("lng_report_reason_violence")},{value:"pornography",label:Z("lng_report_reason_pornography")},{value:"childAbuse",label:Z("lng_report_reason_child_abuse")},{value:"copyright",label:Z("ReportPeer.ReasonCopyright")},{value:"other",label:Z("lng_report_reason_other")}];if(t)return a.ZP.createElement(ke.Z,{isOpen:e,onClose:r,onEnter:e?d:void 0,className:"report",title:Z("lng_report_message_title")},a.ZP.createElement(tt.Z,{name:"report-message",options:P,onChange:m,selected:o}),a.ZP.createElement(Ne.Z,{label:Z("lng_report_reason_description"),value:l,onChange:h}),a.ZP.createElement(F.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:d},Z("lng_report_button")),a.ZP.createElement(F.Z,{className:"confirm-dialog-button",isText:!0,onClick:r},Z("Cancel")))}))),at=(0,a.X$)((0,s.c$)((e=>{const{type:t}=(0,v.Bt)(e)||{},{canDelete:n}=(0,v.xl)(e),a=(0,v.nB)(e),s=(0,v.Nu)(e),{messageIds:r}=e.selectedMessages||{};return{isSchedule:"scheduled"===t,selectedMessagesCount:(0,v.D7)(e),canDeleteMessages:n,canReportMessages:a,canDownloadMessages:s,selectedMessageIds:r}}),((e,t)=>(0,b.ei)(t,["exitMessageSelectMode","openForwardMenuForSelectedMessages","downloadSelectedMessages"])))((({canPost:e,isActive:t,messageListType:n,isSchedule:s,selectedMessagesCount:r,canDeleteMessages:o,canReportMessages:i,canDownloadMessages:l,selectedMessageIds:c,exitMessageSelectMode:d,openForwardMenuForSelectedMessages:m,downloadSelectedMessages:h})=>{const[Z,g,v]=(0,Xe.Z)(),[p,E,C]=(0,Xe.Z)();(0,a.d4)((()=>!t||Z||p?void 0:(0,Qe.Z)({onBackspace:g,onDelete:g,onEsc:d})),[t,Z,p,g,d]);const f=(0,a.I4)((()=>{h(),d()}),[h,d]),b=(0,P.Z)(r||void 0,!0),I=t?r:b,y=(0,u.Z)(),S=y("VoiceOver.Chat.MessagesSelected",I,"i"),w=(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:w},a.ZP.createElement("div",{className:"MessageSelectToolbar-inner"},a.ZP.createElement(F.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:S},S),!!r&&a.ZP.createElement("div",{className:"MessageSelectToolbar-actions"},"scheduled"!==n&&k("forward",y("Chat.ForwardActionHeader"),m),i&&k("flag",y("Conversation.ReportMessages"),E),l&&k("download",y("lng_media_download"),f),k("delete",y("EditAdminGroupDeleteMessages"),g,!o,!0))),a.ZP.createElement(et,{isOpen:Z,isSchedule:s,onClose:v}),a.ZP.createElement(nt,{isOpen:p,onClose:C,messageIds:c}))}))),st=(0,a.X$)((0,s.c$)((e=>{var t;const{chatId:n,messageId:a}=e.seenByModal||{};return n&&a?{memberIds:null===(t=(0,v.hj)(e,n,a))||void 0===t?void 0:t.seenByUserIds}:{}}),((e,t)=>(0,b.ei)(t,["openChat","closeSeenByModal"])))((({isOpen:e,memberIds:t,openChat:n,closeSeenByModal:s})=>{const r=(0,u.Z)(),o=(0,a.I4)((e=>{s(),setTimeout((()=>{n({id:e})}),100)}),[s,n]),i=(0,be.Z)(t,!0);return a.ZP.createElement(ke.Z,{isOpen:e,onClose:s,className:"narrow",title:"Which users read the message"},a.ZP.createElement("div",{dir:r.isRtl?"rtl":void 0},i&&i.map((e=>a.ZP.createElement(Te.Z,{key:e,className:"chat-item-clickable scroll-item small-icon",onClick:()=>o(e)},a.ZP.createElement(Ae.Z,{userId:e,noStatusOrTyping:!0}))))),a.ZP.createElement(F.Z,{className:"confirm-dialog-button",isText:!0,onClick:s},r("Close")))})));var rt=n(3133),ot=n(735),it=n(1470);const lt=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 ct=n(329),dt=n(742);const mt=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,v.Z1)(e,t),a=n&&(0,g.zX)(n);return{chat:n,user:a?(0,v.dy)(e,a):void 0,isPinned:(0,v.ep)(e,t),isMuted:n?(0,g.i4)(n,(0,v.dZ)(e),(0,v.NJ)(e)):void 0}}))((({chatId:e,chat:t,user:n,isPinned:s,isMuted:r,withUsername:o,onClick:i})=>{const[l,c,d]=(0,Xe.Z)(),[m,u,h]=(0,Xe.Z)(),Z=(0,it.Z)({chat:t,user:n,isPinned:s,isMuted:r,handleDelete:c,handleChatFolderChange:u},!0),P=()=>{i(e)},v=lt(P);if(t)return a.ZP.createElement(Te.Z,{className:"chat-item-clickable search-result",onClick:P,contextActions:Z,buttonRef:v},(0,g.YC)(e)?a.ZP.createElement(Ae.Z,{userId:e,withUsername:o,avatarSize:"large"}):a.ZP.createElement(Fe.Z,{chatId:e,withUsername:o,avatarSize:"large"}),a.ZP.createElement(ct.Z,{isOpen:l,onClose:d,chat:t}),a.ZP.createElement(dt.Z,{isOpen:m,onClose:h,chatId:e}))})));var ut=n(8781);const ht=(0,G.P2)((e=>e()),6e4,!0),Zt=(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,b.ei)(t,["loadTopUsers","loadContactList","openChat","addRecentlyFoundChatId","clearRecentlyFoundChats"])))((({topUserIds:e,usersById:t,recentlyFoundChatIds:n,onReset:s,loadTopUsers:r,loadContactList:o,openChat:i,addRecentlyFoundChatId:l,clearRecentlyFoundChats:c})=>{const d=(0,a.sO)(null);(0,a.d4)((()=>{ht((()=>{r(),o()}))}),[r,o]),(0,ut.Z)(d.current,!e);const m=(0,a.I4)((e=>{i({id:e,shouldReplaceHistory:!0}),s(),setTimeout((()=>{l({id:e})}),250)}),[i,l,s]),h=(0,u.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(ge.Z,{user:t[e]}),a.ZP.createElement("div",{className:"top-peer-name"},(0,Pe.Z)((0,g.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(F.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(mt,{chatId:e,onClick:m})))))})));var Pt=n(9411),gt=n(8033);const vt=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,v.Z1)(e,t);if(!n)return{};const a=(0,g.zX)(n);return{chat:n,lastSyncTime:e.lastSyncTime,...a&&{privateChatUser:(0,v.dy)(e,a)}}}),((e,t)=>(0,b.ei)(t,["focusMessage"])))((({message:e,searchQuery:t,chatId:n,chat:s,privateChatUser:r,focusMessage:o,lastSyncTime:i})=>{const l=(0,g.DH)(e),c=(0,h.Z)((0,g.Ti)(e,"micro")),d=Boolean((0,g.Y5)(e)),m=(0,a.I4)((()=>{o({chatId:n,messageId:e.id})}),[n,o,e.id]),Z=(0,u.Z)(),P=lt(m);if(s)return a.ZP.createElement(Te.Z,{className:"ChatMessage chat-item-clickable",ripple:!f.wB,onClick:m,buttonRef:P},a.ZP.createElement(ge.Z,{chat:s,user:r,isSavedMessages:null==r?void 0:r.isSelf,lastSyncTime:i}),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,Pe.Z)((0,g.U)(Z,s,r))),s.isVerified&&a.ZP.createElement(Pt.Z,null)),a.ZP.createElement("div",{className:"message-date"},a.ZP.createElement(gt.Z,{className:"date"},(0,K.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,g.b7)(t)&&a.ZP.createElement("i",{className:"icon-play"}),(0,Pe.Z)((0,g.MK)(e,t,!0),["emoji","highlight"],{highlight:s})):(0,Pe.Z)((0,g.MK)(e,t))}(Z,e,c||l,t,d)))))}))),pt=(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,K.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,K.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 Et=n(7262),Ct=n(9187);const ft=(0,G.P2)((e=>e()),500,!0),bt=(0,a.X$)((0,s.c$)((e=>{var t;const{byId:n}=e.chats,{userIds:a}=e.contactList||{};if(!a)return{chatsById:n};const{currentUserId:s,messages:r,lastSyncTime:o}=e,{fetchingStatus:i,globalResults:l,localResults:c,resultsByType:d}=e.globalSearch,{chatIds:m,userIds:u}=l||{},{chatIds:h,userIds:Z}=c||{},{byChatId:P}=r;return{currentUserId:s,localContactIds:a,localChatIds:h,localUserIds:Z,globalChatIds:m,globalUserIds:u,foundIds:null==d||null===(t=d.text)||void 0===t?void 0:t.foundIds,globalMessagesByChatId:P,chatsById:n,fetchingStatus:i,lastSyncTime:o}}),((e,t)=>(0,b.ei)(t,["openChat","addRecentlyFoundChatId","searchMessagesGlobal","setGlobalSearchChatId"])))((({searchQuery:e,searchDate:t,dateSearchQuery:n,currentUserId:r,localContactIds:i,localChatIds:l,localUserIds:c,globalChatIds:d,globalUserIds:m,foundIds:h,globalMessagesByChatId:Z,chatsById:P,fetchingStatus:v,lastSyncTime:p,onReset:E,onSearchDateSelect:C,openChat:I,addRecentlyFoundChatId:y,searchMessagesGlobal:S,setGlobalSearchChatId:w})=>{const k=(0,u.Z)(),[N,M]=(0,a.eJ)(!1),[T,F]=(0,a.eJ)(!1),A=(0,a.I4)((({direction:t})=>{p&&t===o.Uq.Backwards&&ft((()=>{S({type:"text",query:e})}))}),[p,S,e]),L=(0,a.I4)((e=>{I({id:e,shouldReplaceHistory:!0}),e!==r&&y({id:e}),f.wB||E()}),[r,I,y,E]),R=(0,a.I4)((e=>{w({id:e})}),[w]),B=(0,a.Ye)((()=>{if(!e||e.startsWith("@")&&e.length<2)return ot.D;const t=[...r?[r]:[],...i||[]],n=(0,s.Rd)().users.byId,a=(0,g.kK)(t,n,e);return[...(0,g.ih)((0,b.Tw)([...a||[],...l||[],...c||[]]),P,void 0,r?[r]:void 0)]}),[e,i,r,l,c,P]),$=(0,a.Ye)((()=>!e||e.length<4||!d||!m?ot.D:(0,g.ih)((0,b.Tw)([...d,...m]),P,!0)),[P,d,m,e]),D=(0,a.Ye)((()=>(e||t)&&h&&0!==h.length?h.map((e=>{var t;const[n,a]=e.split("_");return null==Z||null===(t=Z[n])||void 0===t?void 0:t.byId[Number(a)]})).filter(Boolean).sort(((e,t)=>t.date-e.date)):ot.D),[h,Z,e,t]),x=(0,a.I4)((()=>{M(!N)}),[N]),U=(0,a.I4)((()=>{F(!T)}),[T]),O=v&&!v.chats&&!v.messages&&!B.length&&!$.length&&!D.length;return e||t?a.ZP.createElement(Me.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(pt,{searchDate:n,onSelect:C})),O&&a.ZP.createElement(Et.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>5&&a.ZP.createElement(gt.Z,{onClick:x},k(N?"ChatList.Search.ShowLess":"ChatList.Search.ShowMore")),k("DialogList.SearchSectionDialogs")),B.map(((e,t)=>{if(N||!(t>=5))return a.ZP.createElement(mt,{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>5&&a.ZP.createElement(gt.Z,{onClick:U},k(T?"ChatList.Search.ShowLess":"ChatList.Search.ShowMore")),k("DialogList.SearchSectionGlobal")),$.map(((e,t)=>{if(T||!(t>=5))return a.ZP.createElement(mt,{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,g.MK)(k,t),s=P[t.chatId];if(n&&s)return a.ZP.createElement(vt,{chatId:t.chatId,message:t,searchQuery:e})})))):a.ZP.createElement(Zt,{onReset:E})}))),It=(0,G.P2)((e=>e()),500,!0),yt=(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:i}=(null==o?void 0:o.text)||{};return{currentUserId:n,foundIds:i,globalMessagesByChatId:a,chatsById:t,fetchingStatus:r,lastSyncTime:s}}),((e,t)=>(0,b.ei)(t,["searchMessagesGlobal"])))((({searchQuery:e,currentUserId:t,dateSearchQuery:n,foundIds:s,globalMessagesByChatId:r,chatsById:i,fetchingStatus:l,lastSyncTime:c,searchMessagesGlobal:d,onSearchDateSelect:m})=>{const h=(0,u.Z)(),Z=(0,a.I4)((({direction:n})=>{c&&n===o.Uq.Backwards&&It((()=>{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)):ot.D),[s,r]),v=l&&!l.chats&&!l.messages&&!P.length;return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(Me.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(pt,{searchDate:n,onSelect:m})),v&&a.ZP.createElement(Et.Z,{text:h("ChatList.Search.NoResults"),description:h("ChatList.Search.NoResultsDescription")}),!!P.length&&P.map((function(t){const n=(0,g.MK)(h,t),s=i[t.chatId];if(n&&s)return a.ZP.createElement(vt,{chatId:t.chatId,message:t,searchQuery:e})}))))})));function St(e){return(t,n)=>{var a;const{byId:s}=t.chats,{byId:r}=t.users,{fetchingStatus:o,resultsByType:i,chatId:l}=t.globalSearch,c="audio"!==e?e:null!=n&&n.isVoice?"voice":"audio",{byChatId:d}=t.messages,m=null==i||null===(a=i[c])||void 0===a?void 0:a.foundIds,u=t.activeDownloads.byChatId;return{theme:(0,v.Pu)(t),isLoading:void 0===m||!!o&&Boolean(o.chats||o.messages),chatsById:s,usersById:r,globalMessagesByChatId:d,foundIds:m,searchChatId:l,activeDownloads:u,lastSyncTime:t.lastSyncTime}}}var wt=n(7891),kt=n(3709);const Nt="media",Mt=(0,G.P2)((e=>e()),500,!0),Tt=(0,a.X$)((0,s.c$)(St(Nt),((e,t)=>(0,b.ei)(t,["searchMessagesGlobal","openMediaViewer"])))((({searchQuery:e,searchChatId:t,isLoading:n,globalMessagesByChatId:s,foundIds:r,lastSyncTime:l,searchMessagesGlobal:c,openMediaViewer:d})=>{const m=(0,u.Z)(),h=(0,a.I4)((({direction:n})=>{l&&n===o.Uq.Backwards&&Mt((()=>{c({type:Nt,query:e,chatId:t})}))}),[l,c,e,t]),Z=(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):ot.D),[s,r]),P=(0,a.I4)(((e,t)=>{d({chatId:t,messageId:e,origin:o.bZ.SearchResult})}),[d]),g=(0,wt.Z)([e],i.Y)&&!n,v=g&&r&&r.length>0&&!e,p=g&&r&&r.length>0&&e,E=(0,X.Z)("search-content custom-scroll",p&&"chat-list");return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(Me.Z,{className:E,items:Z,itemSelector:e?".ListItem":".Media",onLoadMore:h,noFastList:!0},!g&&a.ZP.createElement(we.Z,null),g&&(!r||0===r.length)&&a.ZP.createElement(Et.Z,{text:m("ChatList.Search.NoResults"),description:m("ChatList.Search.NoResultsDescription")}),v&&a.ZP.createElement("div",{className:"media-list",dir:m.isRtl?"rtl":void 0},Z.map((e=>a.ZP.createElement(kt.Z,{key:e.id,idPrefix:"search-media",message:e,onClick:P})))),p&&Z.map((e=>a.ZP.createElement(vt,{key:e.id,chatId:e.chatId,message:e})))))})));var Ft=n(91),At=n(5418);const Lt="links",Rt=(0,G.P2)((e=>e()),500,!0),Bt=(0,a.X$)((0,s.c$)(St(Lt),((e,t)=>(0,b.ei)(t,["searchMessagesGlobal","focusMessage"])))((({searchQuery:e,searchChatId:t,isLoading:n,chatsById:s,usersById:r,globalMessagesByChatId:l,foundIds:c,lastSyncTime:d,searchMessagesGlobal:m,focusMessage:h})=>{const Z=(0,u.Z)(),P=(0,a.I4)((({direction:n})=>{d&&n===o.Uq.Backwards&&Rt((()=>{m({type:Lt,query:e,chatId:t})}))}),[d,m,e,t]),g=(0,a.Ye)((()=>c&&l?c.map((e=>{var t;const[n,a]=e.split("_");return null===(t=l[n])||void 0===t?void 0:t.byId[Number(a)]})).filter(Boolean):ot.D),[l,c]),v=(0,a.I4)(((e,t)=>{h({chatId:t,messageId:e})}),[h]),p=(0,wt.Z)([e],i.Y)&&!n;return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(Me.Z,{className:"search-content documents-list custom-scroll",items:g,onLoadMore:P,noFastList:!0},!p&&a.ZP.createElement(we.Z,null),p&&(!c||0===c.length)&&a.ZP.createElement(Et.Z,{text:Z("ChatList.Search.NoResults"),description:Z("ChatList.Search.NoResultsDescription")}),p&&c&&c.length>0&&g.map(((e,t)=>{const n=0===t||(0,K.kj)(e.date)!==(0,K.kj)(g[t-1].date);return a.ZP.createElement("div",{className:"ListItem small-icon",dir:Z.isRtl?"rtl":void 0,key:e.id},n&&a.ZP.createElement("p",{className:"section-heading",dir:Z.isRtl?"rtl":void 0},(0,K.np)(Z,new Date(1e3*e.date))),a.ZP.createElement(At.Z,{key:e.id,message:e,senderTitle:(0,Ft.F)(Z,e,s,r),onMessageClick:v}))}))))})));var $t=n(2535);const Dt="documents",xt=(0,G.P2)((e=>e()),500,!0),Ut=(0,a.X$)((0,s.c$)(St(Dt),((e,t)=>(0,b.ei)(t,["searchMessagesGlobal","focusMessage"])))((({searchQuery:e,searchChatId:t,isLoading:n,chatsById:s,usersById:r,globalMessagesByChatId:l,foundIds:c,activeDownloads:d,lastSyncTime:m,searchMessagesGlobal:h,focusMessage:Z})=>{const P=(0,u.Z)(),v=(0,a.I4)((({direction:n})=>{m&&n===o.Uq.Backwards&&xt((()=>{h({type:Dt,query:e,chatId:t})}))}),[m,h,e,t]),p=(0,a.Ye)((()=>c&&l?c.map((e=>{var t;const[n,a]=e.split("_"),s=null===(t=l[n])||void 0===t?void 0:t.byId[Number(a)];return s&&(0,g.aE)(s)?s:void 0})).filter(Boolean):ot.D),[l,c]),E=(0,a.I4)(((e,t)=>{Z({chatId:t,messageId:e})}),[Z]),C=(0,wt.Z)([e],i.Y)&&!n;return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(Me.Z,{className:"search-content documents-list custom-scroll",items:p,onLoadMore:v,noFastList:!0},!C&&a.ZP.createElement(we.Z,null),C&&(!c||0===c.length)&&a.ZP.createElement(Et.Z,{text:P("ChatList.Search.NoResults"),description:P("ChatList.Search.NoResultsDescription")}),C&&c&&c.length>0&&p.map(((e,t)=>{var n;const o=0===t||(0,K.kj)(e.date)!==(0,K.kj)(p[t-1].date);return a.ZP.createElement("div",{className:"ListItem small-icon",key:e.id},o&&a.ZP.createElement("p",{className:"section-heading"},(0,K.np)(P,new Date(1e3*e.date))),a.ZP.createElement($t.Z,{message:e,withDate:!0,datetime:e.date,smaller:!0,sender:(0,Ft.F)(P,e,s,r),className:"scroll-item",onDateClick:E,isDownloading:null===(n=d[e.chatId])||void 0===n?void 0:n.includes(e.id)}))}))))})));var Ot=n(4752);const Gt=(0,G.P2)((e=>e()),500,!0),zt=(0,a.X$)((0,s.c$)(St("audio"),((e,t)=>(0,b.ei)(t,["searchMessagesGlobal","focusMessage","openAudioPlayer"])))((({theme:e,isVoice:t,searchQuery:n,searchChatId:s,isLoading:r,chatsById:l,usersById:c,globalMessagesByChatId:d,foundIds:m,lastSyncTime:h,activeDownloads:Z,searchMessagesGlobal:P,focusMessage:g,openAudioPlayer:v})=>{const p=(0,u.Z)(),E=t?"voice":"audio",C=(0,a.I4)((({direction:e})=>{h&&e===o.Uq.Backwards&&Gt((()=>{P({type:E,query:n,chatId:s})}))}),[E,h,P,n,s]),f=(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):ot.D),[d,m]),b=(0,a.I4)(((e,t)=>{g({chatId:t,messageId:e})}),[g]),I=(0,a.I4)(((e,t)=>{v({chatId:t,messageId:e})}),[v]),y=(0,wt.Z)([n],i.Y)&&!r;return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(Me.Z,{className:"search-content documents-list custom-scroll",items:f,onLoadMore:C,noFastList:!0},!y&&a.ZP.createElement(we.Z,null),y&&(!m||0===m.length)&&a.ZP.createElement(Et.Z,{text:p("ChatList.Search.NoResults"),description:p("ChatList.Search.NoResultsDescription")}),y&&m&&m.length>0&&f.map(((t,n)=>{var s;const r=0===n||(0,K.kj)(t.date)!==(0,K.kj)(f[n-1].date);return a.ZP.createElement("div",{className:"ListItem small-icon",key:t.id},r&&a.ZP.createElement("p",{className:"section-heading",dir:p.isRtl?"rtl":void 0},(0,K.np)(p,new Date(1e3*t.date))),a.ZP.createElement(Ot.Z,{key:t.id,theme:e,message:t,origin:o.Cr.Search,senderTitle:(0,Ft.F)(p,t,l,c),date:t.date,lastSyncTime:h,className:"scroll-item",onPlay:I,onDateClick:b,isDownloading:null===(s=Z[t.chatId])||void 0===s?void 0:s.includes(t.id)}))}))))}))),Xt=[{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"}],Jt=[{type:o.nJ.ChatList,title:"All Messages"},...Xt.slice(1)],_t=Object.keys(o.nJ).length/2,Vt=(0,a.X$)((0,s.c$)((e=>{const{currentContent:t,chatId:n}=e.globalSearch;return{currentContent:t,chatId:n}}),((e,t)=>(0,b.ei)(t,["setGlobalSearchContent","setGlobalSearchDate"])))((({searchQuery:e,searchDate:t,isActive:n,currentContent:s=o.nJ.ChatList,chatId:r,setGlobalSearchContent:i,setGlobalSearchDate:l,onReset:c})=>{const d=(0,u.Z)(),[h,Z]=(0,a.eJ)(s),P=(0,a.Ye)((()=>(0,K.xk)(e)),[e]),g=(0,a.I4)((e=>{const t=Xt[e];i({content:t.type}),Z(e)}),[i]),v=(0,a.I4)((e=>{l({date:e.getTime()/1e3})}),[l]);(0,m.ZP)(n,c,void 0,void 0,!0);const p=(0,a.sO)(null),E=(0,ye.Z)(p,n,void 0,".ListItem-button",!0);return a.ZP.createElement("div",{className:"LeftSearch",ref:p,onKeyDown:E},a.ZP.createElement(rt.Z,{activeTab:h,tabs:r?Jt:Xt,onSwitchTab:g}),a.ZP.createElement(L.Z,{name:d.isRtl?"slide-optimized-rtl":"slide-optimized",renderCount:_t,activeKey:s},(()=>{switch(s){case o.nJ.ChatList:return r?a.ZP.createElement(yt,{searchQuery:e,dateSearchQuery:P,onReset:c,onSearchDateSelect:v}):a.ZP.createElement(bt,{searchQuery:e,searchDate:t,dateSearchQuery:P,onReset:c,onSearchDateSelect:v});case o.nJ.Media:return a.ZP.createElement(Tt,{searchQuery:e});case o.nJ.Links:return a.ZP.createElement(Bt,{searchQuery:e});case o.nJ.Files:return a.ZP.createElement(Ut,{searchQuery:e});case o.nJ.Music:return a.ZP.createElement(zt,{key:"audio",searchQuery:e});case o.nJ.Voice:return a.ZP.createElement(zt,{key:"voice",isVoice:!0,searchQuery:e});default:return}})))})));var Ht=n(1090);const Yt={currentPassword:"",password:"",hint:"",email:""},jt=(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 Yt;default:return e}},Kt=(0,a.X$)((0,s.c$)(void 0,((e,t)=>(0,b.ei)(t,["signOut","deleteChatFolder"])))((({currentScreen:e,editedFolderId:t,onReset:n,onSaveFilter:s,signOut:r,deleteChatFolder:i,onScreenSelect:l})=>{const[c,d]=(0,a.eJ)(!1),[m,h]=(0,a.eJ)(!1),Z=(0,a.I4)((()=>{d(!0)}),[]),P=(0,a.I4)((()=>{d(!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(),i({id:t}),n()}),[t,v,i,n]),C=(0,a.Ye)((()=>({onTrigger:e,isOpen:t})=>a.ZP.createElement(F.Z,{round:!0,ripple:!f.wB,size:"smaller",color:"translucent",className:t?"active":"",onClick:e,ariaLabel:"More actions"},a.ZP.createElement("i",{className:"icon-more"}))),[]),b=(0,u.Z)();return a.ZP.createElement("div",{className:"left-header"},a.ZP.createElement(F.Z,{round:!0,size:"smaller",color:"translucent",onClick:n,ariaLabel:b("AccDescrGoBack")},a.ZP.createElement("i",{className:"icon-arrow-left"})),function(){switch(e){case o.MT.EditProfile:return a.ZP.createElement("h3",null,b("lng_settings_information"));case o.MT.General:return a.ZP.createElement("h3",null,b("General"));case o.MT.Notifications:return a.ZP.createElement("h3",null,b("Notifications"));case o.MT.DataStorage:return a.ZP.createElement("h3",null,b("DataSettings"));case o.MT.Privacy:return a.ZP.createElement("h3",null,b("PrivacySettings"));case o.MT.Language:return a.ZP.createElement("h3",null,b("Language"));case o.MT.GeneralChatBackground:return a.ZP.createElement("h3",null,b("ChatBackground"));case o.MT.GeneralChatBackgroundColor:return a.ZP.createElement("h3",null,b("SetColor"));case o.MT.PrivacyPhoneNumber:return a.ZP.createElement("h3",null,b("PrivacyPhone"));case o.MT.PrivacyLastSeen:return a.ZP.createElement("h3",null,b("PrivacyLastSeen"));case o.MT.PrivacyProfilePhoto:return a.ZP.createElement("h3",null,b("Privacy.ProfilePhoto"));case o.MT.PrivacyForwarding:return a.ZP.createElement("h3",null,b("PrivacyForwards"));case o.MT.PrivacyGroupChats:return a.ZP.createElement("h3",null,b("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,b("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,b("NeverShareWith"));case o.MT.PrivacyActiveSessions:return a.ZP.createElement("h3",null,b("SessionsTitle"));case o.MT.PrivacyBlockedUsers:return a.ZP.createElement("h3",null,b("BlockedUsers"));case o.MT.TwoFaDisabled:case o.MT.TwoFaEnabled:return a.ZP.createElement("h3",null,b("TwoStepVerification"));case o.MT.TwoFaNewPassword:case o.MT.TwoFaChangePasswordNew:case o.MT.TwoFaChangePasswordConfirm:return a.ZP.createElement("h3",null,b("PleaseEnterCurrentPassword"));case o.MT.TwoFaNewPasswordConfirm:return a.ZP.createElement("h3",null,b("PleaseReEnterPassword"));case o.MT.TwoFaNewPasswordHint:case o.MT.TwoFaChangePasswordHint:return a.ZP.createElement("h3",null,b("PasswordHint"));case o.MT.TwoFaNewPasswordEmail:case o.MT.TwoFaRecoveryEmail:return a.ZP.createElement("h3",null,b("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,b("TwoStepVerificationPasswordSet"));case o.MT.TwoFaChangePasswordCurrent:case o.MT.TwoFaTurnOff:case o.MT.TwoFaRecoveryEmailCurrentPassword:return a.ZP.createElement("h3",null,b("PleaseEnterCurrentPassword"));case o.MT.Folders:return a.ZP.createElement("h3",null,b("Filters"));case o.MT.FoldersCreateFolder:return a.ZP.createElement("h3",null,b("FilterNew"));case o.MT.FoldersEditFolder:case o.MT.FoldersEditFolderFromChatList:return a.ZP.createElement("div",{className:"settings-main-header"},a.ZP.createElement("h3",null,b("FilterEdit")),t&&a.ZP.createElement(R.Z,{className:"settings-more-menu",trigger:C,positionX:"right"},a.ZP.createElement(B.Z,{icon:"delete",destructive:!0,onClick:g},b("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,b("FilterInclude")):a.ZP.createElement("h3",null,b("FilterExclude")),a.ZP.createElement(F.Z,{round:!0,size:"smaller",color:"translucent",className:"color-primary",onClick:s,ariaLabel:b("AutoDeleteConfirm")},a.ZP.createElement("i",{className:"icon-check"})));default:return a.ZP.createElement("div",{className:"settings-main-header"},a.ZP.createElement("h3",null,b("SETTINGS")),a.ZP.createElement(F.Z,{round:!0,ripple:!f.wB,size:"smaller",color:"translucent",onClick:()=>l(o.MT.EditProfile),ariaLabel:b("lng_settings_information")},a.ZP.createElement("i",{className:"icon-edit"})),a.ZP.createElement(R.Z,{className:"settings-more-menu",trigger:C,positionX:"right"},a.ZP.createElement(B.Z,{icon:"logout",onClick:Z},b("LogOutTitle"))))}}(),a.ZP.createElement(Ge.Z,{isOpen:c,onClose:P,text:b("lng_sure_logout"),confirmLabel:b("AccountSettings.Logout"),confirmHandler:p,confirmIsDestructive:!0}),a.ZP.createElement(Ge.Z,{isOpen:m,onClose:v,text:b("FilterDeleteAlert"),confirmLabel:b("Delete"),confirmHandler:E,confirmIsDestructive:!0}))})));var qt=n(787),Wt=n(180);const Qt=(0,a.X$)((0,s.c$)((e=>{const{currentUserId:t,lastSyncTime:n}=e;return{currentUser:t?(0,v.dy)(e,t):void 0,lastSyncTime:n}}),((e,t)=>(0,b.ei)(t,["loadProfilePhotos"])))((({isActive:e,onScreenSelect:t,onReset:n,loadProfilePhotos:s,currentUser:r,lastSyncTime:i})=>{const l=(0,u.Z)(),c=null==r?void 0:r.id;return(0,a.d4)((()=>{c&&i&&s({profileId:c})}),[i,c,s]),(0,m.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(qt.Z,{userId:r.id,forceShowSelf:!0}),r&&a.ZP.createElement(Wt.Z,{chatOrUserId:r.id,forceShowSelf:!0}),a.ZP.createElement(Te.Z,{icon:"settings",onClick:()=>t(o.MT.General)},l("Telegram.GeneralSettingsViewController")),a.ZP.createElement(Te.Z,{icon:"unmute",onClick:()=>t(o.MT.Notifications)},l("Notifications")),a.ZP.createElement(Te.Z,{icon:"lock",onClick:()=>t(o.MT.Privacy)},l("PrivacySettings")),a.ZP.createElement(Te.Z,{icon:"data",onClick:()=>t(o.MT.DataStorage)},l("DataSettings")),a.ZP.createElement(Te.Z,{icon:"folder",onClick:()=>t(o.MT.Folders)},l("Filters")),a.ZP.createElement(Te.Z,{icon:"language",onClick:()=>t(o.MT.Language)},l("Language"))))})));var en=n(710),tn=n(1151);const nn="https://t.me/",an=/https:\/\/t\.me\/?/i,sn=/^([a-zA-Z0-9_]+)$/,rn=(0,G.Ds)((e=>e()),250,!1),on=(0,a.X$)((({currentUsername:e,asLink:t,isLoading:n,isUsernameAvailable:s,checkUsername:r,onChange:o})=>{const[i,l]=(0,a.eJ)(e||""),c=(0,u.Z)(),d=t?"SetUrl":"Username",m=c(t?"SetUrlPlaceholder":"Username"),[h,Z]=(0,a.Ye)((()=>i.length?i.length<5?[void 0,`${m} is too short`]:i.length>32?[void 0,`${m} is too long`]:sn.test(i)?void 0===s?[]:[s?c(`${d}Available`,"Username"):void 0,!1===s?c(`${d}InUse`):void 0]:[void 0,`${m} contains invalid characters`]:[]),[i,s,c,d,m]);(0,a.d4)((()=>{l(e||"")}),[t,e]);const P=(0,a.I4)((e=>{const n=e.target.value.trim().replace(an,"");l(n),e.target.value=`${t?nn:""}${n}`;const a=function(e){return e.length>=5&&e.length<=32&&sn.test(e)}(n);a&&rn((()=>{r({username:n})})),o&&o(!!a&&n)}),[t,r,o]);return a.ZP.createElement(Ne.Z,{value:`${t?nn:""}${i}`,onChange:P,label:m,error:Z,success:h,readOnly:n})})),ln=(0,G.P2)((e=>e()),6e4,!0),cn="Please provide your first name",dn="Bio can' be longer than 70 characters",mn=(0,a.X$)((0,s.c$)((e=>{const{currentUserId:t}=e,{progress:n,isUsernameAvailable:a}=e.profileEdit||{},s=t?(0,v.dy)(e,t):void 0;if(!s)return{progress:n,isUsernameAvailable:a};const{firstName:r,lastName:o,username:i,fullInfo:l}=s,{bio:c}=l||{};return{currentAvatarHash:(0,g.RT)(s),currentFirstName:r,currentLastName:o,currentBio:c,currentUsername:i,progress:n,isUsernameAvailable:a}}),((e,t)=>(0,b.ei)(t,["loadCurrentUser","updateProfile","checkUsername"])))((({isActive:e,onScreenSelect:t,onReset:n,currentAvatarHash:s,currentFirstName:i,currentLastName:l,currentBio:c,currentUsername:d,progress:Z,isUsernameAvailable:P,loadCurrentUser:g,updateProfile:v,checkUsername:p})=>{const E=(0,u.Z)(),[C,f]=(0,a.eJ)(!1),[b,I]=(0,a.eJ)(!1),[y,S]=(0,a.eJ)(),[w,k]=(0,a.eJ)(),[N,M]=(0,a.eJ)(i||""),[T,F]=(0,a.eJ)(l||""),[A,L]=(0,a.eJ)(c||""),[R,B]=(0,a.eJ)(d||""),$=(0,h.Z)(s,!1,r.IU.BlobUrl),D=Z===o.rN.InProgress,x=!1===R,U=(0,a.Ye)((()=>!x&&(Boolean(w)||b||!0===P)),[w,b,x,P]);(0,m.ZP)(e,n,t,o.MT.EditProfile),(0,a.d4)((()=>{ln((()=>{g()}))}),[g]),(0,a.d4)((()=>{k(void 0)}),[$]),(0,a.d4)((()=>{M(i||""),F(l||""),L(c||"")}),[i,l,c]),(0,a.d4)((()=>{B(d||"")}),[d]),(0,a.d4)((()=>{Z===o.rN.Complete&&(I(!1),f(!1),S(void 0))}),[Z]);const O=(0,a.I4)((e=>{k(e)}),[]),G=(0,a.I4)((e=>{M(e.target.value),I(!0)}),[]),X=(0,a.I4)((e=>{F(e.target.value),I(!0)}),[]),J=(0,a.I4)((e=>{L(e.target.value),I(!0)}),[]),_=(0,a.I4)((e=>{B(e),f(!0)}),[]),V=(0,a.I4)((()=>{const e=N.trim(),t=T.trim(),n=A.trim();e.length?n.length>70?S(dn):v({photo:w,...b&&{firstName:e,lastName:t,bio:n},...C&&{username:R}}):S(cn)}),[w,N,T,A,b,R,C,v]);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(en.Z,{currentAvatarBlobUrl:$,onChange:O,title:"Edit your profile photo",disabled:D}),a.ZP.createElement(Ne.Z,{value:N,onChange:G,label:E("FirstName"),disabled:D,error:y===cn?y:void 0}),a.ZP.createElement(Ne.Z,{value:T,onChange:X,label:E("LastName"),disabled:D}),a.ZP.createElement(Ne.Z,{value:A,onChange:J,label:E("UserBio"),disabled:D,error:y===dn?y:void 0}),a.ZP.createElement("p",{className:"settings-item-description",dir:E.isRtl?"rtl":void 0},(0,Pe.Z)(E("lng_settings_about_bio"),["br","simple_markdown"]))),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:E.isRtl?"rtl":void 0},E("Username")),a.ZP.createElement(on,{currentUsername:R||"",isLoading:D,isUsernameAvailable:P,checkUsername:p,onChange:_}),a.ZP.createElement("p",{className:"settings-item-description",dir:E.isRtl?"rtl":void 0},(0,Pe.Z)(E("UsernameHelp"),["br","simple_markdown"])),R&&a.ZP.createElement("p",{className:"settings-item-description",dir:E.isRtl?"rtl":void 0},E("lng_username_link"),a.ZP.createElement("br",null),a.ZP.createElement("span",{className:"username-link"},"https://t.me/",R)))),a.ZP.createElement(tn.Z,{isShown:U,onClick:V,disabled:D,ariaLabel:"Save changes"},D?a.ZP.createElement(z.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})))})));var un=n(4605),hn=n(8051);const Zn=(0,a.X$)((0,s.c$)((e=>(0,b.ei)(e.settings.byKey,["canAutoLoadPhotoFromContacts","canAutoLoadPhotoInPrivateChats","canAutoLoadPhotoInGroups","canAutoLoadPhotoInChannels","canAutoLoadVideoFromContacts","canAutoLoadVideoInPrivateChats","canAutoLoadVideoInGroups","canAutoLoadVideoInChannels","canAutoLoadFileFromContacts","canAutoLoadFileInPrivateChats","canAutoLoadFileInGroups","canAutoLoadFileInChannels","canAutoPlayGifs","canAutoPlayVideos","autoLoadFileMaxSizeMb"])),((e,t)=>(0,b.ei)(t,["setSettingOption"])))((({isActive:e,onScreenSelect:t,onReset:n,canAutoLoadPhotoFromContacts:s,canAutoLoadPhotoInPrivateChats:r,canAutoLoadPhotoInGroups:l,canAutoLoadPhotoInChannels:c,canAutoLoadVideoFromContacts:d,canAutoLoadVideoInPrivateChats:h,canAutoLoadVideoInGroups:Z,canAutoLoadVideoInChannels:P,canAutoLoadFileFromContacts:g,canAutoLoadFileInPrivateChats:v,canAutoLoadFileInGroups:p,canAutoLoadFileInChannels:E,canAutoPlayGifs:C,canAutoPlayVideos:f,autoLoadFileMaxSizeMb:b,setSettingOption:I})=>{const y=(0,u.Z)();(0,m.ZP)(e,n,t,o.MT.General);const S=(0,a.I4)((e=>y("AutodownloadSizeLimitUpTo",y("FileSize.MB",String(i.by[e]),"i"))),[y]),w=(0,a.I4)((e=>{I({autoLoadFileMaxSizeMb:i.by[e]})}),[I]);function k(e,t,n,s,r,o){return a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:y.isRtl?"rtl":void 0},e),a.ZP.createElement(un.Z,{label:y("AutoDownloadSettings.Contacts"),checked:n,onCheck:e=>I({[`canAutoLoad${t}FromContacts`]:e})}),a.ZP.createElement(un.Z,{label:y("AutoDownloadSettings.PrivateChats"),checked:s,onCheck:e=>I({[`canAutoLoad${t}InPrivateChats`]:e})}),a.ZP.createElement(un.Z,{label:y("AutoDownloadSettings.GroupChats"),checked:r,onCheck:e=>I({[`canAutoLoad${t}InGroups`]:e})}),a.ZP.createElement(un.Z,{label:y("AutoDownloadSettings.Channels"),checked:o,onCheck:e=>I({[`canAutoLoad${t}InChannels`]:e})}),"File"===t&&function(){const e=i.by.indexOf(b);return a.ZP.createElement("div",{className:"pt-5"},a.ZP.createElement(hn.Z,{label:y("AutoDownloadMaxFileSize"),min:0,max:5,value:-1!==e?e:2,renderValue:S,onChange:w}))}())}return a.ZP.createElement("div",{className:"settings-content custom-scroll"},k(y("AutoDownloadPhotosTitle"),"Photo",s,r,l,c),k(y("AutoDownloadVideosTitle"),"Video",d,h,Z,P),k("Auto-download files","File",g,v,p,E),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:y.isRtl?"rtl":void 0},y("AutoplayMedia")),a.ZP.createElement(un.Z,{label:y("GifsTab2"),checked:C,onCheck:e=>I({canAutoPlayGifs:e})}),a.ZP.createElement(un.Z,{label:y("DataAndStorage.Autoplay.Videos"),checked:f,onCheck:e=>I({canAutoPlayVideos:e})})))})));var Pn=n(7324),gn=n(7799);const vn=(0,G.P2)((e=>e()),6e4,!0),pn=(0,a.X$)((0,s.c$)((e=>{const{chats:{listIds:t,byId:n},users:{byId:a}}=e,{orderedIds:s,byId:r,recommended:o}=e.chatFolders;return{allListIds:t,chatsById:n,usersById:a,orderedFolderIds:s,foldersById:r,recommendedChatFolders:o,notifySettings:(0,v.dZ)(e),notifyExceptions:(0,v.NJ)(e)}}),((e,t)=>(0,b.ei)(t,["loadRecommendedChatFolders","addChatFolder","showDialog"])))((({isActive:e,allListIds:t,chatsById:n,usersById:s,orderedFolderIds:r,foldersById:l,recommendedChatFolders:c,notifySettings:d,notifyExceptions:h,onCreateFolder:Z,onEditFolder:P,onScreenSelect:v,onReset:p,loadRecommendedChatFolders:E,addChatFolder:C,showDialog:f})=>{const[b,I]=(0,a.eJ)(),[y,S]=(0,a.eJ)(!1),w=(0,a.I4)((()=>S(!0)),[]);(0,a.d4)((()=>{b||(0,Pn.Z)("FoldersAll").then(I)}),[b]),(0,a.d4)((()=>{vn((()=>{E()}))}),[E]);const k=(0,a.I4)((()=>{Object.keys(l).length>=10?f({data:{message:"DIALOG_FILTERS_TOO_MUCH",hasErrorKey:!0}}):Z()}),[l,f,Z]),N=(0,u.Z)();(0,m.ZP)(e,p,v,o.MT.Folders);const M=(0,a.Ye)((()=>{if(r)return r.map((e=>{const a=l[e];return{id:a.id,title:a.title,subtitle:(0,g.SB)(N,t,n,s,a,d,h)}}))}),[N,t,l,n,s,r,d,h]),T=(0,a.I4)((e=>{Object.keys(l).length>=10?f({data:{message:"DIALOG_FILTERS_TOO_MUCH",hasErrorKey:!0}}):C({folder:e})}),[l,C,f]);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"},b&&a.ZP.createElement(gn.Z,{id:"settingsFoldersMain",size:i.ku,animationData:b,play:y,noLoop:!0,onLoad:w})),a.ZP.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},N("CreateNewFilterInfo")),a.ZP.createElement(F.Z,{className:"with-icon mb-2",color:"primary",size:"smaller",pill:!0,fluid:!0,onClick:k,isRtl:N.isRtl},a.ZP.createElement("i",{className:"icon-add"}),N("CreateNewFilter"))),a.ZP.createElement("div",{className:"settings-item pt-3"},a.ZP.createElement("h4",{className:"settings-item-header mb-3",dir:N.isRtl?"rtl":void 0},N("Filters")),null!=M&&M.length?M.map((e=>a.ZP.createElement(Te.Z,{className:"mb-2 no-icon",narrow:!0,multiline:!0,onClick:()=>P(l[e.id])},a.ZP.createElement("span",{className:"title"},e.title),a.ZP.createElement("span",{className:"subtitle"},e.subtitle)))):M&&!M.length?a.ZP.createElement("p",{className:"settings-item-description my-4",dir:"auto"},"You have no folders yet."):a.ZP.createElement(we.Z,null)),c&&!!c.length&&a.ZP.createElement("div",{className:"settings-item pt-3"},a.ZP.createElement("h4",{className:"settings-item-header mb-3",dir:N.isRtl?"rtl":void 0},N("FilterRecommended")),c.map((e=>a.ZP.createElement(Te.Z,{className:"mb-2",narrow:!0,onClick:()=>T(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(F.Z,{className:"px-3",color:"primary",size:"tiny",pill:!0,fluid:!0,isRtl:N.isRtl},N("Add"))))))))})));var En=n(3455);const Cn=({count:e,itemName:t,itemPluralName:n,isLoading:s,onClick:r})=>{const o=(0,u.Z)();return a.ZP.createElement(F.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)},fn="Please provide a title for this folder.",bn="ChatList.Filter.Error.Empty",In=(0,a.X$)((0,s.c$)((e=>{const{listIds:t}=e.chats;return{loadedActiveChatIds:t.active,loadedArchivedChatIds:t.archived}}),((e,t)=>(0,b.ei)(t,["editChatFolder","addChatFolder","loadMoreChats"])))((({state:e,dispatch:t,onAddIncludedChats:n,onAddExcludedChats:s,isActive:r,onScreenSelect:l,onReset:c,onBack:d,loadedActiveChatIds:h,loadedArchivedChatIds:Z,editChatFolder:P,addChatFolder:v,loadMoreChats:p})=>{const[E,C]=(0,a.eJ)(),[f,I]=(0,a.eJ)(!1),y=(0,a.I4)((()=>I(!0)),[]),[S,w]=(0,a.eJ)(!1),[k,N]=(0,a.eJ)(!1),{selectedChatIds:M,selectedChatTypes:T}=(0,En.vb)(e,"included"),{selectedChatIds:F,selectedChatTypes:A}=(0,En.vb)(e,"excluded");(0,a.d4)((()=>{E||(0,Pn.Z)("FoldersNew").then(C)}),[E]),(0,a.d4)((()=>{w(!1),N(!1)}),[e.folderId]);const[L,R]=(0,a.Ye)((()=>{const e=new Set([...h||[],...Z||[]]),t=(0,b.eL)(M,e),n=(0,b.eL)(F,e);return[S?t:t.slice(0,5-T.length),k?n:n.slice(0,5-A.length)]}),[F,M,T,A,k,S,h,Z]);(0,a.d4)((()=>{(L.lengthw(!0):()=>N(!0);return a.ZP.createElement(a.ZP.Fragment,null,t.map((t=>function(e,t){const n="included"===t?En.fi.find((({key:t})=>t===e)):En.Yy.find((({key:t})=>t===e));if(n)return a.ZP.createElement(Te.Z,{key:n.key,className:"settings-folders-list-item mb-1",icon:n.icon,narrow:!0,inactive:!0},B(n.title))}(t,e))),n.map((e=>a.ZP.createElement(Te.Z,{className:"settings-folders-list-item mb-1",narrow:!0,inactive:!0},(0,g.YC)(e)?a.ZP.createElement(Ae.Z,{avatarSize:"small",userId:e}):a.ZP.createElement(Fe.Z,{avatarSize:"small",chatId:e})))),!s&&r>0&&a.ZP.createElement(Cn,{count:r,itemName:"chat",onClick:o}))}return(0,m.ZP)(r,d,l,"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"},E&&a.ZP.createElement(gn.Z,{id:"settingsFoldersEdit",size:i.ku,animationData:E,play:f&&String(e.folderId),noLoop:!0,onLoad:y})),"create"===e.mode&&a.ZP.createElement("p",{className:"settings-item-description mb-3",dir:B.isRtl?"rtl":void 0},B("FilterIncludeInfo")),a.ZP.createElement(Ne.Z,{className:"mb-0",label:B("FilterNameHint"),value:e.folder.title,onChange:function(e){const{currentTarget:n}=e;t({type:"setTitle",payload:n.value.trim()})},error:e.error&&e.error===fn?fn:void 0})),a.ZP.createElement("div",{className:"settings-item no-border pt-3"},e.error&&e.error===bn&&a.ZP.createElement("p",{className:"settings-item-description color-danger mb-2",dir:B.isRtl?"rtl":void 0},B(e.error)),a.ZP.createElement("h4",{className:"settings-item-header mb-3",dir:B.isRtl?"rtl":void 0},B("FilterInclude")),a.ZP.createElement(Te.Z,{className:"settings-folders-list-item color-primary mb-0",icon:"add",onClick:n},B("FilterAddChats")),$("included")),a.ZP.createElement("div",{className:"settings-item no-border pt-3"},a.ZP.createElement("h4",{className:"settings-item-header mb-3",dir:B.isRtl?"rtl":void 0},B("FilterExclude")),a.ZP.createElement(Te.Z,{className:"settings-folders-list-item color-primary mb-0",icon:"add",onClick:s},B("FilterAddChats")),$("excluded"))),a.ZP.createElement(tn.Z,{isShown:!!e.isTouched,disabled:e.isLoading,onClick:function(){const{title:n}=e.folder;n?M.length||Object.keys(T).length?(t({type:"setIsLoading",payload:!0}),"edit"===e.mode?P({id:e.folderId,folderUpdate:e.folder}):v({folder:e.folder}),setTimeout((()=>{c()}),500)):t({type:"setError",payload:bn}):t({type:"setError",payload:fn})},ariaLabel:"edit"===e.mode?"Save changes":"Create folder"},e.isLoading?a.ZP.createElement(z.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})))})));var yn=n(5765);const Sn=(0,a.X$)((({mode:e,chatIds:t,selectedIds:n,selectedChatTypes:s,filterValue:r,onSelectedIdsChange:o,onSelectedChatTypesChange:i,onFilterChange:l,onLoadMore:c})=>{const d=(0,a.sO)(null),m="included"===e?En.fi:En.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]),v=(0,a.I4)((e=>{const t=[...s];t.includes(e)?t.splice(t.indexOf(e),1):t.push(e),i(t)}),[s,i]),p=(0,a.I4)((e=>{const{value:t}=e.currentTarget;l(t)}),[l]),E=(0,u.Z)(),[C,f]=(0,Ie.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:E(t.title),isMinimized:h,canClose:!0,onClick:v,clickArg:t.key})})),n.map(((e,t)=>a.ZP.createElement(Ct.Z,{chatOrUserId:e,isMinimized:h&&tv(e.key),ripple:!0},a.ZP.createElement("i",{className:`icon-${e.icon}`}),a.ZP.createElement("h3",{className:"chat-type",dir:"auto"},E(e.title)),a.ZP.createElement(un.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:E.isRtl?"rtl":void 0},E("FilterChats"))),null!=C&&C.length?C.map((function(e){const t=n.includes(e);return a.ZP.createElement(Te.Z,{key:e,className:"chat-item-clickable picker-list-item chat-item",onClick:()=>P(e),ripple:!0,disabled:!t&&Z},(0,g.YC)(e)?a.ZP.createElement(Ae.Z,{userId:e}):a.ZP.createElement(Fe.Z,{chatId:e,withChatType:!0}),a.ZP.createElement(un.Z,{label:"",checked:t,round:!0}))})):C&&!C.length?a.ZP.createElement("p",{className:"no-results",key:"no-results"},"Sorry, nothing found."):a.ZP.createElement(we.Z,{key:"loading"})))})),wn=(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,b.ei)(t,["loadMoreChats"])))((({isActive:e,onScreenSelect:t,onReset:n,mode:s,state:r,dispatch:i,chatsById:l,listIds:c,orderedPinnedIds:d,archivedListIds:h,archivedPinnedIds:Z,loadMoreChats:P})=>{const{chatFilter:v}=r,{selectedChatIds:p,selectedChatTypes:E}=(0,En.vb)(r,s,!0),C=(0,u.Z)(),f=(0,a.Ye)((()=>{const e=c?(0,g.O)(l,c,d,"all"):void 0,t=h?(0,g.O)(l,h,Z,"archived"):void 0;if(e||t)return[...(null==e?void 0:e.pinnedChats)||[],...(null==e?void 0:e.otherChats)||[],...(null==t?void 0:t.otherChats)||[]]}),[l,c,d,h,Z]),b=(0,a.Ye)((()=>{if(f)return f.filter((e=>!v||(0,yn.Z)((0,g.U)(C,e),v)||p.includes(e.id))).map((({id:e})=>e))}),[f,v,C,p]),I=(0,a.I4)((e=>{i({type:"setChatFilter",payload:e})}),[i]),y=(0,a.I4)((e=>{i("included"===s?{type:"setIncludeFilters",payload:{...r.includeFilters,includedChatIds:e}}:{type:"setExcludeFilters",payload:{...r.excludeFilters,excludedChatIds:e}})}),[s,r,i]),S=(0,a.I4)((e=>{const t={};e.forEach((e=>{t[e]=!0})),i("included"===s?{type:"setIncludeFilters",payload:{includedChatIds:p,...t}}:{type:"setExcludeFilters",payload:{excludedChatIds:p,...t}})}),[s,p,i]);return(0,m.ZP)(e,n,t,"included"===s?o.MT.FoldersIncludedChats:o.MT.FoldersExcludedChats),b?a.ZP.createElement(Sn,{mode:s,chatIds:b,selectedIds:p,selectedChatTypes:E,filterValue:v,onSelectedIdsChange:y,onSelectedChatTypesChange:S,onFilterChange:I,onLoadMore:P}):a.ZP.createElement(we.Z,null)}))),kn=(0,a.X$)((({currentScreen:e,shownScreen:t,state:n,dispatch:s,isActive:r,onScreenSelect:i,onReset:l})=>{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?l():"create"===n.mode?i(o.MT.FoldersCreateFolder):i(o.MT.FoldersEditFolder)}),[n.mode,s,e,l,i]),d=(0,a.I4)((()=>{s({type:"reset"}),i(o.MT.FoldersCreateFolder)}),[i,s]),m=(0,a.I4)((e=>{s({type:"editFolder",payload:e}),i(o.MT.FoldersEditFolder)}),[s,i]),u=(0,a.I4)((()=>{s({type:"editIncludeFilters"}),i(e===o.MT.FoldersEditFolderFromChatList?o.MT.FoldersIncludedChatsFromChatList:o.MT.FoldersIncludedChats)}),[e,s,i]),h=(0,a.I4)((()=>{s({type:"editExcludeFilters"}),i(e===o.MT.FoldersEditFolderFromChatList?o.MT.FoldersExcludedChatsFromChatList:o.MT.FoldersExcludedChats)}),[e,s,i]);switch(e){case o.MT.Folders:return a.ZP.createElement(pn,{onCreateFolder:d,onEditFolder:m,onScreenSelect:i,isActive:r||[o.MT.FoldersCreateFolder,o.MT.FoldersEditFolder,o.MT.FoldersIncludedChats,o.MT.FoldersExcludedChats].includes(t),onReset:l});case o.MT.FoldersCreateFolder:case o.MT.FoldersEditFolder:case o.MT.FoldersEditFolderFromChatList:return a.ZP.createElement(In,{state:n,dispatch:s,onAddIncludedChats:u,onAddExcludedChats:h,onReset:c,onScreenSelect:i,isActive:r||[o.MT.FoldersIncludedChats,o.MT.FoldersExcludedChats].includes(t),onBack:l});case o.MT.FoldersIncludedChats:case o.MT.FoldersIncludedChatsFromChatList:return a.ZP.createElement(wn,{mode:"included",state:n,dispatch:s,onReset:c,onScreenSelect:i,isActive:r});case o.MT.FoldersExcludedChats:case o.MT.FoldersExcludedChatsFromChatList:return a.ZP.createElement(wn,{mode:"excluded",state:n,dispatch:s,onReset:c,onScreenSelect:i,isActive:r});default:return}}));var Nn=n(663),Mn=n(3657),Tn=n(692),Fn=n(2155);const An=(0,a.X$)((({size:e=i.DC,stickerSet:t,observeIntersection:n})=>{const s=(0,a.sO)(null),o=(0,Mn.Op)(s,n),l=`stickerSet${t.id}`,c=(0,h.Z)(l,!o,r.IU.Lottie),d=(0,Tn.Z)(c),m=(0,a.Ye)((()=>{if(!c)return(0,Fn.Xv)(t.title,2)}),[c,t.title]);return a.ZP.createElement("div",{ref:s,className:"sticker-set-cover"},m,c&&a.ZP.createElement(gn.Z,{id:l,size:e,animationData:c,className:d}))})),Ln=(0,a.X$)((({stickerSet:e,observeIntersection:t})=>{const n=(0,a.sO)(null),s=(0,Mn.Op)(n,t),r=(0,h.Z)(e.hasThumbnail&&`stickerSet${e.id}`,!s),o=(0,Tn.Z)(r),i=(0,a.Ye)((()=>{if(!r)return(0,Fn.Xv)(e.title,2)}),[r,e.title]);return a.ZP.createElement("div",{ref:n,className:"sticker-set-cover"},i,a.ZP.createElement("img",{src:r,className:o,alt:""}))}));var Rn=n(3547);const Bn=(0,a.X$)((({stickerSet:e,observeIntersection:t,onClick:n})=>{var s;const r=(0,u.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(Te.Z,{narrow:!0,className:"SettingsStickerSet",inactive:!o,onClick:()=>o&&n(o)},a.ZP.createElement(F.Z,{ariaLabel:e.title,color:"translucent",isRtl:r.isRtl},e.isAnimated?a.ZP.createElement(An,{size:i.Mw,stickerSet:e,observeIntersection:t}):a.ZP.createElement(Ln,{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(Te.Z,{narrow:!0,className:"SettingsStickerSet",onClick:()=>n(o)},a.ZP.createElement(Rn.Z,{sticker:o,size:i.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 $n=n(4851);const Dn=["Solid and Steady","Nice and Fast","Lots of Stuff"],xn=[{label:"12-hour",value:"12h"},{label:"24-hour",value:"24h"}],Un=(0,a.X$)((0,s.c$)((e=>({...(0,b.ei)(e.settings.byKey,["messageTextSize","animationLevel","messageSendKeyCombo","shouldSuggestStickers","shouldLoopStickers","isSensitiveEnabled","canChangeSensitive","timeFormat"]),stickerSetIds:e.stickers.added.setIds,stickerSetsById:e.stickers.setsById})),((e,t)=>(0,b.ei)(t,["setSettingOption","loadStickerSets","loadAddedStickers"])))((({isActive:e,onScreenSelect:t,onReset:n,stickerSetIds:s,stickerSetsById:r,messageTextSize:i,animationLevel:l,messageSendKeyCombo:c,shouldSuggestStickers:d,shouldLoopStickers:h,timeFormat:Z,setSettingOption:P,loadStickerSets:g,loadAddedStickers:v})=>{const p=(0,a.sO)(null),{observe:E}=(0,Mn.S1)({rootRef:p}),[C,b,I]=(0,Xe.Z)(),[y,S]=(0,a.eJ)(),w=(0,u.Z)(),k=f.$b?void 0:[{value:"enter",label:w("lng_settings_send_enter"),subLabel:"New line by Shift + Enter"},{value:"ctrl-enter",label:w(f.jm?"lng_settings_send_cmdenter":"lng_settings_send_ctrlenter"),subLabel:"New line by Enter"}];(0,a.d4)((()=>{g()}),[g]),(0,a.d4)((()=>{null!=s&&s.length&&v()}),[s,v]);const N=(0,a.I4)((e=>{Dn.forEach(((t,n)=>{document.body.classList.toggle(`animation-level-${n}`,e===n)})),P({animationLevel:e})}),[P]),M=(0,a.I4)((e=>{document.documentElement.style.setProperty("--composer-text-size",`${Math.max(e,f.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()),P({messageTextSize:e})}),[P]),T=(0,a.I4)((e=>{P({timeFormat:e}),P({wasTimeFormatSetManually:!0}),(0,Nn.qf)(e)}),[P]),F=(0,a.I4)((e=>{S(e),b()}),[b]),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,m.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:w.isRtl?"rtl":void 0},w("SETTINGS")),a.ZP.createElement(hn.Z,{label:w("TextSize"),min:12,max:20,value:i,onChange:M}),a.ZP.createElement(Te.Z,{icon:"photo",onClick:()=>t(o.MT.GeneralChatBackground)},w("ChatBackground"))),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:w.isRtl?"rtl":void 0},"Time Format"),a.ZP.createElement(tt.Z,{name:"timeformat",options:xn,selected:Z,onChange:T})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:w.isRtl?"rtl":void 0},"Animation Level"),a.ZP.createElement("p",{className:"settings-item-description",dir:w.isRtl?"rtl":void 0},"Choose the desired animations amount."),a.ZP.createElement(hn.Z,{options:Dn,value:l,onChange:N})),k&&a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:w.isRtl?"rtl":void 0},w("VoiceOver.Keyboard")),a.ZP.createElement(tt.Z,{name:"keyboard-send-settings",options:k,onChange:e=>P({messageSendKeyCombo:e}),selected:c})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:w.isRtl?"rtl":void 0},w("AccDescrStickers")),a.ZP.createElement(un.Z,{label:w("SuggestStickers"),checked:d,onCheck:e=>P({shouldSuggestStickers:e})}),a.ZP.createElement(un.Z,{label:w("LoopAnimatedStickers"),checked:h,onCheck:e=>P({shouldLoopStickers:e})}),a.ZP.createElement("div",{className:"mt-4",ref:p},A&&A.map((e=>a.ZP.createElement(Bn,{key:e.id,stickerSet:e,observeIntersection:E,onClick:F})))),y&&a.ZP.createElement($n.Z,{isOpen:C,fromSticker:y,onClose:I})))})));let On;function Gn(e="*",t,n=!1){On||(On=document.createElement("input"),On.setAttribute("type","file")),On.setAttribute("accept",e),n?On.removeAttribute("multiple"):On.setAttribute("multiple","multiple"),On.onchange=null,On.value="",On.onchange=t,On.click()}var zn=n(1394);function Xn(e){return[parseInt(e.substring(0,2),16),parseInt(e.substring(2,4),16),parseInt(e.substring(4,6),16)]}function Jn(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 _n([e,t,n]){e/=255,t/=255,n/=255;let a,s,r=Math.max(e,t,n),o=Math.min(e,t,n),i=r,l=r-o;if(s=0==r?0:l/r,r==o)a=0;else{switch(r){case e:a=(t-n)/l+(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 Yn=n(9524),jn=n(5866);const Kn=(0,a.X$)((({wallpaper:e,theme:t,isSelected:n,onClick:s})=>{var r;const{slug:l,document:c}=e,d=`wallpaper${c.id}`,m=c.previewBlobUrl,u=(0,h.Z)(`${d}?size=m`),g=(0,jn.Z)(null===(r=c.thumbnail)||void 0===r?void 0:r.dataUri,Boolean(u),!0),{transitionClassNames:v}=(0,_.Z)(Boolean(u||m),void 0,void 0,"slow"),[p,E]=(0,a.eJ)(!1),{mediaData:C,loadProgress:f}=(0,Z.Z)(d,!p),b=!1===(0,P.Z)(p),{shouldRender:I,transitionClassNames:y}=(0,_.Z)(p&&!C||l===o.mp,void 0,b,"slow"),S=(0,a.sO)();S.current=t;const w=(0,a.I4)((()=>{(async()=>{const e=await(0,zn.gm)(C);await Yn.save(i.fo,S.current,e),s(l)})()}),[C,s,l]);(0,a.d4)((()=>{C&&w()}),[C,w]);const k=(0,a.I4)((()=>{C?w():E((e=>!e))}),[C,w]),N=(0,X.Z)("WallpaperTile",n&&"selected");return a.ZP.createElement("div",{className:N,onClick:k},a.ZP.createElement("div",{className:"media-inner"},a.ZP.createElement("canvas",{ref:g,className:"thumbnail"}),a.ZP.createElement("img",{src:u||m,className:(0,X.Z)("full-media",v),alt:""}),I&&a.ZP.createElement("div",{className:(0,X.Z)("spinner-container",y)},a.ZP.createElement($.Z,{progress:f,onClick:k}))))})),qn=(0,G.P2)((e=>e()),6e4,!0),Wn=(0,a.X$)((0,s.c$)((e=>{const t=(0,v.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,b.ei)(t,["loadWallpapers","uploadWallpaper","setThemeSettings"])))((({isActive:e,onScreenSelect:t,onReset:n,background:s,isBlurred:r,loadedWallpapers:l,theme:c,loadWallpapers:d,uploadWallpaper:h,setThemeSettings:Z})=>{const P=(0,a.sO)();P.current=c,(0,a.d4)((()=>{qn((()=>{d()}))}),[d]);const g=(0,a.I4)((e=>{const{files:t}=e.target;t&&t.length>0&&h(t[0])}),[h]),v=(0,a.I4)((()=>{Gn("image/jpeg",g,!0)}),[g]),p=(0,a.I4)((()=>{t(o.MT.GeneralChatBackgroundColor)}),[t]),E=(0,a.I4)((()=>{Z({theme:c,background:void 0,backgroundColor:void 0,isBlurred:!0,patternColor:"dark"===c?i.Vv:i.g})}),[Z,c]),C=(0,a.I4)((e=>{Z({theme:P.current,background:e});const t=l&&l.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,i=[0,0,0],l=0;const c=document.createElement("canvas"),d=c.getContext&&c.getContext("2d");if(!d)return t;const m=await(0,zn.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=Hn(e),n=`#${Jn(e)}`;Z({theme:P.current,backgroundColor:n,patternColor:t})}))}),[l,Z]),f=(0,a.I4)((e=>{Z({theme:P.current,isBlurred:e.target.checked})}),[Z]),b=(0,u.Z)();(0,m.ZP)(e,n,t,o.MT.GeneralChatBackground);const I=(null==l?void 0:l[0])&&l[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(Te.Z,{icon:"camera-add",className:"mb-0",disabled:I,onClick:v},b("UploadImage")),a.ZP.createElement(Te.Z,{icon:"colorize",className:"mb-0",onClick:p},b("SetColor")),a.ZP.createElement(Te.Z,{icon:"favorite",onClick:E},b("ThemeResetToDefaults")),a.ZP.createElement(un.Z,{label:b("BackgroundBlurred"),checked:Boolean(r),onChange:f})),l?a.ZP.createElement("div",{className:"settings-wallpapers"},l.map((e=>a.ZP.createElement(Kn,{wallpaper:e,theme:c,isSelected:s===e.slug,onClick:C})))):a.ZP.createElement(we.Z,null))}))),Qn=_n(Xn("e6ebee")),ea=["#e6ebee","#b2cee1","#008dd0","#c6e7cb","#c4e1a6","#60b16e","#ccd0af","#a6a997","#7a7072","#fdd7af","#fdb76e","#dd8851"];function ta(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 na({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 aa=(0,a.X$)((0,s.c$)((e=>{const t=(0,v.Pu)(e),{backgroundColor:n}=e.settings.themes[t]||{};return{backgroundColor:n,theme:t}}),((e,t)=>(0,b.ei)(t,["setThemeSettings"])))((({isActive:e,onScreenSelect:t,onReset:n,theme:s,backgroundColor:r,setThemeSettings:i})=>{const l=(0,a.sO)();l.current=s;const c=(0,a.sO)(null),d=(0,a.sO)(null),u=(0,a.sO)(null),h=(0,a.sO)(!0),[Z,P]=(0,a.eJ)(function(e){return e&&e.startsWith("#")?_n(Xn(e.replace("#",""))):Qn}(r)),g=(0,a.sO)(Z);(0,a.d4)((()=>{g.current=Z}),[Z]);const[v,p,E]=(0,Xe.Z)(),[f,I]=(0,a.eJ)(""),[y,S]=(0,a.eJ)(""),w=(0,a.sO)(),k=(0,a.sO)();(0,a.d4)((()=>{const e={offsetLeft:d.current.offsetLeft,...(0,b.ei)(d.current.getBoundingClientRect(),["top","width","height"])},t={offsetLeft:u.current.offsetLeft,...(0,b.ei)(u.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}=ta(g.current,w.current);return P(na({colorPosition:n,huePosition:a},w.current)),p(),!0}function a(e){const{colorPosition:n}=ta(g.current,w.current),a=Math.min(Math.max(0,e.pageX-t.offsetLeft),t.width-1);return P(na({colorPosition:n,huePosition:a},w.current)),p(),!0}w.current={colorRect:e,hueRect:t},(0,C.s)(d.current,{onCapture:n,onDrag:n,onRelease:E,onClick:E,selectorToPreventScroll:".SettingsGeneralBackgroundColor",withCursor:!0}),(0,C.s)(u.current,{onCapture:a,onDrag:a,onRelease:E,onClick:E,selectorToPreventScroll:".SettingsGeneralBackgroundColor",withCursor:!0})}),[p,E]);const{colorPosition:N=[0,0],huePosition:M=0}=w.current?ta(Z,w.current):{},T=Jn(Vn(Z)),F=Z[0],A=Jn(Vn([F,1,1]));(0,a.d4)((()=>{const e=Vn(Z),t=`#${Jn(e)}`;if(I(e.join(", ")),S(t),!h.current){const n=Hn(e);i({theme:l.current,background:void 0,backgroundColor:t,patternColor:n})}h.current=!1}),[Z,i]),(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 i=o.createImageData(s,r),l=i.data,c=Vn([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())));P(_n(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}$/)&&P(_n(Xn(t.replace("#","")))),e.currentTarget.value=t}),[]),B=(0,a.I4)((e=>{P(_n(Xn(e.currentTarget.dataset.color.replace("#",""))))}),[]),$=(0,X.Z)("SettingsGeneralBackgroundColor settings-content custom-scroll",v&&"is-dragging");return(0,m.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(${N[0]}px, ${N[1]}px); background-color: #${T};`})),a.ZP.createElement("div",{ref:u,className:"hue-picker"},a.ZP.createElement("canvas",null),a.ZP.createElement("div",{className:"handle",style:`transform: translateX(${M}px); background-color: #${A};`})),a.ZP.createElement("div",{className:"tools"},a.ZP.createElement(Ne.Z,{value:y,label:"HEX",onChange:R}),a.ZP.createElement(Ne.Z,{value:f,label:"RGB",onChange:L}))),a.ZP.createElement("div",{className:"predefined-colors"},ea.map((e=>a.ZP.createElement("div",{className:e===`#${T}`?"active":void 0,"data-color":e,style:`background-color: ${e};`,onClick:B})))))})));var sa=n(8406);const ra=(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,b.ei)(t,["loadNotificationSettings","updateContactSignUpNotification","updateNotificationSettings","updateWebNotificationSettings"])))((({isActive:e,onScreenSelect:t,onReset:n,hasPrivateChatsNotifications:s,hasPrivateChatsMessagePreview:r,hasGroupNotifications:i,hasGroupMessagePreview:l,hasBroadcastNotifications:c,hasBroadcastMessagePreview:d,hasContactJoinedNotifications:h,hasPushNotifications:Z,hasWebNotifications:P,notificationSoundVolume:g,loadNotificationSettings:v,updateContactSignUpNotification:p,updateNotificationSettings:E,updateWebNotificationSettings:C})=>{(0,a.d4)((()=>{v()}),[v]);const f=(0,x.Z)(500,!1,!0),b=(0,a.I4)(((e,t,n)=>{const a="contact"===t?!s:!("group"===t?i:c),o="contact"===t?r:"group"===t?l:d;E({peerType:t,..."silent"===n&&{isSilent:!e.target.checked,shouldShowPreviews:o},..."showPreviews"===n&&{shouldShowPreviews:e.target.checked,isSilent:a}})}),[d,c,l,i,r,s,E]),I=(0,a.I4)((e=>{p({isSilent:!e.target.checked})}),[p]),y=(0,u.Z)();return(0,m.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:y.isRtl?"rtl":void 0},"Web notifications"),a.ZP.createElement(un.Z,{label:"Web notifications",subLabel:y(P?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:P,onChange:e=>{C({hasWebNotifications:e.target.checked})}}),a.ZP.createElement(un.Z,{label:"Offline notifications",disabled:!P,subLabel:y(Z?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:Z,onChange:e=>{C({hasPushNotifications:e.target.checked})}}),a.ZP.createElement("div",{className:"settings-item-slider"},a.ZP.createElement(hn.Z,{label:"Sound",min:0,max:10,value:g,onChange:e=>{C({notificationSoundVolume:e}),f((()=>(0,sa.q3)(void 0,e)))}}))),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:y.isRtl?"rtl":void 0},y("AutodownloadPrivateChats")),a.ZP.createElement(un.Z,{label:y("NotificationsForPrivateChats"),subLabel:y(s?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:s,onChange:e=>{b(e,"contact","silent")}}),a.ZP.createElement(un.Z,{label:y("MessagePreview"),disabled:!s,subLabel:y(r?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:r,onChange:e=>{b(e,"contact","showPreviews")}})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:y.isRtl?"rtl":void 0},y("FilterGroups")),a.ZP.createElement(un.Z,{label:y("NotificationsForGroups"),subLabel:y(i?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:i,onChange:e=>{b(e,"group","silent")}}),a.ZP.createElement(un.Z,{label:y("MessagePreview"),disabled:!i,subLabel:y(l?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:l,onChange:e=>{b(e,"group","showPreviews")}})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:y.isRtl?"rtl":void 0},y("FilterChannels")),a.ZP.createElement(un.Z,{label:y("NotificationsForChannels"),subLabel:y(c?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:c,onChange:e=>{b(e,"broadcast","silent")}}),a.ZP.createElement(un.Z,{label:y("MessagePreview"),disabled:!c,subLabel:y(d?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:d,onChange:e=>{b(e,"broadcast","showPreviews")}})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:y.isRtl?"rtl":void 0},y("PhoneOther")),a.ZP.createElement(un.Z,{label:y("ContactJoined"),checked:h,onChange:I})))}))),oa=(0,a.X$)((0,s.c$)((e=>{var t,n,a,s,r;const{settings:{byKey:{hasPassword:o,isSensitiveEnabled:i,canChangeSensitive:l},privacy:c},blocked:d,activeSessions:m}=e;return{hasPassword:o,blockedCount:d.totalCount,sessionsCount:m.length,isSensitiveEnabled:i,canChangeSensitive:l,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,b.ei)(t,["loadBlockedContacts","loadAuthorizations","loadPrivacySettings","loadContentSettings","updateContentSettings"])))((({isActive:e,onScreenSelect:t,onReset:n,hasPassword:s,blockedCount:r,sessionsCount:i,isSensitiveEnabled:l,canChangeSensitive:c,visibilityPrivacyPhoneNumber:d,visibilityPrivacyLastSeen:h,visibilityPrivacyProfilePhoto:Z,visibilityPrivacyForwarding:P,visibilityPrivacyGroupChats:g,loadPrivacySettings:v,loadBlockedContacts:p,loadAuthorizations:E,loadContentSettings:C,updateContentSettings:f})=>{(0,a.d4)((()=>{p(),E(),v(),C()}),[p,E,v,C]);const b=(0,u.Z)();function I(e){switch(e){case"everybody":return b("P2PEverybody");case"contacts":return b("P2PContacts");case"nobody":return b("P2PNobody")}}return(0,m.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(Te.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"},b("BlockedUsers")),r>0&&a.ZP.createElement("span",{className:"subtitle",dir:"auto"},b("Users",r)))),a.ZP.createElement(Te.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"},b("TwoStepVerification")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},b(s?"PasswordOn":"PasswordOff")))),a.ZP.createElement(Te.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"},b("SessionsTitle")),i>0&&a.ZP.createElement("span",{className:"subtitle",dir:"auto"},1===i?"1 session":`${i} sessions`)))),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header mb-4",dir:b.isRtl?"rtl":void 0},b("PrivacyTitle")),a.ZP.createElement(Te.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"},b("PrivacyPhoneTitle")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},I(d)))),a.ZP.createElement(Te.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"},b("LastSeenTitle")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},I(h)))),a.ZP.createElement(Te.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"},b("PrivacyProfilePhotoTitle")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},I(Z)))),a.ZP.createElement(Te.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"},b("PrivacyForwardsTitle")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},I(P)))),a.ZP.createElement(Te.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"},b("WhoCanAddMe")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},I(g))))),c&&a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:b.isRtl?"rtl":void 0},b("lng_settings_sensitive_title")),a.ZP.createElement(un.Z,{label:b("lng_settings_sensitive_disable_filtering"),subLabel:b("lng_settings_sensitive_about"),checked:Boolean(l),disabled:!c,onCheck:f})))}))),ia=(0,a.X$)((0,s.c$)((e=>({languages:e.settings.byKey.languages,language:e.settings.byKey.language})),((e,t)=>(0,b.ei)(t,["loadLanguages","setSettingOption"])))((({isActive:e,onScreenSelect:t,onReset:n,languages:s,language:r,loadLanguages:i,setSettingOption:l})=>{const[c,d]=(0,a.eJ)(r),[u,h,Z]=(0,Xe.Z)();(0,a.d4)((()=>{i()}),[i]);const P=(0,a.I4)((e=>{d(e),h(),(0,Nn.m0)(e,(()=>{Z(),l({language:e})}))}),[h,Z,l]),g=(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,m.ZP)(e,n,t,o.MT.Language),a.ZP.createElement("div",{className:"settings-content settings-item settings-language custom-scroll"},g?a.ZP.createElement(tt.Z,{name:"keyboard-send-settings",options:g,selected:c,loadingOption:u?c:void 0,onChange:P}):a.ZP.createElement(we.Z,null))})));function la(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 ca=(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,b.ei)(t,["setPrivacyVisibility"])))((({screen:e,isActive:t,onScreenSelect:n,onReset:s,visibility:r,allowUserIds:i,allowChatIds:l,blockUserIds:c,blockChatIds:d,chatsById:h,setPrivacyVisibility:Z})=>{const P=(0,u.Z)(),g=(0,a.Ye)((()=>{switch(e){case o.MT.PrivacyProfilePhoto:case o.MT.PrivacyGroupChats:return[{value:"everybody",label:P("P2PEverybody")},{value:"contacts",label:P("P2PContacts")}];default:return[{value:"everybody",label:P("P2PEverybody")},{value:"contacts",label:P("P2PContacts")},{value:"nobody",label:P("P2PNobody")}]}}),[P,e]),v={shouldShowDenied:"nobody"!==r,shouldShowAllowed:"everybody"!==r},p=la(e),E=(0,a.Ye)((()=>{switch(e){case o.MT.PrivacyPhoneNumber:return P("PrivacyPhoneTitle");case o.MT.PrivacyLastSeen:return P("LastSeenTitle");case o.MT.PrivacyProfilePhoto:return P("PrivacyProfilePhotoTitle");case o.MT.PrivacyForwarding:return P("PrivacyForwardsTitle");case o.MT.PrivacyGroupChats:return P("WhoCanAddMe");default:return}}),[P,e]);(0,m.ZP)(t,s,n,e);const C=(0,a.Ye)((()=>{switch(e){case o.MT.PrivacyLastSeen:return P("CustomHelp");default:return}}),[P,e]),f=(()=>{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}})(),b=(()=>{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}})(),I=(0,a.Ye)((()=>i&&l&&h?l.reduce(((e,t)=>e+(h[t]?h[t].membersCount:0)),i.length):0),[l,i,h]),y=(0,a.Ye)((()=>c&&d&&h?d.reduce(((e,t)=>e+(h[t]?h[t].membersCount:0)),c.length):0),[d,c,h]),S=(0,a.I4)((e=>{Z({privacyKey:p,visibility:e})}),[p,Z]);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:P.isRtl?"rtl":void 0},E),a.ZP.createElement(tt.Z,{name:`visibility-${p}`,options:g,onChange:S,selected:r}),C&&a.ZP.createElement("p",{className:"settings-item-description-larger",dir:P.isRtl?"rtl":void 0},C)),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header mb-4",dir:P.isRtl?"rtl":void 0},P("PrivacyExceptions")),v.shouldShowAllowed&&a.ZP.createElement(Te.Z,{narrow:!0,icon:"add-user",onClick:()=>{n(f)}},a.ZP.createElement("div",{className:"multiline-menu-item full-size"},I>0&&a.ZP.createElement("span",{className:"date",dir:"auto"},"+",I),a.ZP.createElement("span",{className:"title"},P("AlwaysShareWith")),a.ZP.createElement("span",{className:"subtitle"},P("EditAdminAddUsers")))),v.shouldShowDenied&&a.ZP.createElement(Te.Z,{narrow:!0,icon:"delete-user",onClick:()=>{n(b)}},a.ZP.createElement("div",{className:"multiline-menu-item full-size"},y>0&&a.ZP.createElement("span",{className:"date",dir:"auto"},"−",y),a.ZP.createElement("span",{className:"title"},P("NeverShareWith")),a.ZP.createElement("span",{className:"subtitle"},P("EditAdminAddUsers"))))))})));function da(e){return[e.region,e.country].filter(Boolean).join(", ")}function ma(e){return`${e.deviceModel}${e.deviceModel?", ":""} ${e.platform} ${e.systemVersion}`}const ua=(0,a.X$)((0,s.c$)((e=>({activeSessions:e.activeSessions})),((e,t)=>(0,b.ei)(t,["loadAuthorizations","terminateAuthorization","terminateAllAuthorizations"])))((({isActive:e,onScreenSelect:t,onReset:n,activeSessions:s,loadAuthorizations:r,terminateAuthorization:i,terminateAllAuthorizations:l})=>{const[c,d,h]=(0,Xe.Z)();(0,a.d4)((()=>{r()}),[r]);const Z=(0,a.I4)((e=>{i({hash:e})}),[i]),P=(0,a.I4)((()=>{h(),l()}),[h,l]),g=(0,a.Ye)((()=>s.find((e=>e.isCurrent))),[s]),v=(0,a.Ye)((()=>s.filter((e=>!e.isCurrent))),[s]),p=(0,u.Z)();return(0,m.ZP)(e,n,t,o.MT.PrivacyActiveSessions),a.ZP.createElement("div",{className:"settings-content custom-scroll"},g&&(C=g,a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header mb-4",dir:p.isRtl?"rtl":void 0},p("AuthSessions.CurrentSession")),a.ZP.createElement(Te.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"},C.appName),a.ZP.createElement("span",{className:"subtitle black tight"},ma(C)),a.ZP.createElement("span",{className:"subtitle"},C.ip," - ",da(C)))),a.ZP.createElement(Te.Z,{className:"destructive mb-0 no-icon",icon:"stop",ripple:!0,narrow:!0,onClick:d},p("TerminateAllSessions")))),v&&(E=v,a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header mb-4",dir:p.isRtl?"rtl":void 0},p("OtherSessions")),E.map((function(e){return a.ZP.createElement(Te.Z,{key:e.hash,ripple:!0,narrow:!0,contextActions:[{title:"Terminate",icon:"stop",handler:()=>{Z(e.hash)}}],className:"no-icon"},a.ZP.createElement("div",{className:"multiline-menu-item full-size",dir:"auto"},a.ZP.createElement("span",{className:"date"},(0,K.VX)(p,1e3*e.dateActive)),a.ZP.createElement("span",{className:"title"},e.appName),a.ZP.createElement("span",{className:"subtitle black tight"},ma(e)),a.ZP.createElement("span",{className:"subtitle"},e.ip," - ",da(e))))})))),v&&a.ZP.createElement(Ge.Z,{isOpen:c,onClose:h,text:"Are you sure you want to terminate all other sessions?",confirmLabel:"Terminate All Other Sessions",confirmHandler:P,confirmIsDestructive:!0}));var E,C})));var ha=n(6272);const Za=(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,b.ei)(t,["loadContactList","setUserSearchQuery","blockContact"])))((({usersById:e,blockedIds:t,contactIds:n,localContactIds:s,currentUserId:r,isOpen:o,onClose:i,loadContactList:l,setUserSearchQuery:c,blockContact:d})=>{const m=(0,u.Z)(),[h,Z]=(0,a.eJ)(""),P=(0,a.sO)(null);(0,a.d4)((()=>{c({query:h})}),[h,c]);const v=(0,a.Ye)((()=>{const a=(0,b.Tw)([...n||[],...s||[]].filter((e=>e!==r&&!t.includes(e))));return(0,g.kK)(a,e,h).sort(((t,n)=>{const a=(0,g.Js)(e[t])||"",s=(0,g.Js)(e[n])||"";return a.localeCompare(s)}))}),[t,n,r,h,s,e]),p=(0,a.I4)((t=>{const{id:n,accessHash:a}=e[t]||{};n&&a&&(d({contactId:n,accessHash:a}),i())}),[d,i,e]);return a.ZP.createElement(Le,{isOpen:o,chatOrUserIds:v,filterRef:P,filterPlaceholder:m("BlockedUsers.BlockUser"),filter:h,onFilterChange:Z,loadMore:l,onSelectChatOrUser:p,onClose:i})}))),Pa=(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,b.ei)(t,["unblockContact"])))((({isActive:e,onScreenSelect:t,onReset:n,chatsByIds:s,usersByIds:r,blockedIds:l,phoneCodeList:c,unblockContact:d})=>{const h=(0,u.Z)(),[Z,P,v]=(0,Xe.Z)(),p=(0,a.I4)((e=>{d({contactId:e})}),[d]);return(0,m.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:h.isRtl?"rtl":void 0},h("BlockedUsersInfo"))),a.ZP.createElement("div",{className:"chat-list custom-scroll"},null!=l&&l.length?a.ZP.createElement("div",{className:"scroll-container"},l.map(((e,t)=>function(e,t,n){const o=(0,g.YC)(e),l=o?r[e]:void 0,d=o?void 0:s[e],m=(0,X.Z)("Chat chat-item-clickable blocked-list-item small-icon",o?"private":"group");return a.ZP.createElement(Te.Z,{key:e,className:m,ripple:!0,narrow:!0,contextActions:[{title:"Unblock",icon:"unlock",handler:()=>{p(e)}}],style:`top: ${(0+t)*i.rS}px;`},a.ZP.createElement(ge.Z,{size:"medium",user:l,chat:d}),a.ZP.createElement("div",{className:"contact-info",dir:"auto"},a.ZP.createElement("h3",{dir:"auto"},(0,Pe.Z)((o?(0,g.Js)(l):(0,g.U)(h,d))||"")),(null==l?void 0:l.phoneNumber)&&a.ZP.createElement("div",{className:"contact-phone",dir:"auto"},(0,ha.WZ)(c,l.phoneNumber)),l&&!l.phoneNumber&&l.username&&a.ZP.createElement("div",{className:"contact-username",dir:"auto"},"@",l.username)))}(e,t)))):l&&!l.length?a.ZP.createElement("div",{className:"no-results",dir:"auto"},h("NoBlocked")):a.ZP.createElement(we.Z,{key:"loading"}))),a.ZP.createElement(tn.Z,{isShown:!0,onClick:P,ariaLabel:h("BlockContact")},a.ZP.createElement("i",{className:"icon-add"})),a.ZP.createElement(Za,{isOpen:Z,onClose:v}))})));var ga=n(7854);const va=(0,a.X$)((0,s.c$)((e=>({animatedEmoji:(0,v.zB)(e,"🔐")})))((({isActive:e,onReset:t,animatedEmoji:n,onScreenSelect:s})=>{const r=(0,u.Z)();return(0,m.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(ga.Z,{sticker:n,size:"large"}),a.ZP.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},(0,Pe.Z)(r("EnabledPasswordText"),["br"]))),a.ZP.createElement("div",{className:"settings-item pt-0 no-border"},a.ZP.createElement(Te.Z,{icon:"edit",onClick:()=>s(o.MT.TwoFaChangePasswordCurrent)},r("ChangePassword")),a.ZP.createElement(Te.Z,{icon:"password-off",onClick:()=>s(o.MT.TwoFaTurnOff)},r("TurnPasswordOff")),a.ZP.createElement(Te.Z,{icon:"email",onClick:()=>s(o.MT.TwoFaRecoveryEmailCurrentPassword)},r("SetRecoveryEmail"))))})));var pa=n(3490),Ea=n(9364);const Ca=(0,a.X$)((({screen:e,isActive:t,onScreenSelect:n,onReset:s,error:r,isLoading:o,expectedPassword:i,placeholder:l="Current Password",hint:c,submitLabel:d,clearError:h,onSubmit:Z})=>{const[P,g]=(0,a.eJ)(""),[v,p]=(0,a.eJ)(!1),E=(0,a.I4)((e=>{i&&e!==i?g("Passwords Should Be Equal"):Z(e)}),[Z,i]),C=(0,a.I4)((()=>{h&&h(),g("")}),[h]),f=(0,u.Z)();return(0,m.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(pa.Z,{isBig:!0,isPasswordVisible:v})),a.ZP.createElement("div",{className:"settings-item pt-0 no-border"},a.ZP.createElement(Ea.Z,{error:P||r,hint:c,placeholder:l,submitLabel:d||f("Next"),clearError:C,isLoading:o,isPasswordVisible:v,onChangePasswordVisibility:p,onSubmit:E})))})),fa=(0,a.X$)((0,s.c$)((e=>({animatedEmoji:(0,v.zB)(e,"🔐")})))((({isActive:e,onScreenSelect:t,onReset:n,animatedEmoji:s,onStart:r})=>{const i=(0,u.Z)();return(0,m.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(ga.Z,{sticker:s,size:"large"}),a.ZP.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},i("SetAdditionalPasswordInfo"))),a.ZP.createElement("div",{className:"settings-item pt-0 no-border"},a.ZP.createElement(F.Z,{onClick:r},i("EditAdminTransferSetPassword"))))}))),ba=f.wB?550:400,Ia=(0,a.X$)((0,s.c$)(((e,{icon:t})=>({animatedEmoji:(0,v.zB)(e,"email"===t?"💌":"💡")})))((({animatedEmoji:e,type:t="text",isLoading:n,error:s,placeholder:r,shouldConfirm:o,clearError:i,onSubmit:l,isActive:c,onScreenSelect:d,onReset:h,screen:Z})=>{const P=(0,a.sO)(null),[g,v]=(0,a.eJ)(""),[p,E,C]=(0,Xe.Z)(!1);(0,a.d4)((()=>{f.$b||setTimeout((()=>{P.current.focus()}),ba)}),[]);const b=(0,u.Z)();return(0,m.ZP)(c,h,d,Z),a.ZP.createElement("div",{className:"settings-content two-fa custom-scroll"},a.ZP.createElement("div",{className:"settings-content-header"},a.ZP.createElement(ga.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(),P.current&&l(g)}},a.ZP.createElement(Ne.Z,{ref:P,value:g,inputMode:t,label:r,error:s,onChange:e=>{s&&i&&i(),v(e.target.value)}}),g?a.ZP.createElement(F.Z,{type:"submit",isLoading:n,ripple:!0},b("Continue")):a.ZP.createElement(F.Z,{isText:!0,isLoading:n,ripple:!0,onClick:o?E:()=>{l()}},b("YourEmailSkip"))),o&&a.ZP.createElement(ke.Z,{className:"narrow",isOpen:p,title:b("YourEmailSkipWarning"),onClose:C},(0,Pe.Z)(b("YourEmailSkipWarningText"),["br","simple_markdown"]),a.ZP.createElement("div",{className:"dialog-buttons"},a.ZP.createElement(F.Z,{color:"danger",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:()=>{C(),l()}},b("YourEmailSkip")),a.ZP.createElement(F.Z,{color:"primary",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:C},b("Cancel"))))))}))),ya=(0,a.X$)((0,s.c$)((e=>({animatedEmoji:(0,v.zB)(e,"🥳")})))((({isActive:e,onReset:t,animatedEmoji:n,onScreenSelect:s})=>{const r=(0,u.Z)();return(0,m.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(ga.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(F.Z,{onClick:()=>{s(o.MT.Privacy)}},r("TwoStepVerificationPasswordReturnSettings"))))}))),Sa=f.wB?550:400,wa=(0,a.X$)((0,s.c$)((e=>({animatedEmoji:(0,v.zB)(e,"💌"),codeLength:e.twoFaSettings.waitingEmailCodeLength})))((({animatedEmoji:e,codeLength:t,isLoading:n,error:s,clearError:r,onSubmit:o,isActive:i,onScreenSelect:l,onReset:c,screen:d})=>{const h=(0,a.sO)(null),[Z,P]=(0,a.eJ)("");(0,a.d4)((()=>{f.$b||setTimeout((()=>{h.current.focus()}),Sa)}),[]);const g=(0,u.Z)();return(0,m.ZP)(i,c,l,d),a.ZP.createElement("div",{className:"settings-content two-fa custom-scroll"},a.ZP.createElement("div",{className:"settings-content-header"},a.ZP.createElement(ga.Z,{sticker:e,size:"large"})),a.ZP.createElement("div",{className:"settings-item pt-0 no-border"},a.ZP.createElement(Ne.Z,{value:Z,ref:h,inputMode:"decimal",label:g("YourEmailCode"),error:s,onChange:e=>{s&&r&&r();const n=e.target.value.slice(0,t);n.length===t&&o(n),P(n),e.target.value=n}}),n&&a.ZP.createElement(we.Z,null)))}))),ka=(0,a.X$)((0,s.c$)((e=>({...e.twoFaSettings})),((e,t)=>(0,b.ei)(t,["updatePassword","updateRecoveryEmail","clearPassword","provideTwoFaEmailCode","checkPassword","clearTwoFaError"])))((({currentScreen:e,shownScreen:t,state:n,hint:s,isLoading:r,error:i,waitingEmailCodeLength:l,dispatch:c,isActive:d,onScreenSelect:m,onReset:h,updatePassword:Z,checkPassword:P,clearTwoFaError:g,updateRecoveryEmail:v,provideTwoFaEmailCode:p,clearPassword:E})=>{(0,a.d4)((()=>{l&&(e===o.MT.TwoFaNewPasswordEmail?m(o.MT.TwoFaNewPasswordEmailCode):e===o.MT.TwoFaRecoveryEmail&&m(o.MT.TwoFaRecoveryEmailCode))}),[e,m,l]);const C=(0,a.I4)((()=>{c({type:"reset"}),m(o.MT.TwoFaNewPassword)}),[c,m]),f=(0,a.I4)((e=>{c({type:"setPassword",payload:e}),m(o.MT.TwoFaNewPasswordConfirm)}),[c,m]),b=(0,a.I4)((()=>{m(o.MT.TwoFaNewPasswordHint)}),[m]),I=(0,a.I4)((e=>{c({type:"setHint",payload:e}),m(o.MT.TwoFaNewPasswordEmail)}),[c,m]),y=(0,a.I4)((e=>{c({type:"setEmail",payload:e}),Z({...n,email:e,onSuccess:()=>{m(o.MT.TwoFaCongratulations)}})}),[c,m,n,Z]),S=(0,a.I4)((e=>{c({type:"setCurrentPassword",payload:e}),P({currentPassword:e,onSuccess:()=>{m(o.MT.TwoFaChangePasswordNew)}})}),[P,c,m]),w=(0,a.I4)((e=>{c({type:"setPassword",payload:e}),m(o.MT.TwoFaChangePasswordConfirm)}),[c,m]),k=(0,a.I4)((()=>{m(o.MT.TwoFaChangePasswordHint)}),[m]),N=(0,a.I4)((e=>{c({type:"setHint",payload:e}),Z({...n,hint:e,onSuccess:()=>{m(o.MT.TwoFaCongratulations)}})}),[c,m,n,Z]),M=(0,a.I4)((e=>{E({currentPassword:e,onSuccess:()=>{m(o.MT.Privacy)}})}),[E,m]),T=(0,a.I4)((e=>{c({type:"setCurrentPassword",payload:e}),P({currentPassword:e,onSuccess:()=>{m(o.MT.TwoFaRecoveryEmail)}})}),[P,c,m]),F=(0,a.I4)((e=>{c({type:"setEmail",payload:e}),v({...n,email:e,onSuccess:()=>{m(o.MT.TwoFaCongratulations)}})}),[c,m,n,v]),A=(0,a.I4)((e=>{p({code:e})}),[p]),L=(0,u.Z)();switch(e){case o.MT.TwoFaDisabled:return a.ZP.createElement(fa,{onStart:C,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:h});case o.MT.TwoFaNewPassword:return a.ZP.createElement(Ca,{screen:e,placeholder:L("PleaseEnterPassword"),submitLabel:L("Continue"),onSubmit:f,onScreenSelect:m,isActive:d||[o.MT.TwoFaNewPasswordConfirm,o.MT.TwoFaNewPasswordHint,o.MT.TwoFaNewPasswordEmail,o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:h});case o.MT.TwoFaNewPasswordConfirm:return a.ZP.createElement(Ca,{screen:e,expectedPassword:n.password,placeholder:L("PleaseReEnterPassword"),submitLabel:L("Continue"),onSubmit:b,onScreenSelect:m,isActive:d||[o.MT.TwoFaNewPasswordHint,o.MT.TwoFaNewPasswordEmail,o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:h});case o.MT.TwoFaNewPasswordHint:return a.ZP.createElement(Ia,{icon:"hint",placeholder:L("PasswordHintPlaceholder"),onSubmit:I,screen:e,onScreenSelect:m,isActive:d||[o.MT.TwoFaNewPasswordEmail,o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:h});case o.MT.TwoFaNewPasswordEmail:return a.ZP.createElement(Ia,{icon:"email",type:"email",isLoading:r,error:i,clearError:g,placeholder:L("RecoveryEmailTitle"),shouldConfirm:!0,onSubmit:y,screen:e,onScreenSelect:m,isActive:d||[o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:h});case o.MT.TwoFaNewPasswordEmailCode:return a.ZP.createElement(wa,{isLoading:r,error:i,clearError:g,onSubmit:A,screen:e,onScreenSelect:m,isActive:d||t===o.MT.TwoFaCongratulations,onReset:h});case o.MT.TwoFaCongratulations:return a.ZP.createElement(ya,{onScreenSelect:m,isActive:d,onReset:h});case o.MT.TwoFaEnabled:return a.ZP.createElement(va,{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:h});case o.MT.TwoFaChangePasswordCurrent:return a.ZP.createElement(Ca,{screen:e,isLoading:r,error:i,clearError:g,hint:s,onSubmit:S,onScreenSelect:m,isActive:d||[o.MT.TwoFaChangePasswordNew,o.MT.TwoFaChangePasswordConfirm,o.MT.TwoFaChangePasswordHint,o.MT.TwoFaCongratulations].includes(t),onReset:h});case o.MT.TwoFaChangePasswordNew:return a.ZP.createElement(Ca,{screen:e,placeholder:L("PleaseEnterNewFirstPassword"),onSubmit:w,onScreenSelect:m,isActive:d||[o.MT.TwoFaChangePasswordConfirm,o.MT.TwoFaChangePasswordHint,o.MT.TwoFaCongratulations].includes(t),onReset:h});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:h});case o.MT.TwoFaChangePasswordHint:return a.ZP.createElement(Ia,{isLoading:r,error:i,clearError:g,icon:"hint",placeholder:L("PasswordHintPlaceholder"),onSubmit:N,onScreenSelect:m,isActive:d||t===o.MT.TwoFaCongratulations,onReset:h,screen:e});case o.MT.TwoFaTurnOff:return a.ZP.createElement(Ca,{isLoading:r,error:i,clearError:g,hint:s,onSubmit:M,onScreenSelect:m,isActive:d,onReset:h,screen:e});case o.MT.TwoFaRecoveryEmailCurrentPassword:return a.ZP.createElement(Ca,{screen:e,isLoading:r,error:i,clearError:g,hint:s,onSubmit:T,onScreenSelect:m,isActive:d||[o.MT.TwoFaRecoveryEmail,o.MT.TwoFaRecoveryEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:h});case o.MT.TwoFaRecoveryEmail:return a.ZP.createElement(Ia,{screen:e,icon:"email",type:"email",placeholder:L("RecoveryEmailTitle"),onSubmit:F,onScreenSelect:m,isActive:d||[o.MT.TwoFaRecoveryEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:h});case o.MT.TwoFaRecoveryEmailCode:return a.ZP.createElement(wa,{screen:e,isLoading:r,error:i,clearError:g,onSubmit:A,onScreenSelect:m,isActive:d||t===o.MT.TwoFaCongratulations,onReset:h});default:return}})));var Na=n(1820);function Ma(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 Ta=(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:Ma(e,t)}}),((e,t)=>(0,b.ei)(t,["setPrivacySettings"])))((({currentUserId:e,isAllowList:t,screen:n,settings:s,chatsById:r,listIds:i,orderedPinnedIds:l,archivedListIds:c,archivedPinnedIds:d,setPrivacySettings:h,isActive:Z,onScreenSelect:P,onReset:v})=>{const p=(0,u.Z)(),E=(0,a.Ye)((()=>s?t?[...s.allowUserIds,...s.allowChatIds]:[...s.blockUserIds,...s.blockChatIds]:[]),[t,s]),[C,f]=(0,a.eJ)(""),[b,I]=(0,a.eJ)(!1),[y,S]=(0,a.eJ)(E),w=(0,a.Ye)((()=>{const e=i?(0,g.O)(r,i,l,"all"):void 0,t=c?(0,g.O)(r,c,d,"archived"):void 0;if(e||t)return[...e?[...e.pinnedChats,...e.otherChats]:[],...t?t.otherChats:[]]}),[r,i,l,c,d]),k=(0,a.Ye)((()=>{if(w)return w.filter((t=>((0,g.YC)(t.id)&&t.id!==e||(0,g.Bf)(t))&&(!C||(0,yn.Z)((0,g.U)(p,t),C)||E.includes(t.id)))).map((({id:e})=>e))}),[w,e,p,C,E]),N=(0,a.I4)((e=>{S(e),I(!0)}),[]),M=(0,a.I4)((()=>{h({privacyKey:la(n),isAllowList:Boolean(t),contactsIds:y}),P(o.MT.Privacy)}),[t,y,P,n,h]);return(0,m.ZP)(Z,v,P,n),a.ZP.createElement("div",{className:"NewChat-inner step-1"},a.ZP.createElement(Na.Z,{itemIds:k||[],selectedIds:y,filterValue:C,filterPlaceholder:p(t?"AlwaysShareWithPlaceholder":"NeverShareWithPlaceholder"),searchInputId:"new-group-picker-search",onSelectedIdsChange:N,onFilterChange:f}),a.ZP.createElement(tn.Z,{isShown:b,onClick:M,ariaLabel:p(t?"AlwaysShareWithTitle":"NeverShareWithTitle")},a.ZP.createElement("i",{className:"icon-arrow-right"})))}))),Fa=Object.keys(o.MT).length/2,Aa=[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],La=[o.MT.Folders,o.MT.FoldersCreateFolder,o.MT.FoldersEditFolder,o.MT.FoldersEditFolderFromChatList,o.MT.FoldersIncludedChats,o.MT.FoldersIncludedChatsFromChatList,o.MT.FoldersExcludedChats,o.MT.FoldersExcludedChatsFromChatList],Ra=[o.MT.PrivacyBlockedUsers,o.MT.PrivacyActiveSessions],Ba=[o.MT.PrivacyPhoneNumberAllowedContacts,o.MT.PrivacyPhoneNumberDeniedContacts],$a=[o.MT.PrivacyLastSeenAllowedContacts,o.MT.PrivacyLastSeenDeniedContacts],Da=[o.MT.PrivacyProfilePhotoAllowedContacts,o.MT.PrivacyProfilePhotoDeniedContacts],xa=[o.MT.PrivacyForwardingAllowedContacts,o.MT.PrivacyForwardingDeniedContacts],Ua=[o.MT.PrivacyGroupChatsAllowedContacts,o.MT.PrivacyGroupChatsDeniedContacts],Oa=(0,a.X$)((({isActive:e,currentScreen:t,foldersState:n,foldersDispatch:s,onScreenSelect:r,onReset:i,shouldSkipTransition:l})=>{const[c,d]=(0,Ht.Z)(jt,Yt),m=(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?i():"create"===n.mode?r(o.MT.FoldersCreateFolder):r(o.MT.FoldersEditFolder)}),[n.mode,s,t,i,r]),u=(0,a.I4)((()=>{s({type:"saveFilters"}),m()}),[s,m]);function h(i,l,h){return a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(Kt,{currentScreen:t,onReset:m,onSaveFilter:u,onScreenSelect:r,editedFolderId:n.folderId}),function(i,l){const u={[o.MT.PrivacyPhoneNumber]:Ba.includes(l),[o.MT.PrivacyLastSeen]:$a.includes(l),[o.MT.PrivacyProfilePhoto]:Da.includes(l),[o.MT.PrivacyForwarding]:xa.includes(l),[o.MT.PrivacyGroupChats]:Ua.includes(l)},h=Aa.includes(l),Z=La.includes(l),P=Ra.includes(l)||h||Object.keys(u).includes(l.toString())||Object.values(u).find((e=>!0===e));switch(t){case o.MT.Main:return a.ZP.createElement(Qt,{onScreenSelect:r,isActive:e,onReset:m});case o.MT.EditProfile:return a.ZP.createElement(mn,{onScreenSelect:r,isActive:e&&i,onReset:m});case o.MT.General:return a.ZP.createElement(Un,{onScreenSelect:r,isActive:i||l===o.MT.GeneralChatBackgroundColor||l===o.MT.GeneralChatBackground||P||Z,onReset:m});case o.MT.Notifications:return a.ZP.createElement(ra,{onScreenSelect:r,isActive:i,onReset:m});case o.MT.DataStorage:return a.ZP.createElement(Zn,{onScreenSelect:r,isActive:i,onReset:m});case o.MT.Privacy:return a.ZP.createElement(oa,{onScreenSelect:r,isActive:i||P||h,onReset:m});case o.MT.Language:return a.ZP.createElement(ia,{onScreenSelect:r,isActive:i,onReset:m});case o.MT.GeneralChatBackground:return a.ZP.createElement(Wn,{onScreenSelect:r,isActive:i||l===o.MT.GeneralChatBackgroundColor,onReset:m});case o.MT.GeneralChatBackgroundColor:return a.ZP.createElement(aa,{onScreenSelect:r,isActive:i,onReset:m});case o.MT.PrivacyActiveSessions:return a.ZP.createElement(ua,{onScreenSelect:r,isActive:i,onReset:m});case o.MT.PrivacyBlockedUsers:return a.ZP.createElement(Pa,{onScreenSelect:r,isActive:i,onReset:m});case o.MT.PrivacyPhoneNumber:case o.MT.PrivacyLastSeen:case o.MT.PrivacyProfilePhoto:case o.MT.PrivacyForwarding:case o.MT.PrivacyGroupChats:return a.ZP.createElement(ca,{screen:t,onScreenSelect:r,isActive:i||u[t],onReset:m});case o.MT.PrivacyPhoneNumberAllowedContacts:case o.MT.PrivacyLastSeenAllowedContacts:case o.MT.PrivacyProfilePhotoAllowedContacts:case o.MT.PrivacyForwardingAllowedContacts:case o.MT.PrivacyGroupChatsAllowedContacts:return a.ZP.createElement(Ta,{isAllowList:!0,screen:t,onScreenSelect:r,isActive:i||u[t],onReset:m});case o.MT.PrivacyPhoneNumberDeniedContacts:case o.MT.PrivacyLastSeenDeniedContacts:case o.MT.PrivacyProfilePhotoDeniedContacts:case o.MT.PrivacyForwardingDeniedContacts:case o.MT.PrivacyGroupChatsDeniedContacts:return a.ZP.createElement(Ta,{screen:t,onScreenSelect:r,isActive:i,onReset:m});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(kn,{currentScreen:t,shownScreen:l,state:n,dispatch:s,isActive:i,onScreenSelect:r,onReset:m});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(ka,{currentScreen:t,state:c,dispatch:d,shownScreen:l,isActive:i,onScreenSelect:r,onReset:m});default:return}}(i,h))}return a.ZP.createElement(L.Z,{id:"Settings",name:l?"none":f.s0,activeKey:t,renderCount:Fa},h)})),Ga=(0,G.P2)((e=>e()),6e4,!0),za=(0,a.X$)((0,s.c$)((e=>{const{userIds:t}=e.contactList||{},{byId:n,statusesById:a}=e.users;return{usersById:n,userStatusesById:a,contactIds:t,serverTimeOffset:e.serverTimeOffset}}),((e,t)=>(0,b.ei)(t,["loadContactList","openChat"])))((({isActive:e,filter:t,usersById:n,userStatusesById:s,contactIds:r,serverTimeOffset:o,onReset:i,loadContactList:l,openChat:c})=>{(0,a.d4)((()=>{Ga((()=>{l()}))})),(0,m.ZP)(e,i);const d=(0,a.I4)((e=>{c({id:e,shouldReplaceHistory:!0})}),[c]),u=(0,a.Ye)((()=>{if(!r)return;const e=(0,g.kK)(r,n,t);return(0,g.Z0)(e,n,s,void 0,o)}),[r,t,n,s,o]),[h,Z]=(0,Ie.Z)(void 0,u,Boolean(t));return a.ZP.createElement(Me.Z,{items:h,onLoadMore:Z,className:"chat-list custom-scroll"},null!=h&&h.length?h.map((e=>a.ZP.createElement(Te.Z,{key:e,className:"chat-item-clickable",onClick:()=>d(e),ripple:!f.wB},a.ZP.createElement(Ae.Z,{userId:e,forceShowSelf:!0,avatarSize:"large"})))):h&&!h.length?a.ZP.createElement("p",{className:"no-results",key:"no-results",dir:"auto"},t.length?"No contacts matched your search.":"Contact list is empty."):a.ZP.createElement(we.Z,{key:"loading"}))}))),Xa=(0,G.P2)((e=>e()),6e4,!0),Ja=(0,a.X$)((0,s.c$)((e=>{const{userIds:t}=e.contactList||{},{byId:n}=e.chats,{query:a,fetchingStatus:s,globalResults:r,localResults:o}=e.globalSearch,{userIds:i}=r||{},{userIds:l}=o||{};return{chatsById:n,localContactIds:t,searchQuery:a,isSearching:null==s?void 0:s.chats,globalUserIds:i,localUserIds:l}}),((e,t)=>(0,b.ei)(t,["loadContactList","setGlobalSearchQuery"])))((({isChannel:e,isActive:t,selectedMemberIds:n,onSelectedMemberIdsChange:r,onNextStep:o,onReset:i,chatsById:l,localContactIds:c,searchQuery:d,isSearching:h,localUserIds:Z,globalUserIds:P,loadContactList:v,setGlobalSearchQuery:p})=>{(0,a.d4)((()=>{Xa((()=>{v()}))}));const E=(0,u.Z)();(0,m.ZP)(t,i);const C=(0,a.I4)((e=>{p({query:e})}),[p]),f=(0,a.Ye)((()=>{const e=(0,s.Rd)().users.byId,t=c?(0,g.kK)(c,e,d):[];return(0,g.ih)((0,b.Tw)([...t,...Z||[],...P||[]]).filter((t=>{const n=e[t];return!n||n.canBeInvitedToGroup&&!n.isSelf&&!(0,g.cS)(n)})),l,!1,n)}),[c,l,d,Z,P,n]),I=(0,a.I4)((()=>{(n.length||e)&&(p({query:""}),o())}),[n.length,e,p,o]);return a.ZP.createElement("div",{className:"NewChat step-1"},a.ZP.createElement("div",{className:"left-header"},a.ZP.createElement(F.Z,{round:!0,size:"smaller",color:"translucent",onClick:i,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(Na.Z,{itemIds:f,selectedIds:n,filterValue:d,filterPlaceholder:E("SendMessageTo"),searchInputId:"new-group-picker-search",isLoading:h,onSelectedIdsChange:r,onFilterChange:C}),a.ZP.createElement(tn.Z,{isShown:Boolean(n.length||e),onClick:I,ariaLabel:e?"Continue To Channel Info":"Continue To Group Info"},a.ZP.createElement("i",{className:"icon-arrow-right"}))))}))),_a=(0,a.X$)((0,s.c$)((e=>{const{progress:t,error:n}=e.chatCreation||{};return{creationProgress:t,creationError:n}}),((e,t)=>(0,b.ei)(t,["createGroupChat","createChannel"])))((({isChannel:e,isActive:t,memberIds:n,onReset:s,creationProgress:r,creationError:i,createGroupChat:l,createChannel:c})=>{const d=(0,u.Z)();(0,m.ZP)(t,s);const[h,Z]=(0,a.eJ)(""),[P,g]=(0,a.eJ)(""),[v,p]=(0,a.eJ)(),[E,C]=(0,a.eJ)(),f="Chat title can't be empty",b="Channel title can't be empty",I="Sorry, creating supergroups is not yet supported",y=r===o.Nh.InProgress,S=(0,a.I4)((e=>{const{value:t}=e.currentTarget,n=t.replace(/^\s+/,"");Z(n),n!==t&&(e.currentTarget.value=n)}),[]),w=(0,a.I4)((e=>{g(e.currentTarget.value)}),[]),k=(0,a.I4)((()=>{h.length?n.length>199?C(I):l({title:h,photo:v,memberIds:n}):C(f)}),[h,n,l,v,f,I]),N=(0,a.I4)((()=>{h.length?c({title:h,about:P,photo:v,memberIds:n}):C(b)}),[h,c,P,v,n,b]);(0,a.d4)((()=>{r===o.Nh.Complete&&s(!0)}),[r,s]);const M=i&&d(i)||(E!==f&&E!==b?E:void 0);return a.ZP.createElement("div",{className:"NewChat"},a.ZP.createElement("div",{className:"left-header"},a.ZP.createElement(F.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(en.Z,{onChange:p,title:d("AddPhoto")}),a.ZP.createElement(Ne.Z,{value:h,onChange:S,label:d(e?"EnterChannelName":"GroupName"),error:E===f||E===b?E:void 0}),e&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(Ne.Z,{value:P,onChange:w,label:d("DescriptionOptionalPlaceholder")}),a.ZP.createElement("p",{className:"note"},d("DescriptionInfo"))),M&&a.ZP.createElement("p",{className:"error"},M),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(Te.Z,{inactive:!0,className:"chat-item-clickable"},a.ZP.createElement(Ae.Z,{userId:e}))))))),a.ZP.createElement(tn.Z,{isShown:0!==h.length,onClick:e?N:k,disabled:y,ariaLabel:e?d("ChannelIntro.CreateChannel"):"Create Group"},y?a.ZP.createElement(z.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-arrow-right"})))}))),Va=Object.keys(o.du).length/2,Ha=(0,a.X$)((({isActive:e,isChannel:t=!1,content:n,onContentChange:s,onReset:r})=>{const[i,l]=(0,a.eJ)([]),c=(0,a.I4)((()=>{s(t?o.du.NewChannelStep2:o.du.NewGroupStep2)}),[t,s]);return a.ZP.createElement(L.Z,{id:"NewChat",name:f.s0,renderCount:Va,activeKey:n},(s=>{switch(n){case o.du.NewChannelStep1:case o.du.NewGroupStep1:return a.ZP.createElement(Ja,{isChannel:t,isActive:e,selectedMemberIds:i,onSelectedMemberIdsChange:l,onNextStep:c,onReset:r});case o.du.NewChannelStep2:case o.du.NewGroupStep2:return a.ZP.createElement(_a,{isChannel:t,isActive:s&&e,memberIds:i,onReset:r});default:return}}))}));var Ya=n(1080);const ja=(0,a.X$)((({isActive:e,onReset:t,onContentChange:n})=>{const s=(0,u.Z)();return(0,m.ZP)(e,t,n,o.du.Archived),a.ZP.createElement("div",{className:"ArchivedChats"},a.ZP.createElement("div",{className:"left-header"},a.ZP.createElement(F.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(Ya.Z,{folderType:"archived",isActive:e}))}));var Ka=n(1218);const qa=(0,a.X$)((0,s.c$)((e=>{const{byId:t,orderedIds:n}=e.chatFolders;return{foldersById:t,folderOrderedIds:n}}),((e,t)=>(0,b.ei)(t,["editChatFolders"])))((({isOpen:e,chatId:t,foldersById:n,folderOrderedIds:s,onClose:r,onCloseAnimationEnd:o,editChatFolders:i})=>{const l=(0,u.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),h=(0,a.Ye)((()=>(null==s?void 0:s.map((e=>({label:n?n[e].title:"",value:String(e)}))))||[]),[s,n]),Z=(0,a.I4)((()=>{const e=c.filter((e=>!d.includes(e))).map(Number),n=d.filter((e=>!c.includes(e))).map(Number);i({chatId:t,idsToRemove:e,idsToAdd:n}),r()}),[t,i,c,r,d]);if(n&&s)return a.ZP.createElement(ke.Z,{isOpen:e,onClose:r,onCloseAnimationEnd:o,onEnter:Z,className:"delete",title:l("FilterAddTo")},a.ZP.createElement(Ka.Z,{options:h,selected:d,onChange:m,round:!0}),a.ZP.createElement(F.Z,{color:"primary",className:"confirm-dialog-button",isText:!0,onClick:Z},l("FilterAddTo")),a.ZP.createElement(F.Z,{className:"confirm-dialog-button",isText:!0,onClick:r},l("Cancel")))})));var Wa=n(4319),Qa=n(647);function es(e){return e?"lng_context_copy_selected":"lng_context_copy_text"}let ts;const ns={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},as=e=>{const t="deltaY"in e?e.deltaY:(e=>"changedTouches"in e?e.changedTouches[0].clientY:0)(e);(!ts||!ts.contains(e.target)||ts.scrollTop<=0&&t<=0||ts.scrollTop>=ts.scrollHeight-ts.offsetHeight&&t>=0)&&e.preventDefault()};function ss(e){ns[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 rs(e){ts=e,document.addEventListener("wheel",as,{passive:!1}),document.addEventListener("touchmove",as,{passive:!1}),document.onkeydown=ss}function os(){ts=void 0,document.removeEventListener("wheel",as),document.removeEventListener("touchmove",as),document.onkeydown=null}var is=n(3394),ls=n(2328);const cs=(0,a.X$)((({isOpen:e,message:t,anchor:n,canSendNow:s,canReschedule:o,canReply:i,canEdit:l,canPin:c,canUnpin:d,canDelete:m,canReport:h,canForward:Z,canFaveSticker:P,canUnfaveSticker:v,canCopy:p,canCopyLink:E,canSelect:C,canDownload:f,isDownloading:b,canShowSeenBy:I,seenByRecentUsers:y,onReply:S,onEdit:w,onPin:k,onUnpin:N,onForward:M,onDelete:T,onReport:F,onFaveSticker:A,onUnfaveSticker:L,onSelect:R,onSend:$,onReschedule:D,onClose:x,onCloseAnimationEnd:U,onCopyLink:O,onDownload:G,onShowSeenBy:z})=>{var X,J;const _=(0,a.sO)(null),V=function(e,t,n){const a=[],s=(0,g.UD)(e),o=(0,g.O$)(e)||((0,g.Cg)(e)?void 0:(0,g.F$)(e)),i=(0,g.Ti)(e,"inline"),l=o&&(i||(0,g.BM)(e))&&Wa.yl,c=window.getSelection();if(l&&a.push({label:"lng_context_copy_image",handler:()=>{Promise.resolve(i?Qa.he(i,r.IU.BlobUrl):o.blobUrl).then(Wa.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:es(e),handler:()=>{const n=e&&c?c.toString():s;(0,Wa.TE)(n),t&&t()}})}return n&&a.push({label:"lng_context_copy_message_link",handler:()=>{n(),t&&t()}}),a}(t,x,E?O:void 0),H=(0,a.I4)((()=>document.querySelector(`.Transition__slide--active > .MessageList div[data-message-id="${t.id}"]`)),[t.id]),Y=(0,a.I4)((()=>document.querySelector(".Transition__slide--active > .MessageList")),[]),j=(0,a.I4)((()=>document.querySelector(".MessageContextMenu .bubble")),[]),{positionX:K,positionY:q,style:W,menuStyle:Q,withScroll:ee}=(0,is.Z)(n,H,Y,j,10,document.querySelector(".MiddleHeader").offsetHeight);(0,a.d4)((()=>(rs(ee?_.current:void 0),os)),[ee]);const te=(0,u.Z)();return a.ZP.createElement(ls.Z,{ref:_,isOpen:e,positionX:K,positionY:q,style:W,menuStyle:Q,className:"MessageContextMenu fluid",onClose:x,onCloseAnimationEnd:U},s&&a.ZP.createElement(B.Z,{icon:"send-outline",onClick:$},te("MessageScheduleSend")),o&&a.ZP.createElement(B.Z,{icon:"schedule",onClick:D},te("MessageScheduleEditTime")),i&&a.ZP.createElement(B.Z,{icon:"reply",onClick:S},te("Reply")),l&&a.ZP.createElement(B.Z,{icon:"edit",onClick:w},te("Edit")),P&&a.ZP.createElement(B.Z,{icon:"favorite",onClick:A},te("AddToFavorites")),v&&a.ZP.createElement(B.Z,{icon:"favorite",onClick:L},te("Stickers.RemoveFromFavorites")),p&&V.map((e=>a.ZP.createElement(B.Z,{key:e.label,icon:"copy",onClick:e.handler},te(e.label)))),c&&a.ZP.createElement(B.Z,{icon:"pin",onClick:k},te("DialogPin")),d&&a.ZP.createElement(B.Z,{icon:"unpin",onClick:N},te("DialogUnpin")),f&&a.ZP.createElement(B.Z,{icon:"download",onClick:G},te(b?"lng_context_cancel_download":"lng_media_download")),Z&&a.ZP.createElement(B.Z,{icon:"forward",onClick:M},te("Forward")),C&&a.ZP.createElement(B.Z,{icon:"select",onClick:R},te("Common.Select")),h&&a.ZP.createElement(B.Z,{icon:"flag",onClick:F},te("lng_context_report_msg")),I&&a.ZP.createElement(B.Z,{icon:"group",onClick:z,disabled:!(null!==(X=t.seenByUserIds)&&void 0!==X&&X.length)},null!==(J=t.seenByUserIds)&&void 0!==J&&J.length?te("Conversation.ContextMenuSeen",t.seenByUserIds.length,"i"):te("Conversation.ContextMenuNoViews"),a.ZP.createElement("div",{className:"avatars"},null==y?void 0:y.map((e=>a.ZP.createElement(ge.Z,{size:"micro",user:e}))))),m&&a.ZP.createElement(B.Z,{destructive:!0,icon:"delete",onClick:T},te("Delete")))})),ds=(0,a.X$)((0,s.c$)(((e,{message:t,messageListType:n})=>{const{threadId:a}=(0,v.Bt)(e)||{},s=(0,v.xs)(e,t.chatId),r=(0,v.Z1)(e,t.chatId),{noOptions:o,canReply:l,canPin:c,canUnpin:d,canDelete:m,canReport:u,canEdit:h,canForward:Z,canFaveSticker:P,canUnfaveSticker:p,canCopy:E,canCopyLink:C,canSelect:f,canDownload:b}=a&&(0,v._k)(e,t,a)||{},I="pinned"===n,y="scheduled"===n;return{noOptions:o,canSendNow:y,canReschedule:y,canReply:!I&&!y&&l,canPin:!y&&c,canUnpin:!y&&d,canDelete:m,canReport:u,canEdit:!I&&h,canForward:!y&&Z,canFaveSticker:!y&&P,canUnfaveSticker:!y&&p,canCopy:E,canCopyLink:!y&&C,canSelect:f,canDownload:b,activeDownloads:s,canShowSeenBy:Boolean(r&&(0,g.Bf)(r)&&(0,g.B4)(t)&&r.membersCount&&r.membersCountDate.now()/1e3-i.EH)}}),((e,t)=>(0,b.ei)(t,["setReplyingToId","setEditingId","pinMessage","openForwardMenu","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","downloadMessageMedia","cancelMessageMediaDownload","loadSeenBy","openSeenByModal"])))((({isOpen:e,messageListType:t,chatUsername:n,message:r,album:o,anchor:i,onClose:l,onCloseAnimationEnd:c,noOptions:d,canSendNow:m,canReschedule:u,canReply:h,canPin:Z,canUnpin:P,canDelete:g,canReport:v,canEdit:p,canForward:E,canFaveSticker:C,canUnfaveSticker:f,canCopy:b,canCopyLink:I,canSelect:y,canDownload:S,activeDownloads:w,canShowSeenBy:k,setReplyingToId:N,setEditingId:M,pinMessage:T,openForwardMenu:F,faveSticker:A,unfaveSticker:L,toggleMessageSelection:R,sendScheduledMessages:B,rescheduleMessage:$,downloadMessageMedia:D,cancelMessageMediaDownload:x,loadSeenBy:U,openSeenByModal:O})=>{const{transitionClassNames:G}=(0,_.Z)(e,c,void 0,!1),[z,X]=(0,a.eJ)(!0),[J,V]=(0,a.eJ)(!1),[H,Y]=(0,a.eJ)(!1),[j,q]=(0,a.eJ)(!1),[W,Q,ee]=(0,Xe.Z)();(0,a.d4)((()=>{k&&e&&U({chatId:r.chatId,messageId:r.id})}),[U,e,r.chatId,r.id,k]);const te=(0,a.Ye)((()=>{var e;if(!r.seenByUserIds)return;const t=(0,s.Rd)().users.byId;return null===(e=r.seenByUserIds)||void 0===e?void 0:e.slice(0,3).map((e=>t[e])).filter(Boolean)}),[r.seenByUserIds]),ne=o?o.messages.some((e=>w.includes(e.id))):w.includes(r.id),ae=(0,a.I4)((()=>{X(!1),V(!0)}),[]),se=(0,a.I4)((()=>{X(!1),Y(!0)}),[]),re=(0,a.I4)((()=>{X(!1),l()}),[l]),oe=(0,a.I4)((()=>{V(!1),l()}),[l]),ie=(0,a.I4)((()=>{Y(!1),l()}),[l]),le=(0,a.I4)((()=>{q(!1),l()}),[l]),ce=(0,a.I4)((()=>{ee(),l()}),[ee,l]),de=(0,a.I4)((()=>{N({messageId:r.id}),re()}),[N,r.id,re]),me=(0,a.I4)((()=>{M({messageId:r.id}),re()}),[M,r.id,re]),ue=(0,a.I4)((()=>{X(!1),q(!0)}),[]),he=(0,a.I4)((()=>{T({messageId:r.id,isUnpin:!0}),re()}),[T,r.id,re]),Ze=(0,a.I4)((()=>{if(re(),null!=o&&o.messages){const e=o.messages.map((({id:e})=>e));F({fromChatId:r.chatId,messageIds:e})}else F({fromChatId:r.chatId,messageIds:[r.id]})}),[F,r,re,o]),Pe=(0,a.I4)((()=>{re(),A({sticker:r.content.sticker})}),[re,r.content.sticker,A]),ge=(0,a.I4)((()=>{re(),L({sticker:r.content.sticker})}),[re,r.content.sticker,L]),ve=(0,a.I4)((()=>{const e=null!=o&&o.messages?{messageId:r.id,childMessageIds:o.messages.map((({id:e})=>e)),withShift:!1}:{messageId:r.id,withShift:!1};R(e),re()}),[re,r.id,R,o]),pe=(0,a.I4)((()=>{B({chatId:r.chatId,id:r.id}),re()}),[re,r.chatId,r.id,B]),Ee=(0,a.I4)((()=>{X(!1),Q()}),[Q]),Ce=(0,a.I4)((()=>{re(),O({chatId:r.chatId,messageId:r.id})}),[re,r.chatId,r.id,O]),fe=(0,a.I4)((e=>{$({chatId:r.chatId,messageId:r.id,scheduledAt:Math.round(e.getTime()/1e3)})}),[r.chatId,r.id,$]),be=(0,a.I4)((()=>{(0,Wa.TE)(`https://t.me/${n||`c/${r.chatId.replace("-","")}`}/${r.id}`),re()}),[n,re,r.chatId,r.id]),Ie=(0,a.I4)((()=>{((null==o?void 0:o.messages)||[r]).forEach((e=>{ne?x({message:e}):D({message:e})})),re()}),[o,r,re,ne,x,D]),ye=(0,a.Ye)((()=>(o?o.messages:[r]).map((({id:e})=>e))),[o,r]);if(d)return void re();const Se=new Date;return Se.setFullYear(Se.getFullYear()+1),a.ZP.createElement("div",{className:["ContextMenuContainer",G].join(" ")},a.ZP.createElement(cs,{message:r,isOpen:z,anchor:i,canSendNow:m,canReschedule:u,canReply:h,canDelete:g,canReport:v,canPin:Z,canUnpin:P,canEdit:p,canForward:E,canFaveSticker:C,canUnfaveSticker:f,canCopy:b,canCopyLink:I,canSelect:y,canDownload:S,canShowSeenBy:k,isDownloading:ne,seenByRecentUsers:te,onReply:de,onEdit:me,onPin:ue,onUnpin:he,onForward:Ze,onDelete:ae,onReport:se,onFaveSticker:Pe,onUnfaveSticker:ge,onSelect:ve,onSend:pe,onReschedule:Ee,onClose:re,onCopyLink:be,onDownload:Ie,onShowSeenBy:Ce}),a.ZP.createElement(Ke,{isOpen:J,isSchedule:"scheduled"===t,onClose:oe,album:o,message:r}),a.ZP.createElement(nt,{isOpen:H,onClose:ie,messageIds:ye}),a.ZP.createElement(qe,{isOpen:j,messageId:r.id,chatId:r.chatId,onClose:le}),a.ZP.createElement(Ye,{isOpen:W,withTimePicker:!0,selectedAt:1e3*r.date,maxAt:(0,K._F)(Se),isFutureMode:!0,onClose:ce,onSubmit:fe}))}))),ms=(0,a.X$)((0,s.c$)(((e,{fromSticker:t,stickerSetShortName:n})=>{const a=(0,v.Bt)(e),{chatId:s,threadId:r}=a||{},o=s&&(0,v.Z1)(e,s),i=o?(0,g.H5)(o):void 0;return{canSendStickers:Boolean(o&&r&&(0,g.Qm)(o,r)&&(null==i?void 0:i.canSendStickers)),stickerSet:t?(0,v.Ny)(e,t.stickerSetId):n?(0,v.E_)(e,n):void 0}}),((e,t)=>(0,b.ei)(t,["loadStickers","toggleStickerSet","sendMessage"])))((({isOpen:e,fromSticker:t,stickerSetShortName:n,stickerSet:s,canSendStickers:r,onClose:o,loadStickers:l,toggleStickerSet:c,sendMessage:d})=>{const m=(0,a.sO)(null),h=(0,u.Z)(),{observe:Z}=(0,Mn.S1)({rootRef:m,throttleMs:200,isDisabled:!e});(0,a.d4)((()=>{if(e)if(t){const{stickerSetId:e,stickerSetAccessHash:n}=t;l({stickerSetId:e,stickerSetAccessHash:n})}else n&&l({stickerSetShortName:n})}),[e,t,l,n]);const P=(0,a.I4)((e=>{e={...e,isPreloadedGlobally:!0},d({sticker:e}),o()}),[o,d]),g=(0,a.I4)((()=>{s&&(c({stickerSetId:s.id}),o())}),[o,s,c]);return a.ZP.createElement(ke.Z,{className:"StickerSetModal",isOpen:e,onClose:o,hasCloseButton:!0,title:s?(0,Pe.Z)(s.title,["emoji","links"]):h("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(Rn.Z,{sticker:e,size:i.yK,observeIntersection:Z,onClick:r?P:void 0,clickArg:e})))),a.ZP.createElement("div",{className:"button-wrapper"},a.ZP.createElement(F.Z,{size:"smaller",fluid:!0,color:s.installedDate?"danger":"primary",onClick:g},h(s.installedDate?"StickerPack.RemoveStickerCount":"StickerPack.AddStickerCount",s.count,"i")))):a.ZP.createElement(we.Z,null))})));var us=n(2898);const hs=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,v.Z1)(e,t);if(!a||a.isRestricted)return{};const s=(0,g.YC)(a.id),r=s?(0,v.dy)(e,t):void 0,o=r&&(0,g.kw)(r);return{chat:a,isMuted:(0,g.i4)(a,(0,v.dZ)(e),(0,v.NJ)(e)),isPrivate:s,canAddContact:o,canDeleteChat:(0,g.cc)(a),hasLinkedChat:Boolean(null==a||null===(n=a.fullInfo)||void 0===n?void 0:n.linkedChatId)}}),((e,t)=>(0,b.ei)(t,["updateChatMutedState","enterMessageSelectMode","sendBotCommand","restartBot","joinGroupCall","createGroupCall","openLinkedChat","addContact","openCallFallbackConfirm"])))((({chatId:e,isOpen:t,withExtraActions:n,anchor:s,isChannel:r,canStartBot:o,canRestartBot:i,canSubscribe:l,canSearch:c,canCall:d,canMute:m,canLeave:h,canEnterVoiceChat:Z,canCreateVoiceChat:P,chat:g,isPrivate:v,isMuted:p,canDeleteChat:E,hasLinkedChat:C,canAddContact:b,onSubscribeChannel:I,onSearchClick:y,onClose:S,onCloseAnimationEnd:w,updateChatMutedState:k,enterMessageSelectMode:N,sendBotCommand:M,restartBot:T,joinGroupCall:F,createGroupCall:A,openLinkedChat:L,addContact:R,openCallFallbackConfirm:$})=>{const[D,x]=(0,a.eJ)(!0),[U,O]=(0,a.eJ)(!1),{x:G,y:z}=s;(0,_.Z)(t,w,void 0,!1);const X=(0,a.I4)((()=>{x(!1),O(!0)}),[]),J=(0,a.I4)((()=>{x(!1),S()}),[S]),V=(0,a.I4)((()=>{O(!1),S()}),[S]),H=(0,a.I4)((()=>{M({command:"/start"})}),[M]),Y=(0,a.I4)((()=>{T({chatId:e})}),[e,T]),j=(0,a.I4)((()=>{k({chatId:e,isMuted:!p}),J()}),[e,J,p,k]),K=(0,a.I4)((()=>{P?A({chatId:e}):F({chatId:e}),J()}),[J,P,e,F,A]),q=(0,a.I4)((()=>{L({id:e}),J()}),[e,J,L]),W=(0,a.I4)((()=>{R({userId:e}),J()}),[R,e,J]),Q=(0,a.I4)((()=>{I(),J()}),[J,I]),ee=(0,a.I4)((()=>{$(),J()}),[J,$]),te=(0,a.I4)((()=>{y(),J()}),[J,y]),ne=(0,a.I4)((()=>{N(),J()}),[J,N]);(0,a.d4)((()=>(rs(),os)),[]);const ae=(0,u.Z)();return a.ZP.createElement(us.Z,null,a.ZP.createElement("div",{className:"HeaderMenuContainer"},a.ZP.createElement(ls.Z,{isOpen:D,positionX:"right",style:`left: ${G}px;top: ${z}px;`,onClose:J},n&&o&&a.ZP.createElement(B.Z,{icon:"bots",onClick:H},ae("BotStart")),n&&i&&a.ZP.createElement(B.Z,{icon:"bots",onClick:Y},ae("BotRestart")),n&&l&&a.ZP.createElement(B.Z,{icon:r?"channel":"group",onClick:Q},ae(r?"ProfileJoinChannel":"ProfileJoinGroup")),b&&a.ZP.createElement(B.Z,{icon:"add-user",onClick:W},ae("AddContact")),f.wB&&d&&a.ZP.createElement(B.Z,{icon:"phone",onClick:ee},ae("Call")),f.wB&&c&&a.ZP.createElement(B.Z,{icon:"search",onClick:te},ae("Search")),m&&a.ZP.createElement(B.Z,{icon:p?"unmute":"mute",onClick:j},ae(p?"ChatsUnmute":"ChatsMute")),(Z||P)&&a.ZP.createElement(B.Z,{icon:"voice-chat",onClick:K},ae(P?"StartVoipChat":"VoipGroupJoinCall")),C&&a.ZP.createElement(B.Z,{icon:r?"comments":"channel",onClick:q},ae(r?"ViewDiscussion":"lng_profile_view_channel")),a.ZP.createElement(B.Z,{icon:"select",onClick:ne},ae("ReportSelectMessages")),h&&a.ZP.createElement(B.Z,{destructive:!0,icon:"delete",onClick:X},ae(v?"DeleteChatUser":E?"GroupInfo.DeleteAndExit":r?"LeaveChannel":"Group.LeaveGroup"))),g&&a.ZP.createElement(ct.Z,{isOpen:U,onClose:V,chat:g})))})));var Zs=n(9589);const Ps=(0,G.Ds)((e=>e()),200,!1),gs=(0,a.X$)((0,s.c$)((e=>{const t=(0,v.jr)(e);if(!t)return{};const{query:n,results:a}=(0,v.n5)(e)||{},{totalCount:s,foundIds:r}=a||{};return{chat:t,query:n,totalCount:s,foundIds:r,isHistoryCalendarOpen:Boolean(e.historyCalendarSelectedAt)}}),((e,t)=>(0,b.ei)(t,["setLocalTextSearchQuery","searchTextMessagesLocal","focusMessage","closeLocalTextSearch","openHistoryCalendar"])))((({isActive:e,chat:t,query:n,totalCount:s,foundIds:r,isHistoryCalendarOpen:o,setLocalTextSearchQuery:i,searchTextMessagesLocal:l,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=>{i({query:e}),e.length&&Ps(l)}),[l,i]),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(F.Z,{size:"smaller",round:!0,color:"translucent",onClick:d},a.ZP.createElement("i",{className:"icon-arrow-left"})),a.ZP.createElement(Zs.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(F.Z,{round:!0,size:"smaller",color:"translucent",onClick:()=>m({selectedAt:(0,K._F)(Date.now())}),ariaLabel:"Search messages by date"},a.ZP.createElement("i",{className:"icon-calendar"}))),a.ZP.createElement(F.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(F.Z,{round:!0,size:"smaller",color:"translucent",onClick:v,disabled:!r||!r.length||0===h},a.ZP.createElement("i",{className:"icon-down"}))))})));var vs=n(5376),ps=n(9295),Es=n(3575),Cs=n(7002),fs=n(3616);function bs(e,t,n=0,a=!1,s=!1,r=!1){const o=e[r?"scrollLeft":"scrollTop"],i=o+e[r?"offsetWidth":"offsetHeight"],l="string"==typeof t?e.querySelectorAll(t):t,{length:c}=l,d=[];let m=!1;for(let e=0;e=o-n&&u<=i+n:c<=i+n&&u>=o-n)d.push(e),m=!0;else if(m&&!a)break}return{allElements:l,visibleIndexes:d}}const Is=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,ys.Z)(a,r[t],e,10)}}var ws=n(3570);function ks({isActive:e,isHorizontal:t,shouldSaveSelectionOnUpdateItems:n,shouldRemoveSelectionOnReset:s,noArrowNavigation:r,items:o,shouldSelectOnTab:i,onSelect:l,onClose:c}){const[d,m]=(0,a.eJ)(-1),u=(0,a.I4)((e=>o?(0,ws.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(),l(t))}}),[o,l,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,Qe.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:i?Z:void 0,onEnter:Z}):void 0),[r,h,Z,e,t,c,i]),d}const Ns=(0,a.X$)((({isOpen:e,onClose:t,onInsertUserName:n,usersById:s,filteredUsers:r})=>{const o=(0,a.sO)(null),{shouldRender:i,transitionClassNames:l}=(0,_.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=ks({isActive:e,items:r,onSelect:d,shouldSelectOnTab:!0,shouldSaveSelectionOnUpdateItems:!0,onClose:t});(0,a.d4)((()=>{Ss(".chat-item-clickable",m,o)}),[m]),(0,a.d4)((()=>{r&&!r.length&&t()}),[r,t]);const u=(0,P.Z)(null!=r&&r.length?r:void 0,i),h=r&&!r.length?u:r;if(!i||h&&!h.length)return;const Z=(0,X.Z)("MentionTooltip composer-tooltip custom-scroll",l);return a.ZP.createElement("div",{className:Z,ref:o},null==h?void 0:h.map((({id:e},t)=>a.ZP.createElement(Te.Z,{key:e,className:"chat-item-clickable scroll-item",onClick:()=>c(e),focus:m===t},a.ZP.createElement(Ae.Z,{userId:e,avatarSize:"small",withUsername:!0})))))}));var Ms=n(9830);const Ts=(0,a.X$)((({chatId:e,threadId:t,attachments:n,caption:s,isReady:r,currentUserId:o,groupChatMembers:l,usersById:c,recentEmojis:d,baseEmojiKeywords:m,emojiKeywords:h,addRecentEmoji:Z,onCaptionUpdate:g,onSend:v,onFileAppend:p,onClear:C})=>{const f=(0,a.sO)(null),b=(0,P.Z)(n),I=n.length?n:b,y=Boolean(n.length),[S,w,k]=(0,Xe.Z)(),N=Boolean(I&&I.every((e=>e.quick))),M=(0,u.Z)(),{isMentionTooltipOpen:T,closeMentionTooltip:A,insertMention:L,mentionFilteredUsers:R}=(0,ps.Z)(y,s,g,i.nY,l,void 0,o),{isEmojiTooltipOpen:B,closeEmojiTooltip:$,filteredEmojis:D,insertEmoji:x}=(0,Es.Z)(y,s,d,i.nY,g,m,h,!r);(0,a.d4)((()=>y?(0,E.Z)(C):void 0),[y,C]);const U=(0,a.I4)((()=>{y&&v()}),[y,v]),O=(0,a.I4)((e=>{e.preventDefault(),k();const{dataTransfer:{files:t}}=e;if(null!=t&&t.length){const e=N?Array.from(t).filter((e=>e.type&&i.dI.has(e.type))):Array.from(t);p(e,N)}}),[N,p,k]);if(!I)return;const G=I.every((e=>i.oG.has(e.mimeType))),z=I.every((e=>i.wG.has(e.mimeType))),X=I.every((e=>e.mimeType.startsWith("audio/")));let J="";return J=M(G?"PreviewSender.SendPhoto":z?"PreviewSender.SendVideo":X?"PreviewSender.SendAudio":"PreviewSender.SendFile",I.length,"i"),a.ZP.createElement(ke.Z,{isOpen:y,onClose:C,header:function(){if(I)return a.ZP.createElement("div",{className:"modal-header-condensed",dir:M.isRtl?"rtl":void 0},a.ZP.createElement(F.Z,{round:!0,color:"translucent",size:"smaller",ariaLabel:"Cancel attachments",onClick:C},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement("div",{className:"modal-title"},J),a.ZP.createElement(F.Z,{color:"primary",size:"smaller",className:"modal-action-button",onClick:U},M("Send")))}(),className:"AttachmentModal "+(S?"hovered":"")},a.ZP.createElement("div",{className:"drop-target",onDragEnter:w,onDrop:O,onDragOver:function(e){e.preventDefault(),e.stopPropagation(),f.current&&window.clearTimeout(f.current)},onDragLeave:e=>{const{relatedTarget:t,target:n}=e;n.matches(".drop-target")&&!t&&(f.current=window.setTimeout(k,150)),n&&n.closest(".AttachmentModal.hovered")||(t&&e.stopPropagation(),k())},"data-attach-description":M("Preview.Dragging.AddItems",10)},N?a.ZP.createElement("div",{className:"media-wrapper custom-scroll"},I.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"},I.map((e=>a.ZP.createElement(Cs.Z,{name:e.filename,extension:(0,vs.mD)(e.filename,e.mimeType),previewData:e.previewBlobUrl,size:e.size,smaller:!0})))),a.ZP.createElement("div",{className:"attachment-caption-wrapper"},a.ZP.createElement(Ns,{isOpen:T,onClose:A,onInsertUserName:L,filteredUsers:R,usersById:c}),a.ZP.createElement(Ms.Z,{isOpen:B,emojis:D,onClose:$,onEmojiSelect:x,addRecentEmoji:Z}),a.ZP.createElement(fs.Z,{id:"caption-input-text",chatId:e,threadId:t,isAttachmentModalInput:!0,html:s,editableInputId:i.nY,placeholder:M("Caption"),onUpdate:g,onSend:v,canAutoFocus:Boolean(r&&n.length)}))))}));var Fs=n(3099);const As=(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),[i,l]=(0,a.eJ)(""),[c,d]=(0,a.eJ)([""]),[m,h]=(0,a.eJ)(!0),[Z,P]=(0,a.eJ)(!1),[g,v]=(0,a.eJ)(!1),[p,C]=(0,a.eJ)(),[f,b]=(0,a.eJ)(),[I,y]=(0,a.eJ)(!1),S=(0,u.Z)(),w=(0,a.I4)((t=>{e&&t.current&&t.current.focus()}),[e]);(0,a.d4)((()=>e?(0,E.Z)(n):void 0),[e,n]),(0,a.d4)((()=>{e||(l(""),d([""]),h(!0),P(!1),v(!1),C(""),b(""),y(!1))}),[e]),(0,a.d4)((()=>w(s)),[w,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"}))}))}),[]),N=(0,a.I4)((()=>{if(y(!1),!e)return;const n=i.trim().substring(0,255),a=c.map((e=>e.trim().substring(0,100))).filter((e=>e.length));if(!n||a.length<2)return l(n),a.length?a.length<2?k(a):d(a):k(),void y(!0);if(g&&(!f||!a[Number(f)]))return void y(!0);const s={summary:{question:n,answers:a.map(((e,t)=>({text:e.trim(),option:String(t),...String(t)===f&&{correct:!0}}))),...!m&&{isPublic:!0},...Z&&{multipleChoice:!0},...g&&{quiz:!0}}};if(g){const{text:e,entities:t}=p&&(0,Fs.Z)(p.substring(0,200))||{};s.quiz={correctAnswers:[f],...e&&{solution:e},...t&&{solutionEntities:t}}}t(s)}),[e,i,c,g,f,m,Z,t,k,p]),M=(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]),A=(0,a.I4)((e=>{b(e)}),[b]),L=(0,a.I4)((e=>{h(e.target.checked)}),[]),R=(0,a.I4)((e=>{P(e.target.checked)}),[]),B=(0,a.I4)((e=>{v(e.target.checked)}),[]),$=(0,a.I4)((e=>{13===e.keyCode&&N()}),[N]),D=(0,a.I4)((()=>{if(I&&!i.trim().length)return S("lng_polls_choose_question")}),[I,S,i]),x=(0,a.I4)((e=>{const t=c.map((e=>e.trim())).filter((e=>e.length));if(I&&t.length<2&&!c[e].trim().length)return S("lng_polls_choose_answers")}),[I,S,c]);function U(){return c.map(((e,t)=>a.ZP.createElement("div",{className:"option-wrapper"},a.ZP.createElement(Ne.Z,{label:t!==c.length-1||10===c.length?S("OptionHint"):S("CreatePoll.AddOption"),error:x(t),value:e,onChange:e=>M(t,e.currentTarget.value),onKeyPress:$}),t!==c.length-1&&a.ZP.createElement(F.Z,{className:"option-remove-button",round:!0,color:"translucent",size:"smaller",ariaLabel:S("Delete"),onClick:()=>T(t)},a.ZP.createElement("i",{className:"icon-close"})))))}return a.ZP.createElement(ke.Z,{isOpen:e,onClose:n,header:a.ZP.createElement("div",{className:"modal-header-condensed"},a.ZP.createElement(F.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"},S("NewPoll")),a.ZP.createElement(F.Z,{color:"primary",size:"smaller",className:"modal-action-button",onClick:N},S("Create"))),className:"PollModal"},a.ZP.createElement(Ne.Z,{ref:s,label:S("AskAQuestion"),value:i,error:D(),onChange:e=>l(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"},S("PollOptions")),I&&function(){const e=c.map((e=>e.trim())).filter((e=>e.length));return g&&(!f||!e[Number(f)])&&a.ZP.createElement("p",{className:"error"},S("lng_polls_choose_correct"))}(),g?a.ZP.createElement(tt.Z,{name:"correctOption",options:U().map(((e,t)=>({value:String(t),label:e,hidden:t===c.length-1}))),onChange:A}):U()),a.ZP.createElement("div",{className:"options-divider"}),a.ZP.createElement("div",{className:"quiz-mode"},a.ZP.createElement(un.Z,{label:S("PollAnonymous"),checked:m,onChange:L}),a.ZP.createElement(un.Z,{label:S("PollMultiple"),checked:Z,disabled:g,onChange:R}),a.ZP.createElement(un.Z,{label:S("PollQuiz"),checked:g,disabled:Z,onChange:B}),g&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("h3",{className:"options-header"},S("lng_polls_solution_title")),a.ZP.createElement("div",{ref:o,className:"form-control",contentEditable:!0,dir:"auto",onChange:e=>C(e.currentTarget.innerHTML)}),a.ZP.createElement("div",{className:"note"},S("CreatePoll.ExplanationInfo")))))}));var Ls=n(6503),Rs=n(4284),Bs=n(1367);const $s=(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]}:`},f.op?e.native:a.ZP.createElement("img",{src:`./img-apple-64/${e.image}.png`,alt:"",loading:"lazy"}))})),Ds=(0,a.X$)((({category:e,index:t,allEmojis:n,observeIntersection:s,shouldRender:r,onEmojiSelect:o})=>{const i=(0,a.sO)(null);(0,Mn._N)(i,s);const l=(0,Tn.Z)(r),c=(0,u.Z)(),d=f.wB?Math.floor((I.Z.get().width-8)/44):9,m=44*Math.ceil(e.emojis.length/d);return a.ZP.createElement("div",{ref:i,key:e.id,id:`emoji-category-${t}`,className:"symbol-set"},a.ZP.createElement("p",{className:"symbol-set-name",dir:"auto"},c("recent"===e.id?"RecentStickers":`Emoji${t}`)),a.ZP.createElement("div",{className:(0,X.Z)("symbol-set-container",l),style:`height: ${m}px;`,dir:c.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($s,{key:s.id,emoji:s,onClick:o})}))))})),xs={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"},Us=[];let Os,Gs,zs;const Xs=(0,a.X$)((0,s.c$)((e=>(0,b.ei)(e,["recentEmojis"])))((({className:e,onEmojiSelect:t,recentEmojis:s})=>{const r=(0,a.sO)(null),o=(0,a.sO)(null),[l,c]=(0,a.eJ)(),[d,m]=(0,a.eJ)(),[h,Z]=(0,a.eJ)(0),{observe:P}=(0,Mn.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-",""));Us[n]=e.isIntersecting}));const t=Us.map(((e,t)=>({index:t,isIntersecting:e}))).filter((({isIntersecting:e})=>e));t.length&&Z(t[Math.floor(t.length/2)].index)}));(0,ut.Z)(o.current,!f.wB),(0,a.d4)((()=>{if(!l)return;const e=o.current;if(!e)return;const t=42*h-e.offsetWidth/2+21;(0,Bs.Z)(e,t)}),[l,h]);const g=(0,u.Z)(),v=(0,a.Ye)((()=>{if(!l)return ot.D;const e=[...l];return null!=s&&s.length&&e.unshift({id:"recent",name:g("RecentStickers"),emojis:s}),e}),[l,g,s]);(0,a.d4)((()=>{setTimeout((()=>{const e=()=>{c(zs.categories),m(zs.emojis)};zs?e():async function(){return Os||(Os=n.e(501).then(n.t.bind(n,7501,19)),Gs=(await Os).default,zs=(0,Rs.NM)(Gs)),Os}().then(e)}),200)}),[]);const p=(0,a.I4)((e=>{Z(e);const t=document.getElementById(`emoji-category-${e}`);(0,ys.Z)(r.current,t,"start",50,800)}),[]),E=(0,a.I4)(((e,n)=>{t(e,n)}),[t]),C=(0,wt.Z)([],i.kU),b=(0,X.Z)("EmojiPicker",e);return d&&C?a.ZP.createElement("div",{className:b},a.ZP.createElement("div",{ref:o,className:"EmojiPicker-header",dir:g.isRtl?"rtl":""},v.map((function(e,t){const n=xs[e.id];return n&&a.ZP.createElement(F.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",f.$b?"no-scrollbar":"custom-scroll")},v.map(((e,t)=>a.ZP.createElement(Ds,{category:e,index:t,allEmojis:d,observeIntersection:P,shouldRender:h>=t-1&&h<=t+1,onEmojiSelect:E}))))):a.ZP.createElement("div",{className:b},a.ZP.createElement(we.Z,null))}))),Js=f.wB?8:16,_s=(0,a.X$)((({stickerSet:e,loadAndPlay:t,index:n,observeIntersection:s,shouldRender:r,onStickerSelect:o,onStickerUnfave:l})=>{const c=(0,a.sO)(null);(0,Mn._N)(c,s);const d=(0,Tn.Z)(r),m=f.wB?Math.floor((I.Z.get().width-8)/(i.Q+Js)):5,u=Math.ceil(e.count/m)*(i.Q+Js);return a.ZP.createElement("div",{ref:c,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",d),style:`height: ${u}px;`},r&&e.stickers&&e.stickers.map((n=>a.ZP.createElement(Rn.Z,{key:n.id,sticker:n,size:i.Q,observeIntersection:s,noAnimate:!t,onClick:o,clickArg:n,onUnfaveClick:"favorite"===e.id?l:void 0})))))})),Vs=[],Hs=(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,b.ei)(t,["loadStickerSets","loadRecentStickers","loadFavoriteStickers","loadAddedStickers","addRecentSticker","unfaveSticker"])))((({className:e,loadAndPlay:t,canSendStickers:n,recentStickers:s,favoriteStickers:r,addedSetIds:o,stickerSetsById:l,shouldPlay:c,onStickerSelect:d,loadStickerSets:m,loadRecentStickers:h,loadFavoriteStickers:Z,loadAddedStickers:P,addRecentSticker:g,unfaveSticker:v})=>{const p=(0,a.sO)(null),E=(0,a.sO)(null),[C,b]=(0,a.eJ)(0),{observe:I}=(0,Mn.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-",""));Vs[n]=e.isIntersecting}));const t=Vs.map(((e,t)=>({index:t,isIntersecting:e}))).filter((({isIntersecting:e})=>e));t.length&&b(t[Math.floor(t.length/2)].index)})),{observe:y}=(0,Mn.S1)({rootRef:E}),S=(0,u.Z)(),w=Boolean(o),k=(0,a.Ye)((()=>o?[{id:"recent",title:S("RecentStickers"),stickers:s,count:s.length},{id:"favorite",title:S("FavoriteStickers"),stickers:r,count:r.length},...o.map((e=>l[e])).filter(Boolean)]:ot.D),[o,S,s,r,l]),N=(0,a.Ye)((()=>w&&0===k.filter((e=>{var t;return null===(t=e.stickers)||void 0===t?void 0:t.length})).length),[k,w]);(0,a.d4)((()=>{t&&(m(),h(),Z())}),[t,Z,h,m]),(0,a.d4)((()=>{null!=o&&o.length&&P()}),[o,P]),(0,ut.Z)(E.current),(0,a.d4)((()=>{if(!w)return;const e=E.current;if(!e)return;const t=52*C-(e.offsetWidth/2-26);(0,Bs.Z)(e,t)}),[w,C]);const M=(0,a.I4)((e=>{b(e);const t=document.getElementById(`sticker-set-${e}`);(0,ys.Z)(p.current,t,"start",void 0,500)}),[]),T=(0,a.I4)((e=>{d(e),g({sticker:e})}),[g,d]),A=(0,a.I4)((e=>{v({sticker:e})}),[v]),L=(0,wt.Z)([],i.Y),R=(0,X.Z)("StickerPicker",e);return w&&L&&!N&&n?a.ZP.createElement("div",{className:R},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(F.Z,{key:e.id,className:r,ariaLabel:e.title,round:!0,faded:"recent"===e.id||"favorite"===e.id,color:"translucent",onClick:()=>M(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(An,{stickerSet:e,observeIntersection:y}):a.ZP.createElement(Ln,{stickerSet:e,observeIntersection:y})):a.ZP.createElement(Rn.Z,{key:e.id,sticker:s,size:i.DC,title:e.title,className:r,observeIntersection:y,onClick:M,clickArg:t})}))),a.ZP.createElement("div",{ref:p,className:(0,X.Z)("StickerPicker-main no-selection",f.$b?"no-scrollbar":"custom-scroll")},k.map(((e,n)=>a.ZP.createElement(_s,{key:e.id,stickerSet:e,loadAndPlay:Boolean(c&&t),index:n,observeIntersection:I,shouldRender:C>=n-1&&C<=n+1,onStickerSelect:T,onStickerUnfave:A}))))):a.ZP.createElement("div",{className:R},n?N?a.ZP.createElement("div",{className:"picker-disabled"},S("NoStickers")):a.ZP.createElement(we.Z,null):a.ZP.createElement("div",{className:"picker-disabled"},S("ErrorSendRestrictedStickersAll")))})));var Ys=n(386);function js(){return(js=Object.assign||function(e){for(var t=1;t{var i,l;const c=(0,a.sO)(null),d=(0,a.sO)(null),m=Boolean(null===(i=e.thumbnail)||void 0===i?void 0:i.dataUri),u=`gif${e.id}`,Z=(0,Mn.Op)(c,t)&&!n,P=(0,h.Z)(`${u}?size=m`,!Z,r.IU.BlobUrl),g=(0,jn.Z)(null===(l=e.thumbnail)||void 0===l?void 0:l.dataUri,Boolean(P)),v=(0,h.Z)(u,!Z,r.IU.BlobUrl),p=Boolean(Z&&v),{isBuffered:E,bufferingHandlers:C}=(0,V.Z)(!0),f=Z&&!E,b=Z&&E;(0,Y.Z)(d,[p]);const I=(0,a.I4)((()=>o({...e,blobUrl:v})),[o,e,v]),y=(0,X.Z)("GifButton",e.width&&e.height&&e.width({savedGifs:e.gifs.saved.gifs})),((e,t)=>(0,b.ei)(t,["loadSavedGifs"])))((({className:e,loadAndPlay:t,canSendGifs:n,savedGifs:s,onGifSelect:r,loadSavedGifs:o})=>{const l=(0,a.sO)(null),{observe:c}=(0,Mn.S1)({rootRef:l,debounceMs:300});(0,a.d4)((()=>{t&&o()}),[t,o]);const d=(0,wt.Z)([],i.Y);return a.ZP.createElement("div",{ref:l,className:(0,X.Z)("GifPicker",e,f.$b?"no-scrollbar":"custom-scroll")},n?d&&s&&s.length?s.map((e=>a.ZP.createElement(Ks,{key:e.id,gif:e,observeIntersection:c,isDisabled:!t,onClick:r}))):d&&s?a.ZP.createElement("div",{className:"picker-disabled"},"No saved GIFs."):a.ZP.createElement(we.Z,null):a.ZP.createElement("div",{className:"picker-disabled"},"Sending GIFs is not allowed in this chat."))})));let Ws;!function(e){e[e.Emoji=0]="Emoji",e[e.Stickers=1]="Stickers",e[e.GIFs=2]="GIFs"}(Ws||(Ws={}));const Qs=Object.values(Ws).filter((e=>"string"==typeof e)),er={[Ws.Emoji]:"icon-smile",[Ws.Stickers]:"icon-stickers",[Ws.GIFs]:"icon-gifs"},tr=(0,a.X$)((({activeTab:e,onSwitchTab:t,onRemoveSymbol:n,onSearchOpen:s})=>{const r=(0,u.Z)();function o(n){return a.ZP.createElement(F.Z,{className:"symbol-tab-button "+(e===n?"activated":""),onClick:()=>t(n),ariaLabel:Qs[n],round:!0,faded:!0,color:"translucent"},a.ZP.createElement("i",{className:er[n]}))}const i=(0,a.I4)((()=>{s(e===Ws.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!==Ws.Emoji&&a.ZP.createElement(F.Z,{className:"symbol-search-button",ariaLabel:e===Ws.Stickers?"Search Stickers":"Search GIFs",round:!0,faded:!0,color:"translucent",onClick:i},a.ZP.createElement("i",{className:"icon-search"})),o(Ws.Emoji),o(Ws.Stickers),o(Ws.GIFs),e===Ws.Emoji&&a.ZP.createElement(F.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 nr=!1;const ar=(0,a.X$)((0,s.c$)((e=>({isLeftColumnShown:e.isLeftColumnShown})))((({isOpen:e,allowedAttachmentOptions:t,isLeftColumnShown:n,onLoad:s,onClose:r,onEmojiSelect:o,onStickerSelect:i,onGifSelect:l,onRemoveSymbol:c,onSearchOpen:d,addRecentEmoji:m})=>{const[h,Z]=(0,a.eJ)(0),[P,g]=(0,a.eJ)([]),[v,p]=(0,Ls.Z)(e,r,void 0,f.wB),{shouldRender:E,transitionClassNames:C}=(0,_.Z)(e,r,!1,!1);!nr&&e&&(nr=!0),(0,a.d4)((()=>{s()}),[s]),(0,a.bt)((()=>{if(f.wB)return e&&(document.body.classList.add("enable-symbol-menu-transforms"),document.body.classList.add("is-symbol-menu-open")),()=>{e&&(0,G.T2)((()=>{document.body.classList.remove("is-symbol-menu-open"),setTimeout((()=>{document.body.classList.remove("enable-symbol-menu-transforms")}),350)}))}}),[e]);const b=(0,a.sO)(P);b.current=P,(0,a.d4)((()=>{b.current.length&&(b.current.forEach((e=>{m({emoji:e})})),g([]))}),[e,h,m]);const I=(0,a.I4)(((e,t)=>{g((e=>[...e,t])),o(e)}),[o]),y=(0,a.I4)((e=>{r(),d(e)}),[r,d]),S=(0,a.I4)((e=>{i(e,!0)}),[i]),w=(0,u.Z)(),{canSendStickers:k,canSendGifs:N}=t;function M(t,n){switch(h){case Ws.Emoji:return a.ZP.createElement(Xs,{className:"picker-tab",onEmojiSelect:I});case Ws.Stickers:return a.ZP.createElement(Hs,{className:"picker-tab",loadAndPlay:!!k&&e&&(t||n),canSendStickers:k,onStickerSelect:S});case Ws.GIFs:return a.ZP.createElement(qs,{className:"picker-tab",loadAndPlay:!!N&&e&&(t||n),canSendGifs:N,onGifSelect:l})}}const T=a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("div",{className:"SymbolMenu-main",onClick:function(e){e.stopPropagation()}},nr&&a.ZP.createElement(L.Z,{name:"slide",activeKey:h,renderCount:Qs.length},M)),f.wB&&a.ZP.createElement(F.Z,{round:!0,faded:!0,color:"translucent",ariaLabel:w("Close"),className:"symbol-close-button",size:"tiny",onClick:r},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement(tr,{activeTab:h,onSwitchTab:Z,onRemoveSymbol:c,onSearchOpen:y}));if(f.wB){if(!E)return;const e=(0,X.Z)("SymbolMenu mobile-menu",C,!n&&"middle-column-open");return a.ZP.createElement(us.Z,null,a.ZP.createElement("div",{className:e},T))}return a.ZP.createElement(ls.Z,{isOpen:e,positionX:"left",positionY:"bottom",onClose:r,className:"SymbolMenu",onCloseAnimationEnd:r,onMouseEnter:f.$b?void 0:v,onMouseLeave:f.$b?void 0:p,noCloseOnBackdrop:!f.$b},T)}))),sr=(0,a.X$)((({isOpen:e,allowedAttachmentOptions:t,onFileSelect:n,onPollCreate:s,onClose:r})=>{const[o,l]=(0,Ls.Z)(e,r),c=(0,a.I4)(((e,t)=>{const{files:a}=e.target;a&&a.length>0&&n(Array.from(a),t)}),[n]),d=(0,a.I4)((()=>{Gn(Array.from(i.dI).join(","),(e=>c(e,!0)))}),[c]),m=(0,a.I4)((()=>{Gn("*",(e=>c(e,!1)))}),[c]),h=(0,u.Z)(),{canAttachMedia:Z,canAttachPolls:P}=t;return a.ZP.createElement(ls.Z,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",onClose:r,className:"AttachMenu fluid",onCloseAnimationEnd:r,onMouseEnter:f.$b?void 0:o,onMouseLeave:f.$b?void 0:l,noCloseOnBackdrop:!f.$b},!Z&&a.ZP.createElement(B.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(B.Z,{icon:"photo",onClick:d},h("AttachmentMenu.PhotoOrVideo")),a.ZP.createElement(B.Z,{icon:"document",onClick:m},h("AttachDocument"))),P&&a.ZP.createElement(B.Z,{icon:"poll",onClick:s},h("Poll")))})),rr=(0,a.X$)((({withAvatar:e,focus:t,botCommand:n,bot:s,onClick:r})=>a.ZP.createElement(Te.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(ge.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,Pe.Z)(n.description)))))),or=(0,a.X$)((0,s.c$)((e=>({usersById:e.users.byId})),((e,t)=>(0,b.ei)(t,["sendBotCommand"])))((({usersById:e,isOpen:t,withUsername:n,botCommands:s,onClick:r,onClose:o,sendBotCommand:i})=>{const l=(0,a.sO)(null),{shouldRender:c,transitionClassNames:d}=(0,_.Z)(t,void 0,void 0,!1),m=(0,a.I4)((({botId:t,command:a})=>{const s=e[t];i({command:`/${a}${n&&s?`@${s.username}`:""}`,botId:t}),r()}),[r,i,e,n]),u=ks({isActive:t,items:s,onSelect:m,onClose:o});(0,a.d4)((()=>{s&&!s.length&&o()}),[s,o]),(0,a.d4)((()=>{Ss(".chat-item-clickable",u,l)}),[u]);const h=(0,P.Z)(s&&s.length?s:void 0,c),Z=s&&!s.length?h:s;if(!c||Z&&!Z.length)return;const g=(0,X.Z)("BotCommandTooltip composer-tooltip custom-scroll",d);return a.ZP.createElement("div",{className:g,ref:l},Z&&Z.map(((t,n)=>a.ZP.createElement(rr,{key:`${t.botId}_${t.command}`,botCommand:t,bot:e[t.botId],withAvatar:!0,onClick:m,focus:u===n}))))}))),ir=(0,a.X$)((0,s.c$)(void 0,((e,t)=>(0,b.ei)(t,["sendBotCommand"])))((({isOpen:e,botCommands:t,onClose:n,sendBotCommand:s})=>{const[r,o]=(0,Ls.Z)(e,n,void 0,f.wB),i=(0,a.I4)((e=>{s({command:`/${e.command}`,botId:e.botId}),n()}),[n,s]);return a.ZP.createElement(ls.Z,{isOpen:e,positionX:"left",positionY:"bottom",onClose:n,className:"BotCommandMenu",onCloseAnimationEnd:n,onMouseEnter:f.$b?void 0:r,onMouseLeave:f.$b?void 0:o,noCloseOnBackdrop:!f.$b},t.map((e=>a.ZP.createElement(rr,{key:e.command,botCommand:e,onClick:i}))))}))),lr=(0,a.X$)((0,s.c$)((e=>{const{stickers:t}=e.stickers.forEmoji;return{stickers:t}}),((e,t)=>(0,b.ei)(t,["clearStickersForEmoji"])))((({isOpen:e,onStickerSelect:t,stickers:n,clearStickersForEmoji:s})=>{const r=(0,a.sO)(null),{shouldRender:o,transitionClassNames:l}=(0,_.Z)(e,void 0,void 0,!1),c=(0,P.Z)(n,!0),d=n||c,{observe:m}=(0,Mn.S1)({rootRef:r,throttleMs:200});(0,a.d4)((()=>e?(0,E.Z)(s):void 0),[e,s]);const u=(0,X.Z)("StickerTooltip composer-tooltip custom-scroll",l,!(null!=d&&d.length)&&"hidden");return a.ZP.createElement("div",{ref:r,className:u,onMouseEnter:f.$b?void 0:()=>{document.body.classList.add("no-select")},onMouseLeave:f.$b?void 0:()=>{document.body.classList.remove("no-select")}},o&&d?d.map((e=>a.ZP.createElement(Rn.Z,{key:e.id,sticker:e,size:i.Q,observeIntersection:m,onClick:t,clickArg:e}))):o?a.ZP.createElement(we.Z,null):void 0)}))),cr=(0,a.X$)((({isOpen:e,onSilentSend:t,onScheduleSend:n,onClose:s,onCloseAnimationEnd:r})=>{const[o,i]=(0,Ls.Z)(e,s),l=(0,u.Z)();return a.ZP.createElement(ls.Z,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",className:"CustomSendMenu",onClose:s,onCloseAnimationEnd:r,onMouseEnter:f.$b?void 0:o,onMouseLeave:f.$b?void 0:i,noCloseOnBackdrop:!f.$b},t&&a.ZP.createElement(B.Z,{icon:"mute",onClick:t},l("SendWithoutSound")),n&&a.ZP.createElement(B.Z,{icon:"schedule",onClick:n},l("ScheduleMessage")))}));var dr=n(2420),mr=n(3283),ur=n(2678);const hr=(0,a.X$)((({isOpen:e,emojis:t,onClose:n,onEmojiSelect:s,addRecentEmoji:r})=>{const o=(0,a.sO)(null),{shouldRender:i,transitionClassNames:l}=(0,_.Z)(e,void 0,void 0,!1),c=(0,ur.Z)(t.length?t:void 0,350)||[],d=(0,a.I4)((e=>{s(e.native),r({emoji:e.id})}),[r,s]),m=(0,a.I4)(((e,t)=>{s(e),r({emoji:t})}),[r,s]),u=ks({isActive:e,isHorizontal:!0,items:t,onSelect:d,onClose:n});(0,a.d4)((()=>{!function(e,t){const n=t.current;if(!n)return;const{visibleIndexes:a,allElements:s}=bs(n,".EmojiButton",8,!0,!0,!0);if(!s.length||!s[e])return;const r=a[0];if(!a.includes(e)||e===r&&!Is(n,s[r],!0)){const t="start"==(e>a[a.length-1]?"start":"end")?44*e:0;(0,Bs.Z)(n,t)}}(u,o)}),[u]);const h=(0,X.Z)("EmojiTooltip composer-tooltip custom-scroll-x",l);return a.ZP.createElement("div",{ref:o,className:h,onMouseEnter:f.$b?void 0:()=>{document.body.classList.add("no-select")},onMouseLeave:f.$b?void 0:()=>{document.body.classList.remove("no-select")}},i&&c?c.map(((e,t)=>a.ZP.createElement($s,{key:e.id,emoji:e,focus:u===t,onClick:m}))):i?a.ZP.createElement(we.Z,null):void 0)})),Zr=(0,a.X$)((({title:e,description:t,thumbnail:n,thumbUrl:s,focus:r,transitionClassNames:o="",onClick:i})=>{let l="";const c=(0,h.Z)(n?`webDocument:${n.url}`:void 0);return(s=s||c)?l=a.ZP.createElement("img",{src:s,className:o,alt:"",decoding:"async",draggable:"false"}):e&&(l=(0,Fn.Xv)(e,1)),a.ZP.createElement(Te.Z,{focus:r,className:"BaseResult chat-item-clickable",onMouseDown:Ys.b,onClick:i},a.ZP.createElement("span",{className:"thumb"},"string"==typeof l?(0,Pe.Z)(l):l),a.ZP.createElement("div",{className:"content-inner"},e&&a.ZP.createElement("div",{className:"title"},e),t&&a.ZP.createElement("div",{className:"description"},t)))})),Pr=(0,a.X$)((({focus:e,isForGallery:t,inlineResult:n,onClick:s})=>{var r;let o,i,l;"photo"in n&&(o=n.photo),"thumbnail"in n&&(i=n.thumbnail),"webThumbnail"in n&&t&&(l=n.webThumbnail);const c=(0,h.Z)(l?`webDocument:${l.url}`:void 0),d=(0,h.Z)(o&&`photo${o.id}?size=m`),m=(0,Tn.Z)(d),u=(0,a.I4)((()=>{s(n)}),[n,s]);var Z,P;if(t)return a.ZP.createElement("div",{className:"MediaResult chat-item-clickable",onClick:u},a.ZP.createElement("img",{src:(null===(Z=o)||void 0===Z||null===(P=Z.thumbnail)||void 0===P?void 0:P.dataUri)||c,alt:""}),a.ZP.createElement("img",{src:d,className:(0,X.Z)("full-media",m),alt:""}));const{title:g,description:v}=n;return a.ZP.createElement(Zr,{focus:e,thumbUrl:d||(null===(r=i)||void 0===r?void 0:r.dataUri)||c,transitionClassNames:m,title:g,description:v,onClick:u})})),gr=(0,a.X$)((({focus:e,inlineResult:t,onClick:n})=>{const{title:s,url:r,description:o,webThumbnail:i}=t,l=(0,a.I4)((()=>{n(t)}),[t,n]);return a.ZP.createElement(Zr,{focus:e,thumbnail:i,title:s||r,description:o,onClick:l})})),vr=(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(Ks,{gif:s,observeIntersection:t,className:"chat-item-clickable",onClick:r})})),pr=(0,a.X$)((({inlineResult:e,observeIntersection:t,onClick:n})=>{const{sticker:s}=e;if(s)return a.ZP.createElement(Rn.Z,{sticker:s,size:i.zq,observeIntersection:t,title:s.emoji,className:"chat-item-clickable",onClick:n,clickArg:e})})),Er=(0,G.P2)((e=>e()),500,!0),Cr=(0,a.X$)((0,s.c$)(void 0,((e,t)=>(0,b.ei)(t,["startBot","openChat","sendInlineBotResult"])))((({isOpen:e,botId:t,isGallery:n,inlineBotResults:s,switchPm:r,loadMore:i,onClose:l,openChat:c,startBot:d,onSelectResult:m})=>{const u=(0,a.sO)(null),{shouldRender:h,transitionClassNames:Z}=(0,_.Z)(e,void 0,void 0,!1),{observe:g}=(0,Mn.S1)({rootRef:u,debounceMs:200,isDisabled:!e}),v=(0,a.I4)((({direction:e})=>{e===o.Uq.Backwards&&Er(i)}),[i]),p=ks({isActive:e,shouldRemoveSelectionOnReset:n,noArrowNavigation:n,items:s,onSelect:m,onClose:l});(0,a.d4)((()=>{Ss(".chat-item-clickable",p,u)}),[p]);const E=(0,a.I4)((()=>{c({id:t}),d({botId:t,param:r.startParam})}),[t,c,d,r]),C=(0,P.Z)(null!=s&&s.length?s:void 0,h),b=s&&!s.length?C:s;if(!h||!b||!b.length&&!r)return;const I=(0,X.Z)("InlineBotTooltip composer-tooltip",f.$b?"no-scrollbar":"custom-scroll",n&&"gallery",Z);return a.ZP.createElement(Me.Z,{ref:u,className:I,items:b,itemSelector:".chat-item-clickable",noFastList:!0,onLoadMore:v,sensitiveArea:160},r&&a.ZP.createElement(Te.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(vr,{key:e.id,inlineResult:e,observeIntersection:g,onClick:m});case"photo":return a.ZP.createElement(Pr,{key:e.id,isForGallery:n,inlineResult:e,onClick:m});case"sticker":return a.ZP.createElement(pr,{key:e.id,inlineResult:e,observeIntersection:g,onClick:m});case"video":case"game":return a.ZP.createElement(Pr,{key:e.id,focus:p===t,inlineResult:e,onClick:m});case"article":case"audio":return a.ZP.createElement(gr,{key:e.id,focus:p===t,inlineResult:e,onClick:m});default:return}})))})));var fr=n(6844);const br=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,v.Z1)(e,t),a=n&&(0,v.Zw)(e,n.id);if(!n||!a)return{};const{query:s,results:r}=(0,v.n5)(e)||{},{totalCount:o,foundIds:i}=r||{};return{chat:n,messagesById:a,query:s,totalCount:o,foundIds:i}}),((e,t)=>(0,b.ei)(t,["searchTextMessagesLocal","focusMessage"])))((({chatId:e,threadId:t,onClose:n,isActive:r,chat:o,messagesById:i,query:l,totalCount:c,foundIds:d,searchTextMessagesLocal:h,focusMessage:Z})=>{const P=(0,u.Z)(),p=(0,a.Ye)((()=>{if(!(l&&d&&d.length&&i))return ot.D;const n=d.map((n=>{const a=i[n];if(!a)return;const r=a.senderId?(0,v.dy)((0,s.Rd)(),a.senderId):void 0;let l;if(o&&(0,g.eA)(o))l=o;else if(a.forwardInfo){const{isChannelPost:e,fromChatId:t}=a.forwardInfo;l=e&&t?(0,v.Z1)((0,s.Rd)(),t):void 0}else l=a.senderId?(0,v.Z1)((0,s.Rd)(),a.senderId):void 0;return{message:a,senderUser:r,senderChat:l,onClick:()=>Z({chatId:e,threadId:t,messageId:n})}})).filter(Boolean);return(0,b.Xo)(n,(({message:e})=>e.date),"desc")}),[e,t,Z,d,o,i,l]);(0,m.ZP)(r,n);const E=(0,a.sO)(null),C=(0,ye.Z)(E,!0,(e=>{const t=null==p?void 0:p[-1===e?0:e];t&&t.onClick()}),".ListItem-button",!0);return a.ZP.createElement(Me.Z,{className:"RightSearch custom-scroll",items:p,preloadBackwards:0,onLoadMore:h,noFastList:!0,onKeyDown:C,ref:E},a.ZP.createElement("p",{className:"helper-text",dir:"auto"},l?0!==c&&p.length?1===c?"1 message found":`${p.length&&(c||p.length)} messages found`:P("lng_search_no_results"):P("lng_dlg_search_for_messages")),p.map((({message:e,senderUser:t,senderChat:n,onClick:s})=>{const r=n?(0,g.U)(P,n):(0,g.Js)(t),o=(0,g.MK)(P,e);return a.ZP.createElement(Te.Z,{className:"chat-item-clickable search-result-message m-0",onClick:s},a.ZP.createElement(ge.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,Pe.Z)(r)),a.ZP.createElement(fr.Z,{message:e})),a.ZP.createElement("div",{className:"subtitle",dir:"auto"},(0,Pe.Z)(o,["emoji","highlight"],{highlight:l}))))})))})));var Ir=n(9290);const yr=(0,a.X$)((0,s.c$)(((e,{stickerSetId:t})=>({set:(0,v.Ny)(e,t),shouldPlay:(0,v.yB)(e)})),((e,t)=>(0,b.ei)(t,["loadStickers","toggleStickerSet"])))((({stickerSetId:e,observeIntersection:t,set:n,shouldPlay:s,loadStickers:r,toggleStickerSet:o,isSomeModalOpen:l,onModalToggle:c})=>{const d=(0,u.Z)(),m=n&&Boolean(n.installedDate),h=Boolean(null==n?void 0:n.stickers),[Z,P,g]=(0,Xe.Z)();(0,Ir.Z)((()=>{c(Z)}),[Z,c]);const v=(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)((()=>{!h&&v.length<5&&r({stickerSetId:e})}),[h,v.length,r,e]);const p=(0,a.I4)((()=>{o({stickerSetId:e})}),[o,e]);if(!n)return;const E=v.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(F.Z,{className:m?"is-added":void 0,color:"primary",size:"tiny",pill:!0,fluid:!0,onClick:p},d(m?"Stickers.Installed":"Stickers.Install"))),a.ZP.createElement("div",{className:"sticker-set-main"},!E&&a.ZP.createElement(z.Z,null),E&&v.map((e=>a.ZP.createElement(Rn.Z,{sticker:e,size:i.Y7,observeIntersection:t,noAnimate:!s||Z||l,onClick:P})))),E&&a.ZP.createElement($n.Z,{isOpen:Z,fromSticker:v[0],onClose:g}))}))),Sr=(0,G.P2)((e=>e()),6e4,!0),wr=(0,a.X$)((0,s.c$)((e=>{const t=(0,v.y5)(e),{query:n,resultIds:a}=t||{},{featured:s}=e.stickers;return{query:n,featuredIds:s.setIds,resultIds:a}}),((e,t)=>(0,b.ei)(t,["loadFeaturedStickers"])))((({onClose:e,isActive:t,query:n,featuredIds:s,resultIds:r,loadFeaturedStickers:o})=>{const i=(0,a.sO)(null),l=(0,u.Z)(),[c,d]=(0,a.eJ)(!1),{observe:h}=(0,Mn.S1)({rootRef:i,throttleMs:200});return(0,a.d4)((()=>{Sr((()=>{o()}))})),(0,m.ZP)(t,e),a.ZP.createElement("div",{ref:i,className:"StickerSearch custom-scroll",dir:l.isRtl?"rtl":void 0},function(){if(void 0!==n)return!n&&s?s.map((e=>a.ZP.createElement(yr,{key:e,stickerSetId:e,observeIntersection:h,isSomeModalOpen:c,onModalToggle:d}))):r?r.length?r.map((e=>a.ZP.createElement(yr,{key:e,stickerSetId:e,observeIntersection:h,isSomeModalOpen:c,onModalToggle:d}))):a.ZP.createElement("p",{className:"helper-text",dir:"auto"},"Nothing found."):a.ZP.createElement(we.Z,null)}())}))),kr=(0,a.X$)((0,s.c$)((e=>{const t=(0,v.yN)(e),{query:n,results:a}=t||{},{chatId:s}=(0,v.Bt)(e)||{},r=s?(0,v.Z1)(e,s):void 0;return{query:n,results:a,chat:r,isChatWithBot:r?(0,v.xo)(e,r):void 0}}),((e,t)=>(0,b.ei)(t,["searchMoreGifs","sendMessage","setGifSearchQuery"])))((({onClose:e,isActive:t,query:n,results:s,chat:r,isChatWithBot:o,searchMoreGifs:i,sendMessage:l,setGifSearchQuery:c})=>{const d=(0,a.sO)(null),{observe:h}=(0,Mn.S1)({rootRef:d,debounceMs:300}),{canSendGifs:Z}=(0,g.H5)(r,o),P=(0,a.I4)((e=>{Z&&l({gif:e}),f.$b&&c({query:void 0})}),[Z,l,c]),v=(0,u.Z)();(0,m.ZP)(t,e);const p=Boolean(void 0!==n&&s&&s.length);return a.ZP.createElement("div",{className:"GifSearch",dir:v.isRtl?"rtl":void 0},a.ZP.createElement(Me.Z,{ref:d,className:(0,X.Z)("gif-container custom-scroll",p&&"grid"),items:s,itemSelector:".GifButton",preloadBackwards:96,noFastList:!0,onLoadMore:i},function(){if(void 0!==n)return s?s.length?s.map((e=>a.ZP.createElement(Ks,{key:e.id,gif:e,observeIntersection:h,onClick:P}))):a.ZP.createElement("p",{className:"helper-text",dir:"auto"},v("NoGIFsFound")):a.ZP.createElement(we.Z,null)}()))}))),Nr=(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,b.ei)(t,["loadPollOptionResults","openChat","closePollResults"])))((({chat:e,message:t,answer:n,answerVote:s,totalVoters:r,voters:o,offset:i,loadPollOptionResults:l,openChat:c,closePollResults:d})=>{const m=(0,P.Z)(s.votersCount),[h,Z]=(0,a.eJ)(!0),g=Boolean(o),{option:v,text:p}=n,E=(0,u.Z)();(0,a.d4)((()=>{g&&m===s.votersCount||l({chat:e,messageId:t.id,option:v,offset:i,limit:4,shouldResetVoters:!0})}),[s.votersCount,g]);const C=(0,a.I4)((()=>{Z(!0),l({chat:e,messageId:t.id,option:v,offset:i,limit:50})}),[e,l,t.id,i,v]);(0,a.d4)((()=>{Z(!1)}),[o]);const f=(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(Te.Z,{key:e,className:"chat-item-clickable",onClick:()=>f(e)},a.ZP.createElement(Ae.Z,{avatarSize:"tiny",userId:e,forceShowSelf:!0,noStatusOrTyping:!0})))):a.ZP.createElement(we.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:h,onClick:C})}()),a.ZP.createElement("div",{className:"answer-head",dir:E.isRtl?"rtl":void 0},a.ZP.createElement("span",{className:"answer-title",dir:"auto"},p),a.ZP.createElement("span",{className:"answer-percent",dir:E.isRtl?"auto":void 0},(b=s.votersCount,(I=r)>0?(b/I*100).toFixed():0),"%")));var b,I}))),Mr=(0,a.X$)((0,s.c$)((e=>{const{pollResults:{chatId:t,messageId:n},lastSyncTime:a}=e;return t&&n?{chat:(0,v.Z1)(e,t),message:(0,v.hj)(e,t,n),lastSyncTime:a}:{}}))((({onClose:e,isActive:t,chat:n,message:s,lastSyncTime:r})=>{const o=(0,u.Z)();if((0,m.ZP)(t,e),!s||!n)return a.ZP.createElement(we.Z,null);const{summary:i,results:l}=(0,g.t9)(s);if(!l.results)return;const c=(0,b.ee)(l.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,Pe.Z)(i.question,["emoji","br"])),a.ZP.createElement("div",{className:"poll-results-list custom-scroll"},r&&i.answers.map((e=>a.ZP.createElement(Nr,{key:`${s.id}-${e.option}`,chat:n,message:s,answer:e,answerVote:c[e.option],totalVoters:l.totalVoters}))),!r&&a.ZP.createElement(we.Z,null)))}))),Tr="Please provide first name",Fr=(0,a.X$)((0,s.c$)(((e,{userId:t})=>{const n=(0,v.dy)(e,t),a=(0,v.Z1)(e,t),{progress:s}=e.management;return{user:n,chat:a,progress:s,isMuted:(0,g.i4)(a,(0,v.dZ)(e),(0,v.NJ)(e))}}),((e,t)=>(0,b.ei)(t,["updateContact","deleteUser","closeManagement","openChat","deleteHistory"])))((({userId:e,user:t,chat:n,progress:s,isMuted:r,updateContact:i,deleteUser:l,deleteHistory:c,closeManagement:d,openChat:h,onClose:Z,isActive:P})=>{const[g,v,p]=(0,Xe.Z)(),[E,C]=(0,a.eJ)(!1),[f,b]=(0,a.eJ)(),I=(0,u.Z)();(0,m.ZP)(P,Z);const y=t&&t.firstName||"",S=t&&t.lastName||"",[w,k]=(0,a.eJ)(y),[N,M]=(0,a.eJ)(S),[T,F]=(0,a.eJ)(!r);(0,a.d4)((()=>{F(!r)}),[r]),(0,a.d4)((()=>{C(!1),p()}),[p,e]),(0,a.d4)((()=>{k(y),M(S)}),[y,S,t]),(0,a.d4)((()=>{s===o.wv.Complete&&(C(!1),b(void 0),p())}),[p,s]);const A=(0,a.I4)((e=>{k(e.target.value),C(!0)}),[]),L=(0,a.I4)((e=>{M(e.target.value),C(!0)}),[]),R=(0,a.I4)((e=>{F(e.target.checked),C(!0)}),[]),B=(0,a.I4)((()=>{const t=w.trim(),n=N.trim();t.length||b(Tr),i({userId:e,isMuted:!T,firstName:t,lastName:n})}),[w,N,i,e,T]),$=(0,a.I4)((()=>{c({chatId:n.id,shouldDeleteForAll:!1}),l({userId:e}),p(),d(),h({id:void 0})}),[n.id,p,d,c,l,h,e]);if(!t)return;const D=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(Ae.Z,{userId:t.id,avatarSize:"jumbo",status:"original name",withFullInfo:!0}),a.ZP.createElement(Ne.Z,{id:"user-first-name",label:I("UserInfo.FirstNamePlaceholder"),onChange:A,value:w,error:f===Tr?f:void 0}),a.ZP.createElement(Ne.Z,{id:"user-last-name",label:I("UserInfo.LastNamePlaceholder"),onChange:L,value:N}),a.ZP.createElement("div",{className:"ListItem no-selection narrow"},a.ZP.createElement(un.Z,{checked:T,label:I("Notifications"),subLabel:I(T?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),onChange:R}))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Te.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:v},I("DeleteContact")))),a.ZP.createElement(tn.Z,{isShown:E,onClick:B,disabled:D,ariaLabel:I("Save")},D?a.ZP.createElement(z.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Ge.Z,{isOpen:g,onClose:p,text:I("AreYouSureDeleteContact"),confirmLabel:I("DeleteContact"),confirmHandler:$,confirmIsDestructive:!0}))}))),Ar="Group title can't be empty",Lr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,v.Z1)(e,t),{progress:s}=e.management,r=Boolean(null===(n=a.fullInfo)||void 0===n?void 0:n.linkedChatId),o=(0,g.G9)(a);return{chat:a,progress:s,isBasicGroup:o,hasLinkedChannel:r,canChangeInfo:o?a.isCreator:(0,g.VE)(a,"changeInfo"),canBanUsers:o?a.isCreator:(0,g.VE)(a,"banUsers")}}),((e,t)=>(0,b.ei)(t,["togglePreHistoryHidden","updateChat","closeManagement","leaveChannel","deleteChannel","deleteChat","openChat"])))((({chatId:e,chat:t,progress:n,isBasicGroup:s,hasLinkedChannel:i,canChangeInfo:l,canBanUsers:c,onScreenSelect:d,togglePreHistoryHidden:Z,updateChat:P,deleteChat:v,leaveChannel:p,deleteChannel:E,closeManagement:C,openChat:f,onClose:b,isActive:I})=>{var y,S,w;const[k,N,M]=(0,Xe.Z)(),T=t.title,F=t.fullInfo&&t.fullInfo.about||"",[A,L]=(0,a.eJ)(!1),[R,B]=(0,a.eJ)(T),[$,D]=(0,a.eJ)(F),[x,U]=(0,a.eJ)(),[O,G]=(0,a.eJ)(),X=(0,g.RT)(t),J=(0,h.Z)(X,!1,r.IU.BlobUrl),_=(0,u.Z)();(0,m.ZP)(I,b),(0,a.d4)((()=>{n===o.wv.Complete&&(L(!1),G(void 0))}),[n]);const V=(0,a.I4)((()=>{d(o.u1.ChatPrivacyType)}),[d]),H=(0,a.I4)((()=>{d(o.u1.Discussion)}),[d]),Y=(0,a.I4)((()=>{d(o.u1.GroupPermissions)}),[d]),j=(0,a.I4)((()=>{d(o.u1.ChatAdministrators)}),[d]),K=(0,a.I4)((e=>{U(e),L(!0)}),[]),q=(0,a.I4)((e=>{B(e.target.value),L(!0)}),[]),W=(0,a.I4)((e=>{D(e.target.value),L(!0)}),[]),Q=(0,a.I4)((()=>{const t=R.trim(),n=$.trim();t.length?P({chatId:e,title:t,about:n,photo:x}):G(Ar)}),[$,e,x,R,P]),ee=(0,a.I4)((()=>{d(o.u1.GroupMembers)}),[d]),te=(0,a.I4)((()=>{if(!t.fullInfo)return;const{isPreHistoryHidden:e}=t.fullInfo;Z({chatId:t.id,isEnabled:!e})}),[t,Z]),ne=(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]),ae=(null===(y=t.fullInfo)||void 0===y||null===(S=y.adminMembers)||void 0===S?void 0:S.length)||0,se=(0,a.I4)((()=>{s?v({chatId:t.id}):t.isCreator?E({chatId:t.id}):p({chatId:t.id}),M(),C(),f({id:void 0})}),[s,t.isCreator,t.id,M,C,p,E,v,f]);if(t.isRestricted)return;const re=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(en.Z,{currentAvatarBlobUrl:J,onChange:K,disabled:!l}),a.ZP.createElement(Ne.Z,{id:"group-title",label:_("GroupName"),onChange:q,value:R,error:O===Ar?O:void 0,disabled:!l}),a.ZP.createElement(Ne.Z,{id:"group-about",className:"mb-2",label:_("DescriptionPlaceholder"),onChange:W,value:$,disabled:!l}),t.isCreator&&a.ZP.createElement(Te.Z,{icon:"lock",multiline:!0,onClick:V},a.ZP.createElement("span",{className:"title"},_("GroupType")),a.ZP.createElement("span",{className:"subtitle"},t.username?_("TypePublic"):_("TypePrivate"))),i&&a.ZP.createElement(Te.Z,{icon:"message",multiline:!0,onClick:H},a.ZP.createElement("span",{className:"title"},_("LinkedChannel")),a.ZP.createElement("span",{className:"subtitle"},_("DiscussionUnlink"))),a.ZP.createElement(Te.Z,{icon:"permissions",multiline:!0,onClick:Y,disabled:!c},a.ZP.createElement("span",{className:"title"},_("ChannelPermissions")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},ne,"/",8)),a.ZP.createElement(Te.Z,{icon:"admin",multiline:!0,onClick:j},a.ZP.createElement("span",{className:"title"},_("ChannelAdministrators")),a.ZP.createElement("span",{className:"subtitle"},(0,Fn.kh)(ae)))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Te.Z,{icon:"group",multiline:!0,onClick:ee},a.ZP.createElement("span",{className:"title"},_("GroupMembers")),a.ZP.createElement("span",{className:"subtitle"},(0,Fn.kh)(null!==(w=t.membersCount)&&void 0!==w?w:0))),t.fullInfo&&a.ZP.createElement("div",{className:"ListItem narrow no-selection"},a.ZP.createElement(un.Z,{checked:!t.fullInfo.isPreHistoryHidden,label:_("ChatHistory"),onChange:te,disabled:!c}))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Te.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:N},_("DeleteMega")))),a.ZP.createElement(tn.Z,{isShown:A,onClick:Q,disabled:re,ariaLabel:_("Save")},re?a.ZP.createElement(z.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Ge.Z,{isOpen:k,onClose:M,textParts:(0,Pe.Z)(s||!t.isCreator?_("AreYouSureDeleteAndExit"):_("AreYouSureDeleteThisChatWithGroup",t.title),["br","simple_markdown"]),confirmLabel:s||!t.isCreator?_("DeleteMega"):_("DeleteGroupForAll"),confirmHandler:se,confirmIsDestructive:!0}))}))),Rr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>({chat:(0,v.Z1)(e,t),currentUserId:e.currentUserId})),((e,t)=>(0,b.ei)(t,["updateChatDefaultBannedRights"])))((({onScreenSelect:e,onChatMemberSelect:t,chat:n,currentUserId:s,updateChatDefaultBannedRights:r,onClose:i,isActive:l})=>{const[c,d]=(0,a.eJ)({}),[h,Z]=(0,a.eJ)(!1),[P,g]=(0,a.eJ)(!1),v=(0,u.Z)();(0,m.ZP)(l,i);const p=(0,a.I4)((()=>{e(o.u1.GroupRemovedUsers)}),[e]),E=(0,a.I4)((()=>{e(o.u1.GroupUserPermissionsCreate)}),[e]),C=(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)||{}),Z(!1),setTimeout((()=>{g(!1)}),250)}),[n]);const f=(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])}}))),Z(!0)}),[]),b=(0,a.I4)((()=>{n&&(g(!0),r({chatId:n.id,bannedRights:c}))}),[n,c,r]),I=(0,a.Ye)((()=>n&&n.fullInfo&&n.fullInfo.kickedMembers?n.fullInfo.kickedMembers.length:0),[n]),y=(0,a.Ye)((()=>n&&n.fullInfo&&n.fullInfo.members?n.fullInfo.members.filter((({bannedRights:e})=>!!e)):[]),[n]),S=(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=v(s);return`${e}${e.length?`, ${r}`:r}`}),"")}),[n,v]);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"},v("ChannelPermissionsHeader")),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"sendMessages",checked:!c.sendMessages,label:v("UserRestrictionsSend"),blocking:!0,onChange:f})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"sendMedia",checked:!c.sendMedia,label:v("UserRestrictionsSendMedia"),blocking:!0,onChange:f})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"sendStickers",checked:!c.sendStickers&&!c.sendGifs,label:v("UserRestrictionsSendStickers"),blocking:!0,onChange:f})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"sendPolls",checked:!c.sendPolls,label:v("UserRestrictionsSendPolls"),blocking:!0,onChange:f})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"embedLinks",checked:!c.embedLinks,label:v("UserRestrictionsEmbedLinks"),blocking:!0,onChange:f})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"inviteUsers",checked:!c.inviteUsers,label:v("UserRestrictionsInviteUsers"),blocking:!0,onChange:f})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"pinMessages",checked:!c.pinMessages,label:v("UserRestrictionsPinMessages"),blocking:!0,onChange:f})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"changeInfo",checked:!c.changeInfo,label:v("UserRestrictionsChangeInfo"),blocking:!0,onChange:f}))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Te.Z,{icon:"delete-user",multiline:!0,narrow:!0,onClick:p},a.ZP.createElement("span",{className:"title"},v("ChannelBlockedUsers")),a.ZP.createElement("span",{className:"subtitle"},I))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement("h3",{className:"section-heading",dir:"auto"},v("PrivacyExceptions")),a.ZP.createElement(Te.Z,{icon:"add-user",onClick:E},v("ChannelAddException")),y.map((e=>a.ZP.createElement(Te.Z,{key:e.userId,className:"chat-item-clickable exceptions-member",onClick:()=>C(e)},a.ZP.createElement(Ae.Z,{userId:e.userId,status:S(e)})))))),a.ZP.createElement(tn.Z,{isShown:h,onClick:b,ariaLabel:v("Save"),disabled:P},P?a.ZP.createElement(z.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})))}))),Br=(0,a.X$)((0,s.c$)((e=>{const{currentUserId:t}=e;return{currentUserId:t}}),((e,t)=>(0,b.ei)(t,["loadMoreMembers","deleteChatMember"])))((({chat:e,currentUserId:t,isOpen:n,onClose:r,loadMoreMembers:o,deleteChatMember:i})=>{var l;const c=(0,u.Z)(),[d,m]=(0,a.eJ)(""),h=(0,a.sO)(null),Z=(0,a.Ye)((()=>{var n;const a=((null===(n=e.fullInfo)||void 0===n?void 0:n.members)||[]).reduce(((e,n)=>(n.isAdmin||n.isOwner||n.userId===t||e.push(n.userId),e)),[]),r=(0,s.Rd)().users.byId;return(0,g.kK)(a,r,d)}),[null===(l=e.fullInfo)||void 0===l?void 0:l.members,t,d]),P=(0,a.I4)((t=>{i({chatId:e.id,userId:t}),r()}),[e.id,i,r]);return a.ZP.createElement(Le,{isOpen:n,chatOrUserIds:Z,filterRef:h,filterPlaceholder:c("ChannelBlockUser"),filter:d,onFilterChange:m,loadMore:o,onSelectChatOrUser:P,onClose:r})}))),$r=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,v.Z1)(e,t),{byId:a}=e.users;return{chat:n,usersById:a,canDeleteMembers:n&&((0,g.VE)(n,"banUsers")||n.isCreator)}}),((e,t)=>(0,b.ei)(t,["updateChatMemberBannedRights"])))((({chat:e,usersById:t,canDeleteMembers:n,updateChatMemberBannedRights:s,onClose:r,isActive:o})=>{const i=(0,u.Z)(),[l,c,d]=(0,Xe.Z)();(0,m.ZP)(o,r);const h=(0,a.Ye)((()=>e&&e.fullInfo&&e.fullInfo.kickedMembers?e.fullInfo.kickedMembers:[]),[e]),Z=(0,a.I4)((e=>{if(!e.kickedByUserId)return;const n=t[e.kickedByUserId];return n?i("UserRemovedBy",(0,g.Js)(n)):void 0}),[i,t]),P=(0,a.I4)((t=>{if(e)return[{title:i("Unblock"),icon:"delete",destructive:!0,handler:()=>s({chatId:e.id,userId:t.userId,bannedRights:{}})}]}),[i,e,s]);return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section",dir:i.isRtl?"rtl":void 0},a.ZP.createElement("p",{className:"text-muted"},i("NoBlockedGroup2")),h.map((e=>a.ZP.createElement(Te.Z,{key:e.userId,className:"chat-item-clickable",ripple:!0,contextActions:P(e)},a.ZP.createElement(Ae.Z,{userId:e.userId,status:Z(e)})))),n&&a.ZP.createElement(tn.Z,{isShown:!0,onClick:c,ariaLabel:i("Channel.EditAdmin.Permission.BanUsers")},a.ZP.createElement("i",{className:"icon-add-user-filled"})),e&&n&&a.ZP.createElement(Br,{chat:e,isOpen:l,onClose:d}))))}))),Dr="Channel title can't be empty",xr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,v.Z1)(e,t),{progress:a}=e.management;return{chat:n,progress:a,isSignaturesShown:Boolean(null==n?void 0:n.isSignaturesShown),canChangeInfo:(0,g.VE)(n,"changeInfo")}}),((e,t)=>(0,b.ei)(t,["toggleSignatures","updateChat","closeManagement","leaveChannel","deleteChannel","openChat"])))((({chatId:e,chat:t,progress:n,isSignaturesShown:s,canChangeInfo:i,onScreenSelect:l,updateChat:c,toggleSignatures:d,closeManagement:Z,leaveChannel:P,deleteChannel:v,openChat:p,onClose:E,isActive:C})=>{var f,b,I,y;const S=t&&t.title||"",w=null!=t&&t.fullInfo&&t.fullInfo.about||"",k=null==t||null===(f=t.fullInfo)||void 0===f?void 0:f.linkedChatId,[N,M,T]=(0,Xe.Z)(),[F,A]=(0,a.eJ)(!1),[L,R]=(0,a.eJ)(S),[B,$]=(0,a.eJ)(w),[D,x]=(0,a.eJ)(),[U,O]=(0,a.eJ)(),G=t&&(0,g.RT)(t),X=(0,h.Z)(G,!1,r.IU.BlobUrl),J=(0,u.Z)();(0,m.ZP)(C,E),(0,a.d4)((()=>{n===o.wv.Complete&&(A(!1),O(void 0))}),[n]);const _=(null==t||null===(b=t.fullInfo)||void 0===b||null===(I=b.adminMembers)||void 0===I?void 0:I.length)||0,V=(0,a.I4)((()=>{l(o.u1.ChatPrivacyType)}),[l]),H=(0,a.I4)((()=>{l(o.u1.Discussion)}),[l]),Y=(0,a.I4)((()=>{l(o.u1.ChatAdministrators)}),[l]),j=(0,a.I4)((e=>{x(e),A(!0)}),[]),K=(0,a.I4)((e=>{R(e.target.value),A(!0)}),[]),q=(0,a.I4)((e=>{$(e.target.value),A(!0)}),[]),W=(0,a.I4)((()=>{const t=L.trim(),n=B.trim();t.length?c({chatId:e,title:t,about:n,photo:D}):O(Dr)}),[B,e,D,L,c]),Q=(0,a.I4)((()=>{d({chatId:e,isEnabled:!s})}),[e,s,d]),ee=(0,a.I4)((()=>{l(o.u1.ChannelSubscribers)}),[l]),te=(0,a.I4)((()=>{t.isCreator?v({chatId:t.id}):P({chatId:t.id}),T(),Z(),p({id:void 0})}),[t.isCreator,t.id,T,Z,P,v,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(en.Z,{currentAvatarBlobUrl:X,onChange:j,disabled:!i}),a.ZP.createElement(Ne.Z,{id:"channel-title",label:J("EnterChannelName"),onChange:K,value:L,error:U===Dr?U:void 0,disabled:!i}),a.ZP.createElement(Ne.Z,{id:"channel-about",className:"mb-2",label:J("DescriptionPlaceholder"),onChange:q,value:B,disabled:!i}),t.isCreator&&a.ZP.createElement(Te.Z,{icon:"lock",multiline:!0,onClick:V},a.ZP.createElement("span",{className:"title"},J("ChannelType")),a.ZP.createElement("span",{className:"subtitle"},t.username?J("TypePublic"):J("TypePrivate"))),a.ZP.createElement(Te.Z,{icon:"message",multiline:!0,onClick:H,disabled:!i},a.ZP.createElement("span",{className:"title"},J("Discussion")),a.ZP.createElement("span",{className:"subtitle"},J(k?"DiscussionUnlink":"Add"))),a.ZP.createElement(Te.Z,{icon:"admin",multiline:!0,onClick:Y},a.ZP.createElement("span",{className:"title"},J("ChannelAdministrators")),a.ZP.createElement("span",{className:"subtitle"},_)),a.ZP.createElement("div",{className:"ListItem no-selection narrow"},a.ZP.createElement(un.Z,{checked:s,label:J("ChannelSignMessages"),onChange:Q}))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Te.Z,{icon:"group",multiline:!0,onClick:ee},a.ZP.createElement("span",{className:"title",dir:"auto"},J("ChannelSubscribers")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},J("Subscribers",null!==(y=t.membersCount)&&void 0!==y?y:0,"i")))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Te.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:M},t.isCreator?J("ChannelDelete"):J("LeaveChannel")))),a.ZP.createElement(tn.Z,{isShown:F,onClick:W,disabled:ne,ariaLabel:J("Save")},ne?a.ZP.createElement(z.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Ge.Z,{isOpen:N,onClose:T,text:t.isCreator?J("ChannelDeleteAlert"):J("ChannelLeaveAlert"),confirmLabel:t.isCreator?J("ChannelDelete"):J("LeaveChannel"),confirmHandler:te,confirmIsDestructive:!0}))})));var Ur=n(88);const Or=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,v.Z1)(e,t),{isUsernameAvailable:a}=(0,v.aW)(e,t);return{chat:n,isChannel:(0,g.eA)(n),progress:e.management.progress,isUsernameAvailable:a}}),((e,t)=>(0,b.ei)(t,["checkPublicLink","updatePublicLink","updatePrivateLink"])))((({chat:e,onClose:t,isActive:n,isChannel:s,progress:r,isUsernameAvailable:i,checkPublicLink:l,updatePublicLink:c,updatePrivateLink:d})=>{var h;const Z=Boolean(e.username),P=null===(h=e.fullInfo)||void 0===h?void 0:h.inviteLink,[g,v]=(0,a.eJ)(Z?"public":"private"),[p,E]=(0,a.eJ)(),[C,f,b]=(0,Xe.Z)(),I=Boolean("public"===g&&p&&i||"private"===g&&Z);(0,m.ZP)(n,t),(0,a.d4)((()=>{g&&!P&&d()}),[g,P,d]);const y=(0,a.I4)((e=>{v(e)}),[]),S=(0,a.I4)((()=>{c({username:"public"===g?p:""})}),[g,c,p]),w=(0,a.I4)((()=>{b(),d()}),[b,d]),k=(0,u.Z)(),N=s?"Channel":"Mega",M=s?"Channel":"Group",T=[{value:"private",label:k(`${N}Private`),subLabel:k(`${N}PrivateInfo`)},{value:"public",label:k(`${N}Public`),subLabel:k(`${N}PublicInfo`)}],F=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:k.isRtl?"rtl":void 0},a.ZP.createElement("h3",{className:"section-heading"},k(`${M}Type`)),a.ZP.createElement(tt.Z,{selected:g,name:"channel-type",options:T,onChange:y})),"private"===g?a.ZP.createElement("div",{className:"section",dir:k.isRtl?"rtl":void 0},P?a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(Ur.Z,{url:P,className:"group-link",text:P}),a.ZP.createElement("p",{className:"section-info",dir:k.isRtl?"rtl":void 0},k(`${N}PrivateLinkHelp`)),a.ZP.createElement(Te.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:f},k("RevokeLink")),a.ZP.createElement(Ge.Z,{isOpen:C,onClose:b,text:k("RevokeAlert"),confirmLabel:k("RevokeButton"),confirmHandler:w,confirmIsDestructive:!0})):a.ZP.createElement(we.Z,null)):a.ZP.createElement("div",{className:"section no-border"},a.ZP.createElement(on,{asLink:!0,currentUsername:e.username,isLoading:F,isUsernameAvailable:i,checkUsername:l,onChange:E}),a.ZP.createElement("p",{className:"section-info",dir:"auto"},k(`${M}.Username.CreatePublicLinkHelp`)))),a.ZP.createElement(tn.Z,{isShown:I,disabled:F,ariaLabel:k("Save"),onClick:S},F?a.ZP.createElement(z.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})))}))),Gr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,v.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,v.Z1)(e,a.fullInfo.linkedChatId):void 0,isChannel:a&&(0,g.eA)(a)}}),((e,t)=>(0,b.ei)(t,["loadGroupsForDiscussion","linkDiscussionGroup","unlinkDiscussionGroup"])))((({chat:e,onClose:t,isActive:n,chatId:s,chatsByIds:r,linkedChat:l,forDiscussionIds:c,isChannel:d,onScreenSelect:h,loadGroupsForDiscussion:Z,linkDiscussionGroup:P,unlinkDiscussionGroup:g})=>{const[v,p]=(0,a.eJ)(),[E,C]=(0,a.eJ)(),[f,b]=(0,a.eJ)(!1),I=(0,a.I4)((()=>b(!0)),[]),[y,S,w]=(0,Xe.Z)(),[k,N,M]=(0,Xe.Z)(),T=(0,u.Z)(),F=null==l?void 0:l.id;(0,m.ZP)(n,t),(0,a.d4)((()=>{Z()}),[Z]),(0,a.d4)((()=>{E||(0,Pn.Z)("DiscussionGroups").then(C)}),[E]);const A=(0,a.I4)((()=>{w(),g({channelId:d?s:F}),d||h(o.u1.Initial)}),[w,g,d,s,F,h]),L=(0,a.I4)((()=>{M(),P({channelId:s,chatId:v})}),[M,P,s,v]);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"},E&&a.ZP.createElement(gn.Z,{id:"discussionGroupsDucks",size:i.bM,animationData:E,play:f,noLoop:!0,onLoad:I})),l&&a.ZP.createElement("div",null,a.ZP.createElement(Te.Z,{className:"chat-item-clickable",inactive:!0},a.ZP.createElement(Fe.Z,{chatId:l.id})),a.ZP.createElement(Te.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:S},T(d?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel")),a.ZP.createElement(Ge.Z,{isOpen:y,onClose:w,header:a.ZP.createElement("div",{className:"modal-header"},a.ZP.createElement(ge.Z,{size:"tiny",chat:l}),a.ZP.createElement("div",{className:"modal-title"},T(d?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"))),textParts:(0,Pe.Z)(T(d?"DiscussionUnlinkChannelAlert":"DiscussionUnlinkGroupAlert",l.title),["br","simple_markdown"]),confirmLabel:T(d?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"),confirmHandler:A,confirmIsDestructive:!0})),!l&&a.ZP.createElement("div",null,a.ZP.createElement("p",{className:"section-help",dir:"auto"},T("DiscussionChannelHelp")),a.ZP.createElement("div",{teactFastList:!0},a.ZP.createElement(Te.Z,{key:"create-group",icon:"group",ripple:!0,teactOrderKey:0,className:"not-implemented"},T("DiscussionCreateGroup")),c?c.map(((e,t)=>a.ZP.createElement(Te.Z,{key:e,teactOrderKey:t+1,className:"chat-item-clickable scroll-item",onClick:()=>{p(e),N()}},a.ZP.createElement(Fe.Z,{chatId:e})))):a.ZP.createElement(Et.Z,{key:"nothing-found",teactOrderKey:0,text:"No discussion groups found"})),a.ZP.createElement("p",{className:"mt-4 mb-0 section-help",dir:"auto"},T("DiscussionChannelHelp2")),a.ZP.createElement(Ge.Z,{isOpen:k,onClose:M,header:function(){const e=r[v];if(e)return a.ZP.createElement("div",{className:"modal-header"},a.ZP.createElement(ge.Z,{size:"tiny",chat:e}),a.ZP.createElement("div",{className:"modal-title"},T("Channel.DiscussionGroup.LinkGroup")))}(),textParts:function(){const t=r[v];if(t)return t.hasPrivateLink?(0,Pe.Z)(`Do you want to make **${t.title}** the discussion board for **${e.title}**?`,["br","simple_markdown"]):(0,Pe.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:T("DiscussionLinkGroup"),confirmHandler:L,isButtonsInOneRow:!0})))))}))),zr=(0,a.X$)((0,s.c$)(((e,{chatId:t,isPromotedByCurrentUser:n})=>{const a=(0,v.Z1)(e,t);return{chat:a,isFormFullyDisabled:!(a.isCreator||n)}}),((e,t)=>(0,b.ei)(t,["updateChatMemberBannedRights"])))((({chat:e,selectedChatMemberId:t,onScreenSelect:n,updateChatMemberBannedRights:s,isFormFullyDisabled:r,onClose:i,isActive:l})=>{const[c,d]=(0,a.eJ)({}),[h,Z]=(0,a.eJ)(!1),[P,g]=(0,a.eJ)(!1),[v,p,E]=(0,Xe.Z)(),C=(0,u.Z)();(0,m.ZP)(l,i);const f=(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&&!f&&n(o.u1.GroupPermissions)}),[e,n,f,t]),(0,a.d4)((()=>{d((null==f?void 0:f.bannedRights)||(null==e?void 0:e.defaultBannedRights)||{}),Z(!1),g(!1)}),[e,f]);const b=(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])}}))),Z(!0)}),[]),I=(0,a.I4)((()=>{e&&t&&(g(!0),s({chatId:e.id,userId:t,bannedRights:c}))}),[e,t,c,s]),y=(0,a.I4)((()=>{e&&t&&s({chatId:e.id,userId:t,bannedRights:{viewMessages:!0}})}),[e,t,s]),S=(0,a.I4)((t=>!!r||!(!e||!e.defaultBannedRights)&&e.defaultBannedRights[t]),[e,r]);if(f)return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Te.Z,{inactive:!0,className:"chat-item-clickable"},a.ZP.createElement(Ae.Z,{userId:f.userId})),a.ZP.createElement("h3",{className:"section-heading mt-4",dir:"auto"},C("UserRestrictionsCanDo")),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"sendMessages",checked:!c.sendMessages,label:C("UserRestrictionsSend"),blocking:!0,disabled:S("sendMessages"),onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"sendMedia",checked:!c.sendMedia,label:C("UserRestrictionsSendMedia"),blocking:!0,disabled:S("sendMedia"),onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"sendStickers",checked:!c.sendStickers&&!c.sendGifs,label:C("UserRestrictionsSendStickers"),blocking:!0,disabled:S("sendStickers"),onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"sendPolls",checked:!c.sendPolls,label:C("UserRestrictionsSendPolls"),blocking:!0,disabled:S("sendPolls"),onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"embedLinks",checked:!c.embedLinks,label:C("UserRestrictionsEmbedLinks"),blocking:!0,disabled:S("embedLinks"),onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"inviteUsers",checked:!c.inviteUsers,label:C("UserRestrictionsInviteUsers"),blocking:!0,disabled:S("inviteUsers"),onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"pinMessages",checked:!c.pinMessages,label:C("UserRestrictionsPinMessages"),blocking:!0,disabled:S("pinMessages"),onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"changeInfo",checked:!c.changeInfo,label:C("UserRestrictionsChangeInfo"),blocking:!0,disabled:S("changeInfo"),onChange:b}))),!r&&a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Te.Z,{icon:"delete-user",ripple:!0,destructive:!0,onClick:p},C("UserRestrictionsBlock")))),a.ZP.createElement(tn.Z,{isShown:h,onClick:I,ariaLabel:C("Save"),disabled:P},P?a.ZP.createElement(z.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Ge.Z,{isOpen:v,onClose:E,text:"Are you sure you want to ban and remove this user from the group?",confirmLabel:"Remove",confirmHandler:y,confirmIsDestructive:!0}))}))),Xr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,v.Z1)(e,t),{byId:a}=e.users;return{chat:n,currentUserId:e.currentUserId,isChannel:(0,g.eA)(n),usersById:a}}))((({chat:e,isChannel:t,currentUserId:n,usersById:s,onScreenSelect:r,onChatMemberSelect:i,onClose:l,isActive:c})=>{const d=(0,u.Z)();(0,m.ZP)(c,l);const h=(0,a.Ye)((()=>e.fullInfo&&e.fullInfo.adminMembers?e.fullInfo.adminMembers.sort(((e,t)=>e.isOwner?-1:t.isOwner?1:0)):[]),[e]),Z=(0,a.I4)((e=>{i(e.userId,e.promotedByUserId===n),r(o.u1.ChatAdminRights)}),[n,i,r]),P=(0,a.I4)((e=>{if(e.isOwner)return d("ChannelCreator");const t=e.promotedByUserId?s[e.promotedByUserId]:void 0;return t?d("EditAdminPromotedBy",(0,g.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(Te.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."),h.map((e=>a.ZP.createElement(Te.Z,{key:e.userId,className:"chat-item-clickable",onClick:()=>Z(e)},a.ZP.createElement(Ae.Z,{userId:e.userId,status:P(e),forceShowSelf:!0})))))))}))),Jr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>({chat:(0,v.Z1)(e,t)})))((({chat:e,onClose:t,isActive:n})=>{const s=(0,u.Z)();(0,m.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(un.Z,{name:"changeInfo",checked:!0,label:s("EventLogAllEvents"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterNewAdmins"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterNewMembers"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterChannelInfo"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterDeletedMessages"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterEditedMessages"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.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(un.Z,{name:"changeInfo",checked:!0,label:s("EventLogAllAdmins"),onChange:void 0})),r.map((e=>a.ZP.createElement(Te.Z,{key:e.userId,className:"chat-item-clickable picker-list-item",onClick:void 0,ripple:!0},a.ZP.createElement(un.Z,{label:"",checked:!0}),a.ZP.createElement(Ae.Z,{userId:e.userId,status:o(e),forceShowSelf:!0})))))))}))),_r=(0,a.X$)((0,s.c$)(((e,{chatId:t,isPromotedByCurrentUser:n})=>{const a=(0,v.Z1)(e,t),{byId:s}=e.users,{currentUserId:r}=e;return{chat:a,usersById:s,currentUserId:r,isChannel:(0,g.eA)(a),isFormFullyDisabled:!(a.isCreator||n)}}),((e,t)=>(0,b.ei)(t,["updateChatAdmin"])))((({selectedChatMemberId:e,onScreenSelect:t,chat:n,usersById:s,currentUserId:r,isChannel:i,isFormFullyDisabled:l,updateChatAdmin:c,onClose:d,isActive:h})=>{const[Z,P]=(0,a.eJ)({}),[v,p]=(0,a.eJ)(!1),[E,C]=(0,a.eJ)(!1),[f,b,I]=(0,Xe.Z)(),[y,S]=(0,a.eJ)(""),w=(0,u.Z)();(0,m.ZP)(h,d);const k=(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&&!k&&t(o.u1.ChatAdministrators)}),[n,t,k,e]),(0,a.d4)((()=>{P((null==k?void 0:k.adminRights)||{}),S(((null==k?void 0:k.customTitle)||"").substr(0,16)),p(!1),C(!1)}),[k]);const N=(0,a.I4)((e=>{const{name:t}=e.target;P((e=>{return{...e,[t]:(n=e[t],!n||void 0)};var n})),p(!0)}),[]),M=(0,a.I4)((()=>{e&&(C(!0),c({chatId:n.id,userId:e,adminRights:Z,customTitle:y}))}),[n,e,Z,y,c]),T=(0,a.I4)((()=>{e&&(c({chatId:n.id,userId:e,adminRights:{}}),I())}),[n.id,I,e,c]),F=(0,a.I4)((e=>!((0,g.G9)(n)||!l&&n.adminRights&&n.adminRights[e])),[n,l]),A=(0,a.Ye)((()=>{if(!k)return;if(k.isOwner)return w("ChannelCreator");const e=k.promotedByUserId?s[k.promotedByUserId]:void 0;return e?w("EditAdminPromotedBy",(0,g.Js)(e)):w("ChannelAdmin")}),[k,s,w]),L=(0,a.I4)((e=>{const{value:t}=e.target;S(t),p(!0)}),[]);if(k)return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Te.Z,{inactive:!0,className:"chat-item-clickable"},a.ZP.createElement(Ae.Z,{userId:k.userId,status:A,forceShowSelf:!0})),a.ZP.createElement("h3",{className:"section-heading mt-4",dir:"auto"},w("EditAdminWhatCanDo")),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"changeInfo",checked:!!Z.changeInfo,label:w(i?"EditAdminChangeChannelInfo":"EditAdminChangeGroupInfo"),blocking:!0,disabled:F("changeInfo"),onChange:N})),i&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"postMessages",checked:!!Z.postMessages,label:w("EditAdminPostMessages"),blocking:!0,disabled:F("postMessages"),onChange:N})),i&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"editMessages",checked:!!Z.editMessages,label:w("EditAdminEditMessages"),blocking:!0,disabled:F("editMessages"),onChange:N})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"deleteMessages",checked:!!Z.deleteMessages,label:w(i?"EditAdminDeleteMessages":"EditAdminGroupDeleteMessages"),blocking:!0,disabled:F("deleteMessages"),onChange:N})),!i&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"banUsers",checked:!!Z.banUsers,label:w("EditAdminBanUsers"),blocking:!0,disabled:F("banUsers"),onChange:N})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"inviteUsers",checked:!!Z.inviteUsers,label:w("EditAdminAddUsers"),blocking:!0,disabled:F("inviteUsers"),onChange:N})),!i&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"pinMessages",checked:!!Z.pinMessages,label:w("EditAdminPinMessages"),blocking:!0,disabled:F("pinMessages"),onChange:N})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"addAdmins",checked:!!Z.addAdmins,label:w("EditAdminAddAdmins"),blocking:!0,disabled:F("addAdmins"),onChange:N})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"manageCall",checked:!!Z.manageCall,label:w("StartVoipChatPermission"),blocking:!0,disabled:F("manageCall"),onChange:N})),!i&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(un.Z,{name:"anonymous",checked:!!Z.anonymous,label:w("EditAdminSendAnonymously"),blocking:!0,disabled:F("anonymous"),onChange:N})),l&&a.ZP.createElement("p",{className:"section-info mb-4",dir:"auto"},w("Channel.EditAdmin.CannotEdit")),!i&&a.ZP.createElement(Ne.Z,{id:"admin-title",label:w("EditAdminRank"),onChange:L,value:y,disabled:l,maxLength:16}),r!==e&&!l&&a.ZP.createElement(Te.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:b},w("EditAdminRemoveAdmin")))),a.ZP.createElement(tn.Z,{isShown:v,onClick:M,ariaLabel:w("Save"),disabled:E},E?a.ZP.createElement(z.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Ge.Z,{isOpen:f,onClose:I,text:"Are you sure you want to dismiss this admin?",confirmLabel:"Dismiss",confirmHandler:T,confirmIsDestructive:!0}))}))),Vr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,v.Z1)(e,t),{byId:s,statusesById:r}=e.users;return{members:null==a||null===(n=a.fullInfo)||void 0===n?void 0:n.members,usersById:s,userStatusesById:r,isChannel:a&&(0,g.eA)(a),serverTimeOffset:e.serverTimeOffset}}),((e,t)=>(0,b.ei)(t,["openUserInfo"])))((({members:e,usersById:t,userStatusesById:n,isChannel:s,openUserInfo:r,onClose:o,isActive:i,serverTimeOffset:l})=>{const c=(0,a.Ye)((()=>{if(e&&t)return(0,g.Z0)(e.map((({userId:e})=>e)),t,n,void 0,l)}),[e,l,t,n]),d=(0,a.I4)((e=>{r({id:e})}),[r]);return(0,m.ZP)(i,o),a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section",teactFastList:!0},c?c.map(((e,t)=>a.ZP.createElement(Te.Z,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>d(e)},a.ZP.createElement(Ae.Z,{userId:e,forceShowSelf:!0})))):a.ZP.createElement(Et.Z,{teactOrderKey:0,key:"nothing-found",text:s?"No subscribers found":"No members found"}))))}))),Hr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,v.Z1)(e,t),{byId:s,statusesById:r}=e.users;return{members:null==a||null===(n=a.fullInfo)||void 0===n?void 0:n.members,usersById:s,userStatusesById:r,isChannel:a&&(0,g.eA)(a),serverTimeOffset:e.serverTimeOffset}}))((({usersById:e,userStatusesById:t,members:n,isChannel:s,onScreenSelect:r,onChatMemberSelect:i,onClose:l,isActive:c,serverTimeOffset:d})=>{(0,m.ZP)(c,l);const u=(0,a.Ye)((()=>{if(n&&e)return(0,g.Z0)(n.filter((e=>!e.isOwner)).map((({userId:e})=>e)),e,t,void 0,d)}),[n,d,e,t]),h=(0,a.I4)((e=>{i(e),r(o.u1.GroupUserPermissions)}),[i,r]);return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section",teactFastList:!0},u?u.map(((e,t)=>a.ZP.createElement(Te.Z,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>h(e)},a.ZP.createElement(Ae.Z,{userId:e,forceShowSelf:!0})))):a.ZP.createElement(Et.Z,{teactOrderKey:0,key:"nothing-found",text:s?"No subscribers found":"No members found"}))))}))),Yr=(0,a.X$)((0,s.c$)((e=>({managementType:(0,v.pP)(e)})))((({chatId:e,currentScreen:t,selectedChatMemberId:n,isPromotedByCurrentUser:s,onScreenSelect:r,onChatMemberSelect:i,onClose:l,isActive:c,managementType:d})=>{switch(t){case o.u1.Initial:switch(d){case"user":return a.ZP.createElement(Fr,{key:e,userId:e,onClose:l,isActive:c});case"group":return a.ZP.createElement(Lr,{key:e,chatId:e,onScreenSelect:r,onClose:l,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(xr,{key:e,chatId:e,onScreenSelect:r,onClose:l,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(Or,{chatId:e,isActive:c,onClose:l});case o.u1.Discussion:return a.ZP.createElement(Gr,{chatId:e,onScreenSelect:r,isActive:c,onClose:l});case o.u1.GroupPermissions:return a.ZP.createElement(Rr,{chatId:e,onScreenSelect:r,onChatMemberSelect:i,isActive:c||[o.u1.GroupRemovedUsers,o.u1.GroupUserPermissionsCreate,o.u1.GroupUserPermissions].includes(t),onClose:l});case o.u1.GroupRemovedUsers:return a.ZP.createElement($r,{chatId:e,isActive:c,onClose:l});case o.u1.GroupUserPermissionsCreate:return a.ZP.createElement(Hr,{chatId:e,onChatMemberSelect:i,onScreenSelect:r,isActive:c||[o.u1.GroupUserPermissions].includes(t),onClose:l});case o.u1.GroupUserPermissions:return a.ZP.createElement(zr,{chatId:e,selectedChatMemberId:n,isPromotedByCurrentUser:s,onScreenSelect:r,isActive:c,onClose:l});case o.u1.ChatAdministrators:return a.ZP.createElement(Xr,{chatId:e,onScreenSelect:r,onChatMemberSelect:i,isActive:c||[o.u1.ChatAdminRights,o.u1.GroupRecentActions].includes(t),onClose:l});case o.u1.GroupRecentActions:return a.ZP.createElement(Jr,{chatId:e,isActive:c,onClose:l});case o.u1.ChatAdminRights:return a.ZP.createElement(_r,{chatId:e,selectedChatMemberId:n,isPromotedByCurrentUser:s,onScreenSelect:r,isActive:c,onClose:l});case o.u1.ChannelSubscribers:case o.u1.GroupMembers:return a.ZP.createElement(Vr,{chatId:e,isActive:c,onClose:l})}})));var jr=n(9937);const Kr=/^4[0-9]{12}(?:[0-9]{1,3})?$/,qr=/^5[1-5][0-9]{11,14}$/,Wr=/^2[2-7][0-9]{11,14}$/;let Qr;!function(e){e[e.Default=0]="Default",e[e.Visa=1]="Visa",e[e.Mastercard=2]="Mastercard"}(Qr||(Qr={}));const eo={[Qr.Default]:"",[Qr.Visa]:"visa",[Qr.Mastercard]:"mastercard"};function to(e){return e=e.replace(/\s/g,""),Kr.test(e)?Qr.Visa:qr.test(e)||Wr.test(e)?Qr.Mastercard:Qr.Default}const no={},ao=/(\d{1,3})(\d{1,3})?(\d{1,3})?(\d{1,3})?(\d{1,3})?/,so="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 ao;const t=e[0];let n;if(!no[t]){const e=t.split("").map(Number);n=e.reduce(((e,t,n)=>`${e}(\\d{1,${t}})${n>0?"?":""}`),""),no[t]=new RegExp(`${n}${"()?".repeat(5-e.length)}`)}return no[t]}(e.match(/\d+$/))}))),ro={streetLine1:"",streetLine2:"",city:"",state:"",countryIso2:"",postCode:"",fullName:"",email:"",phone:"",shipping:"",cardNumber:"",cardholder:"",expiry:"",cvv:"",billingCountry:"",billingZip:"",saveInfo:!0,saveCredentials:!1,formErrors:{}},oo=(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:io(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:io(t.payload.countryIso2)}:{...e,...t.payload};case"setFormErrors":return{...e,formErrors:{...e.formErrors,...t.payload}};default:return e}};function io(e){const t=so.find((({id:t})=>t===e));return t?t.name:""}function lo(e,t=400){(0,a.d4)((()=>{f.$b||setTimeout((()=>{(0,G.T2)((()=>{e.current&&e.current.focus()}))}),t)}),[e,t])}const co=(0,a.X$)((e=>{const{id:t,value:n,label:s,hasArrow:r,error:o,ref:i,placeholder:l,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:l||s,ref:i},d),m&&t&&a.ZP.createElement("label",{htmlFor:t},m))})),mo=(0,a.X$)((({state:e,needEmail:t,needPhone:n,needName:s,needAddress:r,dispatch:o})=>{const i=(0,a.sO)(null),l=(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,u.Z)();lo(i);const m=(0,a.I4)((e=>{o({type:"changeAddress1",payload:e.target.value})}),[o]),h=(0,a.I4)((e=>{o({type:"changeAddress2",payload:e.target.value})}),[o]),Z=(0,a.I4)((e=>{o({type:"changeCity",payload:e.target.value})}),[o]),P=(0,a.I4)((e=>{o({type:"changeState",payload:e.target.value})}),[o]),g=(0,a.I4)((e=>{o({type:"changeCountry",payload:e.target.value})}),[o]),v=(0,a.I4)((e=>{o({type:"changePostCode",payload:e.target.value})}),[o]),p=(0,a.I4)((e=>{o({type:"changeFullName",payload:e.target.value})}),[o]),E=(0,a.I4)((e=>{o({type:"changeEmail",payload:e.target.value})}),[o]),C=(0,a.I4)((e=>{let{value:t}=e.target;t=`+${t.replace(/\D/g,"")}`,l.current&&(l.current.value=t),o({type:"changePhone",payload:t})}),[o]),f=(0,a.I4)((e=>{o({type:"changeSaveInfo",payload:e.target.value})}),[o]),{formErrors:b}=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(Ne.Z,{ref:i,label:"Address1 (Street)",onChange:m,value:e.streetLine1,inputMode:"text",error:b.streetLine1}),a.ZP.createElement(Ne.Z,{label:"Address2 (Street)",onChange:h,value:e.streetLine2,inputMode:"text",error:b.streetLine2}),a.ZP.createElement(Ne.Z,{label:"City",onChange:Z,value:e.city,inputMode:"text",error:b.city}),a.ZP.createElement(Ne.Z,{label:"State",onChange:P,value:e.state,inputMode:"text",error:b.state}),a.ZP.createElement(co,{label:"Country",placeholder:"Country",onChange:g,value:e.countryIso2,hasArrow:Boolean(!0),id:"shipping-country",error:b.countryIso2,ref:c},so.map((({name:e,id:t})=>a.ZP.createElement("option",{value:t,className:"county-item"},e)))),a.ZP.createElement(Ne.Z,{label:"Post Code",onChange:v,value:e.postCode,inputMode:"text",error:b.postCode})):void 0,s||t||n?a.ZP.createElement("h5",null,d("PaymentShippingReceiver")):void 0,s&&a.ZP.createElement(Ne.Z,{label:"Full name",onChange:p,value:e.fullName,inputMode:"text",error:b.fullName}),t&&a.ZP.createElement(Ne.Z,{label:"Email",onChange:E,value:e.email,inputMode:"email",error:b.email}),n&&a.ZP.createElement(Ne.Z,{label:"Phone number",onChange:C,value:e.phone,inputMode:"tel",error:b.phone,ref:l}),a.ZP.createElement(un.Z,{label:d("PaymentShippingSave"),subLabel:d("PaymentShippingSaveInfo"),checked:Boolean(e.saveInfo),onChange:f})))})),uo=(0,a.X$)((({state:e,shippingOptions:t,currency:n,dispatch:s})=>{const r=(0,u.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]),i=(0,a.Ye)((()=>t.map((({id:e,title:t,amount:a})=>({label:t,subLabel:(0,jr.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(tt.Z,{name:"shipping-options",options:i,onChange:o,selected:e.shipping})))}));function ho(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,jr.x)(n,s,e)))}function Zo(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 Po=(0,a.X$)((({invoiceContent:e,prices:t,shippingPrices:n,checkoutInfo:s,currency:r,totalPrice:o})=>{const i=(0,u.Z)(),{photoUrl:l,title:c,text:d}=e||{},{paymentMethod:m,paymentProvider:h,shippingAddress:Z,name:P,phone:g,shippingMethod:v}=s||{};return a.ZP.createElement("div",{className:"Checkout"},a.ZP.createElement("div",{className:"description has-image"},l&&a.ZP.createElement("img",{src:l,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=>ho(i.code,e.label,e.amount,r))),n&&n.map((e=>ho(i.code,e.label,e.amount,r))),void 0!==o&&ho(i.code,i("Checkout.TotalAmount"),o,r,!0)),a.ZP.createElement("div",{className:"invoice-info"},m&&Zo("icon-card",m,"Payment method"),h&&Zo("stripe-provider",h,"Payment provider"),Z&&Zo("icon-location",Z,"Shipping address"),P&&Zo("icon-user",P,"Name"),g&&Zo("icon-phone",g,"Phone number"),v&&Zo("icon-truck",v,"Shipping method")))})),go=(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(Ne.Z,{label:"Expiry date",ref:s,onChange:o,onKeyDown:r,value:e,error:t,inputMode:"numeric",maxLength:5})}));var vo=n(6352),po=n(5753);const Eo=(0,a.X$)((({value:e,error:t,onChange:n})=>{const s=(0,a.sO)(null);lo(s);const[r,o]=(0,a.eJ)(Qr.Default);(0,a.d4)((()=>{const t=to(e);o(t)}),[]);const i=(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=to(e.target.value);o(a),n(t),s.current&&(s.current.value=t)}),[n,s]),l=function(e){switch(e){case Qr.Mastercard:return a.ZP.createElement("img",{src:vo,alt:""});case Qr.Visa:return a.ZP.createElement("img",{src:po,alt:""});default:return}}(r);return a.ZP.createElement("div",{className:"CardInput"},a.ZP.createElement("span",{className:"left-addon"},l),a.ZP.createElement(Ne.Z,{ref:s,label:"Card number",onChange:i,value:e,inputMode:"numeric",className:r?"has-left-addon":"",error:t,maxLength:23}))})),Co=(0,a.X$)((({state:e,canSaveCredentials:t,needCardholderName:n,needCountry:s,needZip:r,dispatch:o})=>{const i=(0,a.sO)(null);(0,a.d4)((()=>{i.current&&i.current.value!==e.billingCountry&&(i.current.value=e.billingCountry)}),[e.billingCountry]);const l=(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]),h=(0,a.I4)((e=>{o({type:"changeBillingCountry",payload:e.target.value})}),[o]),Z=(0,a.I4)((e=>{o({type:"changeBillingZip",payload:e.target.value})}),[o]),P=(0,a.I4)((e=>{o({type:"changeSaveCredentials",payload:e.target.value})}),[o]),g=(0,u.Z)(),{formErrors:v={}}=e;return a.ZP.createElement("div",{className:"PaymentInfo"},a.ZP.createElement("form",null,a.ZP.createElement("h5",null,g("PaymentCardTitle")),a.ZP.createElement(Eo,{onChange:l,value:e.cardNumber,error:v.cardNumber}),n&&a.ZP.createElement(Ne.Z,{label:"Name on card",onChange:c,value:e.cardholder,inputMode:"text",error:v.cardholder}),a.ZP.createElement("section",{className:"inline-inputs"},a.ZP.createElement(go,{value:e.expiry,onChange:d,error:v.expiry}),a.ZP.createElement(Ne.Z,{label:"CVV code",onChange:m,value:e.cvv,inputMode:"numeric",maxLength:3,error:v.cvv})),s||r?a.ZP.createElement("h5",null,g("PaymentBillingAddress")):void 0,s&&a.ZP.createElement(co,{label:"Country",placeholder:"Country",onChange:h,value:e.billingCountry,hasArrow:Boolean(!0),id:"billing-country",error:v.billingCountry,ref:i},so.map((({name:e})=>a.ZP.createElement("option",{value:e,className:"county-item"},e)))),r&&a.ZP.createElement(Ne.Z,{label:"Post Code",onChange:Z,value:e.billingZip,inputMode:"text",error:v.billingZip}),t&&a.ZP.createElement(un.Z,{label:g("PaymentCardSavePaymentInformation"),checked:e.saveCredentials,onChange:P})))})),fo=(0,a.X$)((0,s.c$)((e=>{const{step:t,shippingOptions:n,savedInfo:a,canSaveCredentials:s,invoice:r,invoiceContent:o,nativeProvider:i,nativeParams:l,passwordMissing:c,error:d}=e.payment,m=Boolean(r&&(!i||"stripe"!==i)),{needCardholderName:u,needCountry:h,needZip:Z}=l||{},{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:i,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,b.ei)(t,["validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError"])))((({isOpen:e,onClose:t,step:n,shippingOptions:s,savedInfo:r,canSaveCredentials:i,nameRequested:l,shippingAddressRequested:c,phoneRequested:d,emailRequested:m,phoneToProvider:h,emailToProvider:Z,currency:P,passwordMissing:g,isProviderError:v,invoiceContent:p,nativeProvider:E,prices:C,needCardholderName:f,needCountry:b,needZip:I,error:y,validateRequestedInfo:S,sendPaymentForm:w,setPaymentStep:k,sendCredentialsInfo:N,clearPaymentError:M})=>{const[T,A]=(0,Ht.Z)(oo,ro),[R,B]=(0,a.eJ)(!1),$=(0,u.Z)();(0,a.d4)((()=>{(n||y)&&B(!1)}),[n,y]),(0,a.d4)((()=>{null!=y&&y.field&&A({type:"setFormErrors",payload:{[y.field]:y.message}})}),[y,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 D=(0,a.I4)((()=>{M()}),[M]),x=(0,a.Ye)((()=>n!==o.KB.Checkout?0:function(e=[],t,n){const a=t?Io(t,n):[];let s=0;return s=e.concat(a||[]).reduce(((e,t)=>e+t.amount),s),s}(C,s,T.shipping)),[n,T.shipping,C,s]),U=(0,a.Ye)((()=>{if(n===o.KB.Checkout)return function(e,t,n){const a=`${function(e){const t=to(e);return eo[t]||""}(e.cardNumber)} *${e.cardNumber.slice(-4)}`,s=e.streetLine1?`${e.streetLine1}, ${e.city}, ${e.countryIso2}`:void 0,{phone:r,fullName:o}=e,i=t?bo(t,e.shipping):void 0;return{paymentMethod:a,paymentProvider:n,shippingAddress:s,name:o,phone:r,shippingMethod:null==i?void 0:i.title}}(T,s,E||"")}),[n,T,s,E]),O=(0,a.I4)((()=>{const{saveInfo:e}=T,t=function(e){const{streetLine1:t,streetLine2:n,city:a,state:s,countryIso2:r,postCode:o,fullName:i,phone:l,email:c}=e;return{name:i,phone:l,email:c,shippingAddress:{streetLine1:t,streetLine2:n,city:a,state:s,countryIso2:r,postCode:o}}}(T);S({requestInfo:t,saveInfo:e})}),[S,T]),G=(0,a.I4)((()=>{const e=function(e){const{cardNumber:t,cardholder:n,expiry:a,cvv:s,billingCountry:r,billingZip:o}=e,[i,l]=a.split("/");return{data:{cardNumber:t,cardholder:n,expiryMonth:i,expiryYear:l,cvv:s,country:r,zip:o}}}(T);N({credentials:e})}),[N,T]),X=(0,a.I4)((()=>{w({shippingOptionId:T.shipping,saveCredentials:T.saveCredentials})}),[w,T]),J=(0,a.I4)((e=>{k({step:e})}),[k]),_=(0,a.I4)((()=>{switch(B(!0),n){case o.KB.ShippingInfo:return O();case o.KB.Shipping:return J(o.KB.PaymentInfo);case o.KB.PaymentInfo:return G();case o.KB.Checkout:return X();default:return()=>{}}}),[n,O,J,G,X]),V=(0,a.Ye)((()=>{switch(n){case o.KB.ShippingInfo:return $("PaymentShippingInfo");case o.KB.Shipping:return $("PaymentShippingMethod");case o.KB.PaymentInfo:return $("PaymentCardInfo");case o.KB.Checkout:return $("PaymentCheckout");default:return""}}),[n,$]),H=(0,a.Ye)((()=>{switch(n){case o.KB.Checkout:return $("Checkout.PayPrice",(0,jr.x)(x,P,$.code));default:return $("Next")}}),[n,$,P,x]);return v?a.ZP.createElement(ke.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(F.Z,{isText:!0,onClick:t},$("OK"))):a.ZP.createElement(ke.Z,{className:"PaymentModal",isOpen:e,onClose:t},a.ZP.createElement("div",{className:"header",dir:$.isRtl?"rtl":void 0},a.ZP.createElement(F.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,V)),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(mo,{state:T,dispatch:A,needAddress:Boolean(c),needEmail:Boolean(m||Z),needPhone:Boolean(d||h),needName:Boolean(l)});case o.KB.Shipping:return a.ZP.createElement(uo,{state:T,dispatch:A,shippingOptions:s||[],currency:P});case o.KB.PaymentInfo:return a.ZP.createElement(Co,{state:T,dispatch:A,canSaveCredentials:Boolean(!g&&i),needCardholderName:f,needCountry:b,needZip:I});case o.KB.Checkout:return a.ZP.createElement(Po,{prices:C,shippingPrices:T.shipping&&s?Io(s,T.shipping):void 0,totalPrice:x,invoiceContent:p,checkoutInfo:U,currency:P});default:return}}(n)))):a.ZP.createElement("div",{className:"empty-content"},a.ZP.createElement(z.Z,{color:"gray"})),a.ZP.createElement("div",{className:"footer"},a.ZP.createElement(F.Z,{type:"submit",onClick:_,disabled:R,isLoading:R},H)),y&&!y.field&&function(){if(y)return a.ZP.createElement(ke.Z,{className:"error",isOpen:Boolean(y),onClose:D},a.ZP.createElement("h4",null,y.description||"Error"),a.ZP.createElement("p",null,y.description||"Error"),a.ZP.createElement(F.Z,{isText:!0,onClick:M},$("OK")))}())})));function bo(e,t){return e.find((({id:e})=>e===t))}function Io(e,t){const n=bo(e,t);return null==n?void 0:n.prices}const yo=(0,a.X$)((0,s.c$)((e=>{const{receipt:t}=e.payment,{currency:n,prices:a,info:s,totalAmount:r,credentialsTitle:o,shippingPrices:i,shippingMethod:l,photoUrl:c,text:d,title:m}=t||{};return{currency:n,prices:a,info:s,totalAmount:r,credentialsTitle:o,shippingPrices:i,shippingMethod:l,photoUrl:c,text:d,title:m}}))((({isOpen:e,onClose:t,prices:n,shippingPrices:s,totalAmount:r,currency:o,info:i,photoUrl:l,text:c,title:d,credentialsTitle:m,shippingMethod:h})=>{const Z=(0,u.Z)(),P=(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,i,h)),[i,h,m]);return a.ZP.createElement(ke.Z,{className:"PaymentModal PaymentModal-receipt",isOpen:e,onClose:t},a.ZP.createElement("div",null,a.ZP.createElement("div",{className:"header",dir:Z.isRtl?"rtl":void 0},a.ZP.createElement(F.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," ",Z("PaymentReceipt")," ")),a.ZP.createElement("div",{className:"receipt-content custom-scroll"},a.ZP.createElement(Po,{prices:n,shippingPrices:s,totalPrice:r,invoiceContent:{photoUrl:l,text:c,title:d},checkoutInfo:P,currency:o}))))})))},9364:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(4050),s=n(3716),r=n(7361),o=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:m="Password",submitLabel:u="Next",clearError:h,onChangePasswordVisibility:Z,onInputChange:P,onSubmit:g})=>{const v=(0,a.sO)(null),p=(0,i.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(l.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),i=n(7799);const l=[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(i.Z,{id:"closeMonkey",size:t?s.K2:m,className:g?"hidden":"shown",animationData:n,playSegment:l,noLoop:!0,onLoad:p}),u&&a.ZP.createElement(i.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),i=n(9107),l=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,i.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(l.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,i]=(0,a.eJ)(),[l,c]=(0,a.eJ)(n);(0,a.d4)((()=>{c(n)}),[n]);const d=(0,s.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(P,{file:o,onClose:function(){i(void 0)},onChange:function(e){i(void 0),r(e),l&&URL.revokeObjectURL(l),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=477.a474b061825f5523f240.js.map \ No newline at end of file diff --git a/dist/477.a474b061825f5523f240.js.map b/dist/477.a474b061825f5523f240.js.map deleted file mode 100644 index 4755089d5..000000000 --- a/dist/477.a474b061825f5523f240.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"477.a474b061825f5523f240.js","mappings":"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","sources":["webpack://telegram-t/./src/components/mediaViewer/helpers/ghostAnimation.ts","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/MediaViewerContent.tsx","webpack://telegram-t/./src/components/mediaViewer/MediaViewerSlides.tsx","webpack://telegram-t/./src/components/mediaViewer/PanZoom.tsx","webpack://telegram-t/./src/components/mediaViewer/SenderInfo.tsx","webpack://telegram-t/./src/components/mediaViewer/SlideTransition.tsx","webpack://telegram-t/./src/components/mediaViewer/ZoomControls.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/components/common/SeenByModal.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 '.MediaViewerSlide--active img, .MediaViewerSlide--active 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('.Transition__slide--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 = `.Transition__slide--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 .Transition__slide--active .ProfilePhoto';\n mediaSelector = 'img.avatar-media';\n break;\n\n case MediaViewerOrigin.ProfileAvatar:\n containerSelector = '#RightColumn .ProfileInfo .Transition__slide--active .ProfilePhoto';\n mediaSelector = 'img.avatar-media';\n break;\n\n case MediaViewerOrigin.ScheduledInline:\n case MediaViewerOrigin.Inline:\n default:\n containerSelector = `.Transition__slide--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, {\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, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiDimensions, ApiMediaFormat, ApiMessage, ApiUser,\n} from '../../api/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport useBlurSync from '../../hooks/useBlurSync';\nimport useMedia from '../../hooks/useMedia';\nimport useMediaWithLoadProgress from '../../hooks/useMediaWithLoadProgress';\nimport {\n getChatAvatarHash,\n getMessageDocument,\n getMessageFileSize,\n getMessageMediaFormat,\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n getMessagePhoto,\n getMessageVideo,\n getMessageWebPagePhoto,\n getMessageWebPageVideo,\n getPhotoFullDimensions,\n getVideoDimensions,\n isMessageDocumentPhoto,\n isMessageDocumentVideo,\n} from '../../modules/helpers';\nimport {\n selectChat, selectChatMessage, selectScheduledMessage, selectUser,\n} from '../../modules/selectors';\nimport { AVATAR_FULL_DIMENSIONS, calculateMediaViewerDimensions } from '../common/helpers/mediaDimensions';\nimport { renderMessageText } from '../common/helpers/renderMessageText';\n\nimport Spinner from '../ui/Spinner';\nimport MediaViewerFooter from './MediaViewerFooter';\nimport VideoPlayer from './VideoPlayer';\n\nimport './MediaViewerContent.scss';\n\ntype OwnProps = {\n messageId?: number;\n chatId?: string;\n threadId?: number;\n avatarOwnerId?: string;\n profilePhotoIndex?: number;\n origin?: MediaViewerOrigin;\n isActive?: boolean;\n animationLevel: 0 | 1 | 2;\n onClose: () => void;\n onFooterClick: () => void;\n isFooterHidden?: boolean;\n};\n\ntype StateProps = {\n chatId?: string;\n messageId?: number;\n senderId?: string;\n threadId?: number;\n avatarOwner?: ApiChat | ApiUser;\n profilePhotoIndex?: number;\n message?: ApiMessage;\n origin?: MediaViewerOrigin;\n};\n\nconst ANIMATION_DURATION = 350;\n\nconst MediaViewerContent: FC = (props) => {\n const {\n messageId,\n isActive,\n avatarOwner,\n chatId,\n message,\n profilePhotoIndex,\n origin,\n animationLevel,\n onClose,\n onFooterClick,\n isFooterHidden,\n } = props;\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\n const isOpen = Boolean(avatarOwner || messageId);\n const isAvatar = Boolean(avatarOwner);\n\n const isFromSharedMedia = origin === MediaViewerOrigin.SharedMedia;\n const isFromSearch = origin === MediaViewerOrigin.SearchResult;\n\n const isGhostAnimation = animationLevel === 2;\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 {\n mediaData: fullMediaBlobUrl,\n loadProgress,\n } = 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\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 if (isAvatar) {\n return (\n
\n {renderPhoto(\n fullMediaBlobUrl || previewBlobUrl,\n calculateMediaViewerDimensions(AVATAR_FULL_DIMENSIONS, false),\n false,\n )}\n
\n );\n }\n\n if (!message) return undefined;\n const textParts = renderMessageText(message);\n const hasFooter = Boolean(textParts);\n return (\n \n {isPhoto && renderPhoto(\n localBlobUrl || fullMediaBlobUrl || previewBlobUrl || pictogramBlobUrl,\n message && calculateMediaViewerDimensions(dimensions!, hasFooter),\n false,\n )}\n {isVideo && (isActive ? (\n \n ) : renderVideoPreview(\n bestImageData,\n message && calculateMediaViewerDimensions(dimensions!, hasFooter, true),\n false,\n ))}\n {textParts && (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global, ownProps): StateProps => {\n const {\n chatId,\n threadId,\n messageId,\n avatarOwnerId,\n profilePhotoIndex,\n origin,\n } = ownProps;\n\n if (origin === MediaViewerOrigin.SearchResult) {\n if (!(chatId && messageId)) {\n return {};\n }\n\n const message = selectChatMessage(global, chatId, messageId);\n if (!message) {\n return {};\n }\n\n return {\n chatId,\n messageId,\n senderId: message.senderId,\n origin,\n message,\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 origin,\n };\n }\n\n if (!(chatId && threadId && messageId)) {\n return {};\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 {};\n }\n\n return {\n chatId,\n threadId,\n messageId,\n senderId: message.senderId,\n origin,\n message,\n };\n },\n)(MediaViewerContent));\n\nfunction renderPhoto(blobUrl?: string, imageSize?: ApiDimensions, canDrag?: boolean) {\n return blobUrl\n ? (\n \n )\n : (\n \n \n \n );\n}\n\nfunction renderVideoPreview(blobUrl?: string, imageSize?: ApiDimensions, canDrag?: boolean) {\n const wrapperStyle = imageSize && `width: ${imageSize.width}px; height: ${imageSize.height}px`;\n const videoStyle = `background-image: url(${blobUrl})`;\n return blobUrl\n ? (\n \n \n {/* eslint-disable-next-line jsx-a11y/media-has-caption */}\n \n \n \n )\n : (\n \n \n \n );\n}\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { MediaViewerOrigin } from '../../types';\n\nimport useDebounce from '../../hooks/useDebounce';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport { animateNumber, timingFunctions } from '../../util/animation';\nimport arePropsShallowEqual from '../../util/arePropsShallowEqual';\nimport { captureEvents } from '../../util/captureEvents';\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport { debounce } from '../../util/schedulers';\n\nimport MediaViewerContent from './MediaViewerContent';\n\nimport './MediaViewerSlides.scss';\n\ntype OwnProps = {\n messageId?: number;\n getMessageId: (fromId?: number, direction?: number) => number | undefined;\n isVideo?: boolean;\n isGif?: boolean;\n isPhoto?: boolean;\n isOpen?: boolean;\n selectMessage: (id?: number) => void;\n chatId?: string;\n threadId?: number;\n isActive?: boolean;\n avatarOwnerId?: string;\n profilePhotoIndex?: number;\n origin?: MediaViewerOrigin;\n isZoomed?: boolean;\n animationLevel: 0 | 1 | 2;\n onClose: () => void;\n hasFooter?: boolean;\n onFooterClick: () => void;\n};\n\nconst SWIPE_X_THRESHOLD = 50;\nconst SWIPE_Y_THRESHOLD = 50;\nconst SLIDES_GAP = 40;\nconst ANIMATION_DURATION = 350;\nconst DEBOUNCE_MESSAGE = 350;\nconst DEBOUNCE_SWIPE = 500;\nconst DEBOUNCE_ACTIVE = 800;\nconst MAX_ZOOM = 4;\nconst MIN_ZOOM = 0.6;\nconst DOUBLE_TAP_ZOOM = 3;\nlet cancelAnimation: Function | undefined;\n\ntype Transform = {\n x: number;\n y: number;\n scale: number;\n};\n\nconst INITIAL_TRANSFORM = {\n x: 0,\n y: 0,\n scale: 1,\n};\n\nconst MediaViewerSlides: FC = ({\n messageId,\n getMessageId,\n selectMessage,\n isVideo,\n isGif,\n isPhoto,\n isOpen,\n isActive,\n hasFooter,\n ...rest\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 activeSlideRef = useRef(null);\n const transformRef = useRef(INITIAL_TRANSFORM);\n const isSwipingRef = useRef(false);\n const isActiveRef = useRef(true);\n const [activeMessageId, setActiveMessageId] = useState(messageId);\n const forceUpdate = useForceUpdate();\n const [isFooterHidden, setIsFooterHidden] = useState(false);\n\n const {\n isZoomed,\n onClose,\n } = rest;\n\n const setTransform = useCallback((value: Transform) => {\n transformRef.current = value;\n forceUpdate();\n }, [forceUpdate]);\n\n const setIsSwiping = useCallback((value: boolean) => {\n isSwipingRef.current = value;\n forceUpdate();\n }, [forceUpdate]);\n\n const setIsActive = useCallback((value: boolean) => {\n isActiveRef.current = value;\n forceUpdate();\n }, [forceUpdate]);\n\n const debounceSetMessage = useDebounce(DEBOUNCE_MESSAGE, false);\n const debounceSwipe = useDebounce(DEBOUNCE_SWIPE, false);\n const debounceActive = useDebounce(DEBOUNCE_ACTIVE, false);\n\n const handleToggleFooterVisibility = useCallback(() => {\n if (IS_TOUCH_ENV && (isPhoto || isGif) && hasFooter) {\n setIsFooterHidden(!isFooterHidden);\n }\n }, [hasFooter, isFooterHidden, isGif, isPhoto]);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV || !containerRef.current || isZoomed || !activeMessageId) {\n return undefined;\n }\n let lastTransform = { ...transformRef.current };\n const lastDragOffset = {\n x: 0,\n y: 0,\n };\n const lastZoomCenter = { x: 0, y: 0 };\n const panDelta = {\n x: 0,\n y: 0,\n };\n let lastGestureTime = Date.now();\n let initialContentRect: DOMRect;\n let content: HTMLElement | null;\n const setLastGestureTime = debounce(() => {\n lastGestureTime = Date.now();\n }, 500, false, true);\n return captureEvents(containerRef.current, {\n isNotPassive: true,\n excludedClosestSelector: '.VideoPlayerControls, .MediaViewerFooter',\n onCapture: (event) => {\n // Prevent safari back swipe on mobile\n if (event.type === 'touchstart'\n && 'pageX' in event\n && !(event.pageX > 10 && event.pageX < window.innerWidth - 10)) {\n event.preventDefault();\n }\n lastGestureTime = Date.now();\n if (arePropsShallowEqual(transformRef.current, INITIAL_TRANSFORM)) {\n if (!activeSlideRef.current) return;\n content = activeSlideRef.current.querySelector('img, video');\n if (!content) return;\n // Store initial content rect, without transformations\n initialContentRect = content.getBoundingClientRect();\n }\n },\n onDrag: (event, captureEvent, {\n dragOffsetX,\n dragOffsetY,\n }) => {\n if (cancelAnimation) {\n cancelAnimation();\n cancelAnimation = undefined;\n }\n panDelta.x = lastDragOffset.x - dragOffsetX;\n panDelta.y = lastDragOffset.y - dragOffsetY;\n lastDragOffset.x = dragOffsetX;\n lastDragOffset.y = dragOffsetY;\n const absOffsetX = Math.abs(dragOffsetX);\n const absOffsetY = Math.abs(dragOffsetY);\n const { scale, x, y } = transformRef.current;\n const h = 10;\n\n // If user is inactive but is still touching the screen\n // we reset last gesture time\n setLastGestureTime();\n\n // If image is scaled we just need to pan it\n if (scale !== 1) {\n if ('touches' in event && event.touches.length === 1) {\n setTransform({\n x: lastTransform.x + dragOffsetX,\n y: lastTransform.y + dragOffsetY,\n scale,\n });\n }\n return;\n }\n // If user is swiping horizontally or horizontal shift is dominant\n // we change only horizontal position\n if (isSwipingRef.current || Math.abs(x) > h || (absOffsetX > h && absOffsetY < h)) {\n isSwipingRef.current = true;\n isActiveRef.current = false;\n setTransform({\n x: dragOffsetX,\n y: 0,\n scale,\n });\n return;\n }\n if (isSwipingRef.current) return;\n // If vertical shift is dominant we change only vertical position\n if (Math.abs(y) > h || (absOffsetY > h && absOffsetX < h)) {\n setTransform({\n x: 0,\n y: dragOffsetY,\n scale,\n });\n }\n },\n onZoom: (e, {\n zoomFactor,\n initialCenterX,\n initialCenterY,\n dragOffsetX,\n dragOffsetY,\n currentCenterX,\n currentCenterY,\n }) => {\n // Calculate current scale based on zoom factor and limits, add max zoom margin for bounce back effect\n const scale = Math.min(MAX_ZOOM * 3, Math.max(lastTransform.scale * zoomFactor, MIN_ZOOM));\n const scaleFactor = scale / lastTransform.scale;\n const offsetX = Math.abs(Math.min(lastTransform.x, 0));\n const offsetY = Math.abs(Math.min(lastTransform.y, 0));\n\n // Calculate new center relative to the shifted image\n const scaledCenterX = offsetX + initialCenterX;\n const scaledCenterY = offsetY + initialCenterY;\n\n // Save last zoom center for bounce back effect\n lastZoomCenter.x = currentCenterX;\n lastZoomCenter.y = currentCenterY;\n\n // Calculate how much we need to shift the image to keep the zoom center at the same position\n const scaleOffsetX = (scaledCenterX - scaleFactor * scaledCenterX);\n const scaleOffsetY = (scaledCenterY - scaleFactor * scaledCenterY);\n\n setTransform({\n x: lastTransform.x + scaleOffsetX + dragOffsetX,\n y: lastTransform.y + scaleOffsetY + dragOffsetY,\n scale,\n });\n },\n onDoubleClick(e, {\n centerX,\n centerY,\n }) {\n // Calculate how much we need to shift the image to keep the zoom center at the same position\n const scaleOffsetX = (centerX - DOUBLE_TAP_ZOOM * centerX);\n const scaleOffsetY = (centerY - DOUBLE_TAP_ZOOM * centerY);\n const { scale, x, y } = transformRef.current;\n if (scale === 1) {\n if (x !== 0 || y !== 0) return undefined;\n lastTransform = {\n x: scaleOffsetX,\n y: scaleOffsetY,\n scale: DOUBLE_TAP_ZOOM,\n };\n } else {\n lastTransform = { x: 0, y: 0, scale: 1 };\n }\n return animateNumber({\n from: [x, y, scale],\n to: [lastTransform.x, lastTransform.y, lastTransform.scale],\n duration: ANIMATION_DURATION,\n timing: timingFunctions.easeOutCubic,\n onUpdate: (value) => setTransform({\n x: value[0],\n y: value[1],\n scale: value[2],\n }),\n });\n },\n onRelease: () => {\n const absX = Math.abs(transformRef.current.x);\n const absY = Math.abs(transformRef.current.y);\n const { scale, x, y } = transformRef.current;\n\n // If scale is less than 1 we need to bounce back\n if (scale < 1) {\n lastTransform = INITIAL_TRANSFORM;\n return animateNumber({\n from: [x, y, scale],\n to: [0, 0, 1],\n duration: ANIMATION_DURATION,\n timing: timingFunctions.easeOutCubic,\n onUpdate: (value) => setTransform({\n x: value[0],\n y: value[1],\n scale: value[2],\n }),\n });\n }\n if (scale > 1) {\n if (!content || !initialContentRect) {\n lastTransform = { x, y, scale };\n return undefined;\n }\n // Get current content boundaries\n const boundaries = content.getBoundingClientRect();\n const s1 = Math.min(scale, MAX_ZOOM);\n const scaleFactor = s1 / scale;\n\n // Calculate new position based on the last zoom center to keep the zoom center\n // at the same position when bouncing back from max zoom\n let x1 = x * scaleFactor + (lastZoomCenter.x - scaleFactor * lastZoomCenter.x);\n let y1 = y * scaleFactor + (lastZoomCenter.y - scaleFactor * lastZoomCenter.y);\n\n // Arbitrary pan velocity coefficient\n const k = 0.15;\n\n // If scale didn't change, we need to add inertia to pan gesture\n if (lastTransform.scale === scale) {\n // Calculate user gesture velocity\n const Vx = Math.abs(lastDragOffset.x) / (Date.now() - lastGestureTime);\n const Vy = Math.abs(lastDragOffset.y) / (Date.now() - lastGestureTime);\n\n // Add extra distance based on gesture velocity and last pan delta\n x1 -= Math.abs(lastDragOffset.x) * Vx * k * panDelta.x;\n y1 -= Math.abs(lastDragOffset.y) * Vy * k * panDelta.y;\n }\n\n // If content is outside window we calculate offset boundaries\n // based on initial content rect and current scale\n if (boundaries.width > window.innerWidth) {\n const minOffsetX = -initialContentRect.left * s1;\n const maxOffsetX = window.innerWidth - initialContentRect.right * s1;\n x1 = Math.min(minOffsetX, Math.max(maxOffsetX, x1));\n } else {\n // Else we center the content on the screen\n x1 = (window.innerWidth - window.innerWidth * s1) / 2;\n }\n\n if (boundaries.height > window.innerHeight) {\n const minOffsetY = -initialContentRect.top * s1;\n const maxOffsetY = window.innerHeight - initialContentRect.bottom * s1;\n y1 = Math.min(minOffsetY, Math.max(maxOffsetY, y1));\n } else {\n y1 = (window.innerHeight - window.innerHeight * s1) / 2;\n }\n lastTransform = {\n x: x1,\n y: y1,\n scale: s1,\n };\n cancelAnimation = animateNumber({\n from: [x, y, scale],\n to: [x1, y1, s1],\n duration: ANIMATION_DURATION,\n timing: timingFunctions.easeOutCubic,\n onUpdate: (value) => setTransform({\n x: value[0],\n y: value[1],\n scale: value[2],\n }),\n });\n return undefined;\n }\n lastTransform = { x, y, scale };\n if (absY >= SWIPE_Y_THRESHOLD) return onClose();\n // Bounce back if vertical swipe is below threshold\n if (absY > 0) {\n return animateNumber({\n from: y,\n to: 0,\n duration: ANIMATION_DURATION,\n timing: timingFunctions.easeOutCubic,\n onUpdate: (value) => setTransform({\n x: 0,\n y: value,\n scale,\n }),\n });\n }\n // Get horizontal swipe direction\n const direction = x < 0 ? 1 : -1;\n const mId = getMessageId(activeMessageId, x < 0 ? 1 : -1);\n // Get the direction of the last pan gesture.\n // Could be different from the total horizontal swipe direction\n // if user starts a swipe in one direction and then changes the direction\n // we need to cancel slide transition\n const dirX = panDelta.x < 0 ? -1 : 1;\n if (mId && absX >= SWIPE_X_THRESHOLD && direction === dirX) {\n const offset = (window.innerWidth + SLIDES_GAP) * direction;\n // If image is shifted by more than SWIPE_X_THRESHOLD,\n // We shift everything by one screen width and then set new active message id\n transformRef.current.x += offset;\n setActiveMessageId(mId);\n debounceSetMessage(() => selectMessage(mId));\n }\n debounceSwipe(() => setIsSwiping(false));\n debounceActive(() => setIsActive(true));\n // Then we always return to the original position\n cancelAnimation = animateNumber({\n from: transformRef.current.x,\n to: 0,\n duration: ANIMATION_DURATION,\n timing: timingFunctions.easeOutCubic,\n onUpdate: (value) => setTransform({\n y: 0,\n x: value,\n scale: transformRef.current.scale,\n }),\n });\n return undefined;\n },\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n isZoomed,\n onClose,\n setTransform,\n getMessageId,\n activeMessageId,\n setIsSwiping,\n setIsActive,\n ]);\n\n if (!activeMessageId) return undefined;\n\n const nextMessageId = getMessageId(activeMessageId, 1);\n const previousMessageId = getMessageId(activeMessageId, -1);\n const offsetX = transformRef.current.x;\n const offsetY = transformRef.current.y;\n const { scale } = transformRef.current;\n\n return (\n
\n {previousMessageId && scale === 1 && /* @ts-ignore */ (\n
\n {/* eslint-disable-next-line react/jsx-props-no-spreading */}\n \n
\n )}\n {activeMessageId && (\n \n \n
\n )}\n {nextMessageId && scale === 1 && /* @ts-ignore */ (\n
\n {/* eslint-disable-next-line react/jsx-props-no-spreading */}\n \n
\n )}\n \n );\n};\n\nexport default memo(MediaViewerSlides);\n\nfunction getAnimationStyle(x = 0, y = 0, scale = 1) {\n return `transform: translate3d(${x.toFixed(3)}px, ${y.toFixed(3)}px, 0px) scale(${scale.toFixed(3)});`;\n}\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('.Transition__slide--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, { 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, { FC } from '../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\n\nimport Transition, { TransitionProps } from '../ui/Transition';\n\nconst SlideTransition: FC = ({ children, ...props }) => {\n if (IS_TOUCH_ENV) {\n // Return dummy container to keep existing DOM structure, needed to preserve ghost animation\n return (\n
\n
\n {children(true, true, 1)}\n
\n
\n );\n }\n // eslint-disable-next-line react/jsx-props-no-spreading\n return {children};\n};\n\nexport default SlideTransition;\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","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, ApiDimensions, ApiMediaFormat, ApiMessage, ApiUser,\n} from '../../api/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { ANIMATION_END_DELAY } from '../../config';\n\nimport useBlurSync from '../../hooks/useBlurSync';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport useHistoryBack from '../../hooks/useHistoryBack';\nimport useLang from '../../hooks/useLang';\nimport useMedia from '../../hooks/useMedia';\nimport useMediaWithLoadProgress from '../../hooks/useMediaWithLoadProgress';\nimport usePrevious from '../../hooks/usePrevious';\nimport {\n getChatAvatarHash,\n getChatMediaMessageIds,\n getMessageDocument,\n getMessageFileName,\n getMessageMediaFormat,\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n getMessagePhoto,\n getMessageVideo,\n getMessageWebPagePhoto,\n getMessageWebPageVideo,\n getPhotoFullDimensions,\n getVideoDimensions,\n isMessageDocumentPhoto,\n isMessageDocumentVideo,\n} from '../../modules/helpers';\nimport {\n selectChat,\n selectChatMessage,\n selectChatMessages,\n selectCurrentMediaSearch,\n selectListedIds,\n selectOutlyingIds,\n selectScheduledMessage,\n selectScheduledMessages,\n selectUser,\n} from '../../modules/selectors';\nimport { stopCurrentAudio } from '../../util/audioPlayer';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { captureEvents } from '../../util/captureEvents';\nimport { IS_IOS, IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../util/environment';\nimport { pick } from '../../util/iteratees';\nimport windowSize from '../../util/windowSize';\nimport { AVATAR_FULL_DIMENSIONS, MEDIA_VIEWER_MEDIA_QUERY } from '../common/helpers/mediaDimensions';\nimport { renderMessageText } from '../common/helpers/renderMessageText';\nimport { animateClosing, animateOpening } from './helpers/ghostAnimation';\n\nimport Button from '../ui/Button';\nimport ShowTransition from '../ui/ShowTransition';\nimport Transition from '../ui/Transition';\nimport MediaViewerActions from './MediaViewerActions';\nimport MediaViewerSlides from './MediaViewerSlides';\nimport PanZoom from './PanZoom';\nimport SenderInfo from './SenderInfo';\nimport SlideTransition from './SlideTransition';\nimport ZoomControls from './ZoomControls';\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 { isGif } = video || webPageVideo || {};\n const isPhoto = Boolean(!isVideo && (photo || webPagePhoto || isDocumentPhoto));\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 && !IS_TOUCH_ENV ? 'mv-slide' : 'none';\n const headerAnimation = animationLevel === 2 ? 'slide-fade' : 'none';\n const isGhostAnimation = animationLevel === 2;\n\n /* Controls */\n const [canPanZoomWrap, setCanPanZoomWrap] = useState(false);\n const [isZoomed, setIsZoomed] = useState(false);\n const [zoomLevel, setZoomLevel] = useState(1);\n const [panDelta, setPanDelta] = useState({\n x: 0,\n y: 0,\n });\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 } = 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 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 const textParts = message ? renderMessageText(message) : undefined;\n const hasFooter = Boolean(textParts);\n\n useEffect(() => {\n if (isGhostAnimation && isOpen && !prevMessage && !prevAvatarOwner) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY);\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, hasFooter,\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({\n x: 0,\n y: 0,\n });\n };\n\n const handleZoomToggle = useCallback(() => {\n setIsZoomed(!isZoomed);\n setZoomLevel(!isZoomed ? 1.5 : 1);\n if (isZoomed) {\n setPanDelta({\n x: 0,\n y: 0,\n });\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({\n chatId,\n threadId,\n messageId,\n });\n }, [close, chatId, threadId, focusMessage, messageId]);\n\n const handleForward = useCallback(() => {\n openForwardMenu({\n fromChatId: chatId,\n messageIds: [messageId],\n });\n closeZoom();\n }, [openForwardMenu, chatId, messageId]);\n\n const selectMessage = useCallback((id?: number) => openMediaViewer({\n chatId,\n threadId,\n messageId: id,\n origin,\n }, {\n forceOnHeavyAnimation: true,\n }), [chatId, openMediaViewer, origin, threadId]);\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 | undefined => {\n if (!fromId) return undefined;\n const index = messageIds.indexOf(fromId);\n if ((direction === -1 && index > 0) || (direction === 1 && index < messageIds.length - 1)) {\n return messageIds[index + direction];\n }\n return undefined;\n }, [messageIds]);\n\n const nextMessageId = getMessageId(messageId, 1);\n const previousMessageId = getMessageId(messageId, -1);\n\n const handlePan = useCallback((x: number, y: number) => {\n setPanDelta({\n x,\n y,\n });\n }, []);\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 useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'Left': // IE/Edge specific value\n case 'ArrowLeft':\n selectMessage(previousMessageId);\n break;\n\n case 'Right': // IE/Edge specific value\n case 'ArrowRight':\n selectMessage(nextMessageId);\n break;\n }\n };\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n }, [nextMessageId, previousMessageId, selectMessage]);\n\n useEffect(() => {\n if (isZoomed || IS_TOUCH_ENV) return undefined;\n const element = document.querySelector('.MediaViewerSlide--active');\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: close,\n });\n }, [close, isGif, isZoomed, messageId]);\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 {(isActive: boolean) => (\n \n )}\n \n \n {!isFirst && !IS_TOUCH_ENV && (\n selectMessage(previousMessageId)}\n />\n )}\n {!isLast && !IS_TOUCH_ENV && (\n selectMessage(nextMessageId)}\n />\n )}\n \n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chatId,\n threadId,\n messageId,\n avatarOwnerId,\n profilePhotoIndex,\n 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 const resetFilter = useCallback(() => {\n onFilterChange('');\n }, [onFilterChange]);\n useInputFocusOnOpen(filterRef, isOpen, resetFilter);\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 { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, MAIN_THREAD_ID } from '../../api/types';\n\nimport {\n filterChatsByName,\n filterUsersByName,\n getCanPostInChat,\n sortChatIds,\n} from '../../modules/helpers';\nimport { pick, unique } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\n\nimport ChatOrUserPicker from '../common/ChatOrUserPicker';\n\nexport type OwnProps = {\n isOpen: boolean;\n};\n\ntype StateProps = {\n chatsById: Record;\n activeListIds?: string[];\n archivedListIds?: string[];\n pinnedIds?: string[];\n contactIds?: string[];\n currentUserId?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst ForwardPicker: FC = ({\n chatsById,\n activeListIds,\n archivedListIds,\n pinnedIds,\n contactIds,\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 chatAndContactIds = useMemo(() => {\n if (!isOpen) {\n return undefined;\n }\n\n let priorityIds = pinnedIds || [];\n if (currentUserId) {\n priorityIds = unique([currentUserId, ...priorityIds]);\n }\n\n const chatIds = [\n ...(activeListIds || []),\n ...(archivedListIds || []),\n ].filter((id) => {\n const chat = chatsById[id];\n\n return chat && getCanPostInChat(chat, MAIN_THREAD_ID);\n });\n\n // No need for expensive global updates on users, so we avoid them\n const usersById = getGlobal().users.byId;\n\n return sortChatIds(unique([\n ...filterChatsByName(lang, chatIds, chatsById, filter, currentUserId),\n ...(contactIds ? filterUsersByName(contactIds, usersById, filter) : []),\n ]), chatsById, undefined, priorityIds);\n }, [activeListIds, archivedListIds, chatsById, contactIds, currentUserId, filter, isOpen, lang, pinnedIds]);\n\n const handleSelectUser = useCallback((userId: string) => {\n setForwardChatId({ id: userId });\n }, [setForwardChatId]);\n\n const renderingChatAndContactIds = useCurrentOrPrev(chatAndContactIds)!;\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 activeListIds: listIds.active,\n archivedListIds: listIds.archived,\n pinnedIds: orderedPinnedIds.active,\n contactIds: global.contactList?.userIds,\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 React, { FC, useCallback, memo } 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 { selectChatMessage } from '../../modules/selectors';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\nimport PrivateChatInfo from './PrivateChatInfo';\nimport ListItem from '../ui/ListItem';\n\nexport type OwnProps = {\n isOpen: boolean;\n};\n\nexport type StateProps = {\n memberIds?: string[];\n};\n\ntype DispatchProps = Pick;\n\nconst CLOSE_ANIMATION_DURATION = 100;\n\nconst SeenByModal: FC = ({\n isOpen,\n memberIds,\n openChat,\n closeSeenByModal,\n}) => {\n const lang = useLang();\n\n const handleClick = useCallback((userId: string) => {\n closeSeenByModal();\n\n setTimeout(() => {\n openChat({ id: userId });\n }, CLOSE_ANIMATION_DURATION);\n }, [closeSeenByModal, openChat]);\n\n const renderingMemberIds = useCurrentOrPrev(memberIds, true);\n\n return (\n \n
\n {renderingMemberIds && renderingMemberIds.map((userId) => (\n handleClick(userId)}\n >\n \n \n ))}\n
\n \n {lang('Close')}\n \n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { chatId, messageId } = global.seenByModal || {};\n if (!chatId || !messageId) {\n return {};\n }\n\n return {\n memberIds: selectChatMessage(global, chatId, messageId)?.seenByUserIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['openChat', 'closeSeenByModal']),\n)(SeenByModal));\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 user?: ApiUser;\n isPinned?: boolean;\n isMuted?: boolean;\n};\n\nconst LeftSearchResultChat: FC = ({\n chatId,\n chat,\n user,\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 user,\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 user = 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 user,\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 { getGlobal, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiMessage } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { unique, pick } from '../../../util/iteratees';\nimport { getMessageSummaryText, sortChatIds, filterUsersByName } 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 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 = 5;\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, 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 contactIdsWithMe = [\n ...(currentUserId ? [currentUserId] : []),\n ...(localContactIds || []),\n ];\n // No need for expensive global updates on users, so we avoid them\n const usersById = getGlobal().users.byId;\n const foundContactIds = filterUsersByName(contactIdsWithMe, usersById, searchQuery);\n\n return [\n ...sortChatIds(unique([\n ...(foundContactIds || []),\n ...(localChatIds || []),\n ...(localUserIds || []),\n ]), chatsById, undefined, currentUserId ? [currentUserId] : undefined),\n ];\n }, [searchQuery, localContactIds, currentUserId, localChatIds, localUserIds, chatsById]);\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(\n unique([...globalChatIds, ...globalUserIds]),\n chatsById,\n true,\n );\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\n const { userIds: localContactIds } = global.contactList || {};\n\n if (!localContactIds) {\n return {\n chatsById,\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 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, GlobalState } 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 isActive?: boolean;\n onCreateFolder: () => void;\n onEditFolder: (folder: ApiChatFolder) => void;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n allListIds: GlobalState['chats']['listIds'];\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 isActive,\n allListIds,\n chatsById,\n usersById,\n orderedFolderIds,\n foldersById,\n recommendedChatFolders,\n notifySettings,\n notifyExceptions,\n onCreateFolder,\n onEditFolder,\n onScreenSelect,\n onReset,\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 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, allListIds, chatsById, usersById, folder, notifySettings, notifyExceptions,\n ),\n };\n });\n }, [lang, allListIds, foldersById, chatsById, usersById, orderedFolderIds, notifySettings, notifyExceptions]);\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: { listIds: allListIds, 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 allListIds,\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?.pinnedChats || []),\n ...(activeChatArrays?.otherChats || []),\n ...(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(\n isActive, onReset, onScreenSelect,\n mode === 'included' ? SettingsScreens.FoldersIncludedChats : SettingsScreens.FoldersExcludedChats,\n );\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 { filterUsersByName, getUserFullName } from '../../../modules/helpers';\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 filteredContactIds = useMemo(() => {\n const availableContactIds = unique([\n ...(contactIds || []),\n ...(localContactIds || []),\n ].filter((contactId) => {\n return contactId !== currentUserId && !blockedIds.includes(contactId);\n }));\n\n return filterUsersByName(availableContactIds, usersById, filter)\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, ApiUserStatus } from '../../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { throttle } from '../../../util/schedulers';\nimport { pick } from '../../../util/iteratees';\nimport { filterUsersByName, 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 userStatusesById: 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,\n filter,\n usersById,\n userStatusesById,\n contactIds,\n serverTimeOffset,\n onReset,\n loadContactList,\n openChat,\n}) => {\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadContactList();\n });\n });\n\n 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 filteredIds = filterUsersByName(contactIds, usersById, filter);\n\n return sortUserIds(filteredIds, usersById, userStatusesById, undefined, serverTimeOffset);\n }, [contactIds, filter, usersById, userStatusesById, 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, statusesById: userStatusesById } = global.users;\n\n return {\n usersById,\n userStatusesById,\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 { getGlobal, withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\n\nimport { pick, unique } from '../../../util/iteratees';\nimport { throttle } from '../../../util/schedulers';\nimport { filterUsersByName, 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 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 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 // No need for expensive global updates on users, so we avoid them\n const usersById = getGlobal().users.byId;\n const foundContactIds = localContactIds ? filterUsersByName(localContactIds, usersById, searchQuery) : [];\n\n return sortChatIds(\n unique([\n ...foundContactIds,\n ...(localUserIds || []),\n ...(globalUserIds || []),\n ]).filter((contactId) => {\n const user = usersById[contactId];\n if (!user) {\n return true;\n }\n\n return user.canBeInvitedToGroup && !user.isSelf && !isUserBot(user);\n }),\n chatsById,\n false,\n selectedMemberIds,\n );\n }, [localContactIds, chatsById, searchQuery, localUserIds, globalUserIds, selectedMemberIds]);\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: chatsById } = global.chats;\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 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)).map(Number);\n const idsToAdd = selectedFolderIds.filter((id) => !initialSelectedFolderIds.includes(id)).map(Number);\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, memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { ApiMessage, ApiUser } 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';\nimport Avatar from '../../common/Avatar';\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 canShowSeenBy?: boolean;\n seenByRecentUsers?: ApiUser[];\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 onShowSeenBy?: () => 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 canShowSeenBy,\n seenByRecentUsers,\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 onShowSeenBy,\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(`.Transition__slide--active > .MessageList div[data-message-id=\"${message.id}\"]`);\n }, [message.id]);\n\n const getRootElement = useCallback(\n () => document.querySelector('.Transition__slide--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 {canShowSeenBy && (\n \n {message.seenByUserIds?.length\n ? lang('Conversation.ContextMenuSeen', message.seenByUserIds.length, 'i')\n : lang('Conversation.ContextMenuNoViews')}\n
\n {seenByRecentUsers?.map((user) => (\n \n ))}\n
\n
\n )}\n {canDelete && {lang('Delete')}}\n \n );\n};\n\nexport default memo(MessageContextMenu);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { getGlobal, 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 selectChat,\n selectCurrentMessageList,\n} from '../../../modules/selectors';\nimport { isChatGroup, isOwnMessage } from '../../../modules/helpers';\nimport { SEEN_BY_MEMBERS_EXPIRE, SEEN_BY_MEMBERS_CHAT_MAX } from '../../../config';\nimport { pick } from '../../../util/iteratees';\nimport { getDayStartAt } from '../../../util/dateFormat';\nimport { copyTextToClipboard } from '../../../util/clipboard';\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';\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 canShowSeenBy?: boolean;\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 canShowSeenBy,\n setReplyingToId,\n setEditingId,\n pinMessage,\n openForwardMenu,\n faveSticker,\n unfaveSticker,\n toggleMessageSelection,\n sendScheduledMessages,\n rescheduleMessage,\n downloadMessageMedia,\n cancelMessageMediaDownload,\n loadSeenBy,\n openSeenByModal,\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 useEffect(() => {\n if (canShowSeenBy && isOpen) {\n loadSeenBy({ chatId: message.chatId, messageId: message.id });\n }\n }, [loadSeenBy, isOpen, message.chatId, message.id, canShowSeenBy]);\n\n const seenByRecentUsers = useMemo(() => {\n if (!message.seenByUserIds) {\n return undefined;\n }\n\n // No need for expensive global updates on users, so we avoid them\n const usersById = getGlobal().users.byId;\n return message.seenByUserIds?.slice(0, 3).map((id) => usersById[id]).filter(Boolean);\n }, [message.seenByUserIds]);\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 handleOpenSeenByModal = useCallback(() => {\n closeMenu();\n openSeenByModal({ chatId: message.chatId, messageId: message.id });\n }, [closeMenu, message.chatId, message.id, openSeenByModal]);\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 chat = selectChat(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 const canShowSeenBy = Boolean(chat\n && isChatGroup(chat)\n && isOwnMessage(message)\n && chat.membersCount\n && chat.membersCount < SEEN_BY_MEMBERS_CHAT_MAX\n && message.date > Date.now() / 1000 - SEEN_BY_MEMBERS_EXPIRE);\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 canShowSeenBy,\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 'loadSeenBy',\n 'openSeenByModal',\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 chatId: string;\n threadId: number;\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 chatId,\n threadId,\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 );\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 { getGlobal, withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\n\nimport { filterUsersByName } from '../../../modules/helpers';\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 currentUserId?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst RemoveGroupUserModal: FC = ({\n chat,\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 availableMemberIds = (chat.fullInfo?.members || [])\n .reduce((acc: string[], member) => {\n if (!member.isAdmin && !member.isOwner && member.userId !== currentUserId) {\n acc.push(member.userId);\n }\n return acc;\n }, []);\n\n // No need for expensive global updates on users, so we avoid them\n const usersById = getGlobal().users.byId;\n\n return filterUsersByName(availableMemberIds, usersById, filter);\n }, [chat.fullInfo?.members, currentUserId, filter]);\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 { currentUserId } = global;\n\n return { 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, ApiUserStatus } 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 userStatusesById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n serverTimeOffset: number;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupMembers: FC = ({\n members,\n usersById,\n userStatusesById,\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(\n members.map(({ userId }) => userId),\n usersById,\n userStatusesById,\n undefined,\n serverTimeOffset,\n );\n }, [members, serverTimeOffset, usersById, userStatusesById]);\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, statusesById: userStatusesById } = global.users;\n const members = chat?.fullInfo?.members;\n const isChannel = chat && isChatChannel(chat);\n\n return {\n members,\n usersById,\n userStatusesById,\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, ApiUserStatus } 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 userStatusesById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n serverTimeOffset: number;\n};\n\nconst ManageGroupUserPermissionsCreate: FC = ({\n usersById,\n userStatusesById,\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,\n userStatusesById,\n undefined,\n serverTimeOffset,\n );\n }, [members, serverTimeOffset, usersById, userStatusesById]);\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, statusesById: userStatusesById } = global.users;\n const members = chat?.fullInfo?.members;\n const isChannel = chat && isChatChannel(chat);\n\n return {\n members,\n usersById,\n userStatusesById,\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","memo","withGlobal","global","isDownloading","selectIsDownloading","setGlobal","actions","pick","mediaData","isVideo","isZoomed","fileName","isAvatar","onCloseMediaViewer","onForward","onZoomToggle","downloadMessageMedia","cancelMessageMediaDownload","loadProgress","downloadProgress","useMediaWithLoadProgress","getMessageMediaHash","handleDownloadClick","useCallback","lang","useLang","MenuButton","useMemo","onTrigger","isOpen","Button","round","size","color","className","undefined","onClick","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","dir","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","key","preventDefault","wrapperStyle","videoStyle","onMouseOver","onMouseOut","autoPlay","playsInline","loop","muted","onPlay","onEnded","onDoubleClick","onTimeUpdate","join","square","ownProps","chatId","threadId","messageId","avatarOwnerId","profilePhotoIndex","selectChatMessage","senderId","avatarOwner","selectUser","selectChat","selectScheduledMessage","props","isActive","animationLevel","onFooterClick","isFooterHidden","photo","getMessagePhoto","getMessageVideo","webPagePhoto","getMessageWebPagePhoto","webPageVideo","getMessageWebPageVideo","isDocumentPhoto","isMessageDocumentPhoto","isDocumentVideo","isMessageDocumentVideo","isPhoto","isFromSharedMedia","isFromSearch","isGhostAnimation","getMediaHash","isFull","photos","getChatAvatarHash","pictogramBlobUrl","useMedia","ApiMediaFormat","previewMediaHash","previewBlobUrl","fullMediaBlobUrl","getMessageMediaFormat","localBlobUrl","blobUrl","bestImageData","thumbDataUri","useBlurSync","getMessageMediaThumbDataUri","videoSize","getMessageFileSize","dimensions","getMessageDocument","mediaSize","getPhotoFullDimensions","getVideoDimensions","AVATAR_FULL_DIMENSIONS","renderPhoto","calculateMediaViewerDimensions","textParts","renderMessageText","hasFooter","imageSize","canDrag","draggable","Spinner","renderVideoPreview","alt","ANIMATION_DURATION","cancelAnimation","INITIAL_TRANSFORM","x","y","scale","getMessageId","selectMessage","rest","containerRef","activeSlideRef","transformRef","isSwipingRef","isActiveRef","activeMessageId","setActiveMessageId","forceUpdate","useForceUpdate","setIsFooterHidden","setTransform","value","setIsSwiping","setIsActive","debounceSetMessage","useDebounce","debounceSwipe","debounceActive","handleToggleFooterVisibility","lastTransform","lastDragOffset","lastZoomCenter","panDelta","initialContentRect","content","lastGestureTime","Date","now","setLastGestureTime","debounce","isNotPassive","excludedClosestSelector","event","type","pageX","innerWidth","arePropsShallowEqual","captureEvent","dragOffsetX","dragOffsetY","absOffsetX","abs","absOffsetY","h","touches","onZoom","zoomFactor","initialCenterX","initialCenterY","currentCenterX","currentCenterY","MAX_ZOOM","scaleFactor","scaledCenterX","scaledCenterY","scaleOffsetX","scaleOffsetY","centerX","centerY","animateNumber","from","to","timing","timingFunctions","onUpdate","absX","absY","boundaries","s1","x1","y1","k","Vx","Vy","minOffsetX","maxOffsetX","right","innerHeight","minOffsetY","top","maxOffsetY","bottom","direction","mId","dirX","offset","nextMessageId","previousMessageId","offsetX","offsetY","getAnimationStyle","INITIAL_MATRIX","SCALE_VALUES","ZOOM_SAFE_AREA","children","noWrap","canPan","zoomLevel","panDeltaX","panDeltaY","onPan","tunedZoomLevel","isDragging","setIsDragging","dragData","setDragData","dx","dy","matrixData","setMatrixData","panWrapperRef","panContainerRef","newZoomLevel","newPandx","newPandy","newMatrixData","areSortedArraysEqual","oldScale","wrapper","image","wrapperRect","imageRect","newImgWidth","newImgHeight","newImgX","newImgY","calculateSafeZoneOnZoom","transform","toString","onMouseDown","newDragData","pageY","onMouseUp","onMouseMove","deltaX","deltaY","getNewMatrixData","sender","isUserId","selectSender","closeMediaViewer","focusMessage","handleFocusMessage","senderTitle","getSenderTitle","Avatar","user","chat","renderText","formatMediaDateTime","date","Transition","isShown","onChangeZoom","prevIsShown","usePrevious","inputRef","setZoomLevel","disabled","step","onChange","Number","target","mediaViewer","settings","byKey","chatMessages","collectionIds","selectScheduledMessages","selectChatMessages","selectOutlyingIds","selectListedIds","currentSearch","selectCurrentMediaSearch","foundIds","resultsByType","media","openMediaViewer","openForwardMenu","isSingleSlide","messageIds","getChatMediaMessageIds","selectedMediaMessageIndex","indexOf","isFirst","isLast","animationKey","prevSenderId","slideAnimation","headerAnimation","canPanZoomWrap","setCanPanZoomWrap","setIsZoomed","setPanDelta","getMessageFileName","toggle","mql","matchMedia","MEDIA_VIEWER_MEDIA_QUERY","addListener","removeListener","prevMessage","prevOrigin","prevAvatarOwner","prevBestImageData","dispatchHeavyAnimationEvent","ANIMATION_END_DELAY","fromImage","windowWidth","windowSize","availableWidth","availableHeight","getMediaViewerAvailableDimensions","toWidth","toHeight","calculateDimensions","toLeft","toTop","topOffsetRem","matches","getTopOffset","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","forceOnHeavyAnimation","captureEscKeyListener","stopCurrentAudio","fromId","index","handlePan","renderSenderInfo","useHistoryBack","handleKeyDown","shouldCloseOnVideo","ShowTransition","isRtl","activeKey","name","currentUserId","chatOrUserIds","filterRef","filter","filterPlaceholder","onFilterChange","loadMore","onSelectChatOrUser","viewportIds","getMore","useInfiniteScroll","resetFilter","useInputFocusOnOpen","handleFilterChange","useKeyboardListNavigation","modalHeader","InputText","onKeyDown","placeholder","Modal","header","InfiniteScroll","items","onLoadMore","noScrollRestore","map","ListItem","PrivateChatInfo","status","userId","GroupChatInfo","Loading","chats","byId","chatsById","listIds","orderedPinnedIds","activeListIds","active","archivedListIds","archived","pinnedIds","contactIds","contactList","userIds","setForwardChatId","exitForwardMode","loadMoreChats","setFilter","chatAndContactIds","priorityIds","unique","chatIds","getCanPostInChat","MAIN_THREAD_ID","usersById","getGlobal","users","sortChatIds","filterChatsByName","filterUsersByName","handleSelectUser","renderingChatAndContactIds","useCurrentOrPrev","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","ConfirmDialog","confirmLabel","confirmHandler","WEEKDAY_LETTERS","isDisabledDay","year","month","day","minDate","maxDate","selectedDay","fixedMinDate","getFullYear","getMonth","getDate","fixedMaxDate","formatInputTime","String","padStart","formatDay","selectedAt","maxAt","isFutureMode","isPastMode","withTimePicker","submitButtonLabel","secondButtonLabel","onSubmit","onSecondButtonClick","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","seenByModal","memberIds","seenByUserIds","openChat","closeSeenByModal","handleClick","renderingMemberIds","noStatusOrTyping","onSelect","buttonRef","activeElement","privateChatUserId","isPinned","selectIsChatPinned","isMuted","selectIsChatMuted","selectNotifySettings","selectNotifyExceptions","withUsername","isChatFolderModalOpen","openChatFolderModal","closeChatFolderModal","contextActions","useChatContextActions","handleDelete","handleChatFolderChange","useSelectWithEnter","avatarSize","DeleteChatModal","runThrottled","cb","topUserIds","topPeers","recentlyFoundChatIds","globalSearch","onReset","loadTopUsers","loadContactList","addRecentlyFoundChatId","clearRecentlyFoundChats","topUsersRef","useHorizontalScroll","shouldReplaceHistory","lastSyncTime","privateChatUser","searchQuery","mediaThumbnail","mediaBlobUrl","isRoundVideo","getMessageRoundVideo","isSavedMessages","isSelf","getChatTitle","isVerified","VerifiedIcon","Link","formatPastTimeShort","getMessageSummaryText","highlight","renderMessageSummary","searchDate","suggestions","match","suggestion","currentDate","latestYear","getSuggestionsFromDate","localContactIds","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","contactIdsWithMe","foundContactIds","foundMessages","split","sort","a","b","handleClickShowMoreLocal","handleClickShowMoreGlobal","nothingFound","noScrollRestoreOnTop","noFastList","NothingFound","PickerSelectedItem","chatOrUserId","clickArg","createMapStateToProps","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","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","currentUsername","asLink","isUsernameAvailable","checkUsername","username","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","allListIds","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","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","searchWords","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","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","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","userSearch","setUserSearchQuery","blockContact","filteredContactIds","availableContactIds","contactId","firstId","secondId","getUserFullName","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","statusesById","userStatusesById","serverTimeOffset","filteredIds","sortUserIds","isSearching","selectedMemberIds","onSelectedMemberIdsChange","onNextStep","setGlobalSearchQuery","canBeInvitedToGroup","isUserBot","handleNextStep","creationProgress","creationError","chatCreation","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","canShowSeenBy","seenByRecentUsers","onReply","onEdit","onPin","onReport","onFaveSticker","onUnfaveSticker","onSend","onReschedule","onCopyLink","onDownload","onShowSeenBy","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","isOwnMessage","SEEN_BY_MEMBERS_CHAT_MAX","SEEN_BY_MEMBERS_EXPIRE","chatUsername","setReplyingToId","setEditingId","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","loadSeenBy","openSeenByModal","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","handleOpenSeenByModal","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","input","div","contentEditable","blur","handleMessageSearchQueryChange","newQuery","handleUp","newFocusIndex","handleDown","SearchInput","findInViewport","selectorOrElements","margin","isDense","shouldContainBottom","isHorizontal","viewportY1","viewportY2","allElements","visibleIndexes","isFound","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","canAutoFocus","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","senderChat","forwardInfo","isChannelPost","orderBy","foundResult","preloadBackwards","LastMessageMeta","selectShouldLoopStickers","isSomeModalOpen","onModalToggle","isAdded","areStickersLoaded","useOnChange","coverStickerIds","covers","otherStickers","handleAddClick","canRenderStickers","STICKER_SIZE_SEARCH","selectCurrentStickerSearch","resultIds","featured","featuredIds","loadFeaturedStickers","setIsModalOpen","selectCurrentGifSearch","isChatWithBot","selectIsChatWithBot","searchMoreGifs","setGifSearchQuery","handleGifClick","hasResults","answer","voters","offsets","pollResults","answerVote","totalVoters","loadPollOptionResults","closePollResults","prevVotersCount","votersCount","setIsLoading","areVotersLoaded","limit","shouldResetVoters","handleViewMoreClick","handleMemberClick","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","availableMemberIds","acc","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","fullName","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","concat","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/524.df43ecd790ed09f3bb50.js.map b/dist/524.df43ecd790ed09f3bb50.js.map deleted file mode 100644 index 4511c2680..000000000 --- a/dist/524.df43ecd790ed09f3bb50.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"524.df43ecd790ed09f3bb50.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// TODO Get values from `getConfig` method once it's available\nexport const SEEN_BY_MEMBERS_CHAT_MAX = 50;\nexport const SEEN_BY_MEMBERS_EXPIRE = 604680; // One week - 2 min\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 fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n waitingTimeout = self.setTimeout(() => {\n if (shouldRunLast) {\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 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 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 fn(...args);\n });\n }\n };\n}\n\nexport function onIdle(cb: NoneToVoidFunction, timeout?: number) {\n // eslint-disable-next-line no-restricted-globals\n if (self.requestIdleCallback) {\n // eslint-disable-next-line no-restricted-globals\n self.requestIdleCallback(cb, { timeout });\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/524.df43ecd790ed09f3bb50.js b/dist/524.fc60bb86a96ed24427c3.js similarity index 99% rename from dist/524.df43ecd790ed09f3bb50.js rename to dist/524.fc60bb86a96ed24427c3.js index 0733f8a81..ba3dd5ccf 100644 --- a/dist/524.df43ecd790ed09f3bb50.js +++ b/dist/524.fc60bb86a96ed24427c3.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.df43ecd790ed09f3bb50.js.map \ No newline at end of file +//# sourceMappingURL=524.fc60bb86a96ed24427c3.js.map \ No newline at end of file diff --git a/dist/524.fc60bb86a96ed24427c3.js.map b/dist/524.fc60bb86a96ed24427c3.js.map new file mode 100644 index 000000000..6ade94d79 --- /dev/null +++ b/dist/524.fc60bb86a96ed24427c3.js.map @@ -0,0 +1 @@ +{"version":3,"file":"524.fc60bb86a96ed24427c3.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_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// TODO Get values from `getConfig` method once it's available\nexport const SEEN_BY_MEMBERS_CHAT_MAX = 50;\nexport const SEEN_BY_MEMBERS_EXPIRE = 604680; // One week - 2 min\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 fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n waitingTimeout = self.setTimeout(() => {\n if (shouldRunLast) {\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 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 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 fn(...args);\n });\n }\n };\n}\n\nexport function onIdle(cb: NoneToVoidFunction, timeout?: number) {\n // eslint-disable-next-line no-restricted-globals\n if (self.requestIdleCallback) {\n // eslint-disable-next-line no-restricted-globals\n self.requestIdleCallback(cb, { timeout });\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/532.a0f46b886f04a00292c0.css b/dist/532.f896c17ee0c2c6548645.css similarity index 99% rename from dist/532.a0f46b886f04a00292c0.css rename to dist/532.f896c17ee0c2c6548645.css index 40a4b1b0f..1679385b2 100644 --- a/dist/532.a0f46b886f04a00292c0.css +++ b/dist/532.f896c17ee0c2c6548645.css @@ -7,4 +7,4 @@ .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(135deg, #3152e8, #8f4aac);transform:translateY(-100%)}.ActiveCallHeader.open{transform:translateY(0)}.ActiveCallHeader span{line-height:100%} -/*# sourceMappingURL=532.a0f46b886f04a00292c0.css.map*/ \ No newline at end of file +/*# sourceMappingURL=532.f896c17ee0c2c6548645.css.map*/ \ No newline at end of file diff --git a/dist/532.a0f46b886f04a00292c0.css.map b/dist/532.f896c17ee0c2c6548645.css.map similarity index 99% rename from dist/532.a0f46b886f04a00292c0.css.map rename to dist/532.f896c17ee0c2c6548645.css.map index f592e7044..3ca9d6ee7 100644 --- a/dist/532.a0f46b886f04a00292c0.css.map +++ b/dist/532.f896c17ee0c2c6548645.css.map @@ -1 +1 @@ -{"version":3,"file":"532.a0f46b886f04a00292c0.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,gBACA,gBAEA,qDAEE,sBAIJ,kEAGE,uBACA,mBAGF,uBACE,aACA,qBAEA,qEACE,iBAIJ,8BACE,WACA,YACA,iBACA,iBACA,gBACA,qB;AC5JJ,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 max-height: 90vh;\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(.Transition__slide--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 +{"version":3,"file":"532.f896c17ee0c2c6548645.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,gBACA,gBAEA,qDAEE,sBAIJ,kEAGE,uBACA,mBAGF,uBACE,aACA,qBAEA,qEACE,iBAIJ,8BACE,WACA,YACA,iBACA,iBACA,gBACA,qB;AC5JJ,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 max-height: 90vh;\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(.Transition__slide--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.a0f46b886f04a00292c0.js b/dist/532.f896c17ee0c2c6548645.js similarity index 99% rename from dist/532.a0f46b886f04a00292c0.js rename to dist/532.f896c17ee0c2c6548645.js index 97d057d88..c357cde06 100644 --- a/dist/532.a0f46b886f04a00292c0.js +++ b/dist/532.f896c17ee0c2c6548645.js @@ -1,3 +1,3 @@ -/*! For license information please see 532.a0f46b886f04a00292c0.js.LICENSE.txt */ +/*! For license information please see 532.f896c17ee0c2c6548645.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),S=a(706),P=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,P.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",S=()=>{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",S())}),200)},onMouseUp:()=>{v||(S(),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,P.Z)(),[m,v,g]=(0,S.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,P.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,P.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,P.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,P.Z)(),I=(0,i.sO)(null),[G,w]=(0,i.eJ)(!1),[T,U,D]=(0,S.Z)(),[$,R,V]=(0,S.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,S.Z)(),[J,X,Y]=(0,S.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,P.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=new MediaStream;return a.srcObject=i,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,audioContext:t,mediaStream:i},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.audioContext&&s.mediaStream){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.mediaStream,a=new window.AudioContext,i=a.createMediaStreamSource(n),o=a.createGain();o.gain.value=((null==l?void 0:l.volume)||1e4)/1e4;const d=a.createGain();o.gain.value=1;const u=a.createAnalyser();u.minDecibels=-100,u.maxDecibels=-30,u.smoothingTimeConstant=.05,u.fftSize=1024,i.connect(u).connect(d).connect(o).connect(a.destination),e.addTrack(i.mediaStream.getAudioTracks()[0]);const p=new Audio;p.srcObject=n,p.muted=!0,p.remove(),s={...s,participantFunctions:{...s.participantFunctions,[t]:{...null===(c=s.participantFunctions)||void 0===c?void 0:c[t],setVolume:e=>{o.gain.value=1{d.gain.value=e?0:1},getCurrentAmplitude:()=>{var e=new Uint8Array(u.frequencyBinCount);return u.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.a0f46b886f04a00292c0.js.map \ No newline at end of file +//# sourceMappingURL=532.f896c17ee0c2c6548645.js.map \ No newline at end of file diff --git a/dist/532.a0f46b886f04a00292c0.js.LICENSE.txt b/dist/532.f896c17ee0c2c6548645.js.LICENSE.txt similarity index 100% rename from dist/532.a0f46b886f04a00292c0.js.LICENSE.txt rename to dist/532.f896c17ee0c2c6548645.js.LICENSE.txt diff --git a/dist/532.a0f46b886f04a00292c0.js.map b/dist/532.f896c17ee0c2c6548645.js.map similarity index 99% rename from dist/532.a0f46b886f04a00292c0.js.map rename to dist/532.f896c17ee0c2c6548645.js.map index d7f2fc4af..fc34ee52f 100644 --- a/dist/532.a0f46b886f04a00292c0.js.map +++ b/dist/532.f896c17ee0c2c6548645.js.map @@ -1 +1 @@ -{"version":3,"file":"532.a0f46b886f04a00292c0.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:m,fingerprints:f,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 S=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)},v=()=>{r(`a=ice-ufrag:${l}`),r(`a=ice-pwd:${m}`),f.forEach((e=>{r(`a=fingerprint:${e.hash} ${e.fingerprint}`),r(\"a=setup:passive\")})),g.forEach(S)},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\"):(v(),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\"),v(),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:()=>m,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&&(m(\"audio\",!1),m(\"video\",!1),m(\"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\");f(\"connecting\");var i=new MediaStream;return n.srcObject=i,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(S,1e3),audioElement:n,audioContext:t,mediaStream:i},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 m(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 f(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(),f(\"disconnected\"),o.analyserInterval&&clearInterval(o.analyserInterval),o=void 0)}function S(){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 v(e){if(o&&o.audioElement&&o.audioContext&&o.mediaStream){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.mediaStream,i=new window.AudioContext,r=i.createMediaStreamSource(t),c=i.createGain();c.gain.value=(n?.volume||1e4)/1e4;const d=i.createGain();c.gain.value=1;const p=i.createAnalyser();p.minDecibels=-100,p.maxDecibels=-30,p.smoothingTimeConstant=.05,p.fftSize=1024,r.connect(p).connect(d).connect(c).connect(i.destination),e.addTrack(r.mediaStream.getAudioTracks()[0]);const u=new Audio;u.srcObject=t,u.muted=!0,u.remove(),o={...o,participantFunctions:{...o.participantFunctions,[a]:{...o.participantFunctions?.[a],setVolume:e=>{c.gain.value=1{d.gain.value=e?0:1},getCurrentAmplitude:()=>{var e=new Uint8Array(p.frequencyBinCount);return p.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?f(\"connected\"):\"checking\"===e||\"new\"===e?f(\"connecting\"):\"disconnected\"===i.iceConnectionState&&f(\"reconnecting\")}),i.ontrack=v,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","m","fingerprints","f","candidates","g","endpoint","join","S","foundation","component","protocol","priority","ip","port","generation","v","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","mediaStream","close","getDisplayMedia","getUserMedia","IS_ECHO_CANCELLATION_SUPPORTED","IS_NOISE_SUPPRESSION_SUPPORTED","createMediaStreamSource","createAnalyser","minDecibels","maxDecibels","smoothingTimeConstant","fftSize","getCurrentAmplitude","Uint8Array","frequencyBinCount","getByteFrequencyData","getAmplitude","stop","clearInterval","AudioContext","createGain","gain","destination","addTrack","Audio","remove","RTCPeerConnection","createDataChannel","onopen","onmessage","JSON","parse","colibriClass","onerror","log","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 +{"version":3,"file":"532.f896c17ee0c2c6548645.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 {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, useMemo,\n} from '../../../lib/teact/teact';\nimport { getGlobal } from '../../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiThreadInfo, ApiUser,\n} from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { isUserId } from '../../../modules/helpers';\nimport { formatIntegerCompact } from '../../../util/textFormat';\nimport buildClassName from '../../../util/buildClassName';\nimport useLang from '../../../hooks/useLang';\n\nimport Avatar from '../../common/Avatar';\n\nimport './CommentButton.scss';\n\ntype OwnProps = {\n threadInfo: ApiThreadInfo;\n disabled?: boolean;\n openChat: GlobalActions['openChat'];\n};\n\nconst CommentButton: FC = ({\n threadInfo,\n disabled,\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 const recentRepliers = useMemo(() => {\n if (!recentReplierIds?.length) {\n return undefined;\n }\n\n // No need for expensive global updates on chats and users, so we avoid them\n const { users: { byId: usersById }, chats: { byId: chatsById } } = getGlobal();\n\n return recentReplierIds.map((peerId) => {\n return isUserId(peerId) ? usersById[peerId] : chatsById[peerId];\n }).filter(Boolean);\n }, [recentReplierIds]);\n\n if (messagesCount === undefined) {\n return undefined;\n }\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(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 ApiThreadInfo,\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 selectThreadInfo,\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 threadInfo?: ApiThreadInfo;\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 threadInfo,\n toggleMessageSelection,\n clickInlineButton,\n disableContextMenuHint,\n openChat,\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 } = 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: threadInfo && threadInfo?.messagesCount > 0,\n hasActionButton: canForward || canFocus,\n });\n const withCommentButton = (\n threadInfo && (!isInDocumentGroup || isLastInDocumentGroup) && messageListType === 'thread' && !noComments\n );\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, threadInfo,\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 const actualThreadInfo = threadInfo\n ? selectThreadInfo(global, threadInfo.chatId, threadInfo.threadId) || threadInfo\n : undefined;\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 threadInfo: actualThreadInfo,\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 'openChat',\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 (forwardInfo?.channelPostId) {\n focusMessage({ chatId: senderPeer.id, messageId: forwardInfo.channelPostId });\n } else if (isUserId(senderPeer.id)) {\n openUserInfo({ id: senderPeer.id });\n } else {\n openChat({ id: senderPeer.id });\n }\n }, [focusMessage, forwardInfo?.channelPostId, lang, openChat, openUserInfo, senderPeer, showNotification]);\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 isReady: boolean;\n isScrollingRef: { current: boolean | undefined };\n isScrollPatchNeededRef: { current: boolean | undefined };\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 isReady,\n isScrollingRef,\n isScrollPatchNeededRef,\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 isReady,\n isScrollingRef,\n isScrollPatchNeededRef,\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 { LOCAL_MESSAGE_ID_BASE, MESSAGE_LIST_SLICE } from '../../../config';\nimport { IS_SCROLL_PATCH_NEEDED, MESSAGE_LIST_SENSITIVE_AREA } from '../../../util/environment';\nimport { debounce } from '../../../util/schedulers';\nimport { useIntersectionObserver, useOnIntersect } from '../../../hooks/useIntersectionObserver';\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 isReady: boolean,\n isScrollingRef: { current: boolean | undefined },\n isScrollPatchNeededRef: { current: boolean | undefined },\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 (!isReady) 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 if (\n IS_SCROLL_PATCH_NEEDED && isScrollingRef.current && messageIds.length <= MESSAGE_LIST_SLICE\n ) {\n isScrollPatchNeededRef.current = true;\n }\n\n loadMoreBackwards();\n } else if (target.className === 'forwards-trigger') {\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 useOnChange(() => {\n if (isReady) {\n toggleScrollTools();\n }\n }, [isReady]);\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, { patchChromiumScroll } 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 onFabToggle: (shouldShow: boolean) => void;\n onNotchToggle: (shouldShow: boolean) => void;\n hasTools?: boolean;\n withBottomShift?: 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 MESSAGE_ANIMATION_DURATION = 500;\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 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 withBottomShift,\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 isScrollingRef = useRef();\n const isScrollPatchNeededRef = useRef();\n\n const handleScroll = useCallback(() => {\n if (isScrollTopJustUpdatedRef.current) {\n isScrollTopJustUpdatedRef.current = false;\n return;\n }\n\n isScrollingRef.current = true;\n\n const container = containerRef.current!;\n\n if (!memoFocusingIdRef.current) {\n updateStickyDates(container, hasTools);\n }\n\n runDebouncedForScroll(() => {\n isScrollingRef.current = false;\n\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 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 // 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 && wasMessageAdded\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 }, MESSAGE_ANIMATION_DURATION);\n }\n\n const { scrollTop, scrollHeight, offsetHeight } = container;\n const scrollOffset = scrollOffsetRef.current;\n const lastItemElement = listItemElementsRef.current[listItemElementsRef.current.length - 1];\n\n 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 && container.querySelector(`#${anchorIdRef.current}`);\n const unreadDivider = (\n !anchor\n && memoUnreadDividerBeforeIdRef.current\n && container.querySelector(`.${UNREAD_DIVIDER_CLASS}`)\n );\n\n if (isAtBottom && isResized) {\n if (isAnimatingScroll()) {\n return;\n }\n\n newScrollTop = scrollHeight - offsetHeight;\n } else if (anchor) {\n if (isScrollPatchNeededRef.current) {\n isScrollPatchNeededRef.current = false;\n patchChromiumScroll(container);\n }\n\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 withBottomShift && 'with-bottom-shift',\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 selectUserStatus,\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 {\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 }\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 );\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: Boolean(\n !isChatWithSelf && !isChatWithBot && chat && chatUser\n && isUserId(chatId) && selectUserStatus(global, chatId)?.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, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './SeenByModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst SeenByModalAsync: FC = (props) => {\n const { isOpen } = props;\n const SeenByModal = useModuleLoader(Bundles.Extra, 'SeenByModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return SeenByModal ? : undefined;\n};\n\nexport default memo(SeenByModalAsync);\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 selectChatBot,\n selectCurrentMessageList,\n selectCurrentTextSearch,\n selectIsChatBotNotStarted,\n selectIsInSelectMode,\n selectIsRightColumnShown,\n selectIsUserBlocked,\n selectPinnedIds,\n selectTheme,\n} from '../../modules/selectors';\nimport {\n getCanPostInChat, getMessageSendingRestrictionReason, isChatChannel, isChatSuperGroup, isUserId,\n} from '../../modules/helpers';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\nimport { createMessageHash } from '../../util/routing';\nimport useCustomBackground from '../../hooks/useCustomBackground';\nimport useWindowSize from '../../hooks/useWindowSize';\nimport usePrevDuringAnimation from '../../hooks/usePrevDuringAnimation';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\nimport usePrevious from '../../hooks/usePrevious';\nimport calculateMiddleFooterTransforms from './helpers/calculateMiddleFooterTransforms';\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';\nimport SeenByModal from '../common/SeenByModal.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 hasPinnedOrAudioPlayer?: 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 isSeenByModalOpen: boolean;\n animationLevel?: number;\n shouldSkipHistoryAnimations?: boolean;\n currentTransitionKey: number;\n messageLists?: GlobalMessageList[];\n isChannel?: boolean;\n canSubscribe?: boolean;\n canStartBot?: boolean;\n canRestartBot?: boolean;\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 hasPinnedOrAudioPlayer,\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 isSeenByModalOpen,\n animationLevel,\n shouldSkipHistoryAnimations,\n currentTransitionKey,\n isChannel,\n canSubscribe,\n canStartBot,\n canRestartBot,\n openChat,\n unpinAllMessages,\n loadUser,\n closeLocalTextSearch,\n exitMessageSelectMode,\n closePaymentModal,\n clearReceipt,\n joinChannel,\n sendBotCommand,\n restartBot,\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 = hasPinnedOrAudioPlayer && (\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 renderingCanSubscribe = usePrevDuringAnimation(canSubscribe, CLOSE_ANIMATION_DURATION);\n const renderingCanStartBot = usePrevDuringAnimation(canStartBot, CLOSE_ANIMATION_DURATION);\n const renderingCanRestartBot = usePrevDuringAnimation(canRestartBot, CLOSE_ANIMATION_DURATION);\n const renderingCanPost = usePrevDuringAnimation(canPost, CLOSE_ANIMATION_DURATION)\n && !renderingCanRestartBot && !renderingCanStartBot && !renderingCanSubscribe;\n const renderingHasTools = usePrevDuringAnimation(hasTools, CLOSE_ANIMATION_DURATION);\n const renderingIsFabShown = usePrevDuringAnimation(isFabShown, CLOSE_ANIMATION_DURATION);\n const renderingIsChannel = usePrevDuringAnimation(isChannel, CLOSE_ANIMATION_DURATION);\n\n const prevTransitionKey = usePrevious(currentTransitionKey);\n const willSwitchMessageList = prevTransitionKey !== undefined && prevTransitionKey !== currentTransitionKey;\n if (willSwitchMessageList) {\n setIsReady(false);\n }\n const cleanupExceptionKey = (\n prevTransitionKey !== undefined && prevTransitionKey < currentTransitionKey ? prevTransitionKey : undefined\n );\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 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 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 }, { forceSyncOnIOs: true });\n };\n\n useHistoryBack(\n renderingChatId && renderingThreadId,\n closeChat, undefined, undefined, undefined,\n messageLists?.map(createMessageHash) || [],\n );\n\n useHistoryBack(isMobileSearchActive, closeLocalTextSearch);\n useHistoryBack(isSelectModeActive, exitMessageSelectMode);\n\n const isMessagingDisabled = Boolean(!isPinnedMessageList && !renderingCanPost && messageSendingRestrictionReason);\n const withMessageListBottomShift = Boolean(\n renderingCanRestartBot || renderingCanSubscribe || renderingCanStartBot || isPinnedMessageList,\n );\n const withExtraShift = Boolean(isMessagingDisabled || isSelectModeActive || isPinnedMessageList);\n\n return (\n \n \n
\n {renderingChatId && renderingThreadId && (\n <>\n
\n \n setIsReady(true)}\n >\n {() => (\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 {IS_SINGLE_COLUMN_LAYOUT && renderingCanSubscribe && (\n
\n \n {lang(renderingIsChannel ? 'ProfileJoinChannel' : 'ProfileJoinGroup')}\n \n
\n )}\n {IS_SINGLE_COLUMN_LAYOUT && renderingCanStartBot && (\n
\n \n {lang('BotStart')}\n \n
\n )}\n {IS_SINGLE_COLUMN_LAYOUT && renderingCanRestartBot && (\n
\n \n {lang('BotRestart')}\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 isSeenByModalOpen: Boolean(global.seenByModal),\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 bot = selectChatBot(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 const isMainThread = messageListType === 'thread' && threadId === MAIN_THREAD_ID;\n const isChannel = Boolean(chat && isChatChannel(chat));\n const canSubscribe = Boolean(\n chat && isMainThread && (isChannel || isChatSuperGroup(chat)) && chat.isNotJoined,\n );\n const canRestartBot = Boolean(bot && selectIsUserBlocked(global, bot.id));\n const canStartBot = !canRestartBot && isBotNotStarted;\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 hasPinnedOrAudioPlayer: (\n threadId !== MAIN_THREAD_ID\n || Boolean(!isPinnedMessageList && pinnedIds?.length)\n || Boolean(audioChatId && audioMessageId)\n ),\n pinnedMessagesCount: pinnedIds ? pinnedIds.length : 0,\n shouldSkipHistoryAnimations: global.shouldSkipHistoryAnimations,\n messageLists,\n isChannel,\n canSubscribe,\n canStartBot,\n canRestartBot,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat', 'unpinAllMessages', 'loadUser', 'closeLocalTextSearch', 'exitMessageSelectMode',\n 'closePaymentModal', 'clearReceipt', 'joinChannel', 'sendBotCommand', 'restartBot',\n ]),\n)(MiddleColumn));\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, ApiUserStatus,\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 userStatusesById?: 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 || !userStatusesById) {\n return undefined;\n }\n\n return sortUserIds(\n groupChatMembers.map(({ userId }) => userId),\n usersById,\n userStatusesById,\n undefined,\n serverTimeOffset,\n );\n }, [groupChatMembers, serverTimeOffset, usersById, userStatusesById]);\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 || tabListEl.offsetTop > container.scrollTop) {\n return;\n }\n\n isScrollingProgrammatically = true;\n fastSmoothScroll(\n container,\n container.firstElementChild as HTMLElement,\n 'start',\n undefined,\n container.offsetHeight * 2,\n );\n\n setTimeout(() => {\n isScrollingProgrammatically = false;\n }, PROGRAMMATIC_SCROLL_TIMEOUT_MS);\n\n onProfileStateChange(profileState);\n }, [profileState]);\n\n const determineProfileState = useCallback(() => {\n const container = containerRef.current;\n if (!container) {\n return;\n }\n\n const tabListEl = container.querySelector('.TabList');\n if (!tabListEl) {\n return;\n }\n\n let state: ProfileState = ProfileState.Profile;\n if (container.scrollTop >= tabListEl.offsetTop) {\n state = tabType === 'members'\n ? ProfileState.MemberList\n : ProfileState.SharedMedia;\n }\n\n onProfileStateChange(state);\n }, [containerRef, onProfileStateChange, tabType]);\n\n // Determine profile state when switching tabs\n useEffect(() => {\n if (isScrollingProgrammatically) {\n return;\n }\n\n determineProfileState();\n }, [determineProfileState, tabType]);\n\n // Determine profile state when scrolling\n const handleScroll = useCallback(() => {\n if (isScrollingProgrammatically) {\n return;\n }\n\n runThrottledForScroll(determineProfileState);\n }, [determineProfileState]);\n\n return { handleScroll };\n}\n","import React, {\n FC, useCallback, useEffect, useMemo, useRef, useState, memo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport {\n MAIN_THREAD_ID,\n ApiMessage,\n ApiChat,\n ApiChatMember,\n ApiUser,\n ApiUserStatus,\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 userStatusesById: 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 userStatusesById,\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, userStatusesById, chatsById, chatMessages, foundIds, chatId, lastSyncTime,\n 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 > .Transition__slide--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, statusesById: userStatusesById } = 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 userStatusesById,\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 { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport {\n ApiChat, ApiChatMember, ApiUpdateConnectionStateType,\n} from '../../api/types';\nimport { NewChatMembersProgress } from '../../types';\n\nimport { pick, unique } from '../../util/iteratees';\nimport { selectChat } from '../../modules/selectors';\nimport {\n filterUsersByName, 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 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 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 // No need for expensive global updates on users, so we avoid them\n const usersById = getGlobal().users.byId;\n const filteredContactIds = localContactIds ? filterUsersByName(localContactIds, usersById, searchQuery) : [];\n\n return sortChatIds(\n unique([\n ...filteredContactIds,\n ...(localUserIds || []),\n ...(globalUserIds || []),\n ]).filter((userId) => {\n const user = usersById[userId];\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 the current user,\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 (\n !memberIds.includes(userId)\n && userId !== currentUserId\n && (!user || !isUserBot(user) || (!isChannel && user.canBeInvitedToGroup))\n );\n }),\n chatsById,\n );\n }, [\n localContactIds, chatsById, searchQuery, localUserIds, globalUserIds, currentUserId, 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: 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 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, { forceSyncOnIOs: true });\n break;\n case RightColumnContent.UserInfo:\n if (isScrolledDown && shouldScrollUp) {\n setProfileState(ProfileState.Profile);\n break;\n }\n openUserInfo({ id: undefined }, { forceSyncOnIOs: 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 { processDeepLink } from '../../util/deeplink';\nimport windowSize from '../../util/windowSize';\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 { 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 loadEmojiKeywords({ language: BASE_EMOJI_KEYWORD_LANG });\n }\n }, [\n lastSyncTime, loadAnimatedEmojis, loadEmojiKeywords, loadNotificationExceptions, loadNotificationSettings,\n loadTopInlineBots, updateIsOnline,\n ]);\n\n // Language-based API calls\n useEffect(() => {\n if (lastSyncTime) {\n if (language !== BASE_EMOJI_KEYWORD_LANG) {\n loadEmojiKeywords({ language });\n }\n\n loadCountryList({ langCode: language });\n }\n }, [language, lastSyncTime, loadCountryList, loadEmojiKeywords]);\n\n // Check version when service chat is ready\n useEffect(() => {\n if (lastSyncTime && isServiceChatReady) {\n checkVersionNotification();\n }\n }, [lastSyncTime, isServiceChatReady, checkVersionNotification]);\n\n // Ensure time format\n useEffect(() => {\n if (lastSyncTime && !wasTimeFormatSetManually) {\n ensureTimeFormat();\n }\n }, [lastSyncTime, wasTimeFormatSetManually, ensureTimeFormat]);\n\n // Parse deep link\n useEffect(() => {\n if (lastSyncTime && LOCATION_HASH.startsWith('#?tgaddr=')) {\n processDeepLink(decodeURIComponent(LOCATION_HASH.substr('#?tgaddr='.length)));\n }\n }, [lastSyncTime]);\n\n // Prevent refresh by accidentally rotating device when listening to a voice chat\n useEffect(() => {\n if (!activeGroupCallId) {\n return undefined;\n }\n\n windowSize.disableRefresh();\n\n return () => {\n windowSize.enableRefresh();\n };\n }, [activeGroupCallId]);\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\"], link[rel=\"alternate 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","seenByModal","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","seenByUserIds","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","addUserStatuses","userStatusesById","updateChats","replaceChatListIds","updateChatListSecondaryInfo","loadAndUpdateUsers","contactIds","contactList","selectUser","updatedUsers","loadTopMessages","afterSyncCallback","DEBUG","console","log","savedUsers","lastLocalServiceMessage","selectLastServiceNotification","currentUserId","savedPrivateChatIds","savedChats","currentChatId","selectedChat","isUserId","selectedChatUser","replaceUserStatuses","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","statusesById","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","allListIds","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","forceOnHeavyAnimation","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","actualThreadInfo","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","channelPostId","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","isScrollingRef","isScrollPatchNeededRef","hasLinkedChat","isSchedule","onFabToggle","onNotchToggle","openHistoryCalendar","observeIntersectionForReading","observe","useIntersectionObserver","rootRef","throttleMs","margin","freezeForReading","unfreezeForReading","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","IS_SCROLL_PATCH_NEEDED","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","withBottomShift","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","hasLastMessageChanged","hasViewportShifted","wasMessageAdded","isAlreadyFocusing","shouldForceScroll","lastItemElement","bottomOffset","newScrollTop","isResized","isAnimatingScroll","patchChromiumScroll","resetScroll","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","selectUserStatus","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","canAutoFocus","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","SeenByModal","CLOSE_ANIMATION_DURATION","isImage","isBlurred","isBackgroundBlurred","background","customBackground","backgroundColor","patternColor","themes","isMobileSearchActive","isReceiptModalOpen","isSeenByModalOpen","getCanPostInChat","isBotNotStarted","isPinnedMessageList","isScheduledMessageList","currentUserBannedRights","defaultBannedRights","hasPinnedOrAudioPlayer","loadUser","closePaymentModal","clearReceipt","setDropAreaState","isFabShown","setIsFabShown","isNotchShown","setIsNotchShown","isUnpinModalOpen","setIsUnpinModalOpen","setIsReady","ANIMATION_LEVEL_MIN","renderingChatId","usePrevDuringAnimation","renderingThreadId","renderingMessageListType","renderingCanSubscribe","renderingCanStartBot","renderingCanRestartBot","renderingCanPost","renderingHasTools","renderingIsFabShown","renderingIsChannel","prevTransitionKey","willSwitchMessageList","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","forceSyncOnIOs","createMessageHash","isMessagingDisabled","withMessageListBottomShift","onTransitionEnd","propertyName","DARK_THEME_BG_COLOR","LIGHT_THEME_BG_COLOR","onDragEnter","onStop","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","tabListEl","determineProfileState","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","big","FloatingActionButton","DeleteMemberModal","RightSearch","Management","localContactIds","isSearching","onNextStep","setUserSearchQuery","selectedMemberIds","setSelectedMemberIds","noPickerScrollRestore","member","handleFilterChange","displayedIds","filteredContactIds","filterUsersByName","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/index.html b/dist/index.html index 861d674c1..ba10f7a38 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.0ea733c1154004de9988.js b/dist/main.0ea733c1154004de9988.js new file mode 100644 index 000000000..06e16d3db --- /dev/null +++ b/dist/main.0ea733c1154004de9988.js @@ -0,0 +1,2 @@ +(()=>{"use strict";var e,t,n,r,o,d,u={1226:(e,t,n)=>{n.d(t,{t9:()=>c,u3:()=>l,g8:()=>i});var r=n(3716),o=n(6926),d=n(9118);let u;const a=new Map,s=new Map;function i(e,t){return u||(r.eM&&console.log(">>> START LOAD WORKER"),u=new Worker(new URL(n.p+n.u(927),n.b)),function(e){u.addEventListener("message",(({data:t})=>{if("update"===t.type)e(t.update);else if("methodResponse"===t.type){const e=a.get(t.messageId);e&&(t.error?e.reject(t.error):e.resolve(t.response))}else if("methodCallback"===t.type){var n,r;null===(n=a.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(u)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&&u.postMessage({type:"cancelProgress",messageId:t})}function f(e){const t=(0,o.Z)(a),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 a.set(t,r),d.catch((()=>{})).finally((()=>{a.delete(t),r.callback&&s.delete(r.callback)})),u.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,u=2147483647;function a(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((u-c)/g))throw RangeError("punycode_overflow(1)");if(c+=v*g,b=y<=l?1:y>=l+26?26:y-l,vMath.floor(u/(d-b)))throw RangeError("punycode_overflow(2)");g*=d-b}if(i=n.length+1,l=a(c-p,i,0===p),Math.floor(c/i)>u-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:a,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||(a({url:e}),t.preventDefault(),!1):(t.preventDefault(),s({url:e}),!1)),[m,s,a,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:u?"rtl":"auto"},h)}))},5376:(e,t,n)=>{n.d(t,{yW:()=>r,K2:()=>o,mD:()=>d,Oh:()=>u,v6:()=>a});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 u(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 a(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),u=n(9937),a=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,u.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 u=(0,d.Z)((0,o.U)(e,t));return n?u:r.ZP.createElement(m,{className:"action-link",chatId:t.id},t&&(0,a.Z)(u))}(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 u=(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&&u&&!s&&!i&&!c&&!l;let y=(0,d.Z)(u,f);return m&&(s?y="a photo":i?y=i.isGif?"a GIF":"a video":c?y="a document":l&&(y=u)),p?g?`«${y}»`:y:g?r.ZP.createElement("span",null,"«",r.ZP.createElement(h,{className:"action-link",message:t},(0,a.Z)(y)),"»"):r.ZP.createElement(h,{className:"action-link",message:t},(0,a.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,a.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),u=n(7361),a=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.push(n),e):(t.innerText=n,e.push(t.innerHTML),e)),[])}(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,u=n.highlight,d.reduce(((e,t)=>{if("string"!=typeof t||!u)return e.push(t),e;const n=t.toLowerCase(),o=n.indexOf(u.toLowerCase()),d=n[o+u.length];if(o<0||d&&d.match(l))return e.push(t),e;const a=[];return a.push(t.substring(0,o)),a.push(r.ZP.createElement("span",{className:"matching-text-highlight"},t.substring(o,o+u.length))),a.push(t.substring(o+u.length)),[...e,...a]}),[]);case"links":return function(e){return e.reduce(((e,t)=>{if("string"!=typeof t)return e.push(t),e;const n=t.match(g);if(!n||!n.length)return e.push(t),e;const o=[];let d=n.shift(),u=0;for(;d;){const e=t.indexOf(d,u);o.push(t.substring(u,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}))),u=e+d.length,d=n.shift()}return o.push(t.substring(u)),[...e,...o]}),[])}(e);case"simple_markdown":return y(e,"jsx");case"simple_markdown_html":return y(e,"html")}var d,u;return e}),[e])}function m(e,t,n){return u.op?e:e.reduce(((e,d)=>{if("string"!=typeof d)return e.push(d),e;const u=(d=(0,a.g6)(d)).split(o.Z),i=d.match(o.Z)||[];return e.push(u[0]),i.reduce(((e,d,i)=>{const c=(0,a.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 u[f]&&e.push(u[f]),e}),e)}),[])}function p(e,t){return e.reduce(((e,n)=>{if("string"!=typeof n)return e.push(n),e;const o=n.split(/\r\n|\r|\n/g).reduce(((e,n,o,d)=>{const u=n.trimLeft(),a=n.length-u.length;return e.push(String.fromCharCode(160).repeat(a)+u),o!==d.length-1&&e.push("jsx"===t?r.ZP.createElement("br",null):"
"),e}),[]);return[...e,...o]}),[])}const g=new RegExp(`${d.FM}|${d.uW}`,"ig");function y(e,t){return e.reduce(((e,n)=>{if("string"!=typeof n)return e.push(n),e;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 u=2*d+2;return o[u]&&e.push(o[u]),e}),e)}),[])}},386:(e,t,n)=>{n.d(t,{q:()=>d,b:()=>u});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 u(e){d(e,!0)}},7373:(e,t,n)=>{n.d(t,{Z:()=>a});var r=n(4050),o=n(5116),d=n(782),u=n(1638);const a=(0,o.c$)(((e,{userId:t})=>({userOrChat:t?(0,u.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:()=>a});var r=n(4050),o=n(6752),d=n(9204),u=n(8512);const a=({ref:e,type:t="button",onClick:n,onContextMenu:a,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),O=(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"),Z=(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:O,href:S,title:C,download:E,tabIndex:k,dir:T?"rtl":void 0},f,!P&&M&&r.ZP.createElement(u.Z,null)):r.ZP.createElement("button",{ref:L,type:t,className:O,onClick:Z,onContextMenu:a,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(u.Z,null))}},4605:(e,t,n)=>{n.d(t,{Z:()=>s});var r=n(4050),o=n(6752),d=n(9107),u=n(2340),a=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,u.Z)(s)),i&&r.ZP.createElement("span",{className:"subLabel",dir:"auto"},(0,u.Z)(i))),m&&r.ZP.createElement(a.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:u="top",footer:a,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:u,footer:a,autoClose:!0,onClose:()=>{m(!1),c&&c()},shouldSkipTransition:s},n))}},7687:(e,t,n)=>{n.d(t,{Z:()=>u});var r=n(4050),o=n(6752),d=n(9107);const u=(0,r.X$)((({ref:e,id:t,className:n,value:u,label:a,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||a,E=(0,o.Z)("input-group",u&&"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:u||"",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 u=(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?u: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),u=n(8758),a=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,a.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,u.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:()=>u});var r=n(4050),o=n(6752),d=n(9107);const u=e=>{const{icon:t,className:n,children:u,onClick:a,href:s,download:i,disabled:c,destructive:l,ariaLabel:f}=e,h=(0,d.Z)(),m=(0,r.I4)((e=>{if(c||!a)return e.stopPropagation(),void e.preventDefault();a(e)}),[c,a]),p=(0,r.I4)((e=>{if(13===e.keyCode||32===e.keyCode)return c||!a?(e.stopPropagation(),void e.preventDefault()):void a(e)}),[c,a]),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}),u);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:a},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(),u=o.offsetWidth/2;t([...e,{x:r.clientX-d.x-u/2,y:r.clientY-d.y-u/2,size:u}]),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:()=>u,eM:()=>a,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,hT:()=>M,YQ:()=>A,rS:()=>k,t_:()=>T,Ov:()=>N,EN:()=>L,pn:()=>R,Hk:()=>D,Vk:()=>O,mo:()=>Z,qU:()=>x,ul:()=>_,NM:()=>F,Qx:()=>B,mw:()=>$,oB:()=>U,zy:()=>W,CX:()=>j,xS:()=>G,b6:()=>H,AR:()=>V,r_:()=>Q,R2:()=>z,nY:()=>K,QU:()=>J,jT:()=>q,_m:()=>Y,ks:()=>X,l3:()=>ee,u_:()=>te,rO:()=>ne,AE:()=>re,AJ:()=>oe,fK:()=>de,V$:()=>ue,bK:()=>ae,ck:()=>se,xn:()=>ie,K7:()=>ce,w7:()=>le,z7:()=>fe,qp:()=>he,Q:()=>me,Mw:()=>pe,DC:()=>ge,Y7:()=>ye,yK:()=>ve,K2:()=>be,bM:()=>we,ku:()=>Ie,zq:()=>Ce,n:()=>Se,pR:()=>Ee,kU:()=>Pe,Y:()=>Me,Ng:()=>Ae,oG:()=>ke,wG:()=>Te,dI:()=>Ne,FM:()=>Le,uW:()=>Re,g$:()=>De,FS:()=>Oe,FD:()=>Ze,aw:()=>xe,FV:()=>_e,Nf:()=>Fe,WS:()=>Be,DU:()=>$e,EG:()=>Ue,t4:()=>We,sR:()=>je,$O:()=>Ge,Bg:()=>He,vi:()=>Ve,Db:()=>Qe,mU:()=>ze,p3:()=>Ke,It:()=>Je,Vv:()=>qe,g:()=>Ye,Hc:()=>Xe,EH:()=>et,Ro:()=>tt,aC:()=>nt,LH:()=>rt});const r="Telegram",o=" [Inactive]",d="Telegram WebZ",u="1.26.1",a=!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=E?60:40,A=2*M,k=72,T=E?30:25,N=100,L=42,R=42,D=20,O=30,Z=200,x=500,_=20,F=!1,B=1,$=1,U=0,W=2,j=W,G=16,H=17,V=15,Q=1e4,z="editable-message-text",K="editable-message-text-modal",J=1440,q=1150,Y=1275,X=925,ee=600,te=950,ne=450,re=1e9,oe="0",de=100,ue=1500,ae=250,se=600,ie=500,ce=(Math.round((ae+se)/2),new Set(["newMessage","newScheduledMessage","deleteMessages","deleteScheduledMessages","deleteHistory"]),13),le=11,fe=160,he=120,me=64,pe=48,ge=32,ye=64,ve=64,be=160,we=140,Ie=80,Ce=100,Se="MEMOJI_STICKER",Ee="en",Pe=200,Me=450,Ae="video/quicktime",ke=new Set(["image/png","image/gif","image/jpeg"]),Te=new Set(["video/mp4"]),Ne=new Set([...ke,...Te]),Le="((ftp|https?):\\/\\/)?((www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,63})\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)",Re="(@[\\w\\d_-]+)",De=/^tg:(\/\/)?([?=&\d\w_-]+)?/gm,Oe=/^(?:https?:\/\/)?(?:t\.me\/)/gm,Ze=new Set(["AU","BD","CA","CO","EG","HN","IE","IN","JO","MX","MY","NI","NZ","PH","PK","SA","SV","US"]),xe="777000",_e="1271266957",Fe=0,Be=1,$e=10,Ue=5,We=2147483646,je="en",Ge="android",He=["android","ios","tdesktop","macos"],Ve="TelegramTips",Qe=["ar","pt-br","id","it","ko","ms","pl","es","tr"],ze="https://bugs.telegram.org/?tag_ids=41&sort=time",Ke="#A2AF8E",Je="#0F0F0F",qe="#0a0a0a8c",Ye="rgba(90, 110, 70, 0.6)",Xe=50,et=604680,tt=100,nt=100*tt,rt=!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,{ZP:()=>s,zG:()=>i,YW:()=>c});var r=n(4050);const o="tt-event-heavy-animation-start",d="tt-event-heavy-animation-end";let u,a=!1;const s=(e,t)=>{(0,r.d4)((()=>(a&&e(),document.addEventListener(o,e),document.addEventListener(d,t),()=>{document.removeEventListener(d,t),document.removeEventListener(o,e)})),[t,e])};function i(){return a}function c(e=1e3){function t(){u&&(clearTimeout(u),u=void 0),a=!1,document.dispatchEvent(new Event(d))}return a||(a=!0,document.dispatchEvent(new Event(o))),u&&(clearTimeout(u),u=void 0),u=window.setTimeout(t,e),t}},6590:(e,t,n)=>{n.d(t,{Oy:()=>s,Wv:()=>l,ZP:()=>h});var r=n(4050),o=n(7361),d=n(7204),u=n(5116),a=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,u.uC)().disableHistoryAnimations(),t(!c.isEdge),p.current=!0)):o===r&&p.current&&n&&!l&&(h.current=!0,c.isEdge&&(0,u.uC)().disableHistoryAnimations(),n(e.state.state))}catch(e){}},o=l?!y||!(0,a.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[u,a]=(0,r.eJ)(-1);return(0,r.d4)((()=>{a(-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(u);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)||u;if(38===t.keyCode&&i>0)i--;else if(40===t.keyCode&&i{n.d(t,{Z:()=>u});var r=n(663),o=n(5326),d=n(9290);const u=()=>{const e=(0,o.Z)();return(0,d.Z)((()=>r.ll(e)),[e]),r.i0}},8778:(e,t,n)=>{n.d(t,{Z:()=>u});var r=n(4050),o=n(9203),d=n(5326);const u=(e,t,n=!1,u=!1)=>{const a=(0,o.o5)(e,t),s=(0,d.Z)();return u&&(0,o.Qt)(s),(0,r.d4)((()=>{n||a||(0,o.$y)(e,t).then(s)}),[e,s,a,t,n]),a}},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",u=!1)=>{const[a,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),a||i.current||(i.current=window.setTimeout((()=>{s(!0),t&&t(),i.current=void 0}),u?0:350)));const f=c&&!(u&&!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={},u=new Map,a={};function s(e,t,n,r=!1){const o=c(t,e);l(o,e,r)?function(e,t,n){a[e]||(a[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=u.get(e);if(t)return t;const n=new Set;return u.set(e,n),n}(t).add(e),a[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){a[e]--,a[e]||document.removeEventListener(e,m),d[e].delete(t),u.get(t).delete(e)}function h(e){const t=u.get(e);t&&(t.forEach((t=>f(t,e))),u.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()},u=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(u),n))return;r=r.parentNode}}}r.eM&&document.addEventListener("dblclick",(()=>{console.log("DELEGATED EVENTS",{delegationRegistry:d,delegatedEventsByElement:u,documentEventCounters:a})}))},2916:(e,t,n)=>{n.d(t,{Z:()=>y});var r=n(4050),o=n(6926),d=n(3716),u=n(5247);const a=new Set(["key","ref","teactFastList","teactOrderKey"]),s=new Set(["dir","role"]),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,u.xg)(e,t,n,t.endsWith("Capture")):t.startsWith("data-")||t.startsWith("aria-")||s.has(t)?e.removeAttribute(t):a.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)&&null==t&&console.warn("Missing `key` in `teactFastList`"),t})));let u=0;const a=e.children.reduce(((e,r,d)=>{let a="props"in r?r.props.key:void 0;const s=null!=a;if(s&&!o.has(a))return l(n,r,void 0,t,-1),e;if(!s){const o=t.children[d],u=o&&"props"in o?o.props.key:void 0;if(!o||u)return l(n,r,void 0,t,-1),e;a=`__indexKey#${d}`}return e[a]={$element:r,index:u++,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=a[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 u="props"in e?e.props.teactOrderKey:void 0,h=d.index!==f&&d.order!==u,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),u=[],a=t.children.length>e.children.length+1?document.createDocumentFragment():void 0;for(let r=0;r=e.children.length?{fragment:a}:void 0);o&&u.push(o)}return a&&n.appendChild(a),u}(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 u=e.children[0];(0,r.op)(u)&&(e.children=[f(u,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,u.Oo)(e,t,n,t.endsWith("Capture")):t.startsWith("data-")||t.startsWith("aria-")||s.has(t)?e.setAttribute(t,n):a.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:()=>O,Ye:()=>Z,I4:()=>x,sO:()=>_,X$:()=>F,ZP:()=>B});var r=n(3716),o=n(9118),d=n(782),u=n(275),a=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,a.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,a.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,o,d){const{cursor:u,byCursor:s}=l.hooks.effects,i=l;function c(){if(!i.isMounted)return;const{cleanup:e}=s[u];if("function"==typeof e)try{let t;if(r.eM&&(t=performance.now()),e(),r.eM){const e=performance.now()-t,n=i.name;e>7&&console.warn(`[Teact] Slow cleanup at effect cursor #${u}: ${n}, ${Math.round(e)} ms`)}}catch(e){(0,a.S)(e)}}function f(){if(!i.isMounted)return;let e;if(r.eM&&(e=performance.now()),s[u].cleanup=n(),r.eM){const t=performance.now()-e,n=i.name;t>7&&console.warn(`[Teact] Slow effect at cursor #${u}: ${n}, ${Math.round(t)} ms`)}}if(void 0!==s[u]&&o&&s[u].dependencies){if(o.some(((e,t)=>e!==s[u].dependencies[t]))){if(d){const e=o.reduce(((e,t,n)=>{const r=s[u].dependencies[n];return t!==r&&e.push(`${n}: ${r} => ${t}`),e}),[]);console.log("[Teact]",d,"Effect caused by dependencies.",e.join(", "))}t(c),e(f)}}else t(c),e(f);s[u]={effect:n,dependencies:o,cleanup:s[u]?s[u].cleanup:void 0},l.hooks.effects.cursor++}function D(e,t,n){return R(o.T2,o.D0,e,t,n)}function O(e,t,n){return R(o.R3,o.zD,e,t,n)}function Z(e,t,n){const{cursor:o,byCursor:d}=l.hooks.memos;let{current:a}=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,u.c)(t,d[o].dependencies).join(", "):"[first render]"),a=e()),d[o]={current:a,dependencies:t},l.hooks.memos.cursor++,a}function x(e,t,n){return Z((()=>e),t,n)}function _(e){return Z((()=>({current:e})),[])}function F(e,t=u.Z,n){return function(o){const d=_(o),a=_();return(!a.current||d.current&&!t(d.current,o))&&(r.eM&&n&&console.log(`[Teact.memo] ${e.name} (${n}): Update is caused by:`,(0,u.c)(d.current,o).join(", ")),d.current=o,a.current=y(e,o)),a.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:()=>h,R3:()=>I,Rd:()=>C,uC:()=>S,Q6:()=>E,ll:()=>P,Iq:()=>M,c$:()=>A});var r=n(4050),o=n(3716),d=n(5326),u=n(6926),a=n(9118),s=n(275),i=n(782),c=n(3592),l=n(8674);function f(){return(f=Object.assign||function(e){for(var t=1;t7&&console.warn(`[TeactN] Slow containers update: ${Math.round(t)} ms`)}}],y={},v=new Map,b=(0,a.mS)(w);function w(e=!1){e||!(0,l.zG)()?g.forEach((e=>e(m))):b()}function I(e,t){"object"==typeof e&&e!==m&&(m=e,null!=t&&t.forceSyncOnIOs?w(!0):b(null==t?void 0:t.forceOnHeavyAnimation))}function C(){return m}function S(){return y}function E(e,t){p[e]||(p[e]=[],y[e]=(t,n)=>{!function(e,t,n){p[e]&&p[e].forEach((e=>{const r=e(m,y,t);r&&I(r,n)}))}(e,t,n)}),p[e].push(t)}function P(e){g.push(e)}function M(e){const t=g.indexOf(e);-1!==t&&g.splice(t,1)}function A(e=(()=>({})),t=(()=>({}))){return n=>function o(a){o.DEBUG_contentComponentName=n.name;const[i]=(0,r.eJ)((0,u.Z)(v)),l=(0,d.Z)();(0,r.d4)((()=>()=>{v.delete(i)}),[i]);let h=v.get(i);if(h||(h={mapStateToProps:e,mapReducersToProps:t,ownProps:a,areMappedPropsChanged:!1,forceUpdate:l,DEBUG_updates:0,DEBUG_componentName:n.name},v.set(i,h)),h.areMappedPropsChanged&&(h.areMappedPropsChanged=!1),!h.mappedProps||!(0,s.Z)(h.ownProps,a)){h.ownProps=a;try{h.mappedProps={...e(m,a),...t(I,y)}}catch(e){(0,c.S)(e)}}return r.ZP.createElement(n,f({},h.mappedProps,a))}}o.eM&&(window.getGlobal=C,document.addEventListener("dblclick",(()=>{console.log("GLOBAL CONTAINERS",(0,i.Xo)(Array.from(v.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:()=>u});const r=/\uFE0F/g,o=String.fromCharCode(8205);function d(e){return e.indexOf(o)<0?e.replace(r,""):e}const u=/(?:\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),u=n(7361),a=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:u.Lt,sessionData:(0,c.K8)(),isTest:window.location.search.includes("test"),isMovSupported:u.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,a.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),u=n(1226),a=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,u={visibility:t};let a,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||(a=n.map(i).filter(Boolean),s=n.map(c).filter(Boolean),a.length>0&&(u.allowedUsers=a),s.length>0&&(u.allowedChats=s)),"everybody"!==t&&"contacts"!==t||(a=r.map(i).filter(Boolean),s=r.map(c).filter(Boolean),a.length>0&&(u.blockedUsers=a),s.length>0&&(u.blockedChats=s)),u}(0,r.Q6)("updateProfile",((e,t,n)=>{const{photo:d,firstName:a,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,u.t9)("updateProfilePhoto",d),(a||s||i)&&await(0,u.t9)("updateProfile",{firstName:a,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:a,lastName:s,fullInfo:{...n.fullInfo,bio:i}}))}f&&await(0,u.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,u.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,u.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,a=URL.createObjectURL(d);(0,r.R3)({...e,settings:{...e.settings,loadedWallpapers:[{slug:o.mp,document:{fileName:"",size:d.size,mimeType:d.type,previewBlobUrl:a}},...e.settings.loadedWallpapers||[]]}}),(async()=>{const t=await(0,u.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:a}};(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,u.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,a.ee)(n.users,"id"))),null!==(t=n.chats)&&void 0!==t&&t.length&&(o=(0,l.GL)(o,(0,a.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,u.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,u.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,u.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,u.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,u.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,u.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,u.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:a}=n;(async()=>{await(0,u.t9)("updateNotificationSettings",o,{isSilent:d,shouldShowPreviews:a})&&(0,r.R3)((0,l.HN)((0,r.Rd)(),o,d,a))})()})),(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,u.t9)("updateContactSignUpNotification",o)&&(0,r.R3)((0,l.BI)((0,r.Rd)(),{hasContactJoinedNotifications:!o}))})()})),(0,r.Q6)("loadLanguages",(()=>{(async()=>{const e=await(0,u.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,u.t9)("fetchPrivacySettings","phoneNumber"),(0,u.t9)("fetchPrivacySettings","lastSeen"),(0,u.t9)("fetchPrivacySettings","profilePhoto"),(0,u.t9)("fetchPrivacySettings","forwards"),(0,u.t9)("fetchPrivacySettings","chatInvite")]);if(!(e&&t&&n&&o&&d))return;const a=(0,r.Rd)();a.settings.privacy.phoneNumber=e,a.settings.privacy.lastSeen=t,a.settings.privacy.profilePhoto=n,a.settings.privacy.forwards=o,a.settings.privacy.chatInvite=d,(0,r.R3)(a)})()})),(0,r.Q6)("setPrivacyVisibility",((e,t,n)=>{const{privacyKey:o,visibility:d}=n,{privacy:{[o]:a}}=e.settings;if(!a)return;const s=h(e,{visibility:d,allowedIds:[...a.allowUserIds,...a.allowChatIds],deniedIds:[...a.blockUserIds,...a.blockChatIds]});(async()=>{const e=await(0,u.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:a}=n,{privacy:{[o]:s}}=e.settings;if(!s)return;const i=h(e,{visibility:s.visibility,allowedIds:d?a:[...s.allowUserIds,...s.allowChatIds],deniedIds:d?[...s.blockUserIds,...s.blockChatIds]:a});(async()=>{const e=await(0,u.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,u.t9)("updateIsOnline",n)})),(0,r.Q6)("loadContentSettings",(()=>{(async()=>{const e=await(0,u.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,u.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,u.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,u.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),u=n(307),a=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,a.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,u.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});break}}}))},7895:(e,t,n)=>{var r=n(5116),o=n(3716),d=n(7361),u=n(663),a=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:u}=n.settings.byKey;d!==t&&((0,a.Z)(d,u===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,u.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,a.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"),d.s$&&document.body.classList.add("is-safari")})),(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},{forceSyncOnIOs:!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:()=>c,Bf:()=>l,G9:()=>f,ZV:()=>h,eA:()=>m,Ru:()=>p,pK:()=>g,l6:()=>y,zX:()=>v,U:()=>b,GM:()=>w,hu:()=>I,RT:()=>C,Hp:()=>S,Nl:()=>E,VE:()=>P,Mg:()=>M,Qm:()=>A,H5:()=>k,q8:()=>T,Hd:()=>N,OE:()=>L,pE:()=>R,i4:()=>D,Sm:()=>O,cc:()=>Z,P4:()=>x,O:()=>_,wG:()=>B,Fu:()=>$,SB:()=>U,zF:()=>W,ih:()=>j,$l:()=>G});var r=n(6137),o=n(3716),d=n(782),u=n(5527),a=n(790),s=n(5765);const i=Date.now()/1e3+31622400;function c(e){return"number"==typeof e?e>0:!e.startsWith("-")}function l(e){return f(e)||h(e)}function f(e){return"chatTypeBasicGroup"===e.type}function h(e){return"chatTypeSuperGroup"===e.type}function m(e){return"chatTypeChannel"===e.type}function p(e){return"chatTypePrivate"===e.type||"chatTypeBasicGroup"===e.type}function g(e){return e===o.FV}function y(e){switch(e.type){case"chatTypePrivate":return"PrivateChat";case"chatTypeBasicGroup":case"chatTypeSuperGroup":return"AccDescrGroup";case"chatTypeChannel":return"AccDescrChannel";default:return"Chat"}}function v(e){if("chatTypePrivate"===e.type||"chatTypeSecret"===e.type)return e.id}function b(e,t,n,r=!1){return r||n&&t.id===n.id&&n.isSelf?e("SavedMessages"):t.title||e("HiddenName")}function w(e){if(e.fullInfo)return e.fullInfo.about}function I(e){const{username:t}=e;if(t)return`https://t.me/${t}`;const{inviteLink:n}=e.fullInfo||{};return n}function C(e,t="normal"){if(e.avatarHash)switch(t){case"big":return`profile${e.id}?${e.avatarHash}`;default:return`avatar${e.id}?${e.avatarHash}`}}function S(e){return!e.lastMessage}function E(e){return Boolean(e.adminRights)}function P(e,t){return!!e.adminRights&&e.adminRights[t]}function M(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 A(e,t){return t!==r._f||!(e.isRestricted||e.migratedTo||e.isNotJoined||g(e.id))&&(!!e.isCreator||!!c(e.id)||(m(e)?P(e,"postMessages"):E(e)||!M(e,"sendMessages")))}function k(e,t=!1){if(!e)return{canAttachMedia:!1,canAttachPolls:!1,canSendStickers:!1,canSendGifs:!1,canAttachEmbedLinks:!1};const n=E(e);return{canAttachMedia:n||!M(e,"sendMedia"),canAttachPolls:(n||!M(e,"sendPolls"))&&(!c(e.id)||t),canSendStickers:n||!M(e,"sendStickers"),canSendGifs:n||!M(e,"sendGifs"),canAttachEmbedLinks:n||!M(e,"embedLinks")}}function T(e,t,n){if(null!=t&&t.sendMessages){const{untilDate:n}=t;return n&&n{const c=t[e];return c&&function(e,t,n,r,d,u,a,s){if(!e.isListed)return!1;const{id:i,type:c,unreadMentionsCount:l}=e;if(null!=u&&u.has(i))return!1;if(null!=a&&a.has(i))return!0;if(null!=s&&s.has(i))return!0;if(t.excludeArchived&&e.folderId===o.WS)return!1;if(t.excludeRead&&!e.unreadCount&&!l&&!e.hasUnreadMark)return!1;if(t.excludeMuted&&!l&&D(e,r,d))return!1;if("chatTypePrivate"===c){const e=n[i];if(e){const{type:n,isContact:r}=e;if("userTypeBot"===n){if(t.bots)return!0}else{if(t.contacts&&r)return!0;if(t.nonContacts&&!r)return!0}}}else{if("chatTypeChannel"===c)return!!t.channels;if("chatTypeBasicGroup"===c||"chatTypeSuperGroup"===c)return!!t.groups}return!1}(c,r,n,d,u,a,s,i)})),r.pinnedChatIds]}function _(e,t,n,r="all",o=!1){const u=new Set(t),a=n?new Set(n):void 0,s=(null==n?void 0:n.reduce(((t,n)=>{const o=e[n];return o&&u.has(o.id)&&F(o,r)&&t.push(o),t}),[]))||[],i=t.reduce(((t,n)=>{const o=e[n];return!o||a&&a.has(o.id)||!F(o,r)||t.push(o),t}),[]);return{pinnedChats:s,otherChats:o?i:(0,d.Xo)(i,L,"desc")}}function F(e,t){return e.lastMessage&&!e.migratedTo&&!e.isRestricted&&!e.isNotJoined&&!("all"===t&&e.folderId===o.WS)&&!("archived"===t&&e.folderId!==o.WS)}function B(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 $(e,t,n,r,o,d){const[u]=x(e,t,n,r,o,d);let a=!1;return{unreadDialogsCount:u.reduce(((e,n)=>{const r=t[n];if(null==r||!r.lastMessage||null!=r&&r.isRestricted||null!=r&&r.isNotJoined)return e;const u=r.unreadCount||r.hasUnreadMark;return u&&e++,!a&&(r.unreadMentionsCount||u&&!D(r,o,d))&&(a=!0),e}),0),hasActiveDialogs:a}}function U(e,t,n,r,o,d,u){const{id:a,title:s,emoticon:i,description:c,pinnedChatIds:l,excludedChatIds:f,includedChatIds:h,excludeArchived:m,excludeMuted:p,excludeRead:g,...y}=o;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[u,a]=x(e,t,n,r,o,d),{pinnedChats:s,otherChats:i}=_(t,u,a,"folder",!0);return s.length+i.length}(t,n,r,o,d,u)):y.bots?e("FilterBots"):y.groups?e("FilterGroups"):y.channels?e("FilterChannels"):y.contacts?e("FilterContacts"):y.nonContacts?e("FilterNonContacts"):void 0}function W(e,t,n){if(n&&!c(t))return n.isSelf?e("FromYou"):(0,u.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")}function G(e,t,n,r,o){if(!r)return t;const d=(0,s.W)(r);return t.filter((t=>{const r=n[t];return!!r&&d(b(e,r,void 0,t===o))}))}},2858:(e,t,n)=>{n.d(t,{uw:()=>ie,$l:()=>o.$l,kK:()=>r.kK,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:()=>ue,N5:()=>x,oP:()=>_,qp:()=>L,w6:()=>T,R5:()=>ae,$D:()=>g,aE:()=>$,ep:()=>X,c0:()=>ee,eO:()=>G,Tp:()=>l,kG:()=>Y,Ti:()=>K,DH:()=>z,KK:()=>h,O$:()=>D,t9:()=>j,Y5:()=>Z,zF:()=>o.zF,q8:()=>o.q8,_O:()=>y,bf:()=>B,MK:()=>m,UD:()=>p,b7:()=>O,kd:()=>F,s1:()=>H,F$:()=>V,Cg:()=>Q,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:()=>W,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),u=n(3716),a=n(7361),s=n(4784);const i="The message is not supported on this version of Telegram",c=new RegExp(u.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:u,voice:a,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():u?`${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")}`:a?`${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:u,document:a,poll:s,webPage:c,contact:l,invoice:f}=e.content;return t?t.text:n||r||o||d||u||a||l||s||c||f?void 0:i}function g(e){const{text:t,sticker:n,photo:r,video:o,audio:d,voice:u,document:a,poll:i,webPage:c,contact:l}=e.content;return!!(n||null!=o&&o.isRound)||!(!t||r||o||d||u||a||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===u.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>=u.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,a.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?a.m5?`${d}.ogg`:`${d}.wav`:d}var N=n(5376);function L(e){return e.content}function R(e){return Boolean(D(e)||O(e)||$(e)||B(e)||function(e){return e.content.contact}(e)||j(e)||x(e)||_(e)||F(e))}function D(e){return e.content.photo}function O(e){return e.content.video}function Z(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 W(e){const t=$(e);return t?"video"===t.mediaType:void 0}function j(e){return e.content.poll}function G(e){return e.content.invoice}function H(e){return e.content.webPage}function V(e){var t;return null===(t=H(e))||void 0===t?void 0:t.photo}function Q(e){var t;return null===(t=H(e))||void 0===t?void 0:t.video}function z(e){var t;return null===(t=function(e){const t=D(e)||O(e)||$(e)||B(e)||V(e)||Q(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:u,document:a}=e.content,s=V(e),i=Q(e),c=r||i,f=n||s;if(!(f||c||o||d||u||a))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(a)switch(t){case"micro":case"pictogram":case"inline":case"viewerPreview":if(!(0,N.v6)(a)||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(u)switch(t){case"micro":case"pictogram":return;case"inline":return h;case"download":return`${h}?download`}}function J(e,t){return a.I_&&a.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:u}=e.content,s=r||Q(e);return n&&"inline"===t&&n.isAnimated?d.IU.Lottie:s&&a.I_&&("viewerFull"===t||"inline"===t)?d.IU.Progressive:o||u?u&&!a.m5?d.IU.BlobUrl:d.IU.Progressive:d.IU.BlobUrl}function X(e){const{photo:t,video:n,document:r}=e.content,o=V(e),d=Q(e);if(t||o)return`photo${e.date}.jpeg`;const{fileName:u}=n||d||r||{};return u}function ee(e){const{video:t,document:n}=e.content,r=Q(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=ae(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 ue(e,t,n=!1){const r=A(e);return{isUploading:r,isTransferring:r||n,transferProgress:Number(t)}}function ae(e,t,n){let r;switch(n){case"media":r=e=>{const t=O(e);return D(e)||t&&!t.isRound&&!t.isGif};break;case"documents":r=$;break;case"links":r=e=>H(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=O(e);return F(e)||t&&t.isRound};break;case"inlineMedia":r=e=>{const t=O(e);return D(e)||t&&!t.isRound&&!t.isGif||U(e)||W(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||Q(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:()=>i,Js:()=>c,Tq:()=>l,kM:()=>f,NB:()=>h,cS:()=>m,kw:()=>p,Z0:()=>g,kK:()=>y,db:()=>v,Rs:()=>b});var r=n(3716),o=n(790),d=n(782),u=n(2267),a=n(5765);const s=[1,8,5,2,7,4,6];function i(e){if(e)switch(e.type){case"userTypeBot":case"userTypeRegular":return e.firstName||e.lastName;case"userTypeDeleted":case"userTypeUnknown":return"Deleted";default:return}}function c(e){if(e){if(h(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 l(e,t,n,d){if(t.id===r.aw)return e("ServiceNotifications").toLowerCase();if(t.type&&"userTypeBot"===t.type)return e("Bot");if(!n)return"";switch(n.type){case"userStatusEmpty":return e("ALongTimeAgo");case"userStatusLastMonth":return e("WithinAMonth");case"userStatusLastWeek":return e("WithinAWeek");case"userStatusOffline":{const{wasOnline:t}=n;if(!t)return e("LastSeen.Offline");const r=new Date((new Date).getTime()+1e3*d),u=new Date(1e3*t);if(u>=r)return e("LastSeen.JustNow");const a=new Date(r.getTime()-u.getTime());if(a.getTime()/1e3<60)return e("LastSeen.JustNow");if(a.getTime()/1e3<3600)return e("LastSeen.MinutesAgo",Math.floor(a.getTime()/1e3/60));const s=new Date;if(s.setHours(0,0,0,0),u>new Date(s.getTime()+1e3*d))return a.getTime()/1e3<21600?e("LastSeen.HoursAgo",Math.floor(a.getTime()/1e3/60/60)):e("LastSeen.TodayAt",(0,o.mr)(u,e));const i=new Date;return i.setDate(r.getDate()-1),i.setHours(0,0,0,0),u>new Date(i.getTime()+1e3*d)?e("LastSeen.YesterdayAt",(0,o.mr)(u,e)):e("LastSeen.AtDate",(0,o.Tu)(e,u))}case"userStatusOnline":return e("Online");case"userStatusRecently":return e("Lately");default:return}}function f(e,t){const{id:n,type:o}=e;return!!t&&n!==r.aw&&"userStatusOnline"===t.type&&"userTypeBot"!==o}function h(e){return!e.noStatus&&"userTypeBot"!==e.type&&e.id!==r.aw&&("userTypeDeleted"===e.type||"userTypeUnknown"===e.type)}function m(e){return"userTypeBot"===e.type}function p(e){return!e.isContact&&!m(e)}function g(e,t,n,r,o=0){return(0,d.Xo)(e,(e=>{const d=(0,u.b)(o);if(r&&r.includes(e))return d+172800-(r.length-r.indexOf(e));const a=t[e],s=n[e];if(!a||!s)return 0;if("userStatusOnline"===s.type)return s.expires;if("userStatusOffline"===s.type&&s.wasOnline)return s.wasOnline;switch(s.type){case"userStatusRecently":return d-86400;case"userStatusLastWeek":return d-604800;case"userStatusLastMonth":return d-18144e3;default:return 0}}),"desc")}function y(e,t,n){if(!n)return e;const r=(0,a.W)(n);return e.filter((e=>{const n=t[e];if(!n)return!1;const o=c(n);return o&&r(o)||r(n.username)}))}function v(e){return"number"==typeof e?Math.abs(e):Math.abs(Number(e))}function b(e){const t=e?v(e.id)%7:0;return s[t]}},6788:(e,t,n)=>{n.d(t,{Mg:()=>u,B1:()=>a,SL:()=>s,a4:()=>i,GL:()=>c,fZ:()=>l,Pi:()=>h,vv:()=>m,Dd:()=>p});var r=n(3716),o=n(782),d=n(1638);function u(e,t,n){return{...e,chats:{...e.chats,listIds:{...e.chats.listIds,[t]:n}}}}function a(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:u(e,t,[...r||[],...o])}function s(e,t){return{...e,chats:{...e.chats,byId:t}}}function i(e,t,n,r){const{byId:o}=e.chats,d=f(e,t,n,r);return d?s(e,{...o,[t]:d}):e}function c(e,t){const n=Object.keys(t).reduce(((n,r)=>{const o=f(e,r,t[r]);return o&&(n[r]=o),n}),{});return e=s(e,{...e.chats.byId,...n})}function l(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=f(e,d,t[d]);n&&(o[d]=n,r||(r=!0))}return o}),{});return r?e=s(e,{...n,...o}):e}function f(e,t,n,r){const{byId:d}=e.chats,u=d[t],a=n.isMin&&u&&!u.isMin,s={...u,...a?(0,o.CE)(n,["isMin","accessHash"]):n,...r&&{photos:[r,...u.photos||[]]}};if(s.id&&s.type)return s}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]}})),i(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=u(e,n,r.filter((e=>e!==t)))),i(e,t,{isNotJoined:!0})}},307:(e,t,n)=>{n.d(t,{O4:()=>be,c_:()=>h,fZ:()=>r.fZ,m6:()=>f,aK:()=>ye,aJ:()=>ge,zn:()=>q,Sh:()=>j,$S:()=>I,bp:()=>Te,WY:()=>Ne,K4:()=>g,bV:()=>y,h8:()=>V,M6:()=>k,i9:()=>N,Dd:()=>r.Dd,vy:()=>_,rB:()=>we,g_:()=>Z,Mg:()=>r.Mg,SL:()=>r.SL,Pb:()=>ue,w3:()=>P,BI:()=>me,lr:()=>pe,pf:()=>l,ps:()=>J,s5:()=>B,y9:()=>C,nA:()=>Pe,_7:()=>Ae,Q$:()=>Ee,Dq:()=>ke,vT:()=>Se,QH:()=>Me,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:()=>O,No:()=>X,Og:()=>ee,xv:()=>ne,px:()=>te,xj:()=>v,c1:()=>ce,z5:()=>ie,qr:()=>de,dx:()=>ae,fw:()=>he,H9:()=>fe,HN:()=>ve,ff:()=>b,P4:()=>p,x1:()=>H,TM:()=>Ce,Rg:()=>D,z3:()=>R,IM:()=>x,Xg:()=>S,j6:()=>E,lG:()=>L,IE:()=>Ie,Nq:()=>U,Lm:()=>Q,Q3:()=>z,eD:()=>W});var r=n(6788),o=n(6137),d=n(3716),u=n(1638),a=n(782);function s(e,t,n=o._f,r="thread",u){const{messageLists:a}=e.messages;let s=a;if(u||d.Cg)s=t?[{chatId:t,threadId:n,type:r}]:[];else if(t){const e=a[a.length-1];e&&e.chatId===t&&e.threadId===n&&e.type===r||(s=e&&e.chatId===d.AJ?[...a.slice(0,-1),{chatId:t,threadId:n,type:r}]:[...a,{chatId:t,threadId:n,type:r}])}else s=a.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,u.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,u.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,u.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,u.Zw)(e,t);if(!r)return e;const o=(0,a.CE)(r,n),d=Object.values((0,a.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,u.tZ)(e,t,r);let d=(0,u.gb)(e,t,r),a=(0,u.qC)(e,t,r),s=(0,u.Cb)(e,t,r),i=(0,u.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)),a&&a.includes(e)&&(a=a.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",a),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,u.Bt)(e),r=n&&n.chatId===t&&"thread"===n.type,o=null==n?void 0:n.threadId;d.forEach((n=>{const{fromChatId:d,fromMessageId:a}=n.forwardInfo,i=(0,u.hj)(e,d,a);r&&o===a&&(e=s(e,t)),i&&(e=m(e,d,a,{threadInfo:void 0}))}))}return e=i(e,t,o)}function y(e,t,n){const r=(0,u.Fn)(e,t);if(!r)return e;const d=(0,a.CE)(r,n);let s=(0,u.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,u.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,u.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,u.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,u.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,u.$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,a.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:a}=t.forwardInfo||{};if(d&&a){const t=(0,u.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,a.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 O(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 Z(e,t){return{...e,animatedEmojis:t}}function x(e,t,n,r){const o=[...(0,u.Pk)(e,t),...n||[]],d=(0,a.Tw)(o.map((({id:e})=>e))),s=(0,a.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){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 U(e,t,n){const{byId:r}=e.users,o=G(e,t,n);return o?B(e=$(e,[o]),{...r,[t]:o}):e}function W(e,t){const n=Object.keys(t).reduce(((n,r)=>{const o=G(e,r,t[r]);return o&&(n[r]=o),n}),{});return e=$(e=B(e,{...e.users.byId,...n}),Object.values(n))}function j(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=G(e,d,t[d]);n&&(o[d]=n,r||(r=!0))}return o}),{});return r?e=$(e=B(e,{...n,...o}),Object.values(o)):e}function G(e,t,n){const{byId:r}=e.users,o=r[t],d=n.isMin&&o&&!o.isMin,u={...o,...d?(0,a.CE)(n,["isMin","accessHash"]):n};if(u.id&&u.type)return u}function H(e,t){return e.users.selectedId===t?e:{...e,users:{...e.users,selectedId:t}}}function V(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 Q(e,t){return{...e,userSearch:{...e.userSearch,...t}}}function z(e,t){return Q(e,{fetchingStatus:t})}function K(e,t,n){const{byId:r}=e.users,o=r[t];return o&&o.fullInfo?U(e,t,{...o,fullInfo:{...o.fullInfo,isBlocked:n}}):e}function J(e,t){return{...e,users:{...e.users,statusesById:t}}}function q(e,t){const{statusesById:n}=e.users,r=Object.keys(t).filter((e=>!n[e]));return r.length?e=J(e,{...n,...(0,a.ei)(t,r)}):e}const Y=e=>`${e.chatId}_${e.id}`;function X(e,t){return{...e,globalSearch:{...e.globalSearch,...t}}}function ee(e,t){return X(e,{currentContent:t})}function te(e,t,n,r,o){var d;const{resultsByType:u}=e.globalSearch||{},s=t.reduce(((e,t)=>(e[Y(t)]=t,e)),{}),i=null==u||null===(d=u[r])||void 0===d?void 0:d.foundIds;if(void 0!==i&&Object.keys(s).every((e=>i.includes(Y(s[e])))))return ne(e,{messages:!1});const c=i||[],l=t.map((e=>Y(e))),f=Array.prototype.concat(c,l),h=(0,a.et)(c,f)?c:f;return X(e=ne(e,{messages:!1}),{resultsByType:{...(e.globalSearch||{}).resultsByType,[r]:{totalCount:n,nextOffsetId:o,foundIds:h}}})}function ne(e,t){return X(e,{fetchingStatus:{...e.globalSearch.fetchingStatus,...t}})}var re=n(2858);function oe(e,t,n){return{...e,localTextSearch:{byChatThreadKey:{...e.localTextSearch.byChatThreadKey,[t]:n}}}}function de(e,t,n,r,o){const d=(0,re.uw)(t,n);return oe(e,d,{...e.localTextSearch.byChatThreadKey[d],isActive:r,query:o})}function ue(e,t,n,r,o,d){const u=(0,re.uw)(t,n);return oe(e,u,{...e.localTextSearch.byChatThreadKey[u],results:{foundIds:r,totalCount:o,nextOffsetId:d}})}function ae(e,t,n,r,o,d){const u=(0,re.uw)(t,n),{results:s}=e.localTextSearch.byChatThreadKey[u]||{},i=(null==s?void 0:s.foundIds)||[],c=le((0,a.Tw)(Array.prototype.concat(i,r)));return ue(e,t,n,(0,a.et)(i,c)?i:c,o,d)}function se(e,t,n){return{...e,localMediaSearch:{byChatId:{...e.localMediaSearch.byChatId,[t]:n}}}}function ie(e,t,n){return se(e,t,{...e.localMediaSearch.byChatId[t],currentType:n})}function ce(e,t,n,r,o,d){const{resultsByType:u}=e.localMediaSearch.byChatId[t]||{},s=null!=u&&u[n]?u[n].foundIds:[],i=le((0,a.Tw)(Array.prototype.concat(s,r)));return function(e,t,n,r,o,d){return se(e,t,{...e.localMediaSearch.byChatId[t],resultsByType:{...(e.localMediaSearch.byChatId[t]||{}).resultsByType,[n]:{foundIds:r,totalCount:o,nextOffsetId:d}}})}(e,t,n,(0,a.et)(s,i)?s:i,o,d)}function le(e){return e.sort(((e,t)=>e-t))}function fe(e,t){return{...e,management:{...e.management,progress:t}}}function he(e,t,n){return{...e,management:{...e.management,byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t]||{},...n}}}}}function me(e,t){return{...e,settings:{...e.settings,byKey:{...e.settings.byKey,...t}}}}function pe(e,t,n){return{...e,settings:{...e.settings,themes:{...e.settings.themes,[t]:{...e.settings.themes[t]||{},...n}}}}}function ge(e,t){return t.forEach((t=>{const{chatId:n,...r}=t;e=ye(e,n,r)})),e}function ye(e,t,n){return{...e,settings:{...e.settings,notifyExceptions:{...e.settings.notifyExceptions,[t]:n}}}}function ve(e,t,n,r){switch(t){case"contact":return me(e,{...void 0!==n&&{hasPrivateChatsNotifications:!n},...void 0!==r&&{hasPrivateChatsMessagePreview:r}});case"group":return me(e,{...void 0!==n&&{hasGroupNotifications:!n},...void 0!==r&&{hasGroupMessagePreview:r}});case"broadcast":return me(e,{...void 0!==n&&{hasBroadcastNotifications:!n},...void 0!==r&&{hasBroadcastMessagePreview:r}});default:return}}function be(e,t){return e=K(e,t,!0),{...e,blocked:{...e.blocked,ids:[t,...e.blocked.ids],totalCount:e.blocked.totalCount+1}}}function we(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 Ie(e,t){return{...e,twoFaSettings:{...e.twoFaSettings,...t}}}function Ce(e,t){return{...e,payment:{...e.payment,shippingOptions:t}}}function Se(e,t){return{...e,payment:{...e.payment,requestId:t}}}function Ee(e,t){return{...e,payment:{...e.payment,step:t}}}function Pe(e,t){if(!t.content||!t.content.invoice)return e;const{title:n,text:r,amount:o,currency:d,isTest:u,photoUrl:a}=t.content.invoice;return{...e,payment:{...e.payment,invoiceContent:{title:n,text:r,photoUrl:a,amount:o,currency:d,isTest:u}}}}function Me(e,t){return{...e,payment:{...e.payment,stripeCredentials:{...t}}}}function Ae(e,t){return{...e,payment:{...e.payment,...t}}}function ke(e,t,n){if(!t||!n)return{...e,payment:{...e.payment,receipt:void 0}};const{invoice:r}=n.content,{photoUrl:o,text:d,title:u}=r||{};return{...e,payment:{...e.payment,receipt:{...t,photoUrl:o,text:d,title:u}}}}function Te(e){return{...e,payment:{}}}function Ne(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),u=n(3716),a=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!==u.mo?t.fullInfo.members.reduce(((t,{userId:n})=>n!==e.currentUserId&&e.users.byId[n]&&(0,o.kM)(e.users.byId[n],e.users.statusesById[n])?t+1:t),0):t.fullInfo.onlineCount}function m(e,t){const n=s(e,t),r=n&&(0,o.zX)(n),u=r&&(0,d.dy)(e,r);if(u&&(0,o.cS)(u))return u}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 u=e.messages.byChatId[t];if(!u)return!1;const{listedIds:a}=u.threadsById[r._f]||{};return a&&!a.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===u.WS?"archived":"active"}function b(e,t){return e.chatFolders.byId[t]}function w(e,t,n=u.Nf){const{active:r,archived:o}=e.chats.orderedPinnedIds;if(n===u.Nf)return!!r&&r.includes(t);if(n===u.WS)return!!o&&o.includes(t);const{byId:d}=e.chatFolders,{pinnedChatIds:a}=d[n]||{};return!!a&&a.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,a.d)(e),d=(0,a.N)(e);return t.reduce(((e,t)=>{const u=n[t];return!(u&&u.unreadCount&&u.isListed)||u.isNotJoined||u.isRestricted||!u.unreadMentionsCount&&(0,o.i4)(u,r,d)?e:e+u.unreadCount}),0)}function S(e){return Boolean(s(e,u.aw))}},1638:(e,t,n)=>{n.d(t,{hg:()=>W,xs:()=>oe,_k:()=>X,zB:()=>g,g4:()=>a.g4,bH:()=>ye,__:()=>be,xl:()=>ee,Nu:()=>ne,nB:()=>te,Z1:()=>a.Z1,IK:()=>a.IK,DI:()=>a.DI,Mw:()=>a.Mw,Ek:()=>a.Ek,hj:()=>G,ZB:()=>Q,Zw:()=>I,YK:()=>a.YK,Dg:()=>a.Dg,X5:()=>ie,A1:()=>a.A1,jr:()=>w,yN:()=>f,JX:()=>Le,pP:()=>Me,we:()=>Ee,og:()=>Se,$W:()=>M,Bt:()=>b,y5:()=>l,n5:()=>Ce,Ms:()=>O,_$:()=>R,kK:()=>V,wU:()=>D,yZ:()=>_,It:()=>ae,G$:()=>z,y8:()=>fe,cv:()=>Y,pk:()=>a.pk,N:()=>a.N,ep:()=>a.ep,xo:()=>a.xo,FM:()=>a.FM,a6:()=>me,te:()=>re,Ev:()=>se,CA:()=>ce,zQ:()=>Ae,_X:()=>K,vk:()=>le,Jf:()=>Te,UW:()=>a.UW,s4:()=>s.s4,b9:()=>j,VF:()=>Ie,gb:()=>E,aW:()=>Pe,xH:()=>he,FT:()=>ge,tV:()=>Z,NJ:()=>Fe.N,dZ:()=>Fe.d,dT:()=>J,qC:()=>P,gx:()=>Re,eh:()=>Oe,Mz:()=>De,sp:()=>Ze,KB:()=>k,$$:()=>xe,rd:()=>ue,p9:()=>F,Yy:()=>L,Wq:()=>ke,qy:()=>T,Tm:()=>H,Fn:()=>C,Vt:()=>N,D7:()=>pe,Ur:()=>q,yB:()=>we,Ny:()=>h,E_:()=>m,Pk:()=>p,i3:()=>_e,P_:()=>a.P_,Pu:()=>Ne,Db:()=>U,tZ:()=>x,Cm:()=>B,qS:()=>$,uZ:()=>de,dy:()=>s.dy,ss:()=>s.ss,Cb:()=>A});var r=n(1713),o=n(7361),d=n(6137),u=n(3716),a=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,a.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 O(e,t,n){return S(e,t,n,"draft")}function Z(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,a.Z1)(e,t);const r=x(e,t,n);return r?(0,a.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 W(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 j(e,t,n){const r=A(e,t,n);if(!r||!r.length)return!0;let o;if(n===d._f){const n=(0,a.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>=u.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 H(e,t,n){const r=C(e,t);return r?r[n]:void 0}function V(e,t,n,r){if("scheduled"===r){const n=D(e,t);return n?H(e,t,n):void 0}{const r=R(e,t,n);return r?G(e,t,r):void 0}}function Q(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 z(e,t){const{chatId:n,messageId:r}=e.focusedMessage||{};return n===t?r:void 0}function K(e,t){const n=z(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,a.Z1)(e,t.chatId)||{};return(0,i.CI)(t)||!n||ne===t.id))}(e,t.content.sticker),Z=!b&&D&&!O,x=!b&&O,_=!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===(u=w.webPage)||void 0===u?void 0:u.photo)||w.audio||w.voice||w.photo||w.video||w.document||w.sticker);return{noOptions:[C,L,E,P,T,A,N,R,Z,x,_,F,B,$].every((e=>!e)),canReply:C,canEdit:L,canPin:E,canUnpin:P,canReport:T,canDelete:A,canDeleteForAll:N,canForward:R,canFaveSticker:Z,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 ue(e,t,n){if(n===d._f){const n=(0,a.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 ae(e,t,n){const r=(0,a.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=ue(e,t,n);if(!c&&r&&r.isNotJoined)return;const l=t===u.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,a.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,a.Z1)(e,t);if(!n)return;if(!(0,a.xo)(e,n))return;const r=I(e,t),o=A(e,t,d._f);if(!r||!o)return;const u=(0,c.dF)(o,(e=>!r[e].isOutgoing&&Boolean(r[e].keyboardButtons))),s=(0,c.dF)(o,(e=>Boolean(r[e].shouldHideKeyboardButtons)));return u&&s&&s>u?void 0:u?r[u]:void 0}function ye(e,t){const n=(0,a.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)),u=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}):!u||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:u}){const a=Boolean(n&&(n.id===e.currentUserId||(0,s.nM)(e,n)));return Boolean(a&&r||!a&&o&&(0,i.YC)(t.id)||d&&(0,i.Bf)(t)||u&&(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,a.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,u=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,a.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:u?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 Oe(e){return e.payment.formId}function Ze(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){return e.users.statusesById[t]}function d(e,t){var n;const o=r(e,t);return null==o||null===(n=o.fullInfo)||void 0===n?void 0:n.isBlocked}function u(e,t){return e.contactList&&e.contactList.userIds.includes(t.id)}n.d(t,{dy:()=>r,ss:()=>o,s4:()=>d,nM:()=>u})},1713:(e,t,n)=>{let r,o,d,u,a,s,i,c,l,f,h,m,p,g;n.d(t,{Uq:()=>r,fo:()=>o,MT:()=>d,du:()=>u,nJ:()=>a,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"}(u||(u={})),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"}(a||(a={})),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,{cK:()=>d,jt:()=>u,M8:()=>a,vr:()=>s});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 u(e){(0,r.T2)((()=>{e()&&u(e)}))}const a={linear:e=>e,easeIn:e=>e**1.675,easeOut:e=>1-(1-e**1.675),easeInOut:e=>.5*(Math.sin((e-.5)*Math.PI)+1),easeInQuad:e=>e*e,easeOutQuad:e=>e*(2-e),easeInOutQuad:e=>e<.5?2*e*e:(4-2*e)*e-1,easeInCubic:e=>e*e*e,easeOutCubic:e=>--e*e*e+1,easeInOutCubic:e=>e<.5?4*e*e*e:(e-1)*(2*e-2)*(2*e-2)+1,easeInQuart:e=>e*e*e*e,easeOutQuart:e=>1- --e*e*e*e,easeInOutQuart:e=>e<.5?8*e*e*e*e:1-8*--e*e*e*e,easeInQuint:e=>e*e*e*e*e,easeOutQuint:e=>1+--e*e*e*e*e,easeInOutQuint:e=>e<.5?16*e*e*e*e*e:1+16*--e*e*e*e*e};function s({timing:e=a.linear,onUpdate:t,duration:n,onEnd:r,from:o,to:d}){const s=Date.now();let i=!1;return u((()=>{if(i)return!1;let u=(Date.now()-s)/n;u>1&&(u=1);const a=e(u);if("number"==typeof o&&"number"==typeof d)t(o+(d-o)*a);else if(Array.isArray(o)&&Array.isArray(d)){const e=o.map(((e,t)=>e+(d[t]-e)*a));t(e)}return 1===u&&r&&r(),u<1})),()=>{i=!0,r&&r()}}},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:()=>u,clear:()=>a});const r=self.caches;let o;async function d(e,t,n,d=!1){if(r)try{const u=new Request(t.replace(/:/g,"_")),a=await r.open(e),s=await a.match(u);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 u(e,t,n){if(r)try{const o="string"==typeof n||n instanceof Blob?n:JSON.stringify(n),d=new Request(t.replace(/:/g,"_")),u=new Response(o),a=await r.open(e);return await a.put(d,u)}catch(e){return void console.warn(e)}}async function a(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 u()||document.addEventListener("keydown",a,!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)}})),u()||document.removeEventListener("keydown",a,!1)}(e)}}function u(){return Object.values(o).some((e=>Boolean(e.length)))}function a(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:()=>u,_F:()=>a,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 u(e){const t=new Date(e);return t.setHours(0,0,0,0),t}function a(e){return u(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=u(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 a=n.getFullYear()!==o.getFullYear(),s=e(a?"formatDateScheduleYear":"formatDateSchedule")||(a?"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 a="number"==typeof t?new Date(t):t,s=u(new Date);if(!o){if(i(a)===i(s))return(d||!n?E:S)(e("Weekday.Today"));const t=new Date(s);if(t.setDate(s.getDate()-1),i(a)===i(t))return(d||!n?E:S)(e("Weekday.Yesterday"));const o=new Date(s),u=new Date(s);if(o.setDate(s.getDate()-7),u.setDate(s.getDate()+7),a>=o&&a<=u){const t=r[a.getDay()];return(d||!n?E:S)(e(n?`Weekday.Short${t}`:`Weekday.${t}`))}}const c=a.getFullYear()!==s.getFullYear(),l=e(n?c?"formatDateScheduleYear":"formatDateSchedule":c?"chatFullDate":"chatDate")||"d MMMM yyyy";return(d||!n?E:S)(p(e,a,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,u=t?Math.floor(t%3600/60):0;let a="";return n>0||d>0?(a+=`${String(n).padStart(2,"0")}:`,a+=`${String(r).padStart(2,"0")}:`):a+=u>=10?`${String(r).padStart(2,"0")}:`:`${String(r)}:`,a+=String(o).padStart(2,"0"),a}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(" "),u=t?o[0]:o[1],a=(t?o[1]:o[0]).toLowerCase(),s=d.findIndex((e=>e.startsWith(a)));return-1!==s&&w(Number(u),s)?`${String(s+1).padStart(2,"0")}-${String(u).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:()=>a,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 u(e){const t=e.split("-").map((e=>parseInt(e,16)));return String.fromCodePoint(...t)}function a(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,i4:()=>O,Mc:()=>S,wB:()=>b,p7:()=>w,$b:()=>v,mh:()=>I,s0:()=>T,aZ:()=>D,gZ:()=>Z,Lt:()=>f,vn:()=>i,on:()=>d});var r=n(3716);let o;function d(){return Boolean(o)}var u,a;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!==(u=(a=window).matchMedia)&&void 0!==u&&u.call(a,"(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,O=!h&&!m&&!p,Z=O?300:750},1394:(e,t,n)=>{n.d(t,{A9:()=>d,YJ:()=>u,hl:()=>a,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 u(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 a(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 a(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_:()=>u});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 u(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 u(e,t){return t.reduce(((t,n)=>(e[n]&&(t[n]=e[n]),t)),{})}function a(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"){function r(e,t,n,r){const o=("function"==typeof n?n(e):e[n])||0,d=("function"==typeof n?n(t):t[n])||0;return r?o-d:d-o}if(Array.isArray(t)){const[o,d]=Array.isArray(n)?n:[n,n],[u,a]=t,s="asc"===o,i="asc"===d;return e.sort(((e,t)=>r(e,t,u,s)||r(e,t,a,i)))}const o="asc"===n;return e.sort(((e,n)=>r(e,n,t,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:()=>u,CE:()=>a,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),u=n(1226),a=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,u.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 a=await d.fetch(o.ee,e,d.Type.Json);if(!a&&(n&&await S(),a=await async function(e){const t=await(0,u.t9)("fetchLangPack",{sourceLangPacks:o.Bg,langCode:e});if(t)return await d.save(o.ee,e,t.langPack),t.langPack}(e),!a))return;l.clear(),y=e,f=a,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,a.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),u=n(9524),a=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]:u.Type.Blob,[r.IU.Lottie]:u.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 u.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"),u=I(e,n,r);g.set(e,u),(0,d.t9)("downloadMedia",{url:e,mediaFormat:t},u)})),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,a.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,a.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 u;null===(u=p.get(e))||void 0===u||u.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 u=await(0,d.t9)("downloadMedia",{mediaFormat:r.IU.Progressive,...o});if(!u)return;const{arrayBuffer:a,mimeType:s,fullSize:i}=u;navigator.serviceWorker.controller.postMessage({type:"partResponse",messageId:n,result:{arrayBuffer:a,mimeType:s,fullSize:i}},[a])}))},735:(e,t,n)=>{n.d(t,{D:()=>r});const r=[]},9203:(e,t,n)=>{n.d(t,{gl:()=>o,$y:()=>a,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={},u={};async function a(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(886),n.e(884),n.e(977)]).then(n.bind(n,6977));break;case o.Extra:d[o.Extra]=Promise.all([n.e(739),n.e(886),n.e(477)]).then(n.bind(n,9477));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 a=await d[e];return u[e]||(u[e]=a),s(e,t)}function s(e,t){const n=u[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),u=n(3716),a=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?(u.eM&&console.warn("[PUSH] The user has blocked push notifications."),!1):"PushManager"in window||(u.eM&&console.warn("[PUSH] Push messaging isn't supported."),!1):(u.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,a.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){u.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,a.Rd)(),n=(0,a.uC)();if(e)try{const t=p(e);return await(0,r.t9)("unregisterDevice",t),await e.unsubscribe(),void n.deleteDeviceToken()}catch(e){u.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,a.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);u.eM&&console.log("[PUSH] Received push subscription: ",n),await(0,r.t9)("registerDevice",n),(0,a.uC)().setDeviceToken(n)}catch(e){"denied"===Notification.permission?u.eM&&console.warn("[PUSH] The user has blocked push notifications."):u.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,a.Rd)());const[e,t]=await Promise.all([(0,r.t9)("fetchNotificationSettings",{serverTimeOffset:(0,a.Rd)().serverTimeOffset}),(0,r.t9)("fetchNotificationExceptions",{serverTimeOffset:(0,a.Rd)().serverTimeOffset})]);if(!e)return(0,l.dZ)((0,a.Rd)());let n=(0,c.BI)((0,a.Rd)(),e);return t&&(n=(0,c.aJ)(n,t)),(0,a.R3)(n),S=!0,(0,l.dZ)(n)}();if(!function(e){if(!S)return!1;const t=(0,a.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||(u.eM&&console.warn("[PUSH] The user has blocked push notifications."),!1):(u.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,a.Rd)(),{senderId:r,replyToMessageId:o}=t,u=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:u;v=(0,d.D)(i.i0,t,n,p,f,m,{asPlain:!0})}else{const n=(0,s.zF)(i.i0,e.id,u),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,a.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;!u.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:()=>u,g3:()=>a,un:()=>s,WZ:()=>i});var r=n(782);const o="X",d="XXX XXX XXX XXX";function u(e,t){return e.filter((e=>e.iso2===t))}function a(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))),u=(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=u[u.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),u=[];let a=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(...u)=>{o=!0,d=u,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 a(g,e)}function u(e){return a(y,e)}function a(e,t){let n,r=!1;return(...o)=>{n=o,r||(r=!0,e((()=>{r=!1,t(...n)})))}}function s(e,t){self.requestIdleCallback?self.requestIdleCallback(e,{timeout:t}):v(e)}n.d(t,{Ds:()=>r,P2:()=>o,mS:()=>d,wT:()=>u,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,W:()=>d});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="string"==typeof t?t.toLowerCase().split(r):t,o=e.toLowerCase();if(1===n.length&&!o.includes(n[0]))return!1;let d;return n.every((e=>!!o.includes(e)&&(d||(d=o.split(r)),d.some((t=>t.startsWith(e))))))}function d(e){const t=e.toLowerCase().split(r);return e=>o(e,t)}},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 u=n(3716),a=n(9524);const s=[1,2,3,4,5];function i(e=!1){if(e&&localStorage.getItem(u.Vx))return!0;const t=localStorage.getItem(u.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(u.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(){[u.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(u.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){u.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(u.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){u.eM&&console.warn("Failed to load legacy session",e)}}async function m(){localStorage.removeItem(u.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([a.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 u=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i,a=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,u=n?0:1,a=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.cK)((()=>{const e=Math.min((Date.now()-s)/200,1);return f(u,a,function(e){return 1-(1-e)**3.5}(e)),e<1})):f(u,a)};function l(e){const t=u.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)),u=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},${u},${i},${c/255})`:`rgb(${d},${u},${i})`),a.has(r)&&document.documentElement.style.setProperty(`${r}-rgb`,`${d},${u},${i}`)}))}},2155:(e,t,n)=>{n.d(t,{kh:()=>d,bi:()=>a,Xv:()=>s});var r=n(3681),o=n(4284);function d(e){return String(e).replace(/\d(?=(\d{3})+$)/g,"$& ")}function u(e){return".0"===String(e.toFixed(1)).substr(-2)?Math.round(e):e.toFixed(1).replace(".",",")}function a(e){return e<1e3?e:e<1e6?`${u(e/1e3)}K`:`${u(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 u,a;const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";async function i(e,t){for(l();!a.wasmReady;)await(0,d.wO)(2e3);const{result:n,width:r,height:o}=await function(e,t){return new Promise((n=>{a.requests||(a.requests=new Map),a.requests.set(e,n),a.postMessage({id:e,blob:t})}))}(e,t);if(r&&o)return function({result:e,width:t,height:n}){return u||(u=document.createElement("canvas")),new Promise((r=>{const o=new ImageData(e,t,n);u.width=t,u.height=n,u.getContext("2d").putImageData(o,0,0),u.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(){a||(a=new Worker(new URL(n.p+n.u(536),n.b)),a.wasmReady=!1,a.onmessage=f)}function f(e){const{id:t}=e.data;switch(e.data.type){case"initialized":a.wasmReady=!0;break;case"result":if(a.requests.has(t)){const n=a.requests.get(t);a.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 u=["t.me","telegram.me"].map((e=>`//${e}/_websync_?`)),a=`${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(u.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:a}),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 u=d.wB&&f(),a=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&&u!==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:()=>a>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"}},a={};function s(e){var t=a[e];if(void 0!==t)return t.exports;var n=a[e]={exports:{}};return u[e].call(n.exports,n,n.exports,s),n.exports}s.m=u,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 u=2&r&&n;"object"==typeof u&&!~e.indexOf(u);u=t(u))Object.getOwnPropertyNames(u).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:"41324961df5671be3f7c",161:"286d0207d962142ad548",354:"3843b6b832a69d88fdd6",472:"21e5264f606f2b525030",477:"51d8c60b6925b9015068",501:"72ce4b6e27f459e194cd",524:"fc60bb86a96ed24427c3",532:"f896c17ee0c2c6548645",536:"55dc7dd4ab42a2c9f037",739:"5f4ff51c7729260f57ab",745:"9316c5c2b711c39a20a5",884:"0744a0141224dc13c805",886:"c1ed05b22f4554640984",915:"53f46f3c9677172ffcd6",927:"73c7571315932f2e4490",941:"5a6cedb5afef94338282",977:"95926b21e6ef3fcaf5ad",993:"f0aad9f6787f211b4e51"}[e]+".js",s.miniCssF=e=>e+"."+{133:"41324961df5671be3f7c",472:"21e5264f606f2b525030",477:"51d8c60b6925b9015068",532:"f896c17ee0c2c6548645",886:"c1ed05b22f4554640984",977:"95926b21e6ef3fcaf5ad"}[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 u,a;if(void 0!==o)for(var i=document.getElementsByTagName("script"),c=0;c{u.onerror=u.onload=null,clearTimeout(h);var o=n[e];if(delete n[e],u.parentNode&&u.parentNode.removeChild(u),o&&o.forEach((e=>e(r))),t)return t(r)},h=setTimeout(f.bind(null,void 0,{type:"timeout",target:u}),12e4);u.onerror=f.bind(null,u.onerror),u.onload=f.bind(null,u.onload),a&&document.head.appendChild(u)}},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 u=d&&("load"===d.type?"missing":d.type),a=d&&d.target&&d.target.href||t,s=new Error("Loading CSS chunk "+e+" failed.\n("+a+")");s.code="CSS_CHUNK_LOAD_FAILED",s.type=u,s.request=a,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,472:1,477:1,532:1,886:1,977: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),u=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;u.message="Loading chunk "+t+" failed.\n("+o+": "+d+")",u.name="ChunkLoadError",u.type=o,u.request=d,r[1](u)}}),"chunk-"+t,t)}};var t=(t,n)=>{var r,o,[d,u,a]=n,i=0;if(d.some((t=>0!==e[t]))){for(r in u)s.o(u,r)&&(s.m[r]=u[r]);a&&a(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.ZT&&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 u=s(2916);const a={isLeftColumnShown:!0,isChatInfoShown:!1,newChatMembersProgress:s(1713).WB.Closed,uiReadyState:0,serverTimeOffset:0,authRememberMe:!0,countryList:{phoneCodes:[],general:[]},blocked:{ids:[],totalCount:0},users:{byId:{},statusesById:{}},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)(S)),5e3,!1);let b,w=!1;function I(){w=!0,b=(0,c.Gq)(S,!0),window.addEventListener("blur",S),(0,t.ll)(v)}function C(){w=!1,(0,t.Iq)(v),window.removeEventListener("blur",S),b&&b()}function S(){if(!w||(0,l.zG)())return;const n=(0,t.Rd)();if(n.isLoggingOut)return;const r={...a,...(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:E(n),users:P(n),chats:M(n),messages:A(n),globalSearch:{recentlyFoundChatIds:n.globalSearch.recentlyFoundChatIds},settings:k(n),chatFolders:T(n),groupCalls:N(n)},o=JSON.stringify(r);localStorage.setItem(e.Uh,o)}function E(t){return window.innerWidth>e._m&&t.isChatInfoShown}function P(t){const{users:{byId:n,statusesById:r,selectedId:o}}=t,d=(t.chats.listIds.active||[]).slice(0,e.gJ).filter(y.YC),u=Object.keys(n),a=d.concat(u).slice(0,e.lO);return{byId:(0,f.ei)(n,a),statusesById:(0,f.ei)(r,a),selectedId:window.innerWidth>e._m?o:void 0}}function M(t){const n=(t.chats.listIds.active||[]).slice(0,e.gJ),{chatId:r}=(0,h.Bt)(t)||{},o=n.concat(r?[r]:[]);return{...t.chats,byId:(0,f.ei)(t.chats.byId,o),listIds:{active:n},isFullyLoaded:{},orderedPinnedIds:{active:t.chats.orderedPinnedIds.active}}}function A(t){const n={},{chatId:r}=(0,h.Bt)(t)||{};return(t.chats.listIds.active||[]).slice(0,e.gJ).concat(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 k(e){const{byKey:t,themes:n}=e.settings;return{byKey:t,themes:n,privacy:{},notifyExceptions:{}}}function T(e){return{...e.chatFolders,activeChatFolder:0}}function N(e){return{...e.groupCalls,byId:{},activeGroupCallId:void 0,isGroupCallPanelHidden:void 0,isFallbackConfirmOpen:void 0}}e.sd||((0,t.Q6)("saveSession",(()=>{w||I()})),(0,t.Q6)("reset",(()=>{localStorage.removeItem(e.Uh),w&&C()}))),(0,t.Q6)("init",(()=>{const t=(0,f.Xh)(a);return function(t){if(!e.sd)return(0,m.ti)(!0)?(I(),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:u,...a}=t.settings.byKey;t.settings.byKey={...a,canAutoLoadPhotoFromContacts:e,canAutoLoadVideoFromContacts:e,canAutoLoadPhotoInPrivateChats:n,canAutoLoadVideoInPrivateChats:n,canAutoLoadPhotoInGroups:r,canAutoLoadVideoInGroups:r,canAutoLoadPhotoInChannels:o,canAutoLoadVideoInChannels:o,canAutoPlayVideos:d,canAutoPlayGifs:u}}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),t.groupCalls||(t.groupCalls=n.groupCalls),t.users.statusesById||(t.users.statusesById={})}(o,t);const d={...t,...o},u=n.wB?void 0:(0,p.V)(g.Oy);return{...d,messages:{...d.messages,messageLists:u?[u]:[]}}}(t)):void C()}(t)||t}));var L=s(4050),R=s(3858);const D="tt-active-tab",O=String(Date.now()+Math.random());let Z;localStorage.setItem(D,O);const x=window.setInterval((()=>{Z&&localStorage.getItem(D)!==O&&(Z(),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 W(){if("fonts"in document)return Promise.all(U.map((e=>document.fonts.load(e))))}var j=s(647),G=s(9203),H=s(6752),V=s(4128),Q=s(2162);function z(){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?j.he(r,i.IU.BlobUrl):void 0})))}const K={main:()=>Promise.all([(0,G.$y)(G.gl.Main,"Main").then(W),z()]),authPhoneNumber:()=>Promise.all([W(),(0,$.pt)(V)]),authCode:()=>(0,$.pt)(Q),authPassword:()=>(0,$.pt)(Q),authQrCode:W},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:u,setIsUiReady:a})=>{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(),a({uiReadyState:1}),t=window.setTimeout((()=>{a({uiReadyState:2})}),1e3)})),()=>{t&&(clearTimeout(t),t=void 0),a({uiReadyState:0})}}),[]),L.ZP.createElement("div",{id:"UiLoader"},t,l&&!d&&L.ZP.createElement("div",{className:(0,H.Z)("mask",f)},"main"===e?L.ZP.createElement(L.ZP.Fragment,null,L.ZP.createElement("div",{className:"left",style:u?`width: ${u}px`:void 0}),L.ZP.createElement("div",{className:(0,H.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),ue=s(5765),ae=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)(),u=(0,L.sO)(null),[a,s]=(0,L.eJ)(),[i,c]=(0,L.eJ)([]),l=(0,L.I4)((e=>{s(e),c(function(e,t=""){if(!t.length)return e;const n=(0,ue.W)(t);return e.filter((e=>n(e.defaultName)||e.name&&n(e.name)))}(o,e))}),[o]);(0,ie.Z)((([e])=>{0===(null==e?void 0:e.length)&&o.length>0&&l(a)}),[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===a&&(n.value=""),l(n.value)}),[a,l,t]);return L.ZP.createElement(ce.Z,{className:"CountryCodeInput",trigger:({onTrigger:r,isOpen:o})=>{const s=()=>{if(o)return;setTimeout((()=>{u.current.select()}),50),r();const e=document.getElementById("auth-phone-number-form");e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},i=null!=a?a:(null==t?void 0:t.name)||(null==t?void 0:t.defaultName)||"";return L.ZP.createElement("div",{className:(0,H.Z)("input-group",t&&"touched")},L.ZP.createElement("input",{ref:u,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}),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,H.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,ae.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:u,authRememberMe:a,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)(),O=C?`+${C.countryCode} ${E||""}`:E,Z=O&&O.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}))}),[]),j=(0,L.I4)((e=>{S(e),P("")}),[]),G=(0,L.I4)((e=>{u&&p(),pe||(pe=!0,W(),(0,$.pt)(Q));const{value:t,selectionStart:r,selectionEnd:o}=e.target;T(r&&o&&o1&&!B.current;x(d?`${C.countryCode} ${t}`:t)}),[u,p,C,O,x]),H=(0,L.I4)((e=>{f(e.target.checked)}),[f]),V="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||Z&&l({phoneNumber:O})}},L.ZP.createElement(me,{id:"sign-in-phone-code",value:C,isLoading:!s&&!C,onChange:j}),L.ZP.createElement(oe.Z,{ref:b,id:"sign-in-phone-number",label:v("Login.PhonePlaceholder"),value:O,error:u&&v(u),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(a),onChange:H}),Z&&(V?L.ZP.createElement(ne.Z,{type:"submit",ripple:!0,isLoading:o},v("Login.Next")):L.ZP.createElement(de.Z,null)),V&&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={},u=e(r,n);u.u(t),u.J(),o=o||0;var a=u.h(),s=u.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>=a||0>t||t>=a)&&u.a(e,t)},d}function n(e,t,n,r,o,d,u,a,s,i){function c(t,n,r,o,u,a,s){t?(e.lineTo(n+a,r+s),e.arcTo(n,r,o,u,d)):e.lineTo(n,r)}u?e.moveTo(t+d,n):e.moveTo(t,n),c(a,r,n,r,o,-d,0),c(s,r,o,t,o,0,-d),c(i,t,o,t,n,d,0),c(u,t,n,r,n,0,d)}function r(e,t,n,r,o,d,u,a,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)}u&&c(t,n,d,d),a&&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,u=o.v,a=o.N,s=o.K,i=o.P;for(a=Math.max(1,a||1),s=Math.min(40,s||40);a<=s;a+=1)try{var c=t(d,u,a,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)),u=c.O,s=o.size/u,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,u){function a(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 u=l=4*o+17,s=Array(u),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(u=8;us;s+=1)m=!e&&1==(u>>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(u=r.A(o),s=0;18>s;s+=1)m=!e&&1==(u>>s&1),c[Math.floor(s/3)][s%3+l-8-3]=m;for(s=0;18>s;s+=1)m=!e&&1==(u>>s&1),c[s%3+l-8-3][Math.floor(s/3)]=m}if(null==f){for(e=d.I(o,i),u=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. ("+u.f()+">"+8*m+")");for(u.f()+4<=8*m&&u.put(0,4);0!=u.f()%8;)u.m(!1);for(;!(u.f()>=8*m||(u.put(236,8),u.f()>=8*m));)u.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+=u)||l<=s){s-=u,u=-u;break}}}var i=n[u],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()),u=0;ur?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=a;a+=1)if(!(0>r+a||t<=r+a))for(var s=-1;1>=s;s+=1)0>o+s||t<=o+s||(0!=a||0!=s)&&u==e.a(r+a,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:t,authState:n,authQrCode:r,language:o,returnToAuthPhoneNumber:d,setSettingOption:u})=>{const a=te(),s=(0,X.Z)(),i=(0,L.sO)(null),c=ee(a,"ContinueOnThisLanguage"),[l,f,h]=(0,_.Z)();(0,L.d4)((()=>{if(!r||"connectionStateReady"!==t)return;const e=i.current;e.innerHTML="",e.classList.remove("pre-animate"),Se.render({text:`tg://login?token=${r.token}`,radius:.5,ecLevel:"M",fill:"#4E96D4",size:280},e)}),[t,r]),(0,L.d4)((()=>{"connectionStateReady"===t&&(0,Y.m0)(e.sR)}),[t]);const m=(0,L.I4)((()=>{f(),(0,Y.m0)(a,(()=>{h(),u({language:a})}))}),[f,u,a,h]),p="authorizationStateWaitQrCode"===n;return L.ZP.createElement("div",{id:"auth-qr-form",className:"custom-scroll"},L.ZP.createElement("div",{className:"auth-form qr"},r?L.ZP.createElement("div",{key:"qr-container",className:"qr-container pre-animate",ref:i}):L.ZP.createElement("div",{key:"qr-loading",className:"qr-loading"},L.ZP.createElement(de.Z,null)),L.ZP.createElement("h3",null,s("Login.QR.Title")),L.ZP.createElement("ol",null,L.ZP.createElement("li",null,L.ZP.createElement("span",null,s("Login.QR.Help1"))),L.ZP.createElement("li",null,L.ZP.createElement("span",null,(0,ae.Z)(s("Login.QR.Help2"),["simple_markdown"]))),L.ZP.createElement("li",null,L.ZP.createElement("span",null,s("Login.QR.Help3")))),p&&L.ZP.createElement(ne.Z,{isText:!0,onClick:d},s("Login.QR.Cancel")),a&&a!==o&&c&&L.ZP.createElement(ne.Z,{isText:!0,isLoading:l,onClick:m},c)))}))),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 u="iOS"===n.Lt||"Android"===n.Lt;switch((0,g.ZP)(!u&&"authorizationStateWaitPhoneNumber"===e||u&&"authorizationStateWaitQrCode"===e,(()=>{u?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 u?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)(),Z=()=>{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"),u.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.0ea733c1154004de9988.js.map \ No newline at end of file diff --git a/dist/main.0ea733c1154004de9988.js.map b/dist/main.0ea733c1154004de9988.js.map new file mode 100644 index 000000000..37d2aeda5 --- /dev/null +++ b/dist/main.0ea733c1154004de9988.js.map @@ -0,0 +1 @@ +{"version":3,"file":"main.0ea733c1154004de9988.js","mappings":"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AAE,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,IA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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,\"472\":1,\"477\":1,\"532\":1,\"886\":1,\"977\":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 seenByUserIds?: string[];\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 result.push(part);\n return result;\n }\n\n divEl.innerText = part;\n result.push(divEl.innerHTML);\n\n return result;\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 result.push(part);\n return result;\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: TextPart[], part) => {\n if (typeof part !== 'string') {\n result.push(part);\n return result;\n }\n\n const splittenParts = 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\n return [...result, ...splittenParts];\n }, []);\n}\n\nfunction addHighlight(textParts: TextPart[], highlight: string | undefined): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string' || !highlight) {\n result.push(part);\n return result;\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 result.push(part);\n return result;\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 result.push(part);\n return result;\n }\n\n const links = part.match(RE_LINK);\n if (!links || !links.length) {\n result.push(part);\n return result;\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 result.push(part);\n return result;\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_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// TODO Get values from `getConfig` method once it's available\nexport const SEEN_BY_MEMBERS_CHAT_MAX = 50;\nexport const SEEN_BY_MEMBERS_EXPIRE = 604680; // One week - 2 min\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\nconst ANIMATION_START_EVENT = 'tt-event-heavy-animation-start';\nconst ANIMATION_END_EVENT = 'tt-event-heavy-animation-end';\n\nlet timeout: number | undefined;\nlet isAnimating = false;\n\n// Make sure to end even if end callback was not called (which was some hardly-reproducible bug)\nconst AUTO_END_TIMEOUT = 1000;\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\nexport function isHeavyAnimating() {\n return isAnimating;\n}\n\nexport function dispatchHeavyAnimationEvent(duration = AUTO_END_TIMEOUT) {\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 // Race condition may happen if another `dispatchHeavyAnimationEvent` is called before `onEnd`\n function onEnd() {\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n isAnimating = false;\n document.dispatchEvent(new Event(ANIMATION_END_EVENT));\n }\n\n timeout = window.setTimeout(onEnd, duration);\n\n return onEnd;\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', 'role']);\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 // eslint-disable-next-line no-null/no-null\n if (DEBUG && isRealElement($newChild) && (key === undefined || key === null)) {\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 // eslint-disable-next-line no-null/no-null\n const isKeyPresent = key !== undefined && key !== null;\n\n // First we handle removed children\n if (isKeyPresent && !newKeys.has(key)) {\n renderWithVirtual(currentEl, $currentChild, undefined, $new, -1);\n\n return acc;\n } else if (!isKeyPresent) {\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-') || key.startsWith('aria-') || 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-') || key.startsWith('aria-') || 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\nconst DEBUG_RENDER_THRESHOLD = 7;\nconst DEBUG_EFFECT_THRESHOLD = 7;\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 duration = performance.now() - DEBUG_startAt!;\n const componentName = componentInstance.name;\n if (duration > DEBUG_RENDER_THRESHOLD) {\n // eslint-disable-next-line no-console\n console.warn(`[Teact] Slow component render: ${componentName}, ${Math.round(duration)} ms`);\n }\n DEBUG_components[componentName].renderTimes.push(duration);\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 // 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 cleanup();\n\n if (DEBUG) {\n const duration = performance.now() - DEBUG_startAt!;\n const componentName = componentInstance.name;\n if (duration > DEBUG_EFFECT_THRESHOLD) {\n // eslint-disable-next-line no-console\n console.warn(\n `[Teact] Slow cleanup at effect cursor #${cursor}: ${componentName}, ${Math.round(duration)} ms`,\n );\n }\n }\n } catch (err) {\n handleError(err);\n }\n }\n }\n\n function exec() {\n if (!componentInstance.isMounted) {\n return;\n }\n\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 byCursor[cursor].cleanup = effect() as Function;\n\n if (DEBUG) {\n const duration = performance.now() - DEBUG_startAt!;\n const componentName = componentInstance.name;\n if (duration > DEBUG_EFFECT_THRESHOLD) {\n // eslint-disable-next-line no-console\n console.warn(`[Teact] Slow effect at cursor #${cursor}: ${componentName}, ${Math.round(duration)} ms`);\n }\n }\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 {\n GlobalState, GlobalActions, ActionTypes, DispatchOptions,\n} from '../../global/types';\nimport { handleError } from '../../util/handleError';\nimport { isHeavyAnimating } from '../../hooks/useHeavyAnimationCheck';\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\nconst runCallbacksThrottled = throttleWithRaf(runCallbacks);\n\nfunction runCallbacks(forceOnHeavyAnimation = false) {\n if (!forceOnHeavyAnimation && isHeavyAnimating()) {\n runCallbacksThrottled();\n return;\n }\n\n callbacks.forEach((cb) => cb(currentGlobal));\n}\n\nexport function setGlobal(newGlobal?: GlobalState, options?: DispatchOptions) {\n if (typeof newGlobal === 'object' && newGlobal !== currentGlobal) {\n currentGlobal = newGlobal;\n if (options?.forceSyncOnIOs) {\n runCallbacks(true);\n } else {\n runCallbacksThrottled(options?.forceOnHeavyAnimation);\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, options?: DispatchOptions) {\n if (reducers[name]) {\n reducers[name].forEach((reducer) => {\n const newGlobal = reducer(currentGlobal, actions, payload);\n if (newGlobal) {\n setGlobal(newGlobal, options);\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, options?: DispatchOptions) => {\n onDispatch(name, payload, options);\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 });\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_SAFARI, 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 if (IS_SAFARI) {\n document.body.classList.add('is-safari');\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 }, { forceSyncOnIOs: 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 { GlobalState } from '../../global/types';\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';\nimport { prepareSearchWordsForNeedle } from '../../util/searchWords';\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 allListIds: GlobalState['chats']['listIds'],\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n notifySettings: NotifySettings,\n notifyExceptions?: Record,\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 = ([] as string[]).concat(allListIds.active || [], allListIds.archived || [])\n .filter((id) => {\n const chat = chatsById[id];\n return chat && filterChatFolder(\n chat,\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\n// This function is the most expensive in the project, so any possible optimizations are welcome\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 const { id: chatId, type, unreadMentionsCount } = chat;\n\n if (excludedChatIds?.has(chatId)) {\n return false;\n }\n\n if (includedChatIds?.has(chatId)) {\n return true;\n }\n\n if (pinnedChatIds?.has(chatId)) {\n return true;\n }\n\n if (folder.excludeArchived && chat.folderId === ARCHIVED_FOLDER_ID) {\n return false;\n }\n\n if (folder.excludeRead && !chat.unreadCount && !unreadMentionsCount && !chat.hasUnreadMark) {\n return false;\n }\n\n if (folder.excludeMuted && !unreadMentionsCount && selectIsChatMuted(chat, notifySettings, notifyExceptions)) {\n return false;\n }\n\n if (type === 'chatTypePrivate') {\n const user = usersById[chatId];\n if (user) {\n const { type: userType, isContact } = user;\n\n if (userType === 'userTypeBot') {\n if (folder.bots) {\n return true;\n }\n } else {\n if (folder.contacts && isContact) {\n return true;\n }\n\n if (folder.nonContacts && !isContact) {\n return true;\n }\n }\n }\n } else if (type === 'chatTypeChannel') {\n return !!folder.channels;\n } else if (type === 'chatTypeBasicGroup' || type === 'chatTypeSuperGroup') {\n return !!folder.groups;\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 noOrder = false,\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) && checkChat(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)) && checkChat(chat, folderType)) {\n acc.push(chat);\n }\n\n return acc;\n }, [] as ApiChat[]);\n\n return {\n pinnedChats,\n otherChats: noOrder ? otherChats : orderBy(otherChats, getChatOrder, 'desc'),\n };\n}\n\nfunction checkChat(chat: ApiChat, folderType: 'all' | 'archived' | 'folder') {\n return (\n chat.lastMessage && !chat.migratedTo && !chat.isRestricted && !chat.isNotJoined\n && !(folderType === 'all' && chat.folderId === ARCHIVED_FOLDER_ID)\n && !(folderType === 'archived' && chat.folderId !== ARCHIVED_FOLDER_ID)\n );\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 allListIds: GlobalState['chats']['listIds'],\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n notifySettings: NotifySettings,\n notifyExceptions?: Record,\n) {\n const [listIds] = prepareFolderListIds(allListIds, chatsById, usersById, folder, notifySettings, notifyExceptions);\n\n let hasActiveDialogs = false;\n const unreadDialogsCount = listIds.reduce((acc, id) => {\n const chat = chatsById[id];\n if (!chat?.lastMessage || chat?.isRestricted || chat?.isNotJoined) {\n return acc;\n }\n\n const isUnread = chat.unreadCount || chat.hasUnreadMark;\n\n if (isUnread) {\n acc++;\n }\n\n if (!hasActiveDialogs && (\n chat.unreadMentionsCount || (isUnread && !selectIsChatMuted(chat, notifySettings, notifyExceptions))\n )) {\n hasActiveDialogs = true;\n }\n\n return acc;\n }, 0);\n\n return {\n unreadDialogsCount,\n hasActiveDialogs,\n };\n}\n\nexport function getFolderDescriptionText(\n lang: LangFn,\n allListIds: GlobalState['chats']['listIds'],\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\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(allListIds, chatsById, usersById, folder, 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 allListIds: GlobalState['chats']['listIds'],\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n notifySettings: NotifySettings,\n notifyExceptions?: Record,\n) {\n const [listIds, pinnedIds] = prepareFolderListIds(\n allListIds, chatsById, usersById, folder, notifySettings, notifyExceptions,\n );\n const { pinnedChats, otherChats } = prepareChatList(chatsById, listIds, pinnedIds, 'folder', true);\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\nexport function filterChatsByName(\n lang: LangFn,\n chatIds: string[],\n chatsById: Record,\n query?: string,\n currentUserId?: string,\n) {\n if (!query) {\n return chatIds;\n }\n\n const searchWords = prepareSearchWordsForNeedle(query);\n\n return chatIds.filter((id) => {\n const chat = chatsById[id];\n if (!chat) {\n return false;\n }\n\n return searchWords(getChatTitle(lang, chat, undefined, id === currentUserId));\n });\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, ApiUserStatus } 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';\nimport { prepareSearchWordsForNeedle } from '../../util/searchWords';\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(\n lang: LangFn, user: ApiUser, userStatus: ApiUserStatus | undefined, serverTimeOffset: number,\n) {\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 (!userStatus) {\n return '';\n }\n\n switch (userStatus.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 } = userStatus;\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, userStatus?: ApiUserStatus) {\n const { id, type } = user;\n\n if (!userStatus) {\n return false;\n }\n\n if (id === SERVICE_NOTIFICATIONS_USER_ID) {\n return false;\n }\n\n return userStatus.type === 'userStatusOnline' && type !== 'userTypeBot';\n}\n\nexport function isDeletedUser(user: ApiUser) {\n if (user.noStatus || 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 userStatusesById: 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 const userStatus = userStatusesById[id];\n if (!user || !userStatus) {\n return 0;\n }\n\n if (userStatus.type === 'userStatusOnline') {\n return userStatus.expires;\n } else if (userStatus.type === 'userStatusOffline' && userStatus.wasOnline) {\n return userStatus.wasOnline;\n }\n\n switch (userStatus.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 filterUsersByName(userIds: string[], usersById: Record, query?: string) {\n if (!query) {\n return userIds;\n }\n\n const searchWords = prepareSearchWordsForNeedle(query);\n\n return userIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n\n const name = getUserFullName(user);\n return (name && searchWords(name)) || searchWords(user.username);\n });\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\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 if (!updatedChat) {\n return global;\n }\n\n return replaceChats(global, {\n ...byId,\n [chatId]: updatedChat,\n });\n}\n\nexport function updateChats(global: GlobalState, newById: Record): GlobalState {\n const updatedById = Object.keys(newById).reduce((acc: Record, id) => {\n const updatedChat = getUpdatedChat(global, id, newById[id]);\n if (updatedChat) {\n acc[id] = updatedChat;\n }\n\n return acc;\n }, {});\n\n global = replaceChats(global, {\n ...global.chats.byId,\n ...updatedById,\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, newById: Record): GlobalState {\n const { byId } = global.chats;\n let isUpdated = false;\n\n const addedById = Object.keys(newById).reduce>((acc, id) => {\n if (!byId[id] || (byId[id].isMin && !newById[id].isMin)) {\n const updatedChat = getUpdatedChat(global, id, newById[id]);\n if (updatedChat) {\n acc[id] = updatedChat;\n if (!isUpdated) {\n isUpdated = true;\n }\n }\n }\n return acc;\n }, {});\n\n if (!isUpdated) {\n return global;\n }\n\n global = replaceChats(global, {\n ...byId,\n ...addedById,\n });\n\n return global;\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) {\n const { byId } = global.chats;\n const chat = byId[chatId];\n const shouldOmitMinInfo = chatUpdate.isMin && chat && !chat.isMin;\n const updatedChat: ApiChat = {\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 undefined;\n }\n\n return updatedChat;\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, ApiUserStatus } from '../../api/types';\n\nimport { omit, pick } 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\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 if (!updatedUser) {\n return global;\n }\n\n global = updateContactList(global, [updatedUser]);\n\n return replaceUsers(global, {\n ...byId,\n [userId]: updatedUser,\n });\n}\n\nexport function updateUsers(global: GlobalState, newById: Record): GlobalState {\n const updatedById = Object.keys(newById).reduce((acc: Record, id) => {\n const updatedUser = getUpdatedUser(global, id, newById[id]);\n if (updatedUser) {\n acc[id] = updatedUser;\n }\n\n return acc;\n }, {});\n\n global = replaceUsers(global, {\n ...global.users.byId,\n ...updatedById,\n });\n\n global = updateContactList(global, Object.values(updatedById));\n\n return global;\n}\n\n// @optimization Allows to avoid redundant updates which cause a lot of renders\nexport function addUsers(global: GlobalState, newById: Record): GlobalState {\n const { byId } = global.users;\n let isUpdated = false;\n\n const addedById = Object.keys(newById).reduce>((acc, id) => {\n if (!byId[id] || (byId[id].isMin && !newById[id].isMin)) {\n const updatedUser = getUpdatedUser(global, id, newById[id]);\n if (updatedUser) {\n acc[id] = updatedUser;\n if (!isUpdated) {\n isUpdated = true;\n }\n }\n }\n return acc;\n }, {});\n\n if (!isUpdated) {\n return global;\n }\n\n global = replaceUsers(global, {\n ...byId,\n ...addedById,\n });\n\n global = updateContactList(global, Object.values(addedById));\n\n return global;\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) {\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 undefined;\n }\n\n return updatedUser;\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\nexport function replaceUserStatuses(global: GlobalState, newById: Record): GlobalState {\n return {\n ...global,\n users: {\n ...global.users,\n statusesById: newById,\n },\n };\n}\n\n// @optimization Allows to avoid redundant updates which cause a lot of renders\nexport function addUserStatuses(global: GlobalState, newById: Record): GlobalState {\n const { statusesById } = global.users;\n\n const newKeys = Object.keys(newById).filter((id) => !statusesById[id]);\n if (!newKeys.length) {\n return global;\n }\n\n global = replaceUserStatuses(global, {\n ...statusesById,\n ...pick(newById, newKeys),\n });\n\n return global;\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 (\n userId !== global.currentUserId\n && global.users.byId[userId]\n && isUserOnline(global.users.byId[userId], global.users.statusesById[userId])\n ) {\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, ApiUserStatus } from '../../api/types';\n\nexport function selectUser(global: GlobalState, userId: string): ApiUser | undefined {\n return global.users.byId[userId];\n}\n\nexport function selectUserStatus(global: GlobalState, userId: string): ApiUserStatus | undefined {\n return global.users.statusesById[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\nexport type TimingFn = (t: number) => number;\n\nexport type AnimateNumberProps = {\n to: number | number[];\n from: number | number[];\n duration: number;\n onUpdate: (value: any) => void;\n timing?: TimingFn;\n onEnd?: () => void;\n};\n\nexport const timingFunctions = {\n linear: (t: number) => t,\n easeIn: (t: number) => t ** 1.675,\n easeOut: (t: number) => 1 - (1 - t ** 1.675),\n easeInOut: (t: number) => 0.5 * (Math.sin((t - 0.5) * Math.PI) + 1),\n easeInQuad: (t: number) => t * t,\n easeOutQuad: (t: number) => t * (2 - t),\n easeInOutQuad: (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n easeInCubic: (t: number) => t * t * t,\n easeOutCubic: (t: number) => (--t) * t * t + 1,\n easeInOutCubic: (t: number) => (t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1),\n easeInQuart: (t: number) => t * t * t * t,\n easeOutQuart: (t: number) => 1 - (--t) * t * t * t,\n easeInOutQuart: (t: number) => (t < 0.5 ? 8 * t * t * t * t : 1 - 8 * (--t) * t * t * t),\n easeInQuint: (t: number) => t * t * t * t * t,\n easeOutQuint: (t: number) => 1 + (--t) * t * t * t * t,\n easeInOutQuint: (t: number) => (t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * (--t) * t * t * t * t),\n};\n\nexport function animateNumber({\n timing = timingFunctions.linear,\n onUpdate,\n duration,\n onEnd,\n from,\n to,\n}: AnimateNumberProps) {\n const t0 = Date.now();\n let canceled = false;\n\n animate(() => {\n if (canceled) return false;\n const t1 = Date.now();\n let t = (t1 - t0) / duration;\n if (t > 1) t = 1;\n const progress = timing(t);\n if (typeof from === 'number' && typeof to === 'number') {\n onUpdate(from + ((to - from) * progress));\n } else if (Array.isArray(from) && Array.isArray(to)) {\n const result = from.map((f, i) => f + ((to[i] - f) * progress));\n onUpdate(result);\n }\n if (t === 1 && onEnd) onEnd();\n return t < 1;\n });\n\n return () => {\n canceled = true;\n if (onEnd) onEnd();\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 = (\n window.matchMedia('(display-mode: standalone)').matches\n || (window.navigator as any).standalone\n || document.referrer.includes('android-app://')\n);\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\nexport const IS_SCROLL_PATCH_NEEDED = !IS_MAC_OS && !IS_IOS && !IS_ANDROID;\n\n// Smaller area reduces scroll jumps caused by `patchChromiumScroll`\nexport const MESSAGE_LIST_SENSITIVE_AREA = IS_SCROLL_PATCH_NEEDED ? 300 : 750;\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 =\n 'asc'\n | '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 orderRule: (keyof T) | OrderCallback | ((keyof T) | OrderCallback)[],\n mode: OrderDirection | [OrderDirection, OrderDirection] = 'asc',\n): T[] {\n function compareValues(a: T, b: T, currentOrderRule: (keyof T) | OrderCallback, isAsc: boolean) {\n const aValue = (typeof currentOrderRule === 'function' ? currentOrderRule(a) : a[currentOrderRule]) || 0;\n const bValue = (typeof currentOrderRule === 'function' ? currentOrderRule(b) : b[currentOrderRule]) || 0;\n\n return isAsc ? aValue - bValue : bValue - aValue;\n }\n\n if (Array.isArray(orderRule)) {\n const [mode1, mode2] = Array.isArray(mode) ? mode : [mode, mode];\n const [orderRule1, orderRule2] = orderRule;\n const isAsc1 = mode1 === 'asc';\n const isAsc2 = mode2 === 'asc';\n\n return collection.sort((a, b) => {\n return compareValues(a, b, orderRule1, isAsc1) || compareValues(a, b, orderRule2, isAsc2);\n });\n }\n\n const isAsc = mode === 'asc';\n return collection.sort((a, b) => {\n return compareValues(a, b, orderRule, isAsc);\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\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 fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n waitingTimeout = self.setTimeout(() => {\n if (shouldRunLast) {\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 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 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 fn(...args);\n });\n }\n };\n}\n\nexport function onIdle(cb: NoneToVoidFunction, timeout?: number) {\n // eslint-disable-next-line no-restricted-globals\n if (self.requestIdleCallback) {\n // eslint-disable-next-line no-restricted-globals\n self.requestIdleCallback(cb, { timeout });\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 | string[]) {\n if (!haystack || !needle) {\n return false;\n }\n\n const needleWords = typeof needle === 'string' ? needle.toLowerCase().split(RE_NOT_LETTER) : needle;\n const haystackLower = haystack.toLowerCase();\n\n // @optimization\n if (needleWords.length === 1 && !haystackLower.includes(needleWords[0])) {\n return false;\n }\n\n let haystackWords: string[];\n\n return needleWords.every((needleWord) => {\n if (!haystackLower.includes(needleWord)) {\n return false;\n }\n\n if (!haystackWords) {\n haystackWords = haystackLower.split(RE_NOT_LETTER);\n }\n\n return haystackWords.some((haystackWord) => haystackWord.startsWith(needleWord));\n });\n}\n\nexport function prepareSearchWordsForNeedle(needle: string) {\n const needleWords = needle.toLowerCase().split(RE_NOT_LETTER);\n\n return (haystack: string) => searchWords(haystack, needleWords);\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\":\"41324961df5671be3f7c\",\"161\":\"286d0207d962142ad548\",\"354\":\"3843b6b832a69d88fdd6\",\"472\":\"21e5264f606f2b525030\",\"477\":\"51d8c60b6925b9015068\",\"501\":\"72ce4b6e27f459e194cd\",\"524\":\"fc60bb86a96ed24427c3\",\"532\":\"f896c17ee0c2c6548645\",\"536\":\"55dc7dd4ab42a2c9f037\",\"739\":\"5f4ff51c7729260f57ab\",\"745\":\"9316c5c2b711c39a20a5\",\"884\":\"0744a0141224dc13c805\",\"886\":\"c1ed05b22f4554640984\",\"915\":\"53f46f3c9677172ffcd6\",\"927\":\"73c7571315932f2e4490\",\"941\":\"5a6cedb5afef94338282\",\"977\":\"95926b21e6ef3fcaf5ad\",\"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\":\"41324961df5671be3f7c\",\"472\":\"21e5264f606f2b525030\",\"477\":\"51d8c60b6925b9015068\",\"532\":\"f896c17ee0c2c6548645\",\"886\":\"c1ed05b22f4554640984\",\"977\":\"95926b21e6ef3fcaf5ad\"}[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, DEBUG_MORE } 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_MORE) {\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 statusesById: {},\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 { isHeavyAnimating } 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 unsubscribeFromBeforeUnload: NoneToVoidFunction | undefined;\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) {\n cached.groupCalls = initialState.groupCalls;\n }\n\n if (!cached.users.statusesById) {\n cached.users.statusesById = {};\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, statusesById, selectedId } } = global;\n const chatIds = (global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT).filter(isUserId);\n const userIds = Object.keys(byId);\n const idsToSave = chatIds.concat(userIds).slice(0, GLOBAL_STATE_CACHE_USER_LIST_LIMIT);\n\n return {\n byId: pick(byId, idsToSave),\n statusesById: pick(statusesById, 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 newListIds = (global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT);\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const idsToSave = newListIds.concat(currentChatId ? [currentChatId] : []);\n\n return {\n ...global.chats,\n byId: pick(global.chats.byId, idsToSave),\n listIds: {\n active: newListIds,\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 chatIds = (global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT);\n const chatIdsToSave = chatIds.concat(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","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 { prepareSearchWordsForNeedle } 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 if (!filter.length) {\n return countryList;\n }\n\n const searchWords = prepareSearchWordsForNeedle(filter);\n\n return countryList.filter((country) => (\n searchWords(country.defaultName) || (country.name && searchWords(country.name))\n ));\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 useEffect(() => {\n if (connectionState === 'connectionStateReady') {\n void setLanguage(DEFAULT_LANG_CODE);\n }\n }, [connectionState]);\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","splittenParts","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_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","SEEN_BY_MEMBERS_CHAT_MAX","SEEN_BY_MEMBERS_EXPIRE","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","handleAnimationStart","handleAnimationEnd","removeEventListener","isHeavyAnimating","duration","onEnd","clearTimeout","dispatchEvent","Event","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","isKeyPresent","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","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","runCallbacksThrottled","runCallbacks","forceOnHeavyAnimation","newGlobal","forceSyncOnIOs","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","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","IS_SAFARI","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","allListIds","folder","excludedChatIds","includedChatIds","pinnedChatIds","active","archived","isListed","unreadMentionsCount","excludeArchived","excludeRead","unreadCount","hasUnreadMark","excludeMuted","userType","isContact","bots","contacts","nonContacts","channels","groups","filterChatFolder","prepareChatList","listIds","orderedPinnedIds","folderType","noOrder","listIdsSet","orderedPinnedIdsSet","pinnedChats","checkChat","otherChats","reduceChatList","chatArrays","filteredIds","filteredIdsSet","getFolderUnreadDialogs","hasActiveDialogs","unreadDialogsCount","isUnread","getFolderDescriptionText","emoticon","description","pinnedIds","getFolderChatsCount","getMessageSenderName","getUserFirstOrLastName","sortChatIds","chatIds","shouldPrioritizeVerified","priorityIds","priority","isVerified","filterChatsByName","query","searchWords","prepareSearchWordsForNeedle","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","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","userStatus","wasOnline","getTime","wasOnlineDate","diff","today","setHours","yesterday","setDate","getDate","formatFullDate","isUserOnline","noStatus","isUserBot","getCanAddContact","sortUserIds","userIds","userStatusesById","getServerTime","expires","filterUsersByName","getUserIdDividend","abs","getUserColorKey","peer","replaceChatListIds","newIds","updateChatListIds","idsUpdate","replaceChats","newById","updateChat","chatUpdate","updatedChat","getUpdatedChat","updatedById","addChats","isUpdated","addedById","isMin","shouldOmitMinInfo","omit","photos","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","updateContactList","updatedUsers","contactUserIds","contactList","newContactUserIds","userUpdate","updatedUser","getUpdatedUser","updateUsers","updateSelectedUserId","selectedId","deleteUser","MEMO_EMPTY_ARRAY","updateUserSearch","searchStatePartial","userSearch","updateUserSearchFetchingStatus","newState","fetchingStatus","updateUserBlockedState","isBlocked","replaceUserStatuses","statusesById","addUserStatuses","getComplexKey","updateGlobalSearch","globalSearch","updateGlobalSearchContent","currentContent","updateGlobalSearchResults","newFoundMessages","nextRate","resultsByType","newFoundMessagesById","foundIdsForType","foundIds","updateGlobalSearchFetchingStatus","prevFoundIds","newFoundIds","foundOrPrevFoundIds","nextOffsetId","replaceLocalTextSearch","chatThreadKey","searchParams","localTextSearch","byChatThreadKey","updateLocalTextSearch","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","selectIsChatListed","targetList","list","selectChatFolder","chatFolders","selectIsChatPinned","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","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","selectUserStatus","selectIsUserBlocked","LoadMoreDirection","FocusDirection","SettingsScreens","LeftColumnContent","GlobalSearchContent","MediaViewerOrigin","AudioOrigin","ChatCreationProgress","ManagementProgress","ProfileState","PaymentStep","ManagementScreens","currentInstance","animateSingle","tick","instance","isCancelled","animate","timingFunctions","linear","easeIn","easeOut","easeInOut","sin","PI","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","animateNumber","timing","t0","canceled","f","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","IS_SCROLL_PATCH_NEEDED","MESSAGE_LIST_SENSITIVE_AREA","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","orderRule","mode","compareValues","currentOrderRule","isAsc","aValue","bValue","mode1","mode2","orderRule1","orderRule2","isAsc1","isAsc2","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","privateChatUser","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","haystack","needle","needleWords","haystackLower","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","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","hasErrorKey","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","setupCaching","clearCaching","reducedGlobal","reduceShowChatInfo","reduceUsers","reduceChats","reduceMessages","recentlyFoundChatIds","reduceSettings","reduceChatFolders","reduceGroupCalls","idsToSave","newListIds","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/main.d87e612a2f2945a65d28.js b/dist/main.d87e612a2f2945a65d28.js deleted file mode 100644 index 514b2263e..000000000 --- a/dist/main.d87e612a2f2945a65d28.js +++ /dev/null @@ -1,2 +0,0 @@ -(()=>{"use strict";var e,t,n,r,o,d,u={1226:(e,t,n)=>{n.d(t,{t9:()=>c,u3:()=>l,g8:()=>i});var r=n(3716),o=n(6926),d=n(9118);let u;const a=new Map,s=new Map;function i(e,t){return u||(r.eM&&console.log(">>> START LOAD WORKER"),u=new Worker(new URL(n.p+n.u(927),n.b)),function(e){u.addEventListener("message",(({data:t})=>{if("update"===t.type)e(t.update);else if("methodResponse"===t.type){const e=a.get(t.messageId);e&&(t.error?e.reject(t.error):e.resolve(t.response))}else if("methodCallback"===t.type){var n,r;null===(n=a.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(u)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&&u.postMessage({type:"cancelProgress",messageId:t})}function f(e){const t=(0,o.Z)(a),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 a.set(t,r),d.catch((()=>{})).finally((()=>{a.delete(t),r.callback&&s.delete(r.callback)})),u.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,u=2147483647;function a(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((u-c)/g))throw RangeError("punycode_overflow(1)");if(c+=v*g,b=y<=l?1:y>=l+26?26:y-l,vMath.floor(u/(d-b)))throw RangeError("punycode_overflow(2)");g*=d-b}if(i=n.length+1,l=a(c-p,i,0===p),Math.floor(c/i)>u-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:a,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||(a({url:e}),t.preventDefault(),!1):(t.preventDefault(),s({url:e}),!1)),[m,s,a,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:u?"rtl":"auto"},h)}))},5376:(e,t,n)=>{n.d(t,{yW:()=>r,K2:()=>o,mD:()=>d,Oh:()=>u,v6:()=>a});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 u(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 a(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),u=n(9937),a=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,u.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 u=(0,d.Z)((0,o.U)(e,t));return n?u:r.ZP.createElement(m,{className:"action-link",chatId:t.id},t&&(0,a.Z)(u))}(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 u=(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&&u&&!s&&!i&&!c&&!l;let y=(0,d.Z)(u,f);return m&&(s?y="a photo":i?y=i.isGif?"a GIF":"a video":c?y="a document":l&&(y=u)),p?g?`«${y}»`:y:g?r.ZP.createElement("span",null,"«",r.ZP.createElement(h,{className:"action-link",message:t},(0,a.Z)(y)),"»"):r.ZP.createElement(h,{className:"action-link",message:t},(0,a.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,a.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),u=n(7361),a=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.push(n),e):(t.innerText=n,e.push(t.innerHTML),e)),[])}(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,u=n.highlight,d.reduce(((e,t)=>{if("string"!=typeof t||!u)return e.push(t),e;const n=t.toLowerCase(),o=n.indexOf(u.toLowerCase()),d=n[o+u.length];if(o<0||d&&d.match(l))return e.push(t),e;const a=[];return a.push(t.substring(0,o)),a.push(r.ZP.createElement("span",{className:"matching-text-highlight"},t.substring(o,o+u.length))),a.push(t.substring(o+u.length)),[...e,...a]}),[]);case"links":return function(e){return e.reduce(((e,t)=>{if("string"!=typeof t)return e.push(t),e;const n=t.match(g);if(!n||!n.length)return e.push(t),e;const o=[];let d=n.shift(),u=0;for(;d;){const e=t.indexOf(d,u);o.push(t.substring(u,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}))),u=e+d.length,d=n.shift()}return o.push(t.substring(u)),[...e,...o]}),[])}(e);case"simple_markdown":return y(e,"jsx");case"simple_markdown_html":return y(e,"html")}var d,u;return e}),[e])}function m(e,t,n){return u.op?e:e.reduce(((e,d)=>{if("string"!=typeof d)return e.push(d),e;const u=(d=(0,a.g6)(d)).split(o.Z),i=d.match(o.Z)||[];return e.push(u[0]),i.reduce(((e,d,i)=>{const c=(0,a.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 u[f]&&e.push(u[f]),e}),e)}),[])}function p(e,t){return e.reduce(((e,n)=>{if("string"!=typeof n)return e.push(n),e;const o=n.split(/\r\n|\r|\n/g).reduce(((e,n,o,d)=>{const u=n.trimLeft(),a=n.length-u.length;return e.push(String.fromCharCode(160).repeat(a)+u),o!==d.length-1&&e.push("jsx"===t?r.ZP.createElement("br",null):"
"),e}),[]);return[...e,...o]}),[])}const g=new RegExp(`${d.FM}|${d.uW}`,"ig");function y(e,t){return e.reduce(((e,n)=>{if("string"!=typeof n)return e.push(n),e;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 u=2*d+2;return o[u]&&e.push(o[u]),e}),e)}),[])}},386:(e,t,n)=>{n.d(t,{q:()=>d,b:()=>u});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 u(e){d(e,!0)}},7373:(e,t,n)=>{n.d(t,{Z:()=>a});var r=n(4050),o=n(5116),d=n(782),u=n(1638);const a=(0,o.c$)(((e,{userId:t})=>({userOrChat:t?(0,u.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:()=>a});var r=n(4050),o=n(6752),d=n(9204),u=n(8512);const a=({ref:e,type:t="button",onClick:n,onContextMenu:a,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),O=(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"),Z=(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:O,href:S,title:C,download:E,tabIndex:k,dir:T?"rtl":void 0},f,!P&&M&&r.ZP.createElement(u.Z,null)):r.ZP.createElement("button",{ref:L,type:t,className:O,onClick:Z,onContextMenu:a,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(u.Z,null))}},4605:(e,t,n)=>{n.d(t,{Z:()=>s});var r=n(4050),o=n(6752),d=n(9107),u=n(2340),a=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,u.Z)(s)),i&&r.ZP.createElement("span",{className:"subLabel",dir:"auto"},(0,u.Z)(i))),m&&r.ZP.createElement(a.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:u="top",footer:a,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:u,footer:a,autoClose:!0,onClose:()=>{m(!1),c&&c()},shouldSkipTransition:s},n))}},7687:(e,t,n)=>{n.d(t,{Z:()=>u});var r=n(4050),o=n(6752),d=n(9107);const u=(0,r.X$)((({ref:e,id:t,className:n,value:u,label:a,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||a,E=(0,o.Z)("input-group",u&&"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:u||"",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 u=(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?u: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),u=n(8758),a=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,a.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,u.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:()=>u});var r=n(4050),o=n(6752),d=n(9107);const u=e=>{const{icon:t,className:n,children:u,onClick:a,href:s,download:i,disabled:c,destructive:l,ariaLabel:f}=e,h=(0,d.Z)(),m=(0,r.I4)((e=>{if(c||!a)return e.stopPropagation(),void e.preventDefault();a(e)}),[c,a]),p=(0,r.I4)((e=>{if(13===e.keyCode||32===e.keyCode)return c||!a?(e.stopPropagation(),void e.preventDefault()):void a(e)}),[c,a]),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}),u);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:a},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(),u=o.offsetWidth/2;t([...e,{x:r.clientX-d.x-u/2,y:r.clientY-d.y-u/2,size:u}]),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:()=>u,eM:()=>a,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:()=>O,Vk:()=>Z,mo:()=>x,qU:()=>_,ul:()=>F,NM:()=>B,Qx:()=>$,mw:()=>U,oB:()=>W,zy:()=>j,CX:()=>G,xS:()=>H,b6:()=>V,AR:()=>Q,r_:()=>z,R2:()=>K,nY:()=>J,QU:()=>q,jT:()=>Y,_m:()=>X,ks:()=>ee,l3:()=>te,u_:()=>ne,rO:()=>re,AE:()=>oe,AJ:()=>de,fK:()=>ue,V$:()=>ae,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$:()=>Oe,FS:()=>Ze,FD:()=>xe,aw:()=>_e,FV:()=>Fe,Nf:()=>Be,WS:()=>$e,DU:()=>Ue,EG:()=>We,t4:()=>je,sR:()=>Ge,$O:()=>He,Bg:()=>Ve,vi:()=>Qe,Db:()=>ze,mU:()=>Ke,p3:()=>Je,It:()=>qe,Vv:()=>Ye,g:()=>Xe,Hc:()=>et,EH:()=>tt,Ro:()=>nt,aC:()=>rt,LH:()=>ot});const r="Telegram",o=" [Inactive]",d="Telegram WebZ",u="1.25.7",a=!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,O=20,Z=30,x=200,_=500,F=20,B=!1,$=1,U=1,W=0,j=2,G=j,H=16,V=17,Q=15,z=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",ue=100,ae=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_-]+)",Oe=/^tg:(\/\/)?([?=&\d\w_-]+)?/gm,Ze=/^(?: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,We=5,je=2147483646,Ge="en",He="android",Ve=["android","ios","tdesktop","macos"],Qe="TelegramTips",ze=["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=50,tt=604680,nt=100,rt=100*nt,ot=!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,{ZP:()=>s,zG:()=>i,YW:()=>c});var r=n(4050);const o="tt-event-heavy-animation-start",d="tt-event-heavy-animation-end";let u,a=!1;const s=(e,t)=>{(0,r.d4)((()=>(a&&e(),document.addEventListener(o,e),document.addEventListener(d,t),()=>{document.removeEventListener(d,t),document.removeEventListener(o,e)})),[t,e])};function i(){return a}function c(e=1e3){function t(){u&&(clearTimeout(u),u=void 0),a=!1,document.dispatchEvent(new Event(d))}return a||(a=!0,document.dispatchEvent(new Event(o))),u&&(clearTimeout(u),u=void 0),u=window.setTimeout(t,e),t}},6590:(e,t,n)=>{n.d(t,{Oy:()=>s,Wv:()=>l,ZP:()=>h});var r=n(4050),o=n(7361),d=n(7204),u=n(5116),a=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,u.uC)().disableHistoryAnimations(),t(!c.isEdge),p.current=!0)):o===r&&p.current&&n&&!l&&(h.current=!0,c.isEdge&&(0,u.uC)().disableHistoryAnimations(),n(e.state.state))}catch(e){}},o=l?!y||!(0,a.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[u,a]=(0,r.eJ)(-1);return(0,r.d4)((()=>{a(-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(u);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)||u;if(38===t.keyCode&&i>0)i--;else if(40===t.keyCode&&i{n.d(t,{Z:()=>u});var r=n(663),o=n(5326),d=n(9290);const u=()=>{const e=(0,o.Z)();return(0,d.Z)((()=>r.ll(e)),[e]),r.i0}},8778:(e,t,n)=>{n.d(t,{Z:()=>u});var r=n(4050),o=n(9203),d=n(5326);const u=(e,t,n=!1,u=!1)=>{const a=(0,o.o5)(e,t),s=(0,d.Z)();return u&&(0,o.Qt)(s),(0,r.d4)((()=>{n||a||(0,o.$y)(e,t).then(s)}),[e,s,a,t,n]),a}},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",u=!1)=>{const[a,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),a||i.current||(i.current=window.setTimeout((()=>{s(!0),t&&t(),i.current=void 0}),u?0:350)));const f=c&&!(u&&!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={},u=new Map,a={};function s(e,t,n,r=!1){const o=c(t,e);l(o,e,r)?function(e,t,n){a[e]||(a[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=u.get(e);if(t)return t;const n=new Set;return u.set(e,n),n}(t).add(e),a[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){a[e]--,a[e]||document.removeEventListener(e,m),d[e].delete(t),u.get(t).delete(e)}function h(e){const t=u.get(e);t&&(t.forEach((t=>f(t,e))),u.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()},u=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(u),n))return;r=r.parentNode}}}r.eM&&document.addEventListener("dblclick",(()=>{console.log("DELEGATED EVENTS",{delegationRegistry:d,delegatedEventsByElement:u,documentEventCounters:a})}))},2916:(e,t,n)=>{n.d(t,{Z:()=>y});var r=n(4050),o=n(6926),d=n(3716),u=n(5247);const a=new Set(["key","ref","teactFastList","teactOrderKey"]),s=new Set(["dir","role"]),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,u.xg)(e,t,n,t.endsWith("Capture")):t.startsWith("data-")||t.startsWith("aria-")||s.has(t)?e.removeAttribute(t):a.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)&&null==t&&console.warn("Missing `key` in `teactFastList`"),t})));let u=0;const a=e.children.reduce(((e,r,d)=>{let a="props"in r?r.props.key:void 0;const s=null!=a;if(s&&!o.has(a))return l(n,r,void 0,t,-1),e;if(!s){const o=t.children[d],u=o&&"props"in o?o.props.key:void 0;if(!o||u)return l(n,r,void 0,t,-1),e;a=`__indexKey#${d}`}return e[a]={$element:r,index:u++,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=a[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 u="props"in e?e.props.teactOrderKey:void 0,h=d.index!==f&&d.order!==u,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),u=[],a=t.children.length>e.children.length+1?document.createDocumentFragment():void 0;for(let r=0;r=e.children.length?{fragment:a}:void 0);o&&u.push(o)}return a&&n.appendChild(a),u}(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 u=e.children[0];(0,r.op)(u)&&(e.children=[f(u,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,u.Oo)(e,t,n,t.endsWith("Capture")):t.startsWith("data-")||t.startsWith("aria-")||s.has(t)?e.setAttribute(t,n):a.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:()=>O,Ye:()=>Z,I4:()=>x,sO:()=>_,X$:()=>F,ZP:()=>B});var r=n(3716),o=n(9118),d=n(782),u=n(275),a=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,a.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,a.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,o,d){const{cursor:u,byCursor:s}=l.hooks.effects,i=l;function c(){if(!i.isMounted)return;const{cleanup:e}=s[u];if("function"==typeof e)try{let t;if(r.eM&&(t=performance.now()),e(),r.eM){const e=performance.now()-t,n=i.name;e>7&&console.warn(`[Teact] Slow cleanup at effect cursor #${u}: ${n}, ${Math.round(e)} ms`)}}catch(e){(0,a.S)(e)}}function f(){if(!i.isMounted)return;let e;if(r.eM&&(e=performance.now()),s[u].cleanup=n(),r.eM){const t=performance.now()-e,n=i.name;t>7&&console.warn(`[Teact] Slow effect at cursor #${u}: ${n}, ${Math.round(t)} ms`)}}if(void 0!==s[u]&&o&&s[u].dependencies){if(o.some(((e,t)=>e!==s[u].dependencies[t]))){if(d){const e=o.reduce(((e,t,n)=>{const r=s[u].dependencies[n];return t!==r&&e.push(`${n}: ${r} => ${t}`),e}),[]);console.log("[Teact]",d,"Effect caused by dependencies.",e.join(", "))}t(c),e(f)}}else t(c),e(f);s[u]={effect:n,dependencies:o,cleanup:s[u]?s[u].cleanup:void 0},l.hooks.effects.cursor++}function D(e,t,n){return R(o.T2,o.D0,e,t,n)}function O(e,t,n){return R(o.R3,o.zD,e,t,n)}function Z(e,t,n){const{cursor:o,byCursor:d}=l.hooks.memos;let{current:a}=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,u.c)(t,d[o].dependencies).join(", "):"[first render]"),a=e()),d[o]={current:a,dependencies:t},l.hooks.memos.cursor++,a}function x(e,t,n){return Z((()=>e),t,n)}function _(e){return Z((()=>({current:e})),[])}function F(e,t=u.Z,n){return function(o){const d=_(o),a=_();return(!a.current||d.current&&!t(d.current,o))&&(r.eM&&n&&console.log(`[Teact.memo] ${e.name} (${n}): Update is caused by:`,(0,u.c)(d.current,o).join(", ")),d.current=o,a.current=y(e,o)),a.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:()=>h,R3:()=>I,Rd:()=>C,uC:()=>S,Q6:()=>E,ll:()=>P,Iq:()=>M,c$:()=>A});var r=n(4050),o=n(3716),d=n(5326),u=n(6926),a=n(9118),s=n(275),i=n(782),c=n(3592),l=n(8674);function f(){return(f=Object.assign||function(e){for(var t=1;t7&&console.warn(`[TeactN] Slow containers update: ${Math.round(t)} ms`)}}],y={},v=new Map,b=(0,a.mS)(w);function w(e=!1){e||!(0,l.zG)()?g.forEach((e=>e(m))):b()}function I(e,t){"object"==typeof e&&e!==m&&(m=e,null!=t&&t.forceSyncOnIOs?w(!0):b(null==t?void 0:t.forceOnHeavyAnimation))}function C(){return m}function S(){return y}function E(e,t){p[e]||(p[e]=[],y[e]=(t,n)=>{!function(e,t,n){p[e]&&p[e].forEach((e=>{const r=e(m,y,t);r&&I(r,n)}))}(e,t,n)}),p[e].push(t)}function P(e){g.push(e)}function M(e){const t=g.indexOf(e);-1!==t&&g.splice(t,1)}function A(e=(()=>({})),t=(()=>({}))){return n=>function o(a){o.DEBUG_contentComponentName=n.name;const[i]=(0,r.eJ)((0,u.Z)(v)),l=(0,d.Z)();(0,r.d4)((()=>()=>{v.delete(i)}),[i]);let h=v.get(i);if(h||(h={mapStateToProps:e,mapReducersToProps:t,ownProps:a,areMappedPropsChanged:!1,forceUpdate:l,DEBUG_updates:0,DEBUG_componentName:n.name},v.set(i,h)),h.areMappedPropsChanged&&(h.areMappedPropsChanged=!1),!h.mappedProps||!(0,s.Z)(h.ownProps,a)){h.ownProps=a;try{h.mappedProps={...e(m,a),...t(I,y)}}catch(e){(0,c.S)(e)}}return r.ZP.createElement(n,f({},h.mappedProps,a))}}o.eM&&(window.getGlobal=C,document.addEventListener("dblclick",(()=>{console.log("GLOBAL CONTAINERS",(0,i.Xo)(Array.from(v.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:()=>u});const r=/\uFE0F/g,o=String.fromCharCode(8205);function d(e){return e.indexOf(o)<0?e.replace(r,""):e}const u=/(?:\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),u=n(7361),a=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:u.Lt,sessionData:(0,c.K8)(),isTest:window.location.search.includes("test"),isMovSupported:u.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,a.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),u=n(1226),a=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,u={visibility:t};let a,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||(a=n.map(i).filter(Boolean),s=n.map(c).filter(Boolean),a.length>0&&(u.allowedUsers=a),s.length>0&&(u.allowedChats=s)),"everybody"!==t&&"contacts"!==t||(a=r.map(i).filter(Boolean),s=r.map(c).filter(Boolean),a.length>0&&(u.blockedUsers=a),s.length>0&&(u.blockedChats=s)),u}(0,r.Q6)("updateProfile",((e,t,n)=>{const{photo:d,firstName:a,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,u.t9)("updateProfilePhoto",d),(a||s||i)&&await(0,u.t9)("updateProfile",{firstName:a,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:a,lastName:s,fullInfo:{...n.fullInfo,bio:i}}))}f&&await(0,u.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,u.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,u.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,a=URL.createObjectURL(d);(0,r.R3)({...e,settings:{...e.settings,loadedWallpapers:[{slug:o.mp,document:{fileName:"",size:d.size,mimeType:d.type,previewBlobUrl:a}},...e.settings.loadedWallpapers||[]]}}),(async()=>{const t=await(0,u.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:a}};(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,u.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,a.ee)(n.users,"id"))),null!==(t=n.chats)&&void 0!==t&&t.length&&(o=(0,l.GL)(o,(0,a.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,u.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,u.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,u.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,u.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,u.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,u.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,u.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:a}=n;(async()=>{await(0,u.t9)("updateNotificationSettings",o,{isSilent:d,shouldShowPreviews:a})&&(0,r.R3)((0,l.HN)((0,r.Rd)(),o,d,a))})()})),(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,u.t9)("updateContactSignUpNotification",o)&&(0,r.R3)((0,l.BI)((0,r.Rd)(),{hasContactJoinedNotifications:!o}))})()})),(0,r.Q6)("loadLanguages",(()=>{(async()=>{const e=await(0,u.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,u.t9)("fetchPrivacySettings","phoneNumber"),(0,u.t9)("fetchPrivacySettings","lastSeen"),(0,u.t9)("fetchPrivacySettings","profilePhoto"),(0,u.t9)("fetchPrivacySettings","forwards"),(0,u.t9)("fetchPrivacySettings","chatInvite")]);if(!(e&&t&&n&&o&&d))return;const a=(0,r.Rd)();a.settings.privacy.phoneNumber=e,a.settings.privacy.lastSeen=t,a.settings.privacy.profilePhoto=n,a.settings.privacy.forwards=o,a.settings.privacy.chatInvite=d,(0,r.R3)(a)})()})),(0,r.Q6)("setPrivacyVisibility",((e,t,n)=>{const{privacyKey:o,visibility:d}=n,{privacy:{[o]:a}}=e.settings;if(!a)return;const s=h(e,{visibility:d,allowedIds:[...a.allowUserIds,...a.allowChatIds],deniedIds:[...a.blockUserIds,...a.blockChatIds]});(async()=>{const e=await(0,u.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:a}=n,{privacy:{[o]:s}}=e.settings;if(!s)return;const i=h(e,{visibility:s.visibility,allowedIds:d?a:[...s.allowUserIds,...s.allowChatIds],deniedIds:d?[...s.blockUserIds,...s.blockChatIds]:a});(async()=>{const e=await(0,u.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,u.t9)("updateIsOnline",n)})),(0,r.Q6)("loadContentSettings",(()=>{(async()=>{const e=await(0,u.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,u.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,u.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,u.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),u=n(307),a=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,a.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,u.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});break}}}))},7895:(e,t,n)=>{var r=n(5116),o=n(3716),d=n(7361),u=n(663),a=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:u}=n.settings.byKey;d!==t&&((0,a.Z)(d,u===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,u.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,a.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"),d.s$&&document.body.classList.add("is-safari")})),(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},{forceSyncOnIOs:!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:()=>c,Bf:()=>l,G9:()=>f,ZV:()=>h,eA:()=>m,Ru:()=>p,pK:()=>g,l6:()=>y,zX:()=>v,U:()=>b,GM:()=>w,hu:()=>I,RT:()=>C,Hp:()=>S,Nl:()=>E,VE:()=>P,Mg:()=>M,Qm:()=>A,H5:()=>k,q8:()=>T,Hd:()=>N,OE:()=>L,pE:()=>R,i4:()=>D,Sm:()=>O,cc:()=>Z,P4:()=>x,O:()=>_,wG:()=>B,Fu:()=>$,SB:()=>U,zF:()=>W,ih:()=>j,$l:()=>G});var r=n(6137),o=n(3716),d=n(782),u=n(5527),a=n(790),s=n(5765);const i=Date.now()/1e3+31622400;function c(e){return"number"==typeof e?e>0:!e.startsWith("-")}function l(e){return f(e)||h(e)}function f(e){return"chatTypeBasicGroup"===e.type}function h(e){return"chatTypeSuperGroup"===e.type}function m(e){return"chatTypeChannel"===e.type}function p(e){return"chatTypePrivate"===e.type||"chatTypeBasicGroup"===e.type}function g(e){return e===o.FV}function y(e){switch(e.type){case"chatTypePrivate":return"PrivateChat";case"chatTypeBasicGroup":case"chatTypeSuperGroup":return"AccDescrGroup";case"chatTypeChannel":return"AccDescrChannel";default:return"Chat"}}function v(e){if("chatTypePrivate"===e.type||"chatTypeSecret"===e.type)return e.id}function b(e,t,n,r=!1){return r||n&&t.id===n.id&&n.isSelf?e("SavedMessages"):t.title||e("HiddenName")}function w(e){if(e.fullInfo)return e.fullInfo.about}function I(e){const{username:t}=e;if(t)return`https://t.me/${t}`;const{inviteLink:n}=e.fullInfo||{};return n}function C(e,t="normal"){if(e.avatarHash)switch(t){case"big":return`profile${e.id}?${e.avatarHash}`;default:return`avatar${e.id}?${e.avatarHash}`}}function S(e){return!e.lastMessage}function E(e){return Boolean(e.adminRights)}function P(e,t){return!!e.adminRights&&e.adminRights[t]}function M(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 A(e,t){return t!==r._f||!(e.isRestricted||e.migratedTo||e.isNotJoined||g(e.id))&&(!!e.isCreator||!!c(e.id)||(m(e)?P(e,"postMessages"):E(e)||!M(e,"sendMessages")))}function k(e,t=!1){if(!e)return{canAttachMedia:!1,canAttachPolls:!1,canSendStickers:!1,canSendGifs:!1,canAttachEmbedLinks:!1};const n=E(e);return{canAttachMedia:n||!M(e,"sendMedia"),canAttachPolls:(n||!M(e,"sendPolls"))&&(!c(e.id)||t),canSendStickers:n||!M(e,"sendStickers"),canSendGifs:n||!M(e,"sendGifs"),canAttachEmbedLinks:n||!M(e,"embedLinks")}}function T(e,t,n){if(null!=t&&t.sendMessages){const{untilDate:n}=t;return n&&n{const c=t[e];return c&&function(e,t,n,r,d,u,a,s){if(!e.isListed)return!1;const{id:i,type:c,unreadMentionsCount:l}=e;if(null!=u&&u.has(i))return!1;if(null!=a&&a.has(i))return!0;if(null!=s&&s.has(i))return!0;if(t.excludeArchived&&e.folderId===o.WS)return!1;if(t.excludeRead&&!e.unreadCount&&!l&&!e.hasUnreadMark)return!1;if(t.excludeMuted&&!l&&D(e,r,d))return!1;if("chatTypePrivate"===c){const e=n[i];if(e){const{type:n,isContact:r}=e;if("userTypeBot"===n){if(t.bots)return!0}else{if(t.contacts&&r)return!0;if(t.nonContacts&&!r)return!0}}}else{if("chatTypeChannel"===c)return!!t.channels;if("chatTypeBasicGroup"===c||"chatTypeSuperGroup"===c)return!!t.groups}return!1}(c,r,n,d,u,a,s,i)})),r.pinnedChatIds]}function _(e,t,n,r="all",o=!1){const u=new Set(t),a=n?new Set(n):void 0,s=(null==n?void 0:n.reduce(((t,n)=>{const o=e[n];return o&&u.has(o.id)&&F(o,r)&&t.push(o),t}),[]))||[],i=t.reduce(((t,n)=>{const o=e[n];return!o||a&&a.has(o.id)||!F(o,r)||t.push(o),t}),[]);return{pinnedChats:s,otherChats:o?i:(0,d.Xo)(i,L,"desc")}}function F(e,t){return e.lastMessage&&!e.migratedTo&&!e.isRestricted&&!e.isNotJoined&&!("all"===t&&e.folderId===o.WS)&&!("archived"===t&&e.folderId!==o.WS)}function B(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 $(e,t,n,r,o,d){const[u]=x(e,t,n,r,o,d);let a=!1;return{unreadDialogsCount:u.reduce(((e,n)=>{const r=t[n];if(null==r||!r.lastMessage||null!=r&&r.isRestricted||null!=r&&r.isNotJoined)return e;const u=r.unreadCount||r.hasUnreadMark;return u&&e++,!a&&(r.unreadMentionsCount||u&&!D(r,o,d))&&(a=!0),e}),0),hasActiveDialogs:a}}function U(e,t,n,r,o,d,u){const{id:a,title:s,emoticon:i,description:c,pinnedChatIds:l,excludedChatIds:f,includedChatIds:h,excludeArchived:m,excludeMuted:p,excludeRead:g,...y}=o;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[u,a]=x(e,t,n,r,o,d),{pinnedChats:s,otherChats:i}=_(t,u,a,"folder",!0);return s.length+i.length}(t,n,r,o,d,u)):y.bots?e("FilterBots"):y.groups?e("FilterGroups"):y.channels?e("FilterChannels"):y.contacts?e("FilterContacts"):y.nonContacts?e("FilterNonContacts"):void 0}function W(e,t,n){if(n&&!c(t))return n.isSelf?e("FromYou"):(0,u.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")}function G(e,t,n,r,o){if(!r)return t;const d=(0,s.W)(r);return t.filter((t=>{const r=n[t];return!!r&&d(b(e,r,void 0,t===o))}))}},2858:(e,t,n)=>{n.d(t,{uw:()=>ie,$l:()=>o.$l,kK:()=>r.kK,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:()=>ue,N5:()=>x,oP:()=>_,qp:()=>L,w6:()=>T,R5:()=>ae,$D:()=>g,aE:()=>$,ep:()=>X,c0:()=>ee,eO:()=>G,Tp:()=>l,kG:()=>Y,Ti:()=>K,DH:()=>z,KK:()=>h,O$:()=>D,t9:()=>j,Y5:()=>Z,zF:()=>o.zF,q8:()=>o.q8,_O:()=>y,bf:()=>B,MK:()=>m,UD:()=>p,b7:()=>O,kd:()=>F,s1:()=>H,F$:()=>V,Cg:()=>Q,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:()=>W,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),u=n(3716),a=n(7361),s=n(4784);const i="The message is not supported on this version of Telegram",c=new RegExp(u.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:u,voice:a,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():u?`${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")}`:a?`${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:u,document:a,poll:s,webPage:c,contact:l,invoice:f}=e.content;return t?t.text:n||r||o||d||u||a||l||s||c||f?void 0:i}function g(e){const{text:t,sticker:n,photo:r,video:o,audio:d,voice:u,document:a,poll:i,webPage:c,contact:l}=e.content;return!!(n||null!=o&&o.isRound)||!(!t||r||o||d||u||a||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===u.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>=u.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,a.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?a.m5?`${d}.ogg`:`${d}.wav`:d}var N=n(5376);function L(e){return e.content}function R(e){return Boolean(D(e)||O(e)||$(e)||B(e)||function(e){return e.content.contact}(e)||j(e)||x(e)||_(e)||F(e))}function D(e){return e.content.photo}function O(e){return e.content.video}function Z(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 W(e){const t=$(e);return t?"video"===t.mediaType:void 0}function j(e){return e.content.poll}function G(e){return e.content.invoice}function H(e){return e.content.webPage}function V(e){var t;return null===(t=H(e))||void 0===t?void 0:t.photo}function Q(e){var t;return null===(t=H(e))||void 0===t?void 0:t.video}function z(e){var t;return null===(t=function(e){const t=D(e)||O(e)||$(e)||B(e)||V(e)||Q(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:u,document:a}=e.content,s=V(e),i=Q(e),c=r||i,f=n||s;if(!(f||c||o||d||u||a))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(a)switch(t){case"micro":case"pictogram":case"inline":case"viewerPreview":if(!(0,N.v6)(a)||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(u)switch(t){case"micro":case"pictogram":return;case"inline":return h;case"download":return`${h}?download`}}function J(e,t){return a.I_&&a.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:u}=e.content,s=r||Q(e);return n&&"inline"===t&&n.isAnimated?d.IU.Lottie:s&&a.I_&&("viewerFull"===t||"inline"===t)?d.IU.Progressive:o||u?u&&!a.m5?d.IU.BlobUrl:d.IU.Progressive:d.IU.BlobUrl}function X(e){const{photo:t,video:n,document:r}=e.content,o=V(e),d=Q(e);if(t||o)return`photo${e.date}.jpeg`;const{fileName:u}=n||d||r||{};return u}function ee(e){const{video:t,document:n}=e.content,r=Q(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=ae(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 ue(e,t,n=!1){const r=A(e);return{isUploading:r,isTransferring:r||n,transferProgress:Number(t)}}function ae(e,t,n){let r;switch(n){case"media":r=e=>{const t=O(e);return D(e)||t&&!t.isRound&&!t.isGif};break;case"documents":r=$;break;case"links":r=e=>H(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=O(e);return F(e)||t&&t.isRound};break;case"inlineMedia":r=e=>{const t=O(e);return D(e)||t&&!t.isRound&&!t.isGif||U(e)||W(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||Q(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:()=>i,Js:()=>c,Tq:()=>l,kM:()=>f,NB:()=>h,cS:()=>m,kw:()=>p,Z0:()=>g,kK:()=>y,db:()=>v,Rs:()=>b});var r=n(3716),o=n(790),d=n(782),u=n(2267),a=n(5765);const s=[1,8,5,2,7,4,6];function i(e){if(e)switch(e.type){case"userTypeBot":case"userTypeRegular":return e.firstName||e.lastName;case"userTypeDeleted":case"userTypeUnknown":return"Deleted";default:return}}function c(e){if(e){if(h(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 l(e,t,n,d){if(t.id===r.aw)return e("ServiceNotifications").toLowerCase();if(t.type&&"userTypeBot"===t.type)return e("Bot");if(!n)return"";switch(n.type){case"userStatusEmpty":return e("ALongTimeAgo");case"userStatusLastMonth":return e("WithinAMonth");case"userStatusLastWeek":return e("WithinAWeek");case"userStatusOffline":{const{wasOnline:t}=n;if(!t)return e("LastSeen.Offline");const r=new Date((new Date).getTime()+1e3*d),u=new Date(1e3*t);if(u>=r)return e("LastSeen.JustNow");const a=new Date(r.getTime()-u.getTime());if(a.getTime()/1e3<60)return e("LastSeen.JustNow");if(a.getTime()/1e3<3600)return e("LastSeen.MinutesAgo",Math.floor(a.getTime()/1e3/60));const s=new Date;if(s.setHours(0,0,0,0),u>new Date(s.getTime()+1e3*d))return a.getTime()/1e3<21600?e("LastSeen.HoursAgo",Math.floor(a.getTime()/1e3/60/60)):e("LastSeen.TodayAt",(0,o.mr)(u,e));const i=new Date;return i.setDate(r.getDate()-1),i.setHours(0,0,0,0),u>new Date(i.getTime()+1e3*d)?e("LastSeen.YesterdayAt",(0,o.mr)(u,e)):e("LastSeen.AtDate",(0,o.Tu)(e,u))}case"userStatusOnline":return e("Online");case"userStatusRecently":return e("Lately");default:return}}function f(e,t){const{id:n,type:o}=e;return!!t&&n!==r.aw&&"userStatusOnline"===t.type&&"userTypeBot"!==o}function h(e){return!e.noStatus&&"userTypeBot"!==e.type&&e.id!==r.aw&&("userTypeDeleted"===e.type||"userTypeUnknown"===e.type)}function m(e){return"userTypeBot"===e.type}function p(e){return!e.isContact&&!m(e)}function g(e,t,n,r,o=0){return(0,d.Xo)(e,(e=>{const d=(0,u.b)(o);if(r&&r.includes(e))return d+172800-(r.length-r.indexOf(e));const a=t[e],s=n[e];if(!a||!s)return 0;if("userStatusOnline"===s.type)return s.expires;if("userStatusOffline"===s.type&&s.wasOnline)return s.wasOnline;switch(s.type){case"userStatusRecently":return d-86400;case"userStatusLastWeek":return d-604800;case"userStatusLastMonth":return d-18144e3;default:return 0}}),"desc")}function y(e,t,n){if(!n)return e;const r=(0,a.W)(n);return e.filter((e=>{const n=t[e];if(!n)return!1;const o=c(n);return o&&r(o)||r(n.username)}))}function v(e){return"number"==typeof e?Math.abs(e):Math.abs(Number(e))}function b(e){const t=e?v(e.id)%7:0;return s[t]}},6788:(e,t,n)=>{n.d(t,{Mg:()=>u,B1:()=>a,SL:()=>s,a4:()=>i,GL:()=>c,fZ:()=>l,Pi:()=>h,vv:()=>m,Dd:()=>p});var r=n(3716),o=n(782),d=n(1638);function u(e,t,n){return{...e,chats:{...e.chats,listIds:{...e.chats.listIds,[t]:n}}}}function a(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:u(e,t,[...r||[],...o])}function s(e,t){return{...e,chats:{...e.chats,byId:t}}}function i(e,t,n,r){const{byId:o}=e.chats,d=f(e,t,n,r);return d?s(e,{...o,[t]:d}):e}function c(e,t){const n=Object.keys(t).reduce(((n,r)=>{const o=f(e,r,t[r]);return o&&(n[r]=o),n}),{});return e=s(e,{...e.chats.byId,...n})}function l(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=f(e,d,t[d]);n&&(o[d]=n,r||(r=!0))}return o}),{});return r?e=s(e,{...n,...o}):e}function f(e,t,n,r){const{byId:d}=e.chats,u=d[t],a=n.isMin&&u&&!u.isMin,s={...u,...a?(0,o.CE)(n,["isMin","accessHash"]):n,...r&&{photos:[r,...u.photos||[]]}};if(s.id&&s.type)return s}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]}})),i(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=u(e,n,r.filter((e=>e!==t)))),i(e,t,{isNotJoined:!0})}},307:(e,t,n)=>{n.d(t,{O4:()=>be,c_:()=>h,fZ:()=>r.fZ,m6:()=>f,aK:()=>ye,aJ:()=>ge,zn:()=>q,Sh:()=>j,$S:()=>I,bp:()=>Te,WY:()=>Ne,K4:()=>g,bV:()=>y,h8:()=>V,M6:()=>k,i9:()=>N,Dd:()=>r.Dd,vy:()=>_,rB:()=>we,g_:()=>Z,Mg:()=>r.Mg,SL:()=>r.SL,Pb:()=>ue,w3:()=>P,BI:()=>me,lr:()=>pe,pf:()=>l,ps:()=>J,s5:()=>B,y9:()=>C,nA:()=>Pe,_7:()=>Ae,Q$:()=>Ee,Dq:()=>ke,vT:()=>Se,QH:()=>Me,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:()=>O,No:()=>X,Og:()=>ee,xv:()=>ne,px:()=>te,xj:()=>v,c1:()=>ce,z5:()=>ie,qr:()=>de,dx:()=>ae,fw:()=>he,H9:()=>fe,HN:()=>ve,ff:()=>b,P4:()=>p,x1:()=>H,TM:()=>Ce,Rg:()=>D,z3:()=>R,IM:()=>x,Xg:()=>S,j6:()=>E,lG:()=>L,IE:()=>Ie,Nq:()=>U,Lm:()=>Q,Q3:()=>z,eD:()=>W});var r=n(6788),o=n(6137),d=n(3716),u=n(1638),a=n(782);function s(e,t,n=o._f,r="thread",u){const{messageLists:a}=e.messages;let s=a;if(u||d.Cg)s=t?[{chatId:t,threadId:n,type:r}]:[];else if(t){const e=a[a.length-1];e&&e.chatId===t&&e.threadId===n&&e.type===r||(s=e&&e.chatId===d.AJ?[...a.slice(0,-1),{chatId:t,threadId:n,type:r}]:[...a,{chatId:t,threadId:n,type:r}])}else s=a.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,u.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,u.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,u.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,u.Zw)(e,t);if(!r)return e;const o=(0,a.CE)(r,n),d=Object.values((0,a.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,u.tZ)(e,t,r);let d=(0,u.gb)(e,t,r),a=(0,u.qC)(e,t,r),s=(0,u.Cb)(e,t,r),i=(0,u.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)),a&&a.includes(e)&&(a=a.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",a),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,u.Bt)(e),r=n&&n.chatId===t&&"thread"===n.type,o=null==n?void 0:n.threadId;d.forEach((n=>{const{fromChatId:d,fromMessageId:a}=n.forwardInfo,i=(0,u.hj)(e,d,a);r&&o===a&&(e=s(e,t)),i&&(e=m(e,d,a,{threadInfo:void 0}))}))}return e=i(e,t,o)}function y(e,t,n){const r=(0,u.Fn)(e,t);if(!r)return e;const d=(0,a.CE)(r,n);let s=(0,u.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,u.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,u.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,u.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,u.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,u.$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,a.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:a}=t.forwardInfo||{};if(d&&a){const t=(0,u.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,a.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 O(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 Z(e,t){return{...e,animatedEmojis:t}}function x(e,t,n,r){const o=[...(0,u.Pk)(e,t),...n||[]],d=(0,a.Tw)(o.map((({id:e})=>e))),s=(0,a.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){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 U(e,t,n){const{byId:r}=e.users,o=G(e,t,n);return o?B(e=$(e,[o]),{...r,[t]:o}):e}function W(e,t){const n=Object.keys(t).reduce(((n,r)=>{const o=G(e,r,t[r]);return o&&(n[r]=o),n}),{});return e=$(e=B(e,{...e.users.byId,...n}),Object.values(n))}function j(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=G(e,d,t[d]);n&&(o[d]=n,r||(r=!0))}return o}),{});return r?e=$(e=B(e,{...n,...o}),Object.values(o)):e}function G(e,t,n){const{byId:r}=e.users,o=r[t],d=n.isMin&&o&&!o.isMin,u={...o,...d?(0,a.CE)(n,["isMin","accessHash"]):n};if(u.id&&u.type)return u}function H(e,t){return e.users.selectedId===t?e:{...e,users:{...e.users,selectedId:t}}}function V(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 Q(e,t){return{...e,userSearch:{...e.userSearch,...t}}}function z(e,t){return Q(e,{fetchingStatus:t})}function K(e,t,n){const{byId:r}=e.users,o=r[t];return o&&o.fullInfo?U(e,t,{...o,fullInfo:{...o.fullInfo,isBlocked:n}}):e}function J(e,t){return{...e,users:{...e.users,statusesById:t}}}function q(e,t){const{statusesById:n}=e.users,r=Object.keys(t).filter((e=>!n[e]));return r.length?e=J(e,{...n,...(0,a.ei)(t,r)}):e}const Y=e=>`${e.chatId}_${e.id}`;function X(e,t){return{...e,globalSearch:{...e.globalSearch,...t}}}function ee(e,t){return X(e,{currentContent:t})}function te(e,t,n,r,o){var d;const{resultsByType:u}=e.globalSearch||{},s=t.reduce(((e,t)=>(e[Y(t)]=t,e)),{}),i=null==u||null===(d=u[r])||void 0===d?void 0:d.foundIds;if(void 0!==i&&Object.keys(s).every((e=>i.includes(Y(s[e])))))return ne(e,{messages:!1});const c=i||[],l=t.map((e=>Y(e))),f=Array.prototype.concat(c,l),h=(0,a.et)(c,f)?c:f;return X(e=ne(e,{messages:!1}),{resultsByType:{...(e.globalSearch||{}).resultsByType,[r]:{totalCount:n,nextOffsetId:o,foundIds:h}}})}function ne(e,t){return X(e,{fetchingStatus:{...e.globalSearch.fetchingStatus,...t}})}var re=n(2858);function oe(e,t,n){return{...e,localTextSearch:{byChatThreadKey:{...e.localTextSearch.byChatThreadKey,[t]:n}}}}function de(e,t,n,r,o){const d=(0,re.uw)(t,n);return oe(e,d,{...e.localTextSearch.byChatThreadKey[d],isActive:r,query:o})}function ue(e,t,n,r,o,d){const u=(0,re.uw)(t,n);return oe(e,u,{...e.localTextSearch.byChatThreadKey[u],results:{foundIds:r,totalCount:o,nextOffsetId:d}})}function ae(e,t,n,r,o,d){const u=(0,re.uw)(t,n),{results:s}=e.localTextSearch.byChatThreadKey[u]||{},i=(null==s?void 0:s.foundIds)||[],c=le((0,a.Tw)(Array.prototype.concat(i,r)));return ue(e,t,n,(0,a.et)(i,c)?i:c,o,d)}function se(e,t,n){return{...e,localMediaSearch:{byChatId:{...e.localMediaSearch.byChatId,[t]:n}}}}function ie(e,t,n){return se(e,t,{...e.localMediaSearch.byChatId[t],currentType:n})}function ce(e,t,n,r,o,d){const{resultsByType:u}=e.localMediaSearch.byChatId[t]||{},s=null!=u&&u[n]?u[n].foundIds:[],i=le((0,a.Tw)(Array.prototype.concat(s,r)));return function(e,t,n,r,o,d){return se(e,t,{...e.localMediaSearch.byChatId[t],resultsByType:{...(e.localMediaSearch.byChatId[t]||{}).resultsByType,[n]:{foundIds:r,totalCount:o,nextOffsetId:d}}})}(e,t,n,(0,a.et)(s,i)?s:i,o,d)}function le(e){return e.sort(((e,t)=>e-t))}function fe(e,t){return{...e,management:{...e.management,progress:t}}}function he(e,t,n){return{...e,management:{...e.management,byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t]||{},...n}}}}}function me(e,t){return{...e,settings:{...e.settings,byKey:{...e.settings.byKey,...t}}}}function pe(e,t,n){return{...e,settings:{...e.settings,themes:{...e.settings.themes,[t]:{...e.settings.themes[t]||{},...n}}}}}function ge(e,t){return t.forEach((t=>{const{chatId:n,...r}=t;e=ye(e,n,r)})),e}function ye(e,t,n){return{...e,settings:{...e.settings,notifyExceptions:{...e.settings.notifyExceptions,[t]:n}}}}function ve(e,t,n,r){switch(t){case"contact":return me(e,{...void 0!==n&&{hasPrivateChatsNotifications:!n},...void 0!==r&&{hasPrivateChatsMessagePreview:r}});case"group":return me(e,{...void 0!==n&&{hasGroupNotifications:!n},...void 0!==r&&{hasGroupMessagePreview:r}});case"broadcast":return me(e,{...void 0!==n&&{hasBroadcastNotifications:!n},...void 0!==r&&{hasBroadcastMessagePreview:r}});default:return}}function be(e,t){return e=K(e,t,!0),{...e,blocked:{...e.blocked,ids:[t,...e.blocked.ids],totalCount:e.blocked.totalCount+1}}}function we(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 Ie(e,t){return{...e,twoFaSettings:{...e.twoFaSettings,...t}}}function Ce(e,t){return{...e,payment:{...e.payment,shippingOptions:t}}}function Se(e,t){return{...e,payment:{...e.payment,requestId:t}}}function Ee(e,t){return{...e,payment:{...e.payment,step:t}}}function Pe(e,t){if(!t.content||!t.content.invoice)return e;const{title:n,text:r,amount:o,currency:d,isTest:u,photoUrl:a}=t.content.invoice;return{...e,payment:{...e.payment,invoiceContent:{title:n,text:r,photoUrl:a,amount:o,currency:d,isTest:u}}}}function Me(e,t){return{...e,payment:{...e.payment,stripeCredentials:{...t}}}}function Ae(e,t){return{...e,payment:{...e.payment,...t}}}function ke(e,t,n){if(!t||!n)return{...e,payment:{...e.payment,receipt:void 0}};const{invoice:r}=n.content,{photoUrl:o,text:d,title:u}=r||{};return{...e,payment:{...e.payment,receipt:{...t,photoUrl:o,text:d,title:u}}}}function Te(e){return{...e,payment:{}}}function Ne(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),u=n(3716),a=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!==u.mo?t.fullInfo.members.reduce(((t,{userId:n})=>n!==e.currentUserId&&e.users.byId[n]&&(0,o.kM)(e.users.byId[n],e.users.statusesById[n])?t+1:t),0):t.fullInfo.onlineCount}function m(e,t){const n=s(e,t),r=n&&(0,o.zX)(n),u=r&&(0,d.dy)(e,r);if(u&&(0,o.cS)(u))return u}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 u=e.messages.byChatId[t];if(!u)return!1;const{listedIds:a}=u.threadsById[r._f]||{};return a&&!a.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===u.WS?"archived":"active"}function b(e,t){return e.chatFolders.byId[t]}function w(e,t,n=u.Nf){const{active:r,archived:o}=e.chats.orderedPinnedIds;if(n===u.Nf)return!!r&&r.includes(t);if(n===u.WS)return!!o&&o.includes(t);const{byId:d}=e.chatFolders,{pinnedChatIds:a}=d[n]||{};return!!a&&a.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,a.d)(e),d=(0,a.N)(e);return t.reduce(((e,t)=>{const u=n[t];return!(u&&u.unreadCount&&u.isListed)||u.isNotJoined||u.isRestricted||!u.unreadMentionsCount&&(0,o.i4)(u,r,d)?e:e+u.unreadCount}),0)}function S(e){return Boolean(s(e,u.aw))}},1638:(e,t,n)=>{n.d(t,{hg:()=>W,xs:()=>oe,_k:()=>X,zB:()=>g,g4:()=>a.g4,bH:()=>ye,__:()=>be,xl:()=>ee,Nu:()=>ne,nB:()=>te,Z1:()=>a.Z1,IK:()=>a.IK,DI:()=>a.DI,Mw:()=>a.Mw,Ek:()=>a.Ek,hj:()=>G,ZB:()=>Q,Zw:()=>I,YK:()=>a.YK,Dg:()=>a.Dg,X5:()=>ie,A1:()=>a.A1,jr:()=>w,yN:()=>f,JX:()=>Le,pP:()=>Me,we:()=>Ee,og:()=>Se,$W:()=>M,Bt:()=>b,y5:()=>l,n5:()=>Ce,Ms:()=>O,_$:()=>R,kK:()=>V,wU:()=>D,yZ:()=>_,It:()=>ae,G$:()=>z,y8:()=>fe,cv:()=>Y,pk:()=>a.pk,N:()=>a.N,ep:()=>a.ep,xo:()=>a.xo,FM:()=>a.FM,a6:()=>me,te:()=>re,Ev:()=>se,CA:()=>ce,zQ:()=>Ae,_X:()=>K,vk:()=>le,Jf:()=>Te,UW:()=>a.UW,s4:()=>s.s4,b9:()=>j,VF:()=>Ie,gb:()=>E,aW:()=>Pe,xH:()=>he,FT:()=>ge,tV:()=>Z,NJ:()=>Fe.N,dZ:()=>Fe.d,dT:()=>J,qC:()=>P,gx:()=>Re,eh:()=>Oe,Mz:()=>De,sp:()=>Ze,KB:()=>k,$$:()=>xe,rd:()=>ue,p9:()=>F,Yy:()=>L,Wq:()=>ke,qy:()=>T,Tm:()=>H,Fn:()=>C,Vt:()=>N,D7:()=>pe,Ur:()=>q,yB:()=>we,Ny:()=>h,E_:()=>m,Pk:()=>p,i3:()=>_e,P_:()=>a.P_,Pu:()=>Ne,Db:()=>U,tZ:()=>x,Cm:()=>B,qS:()=>$,uZ:()=>de,dy:()=>s.dy,ss:()=>s.ss,Cb:()=>A});var r=n(1713),o=n(7361),d=n(6137),u=n(3716),a=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,a.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 O(e,t,n){return S(e,t,n,"draft")}function Z(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,a.Z1)(e,t);const r=x(e,t,n);return r?(0,a.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 W(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 j(e,t,n){const r=A(e,t,n);if(!r||!r.length)return!0;let o;if(n===d._f){const n=(0,a.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>=u.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 H(e,t,n){const r=C(e,t);return r?r[n]:void 0}function V(e,t,n,r){if("scheduled"===r){const n=D(e,t);return n?H(e,t,n):void 0}{const r=R(e,t,n);return r?G(e,t,r):void 0}}function Q(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 z(e,t){const{chatId:n,messageId:r}=e.focusedMessage||{};return n===t?r:void 0}function K(e,t){const n=z(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,a.Z1)(e,t.chatId)||{};return(0,i.CI)(t)||!n||ne===t.id))}(e,t.content.sticker),Z=!b&&D&&!O,x=!b&&O,_=!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===(u=w.webPage)||void 0===u?void 0:u.photo)||w.audio||w.voice||w.photo||w.video||w.document||w.sticker);return{noOptions:[C,L,E,P,T,A,N,R,Z,x,_,F,B,$].every((e=>!e)),canReply:C,canEdit:L,canPin:E,canUnpin:P,canReport:T,canDelete:A,canDeleteForAll:N,canForward:R,canFaveSticker:Z,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 ue(e,t,n){if(n===d._f){const n=(0,a.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 ae(e,t,n){const r=(0,a.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=ue(e,t,n);if(!c&&r&&r.isNotJoined)return;const l=t===u.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,a.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,a.Z1)(e,t);if(!n)return;if(!(0,a.xo)(e,n))return;const r=I(e,t),o=A(e,t,d._f);if(!r||!o)return;const u=(0,c.dF)(o,(e=>!r[e].isOutgoing&&Boolean(r[e].keyboardButtons))),s=(0,c.dF)(o,(e=>Boolean(r[e].shouldHideKeyboardButtons)));return u&&s&&s>u?void 0:u?r[u]:void 0}function ye(e,t){const n=(0,a.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)),u=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}):!u||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:u}){const a=Boolean(n&&(n.id===e.currentUserId||(0,s.nM)(e,n)));return Boolean(a&&r||!a&&o&&(0,i.YC)(t.id)||d&&(0,i.Bf)(t)||u&&(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,a.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,u=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,a.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:u?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 Oe(e){return e.payment.formId}function Ze(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){return e.users.statusesById[t]}function d(e,t){var n;const o=r(e,t);return null==o||null===(n=o.fullInfo)||void 0===n?void 0:n.isBlocked}function u(e,t){return e.contactList&&e.contactList.userIds.includes(t.id)}n.d(t,{dy:()=>r,ss:()=>o,s4:()=>d,nM:()=>u})},1713:(e,t,n)=>{let r,o,d,u,a,s,i,c,l,f,h,m,p,g;n.d(t,{Uq:()=>r,fo:()=>o,MT:()=>d,du:()=>u,nJ:()=>a,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"}(u||(u={})),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"}(a||(a={})),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,{cK:()=>d,jt:()=>u,M8:()=>a,vr:()=>s});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 u(e){(0,r.T2)((()=>{e()&&u(e)}))}const a={linear:e=>e,easeIn:e=>e**1.675,easeOut:e=>1-(1-e**1.675),easeInOut:e=>.5*(Math.sin((e-.5)*Math.PI)+1),easeInQuad:e=>e*e,easeOutQuad:e=>e*(2-e),easeInOutQuad:e=>e<.5?2*e*e:(4-2*e)*e-1,easeInCubic:e=>e*e*e,easeOutCubic:e=>--e*e*e+1,easeInOutCubic:e=>e<.5?4*e*e*e:(e-1)*(2*e-2)*(2*e-2)+1,easeInQuart:e=>e*e*e*e,easeOutQuart:e=>1- --e*e*e*e,easeInOutQuart:e=>e<.5?8*e*e*e*e:1-8*--e*e*e*e,easeInQuint:e=>e*e*e*e*e,easeOutQuint:e=>1+--e*e*e*e*e,easeInOutQuint:e=>e<.5?16*e*e*e*e*e:1+16*--e*e*e*e*e};function s({timing:e=a.linear,onUpdate:t,duration:n,onEnd:r,from:o,to:d}){const s=Date.now();let i=!1;return u((()=>{if(i)return!1;let u=(Date.now()-s)/n;u>1&&(u=1);const a=e(u);if("number"==typeof o&&"number"==typeof d)t(o+(d-o)*a);else if(Array.isArray(o)&&Array.isArray(d)){const e=o.map(((e,t)=>e+(d[t]-e)*a));t(e)}return 1===u&&r&&r(),u<1})),()=>{i=!0,r&&r()}}},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:()=>u,clear:()=>a});const r=self.caches;let o;async function d(e,t,n,d=!1){if(r)try{const u=new Request(t.replace(/:/g,"_")),a=await r.open(e),s=await a.match(u);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 u(e,t,n){if(r)try{const o="string"==typeof n||n instanceof Blob?n:JSON.stringify(n),d=new Request(t.replace(/:/g,"_")),u=new Response(o),a=await r.open(e);return await a.put(d,u)}catch(e){return void console.warn(e)}}async function a(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 u()||document.addEventListener("keydown",a,!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)}})),u()||document.removeEventListener("keydown",a,!1)}(e)}}function u(){return Object.values(o).some((e=>Boolean(e.length)))}function a(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:()=>u,_F:()=>a,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 u(e){const t=new Date(e);return t.setHours(0,0,0,0),t}function a(e){return u(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=u(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 a=n.getFullYear()!==o.getFullYear(),s=e(a?"formatDateScheduleYear":"formatDateSchedule")||(a?"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 a="number"==typeof t?new Date(t):t,s=u(new Date);if(!o){if(i(a)===i(s))return(d||!n?E:S)(e("Weekday.Today"));const t=new Date(s);if(t.setDate(s.getDate()-1),i(a)===i(t))return(d||!n?E:S)(e("Weekday.Yesterday"));const o=new Date(s),u=new Date(s);if(o.setDate(s.getDate()-7),u.setDate(s.getDate()+7),a>=o&&a<=u){const t=r[a.getDay()];return(d||!n?E:S)(e(n?`Weekday.Short${t}`:`Weekday.${t}`))}}const c=a.getFullYear()!==s.getFullYear(),l=e(n?c?"formatDateScheduleYear":"formatDateSchedule":c?"chatFullDate":"chatDate")||"d MMMM yyyy";return(d||!n?E:S)(p(e,a,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,u=t?Math.floor(t%3600/60):0;let a="";return n>0||d>0?(a+=`${String(n).padStart(2,"0")}:`,a+=`${String(r).padStart(2,"0")}:`):a+=u>=10?`${String(r).padStart(2,"0")}:`:`${String(r)}:`,a+=String(o).padStart(2,"0"),a}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(" "),u=t?o[0]:o[1],a=(t?o[1]:o[0]).toLowerCase(),s=d.findIndex((e=>e.startsWith(a)));return-1!==s&&w(Number(u),s)?`${String(s+1).padStart(2,"0")}-${String(u).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:()=>a,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 u(e){const t=e.split("-").map((e=>parseInt(e,16)));return String.fromCodePoint(...t)}function a(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 u,a;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!==(u=(a=window).matchMedia)&&void 0!==u&&u.call(a,"(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:()=>u,hl:()=>a,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 u(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 a(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 a(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_:()=>u});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 u(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 u(e,t){return t.reduce(((t,n)=>(e[n]&&(t[n]=e[n]),t)),{})}function a(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"){function r(e,t,n,r){const o=("function"==typeof n?n(e):e[n])||0,d=("function"==typeof n?n(t):t[n])||0;return r?o-d:d-o}if(Array.isArray(t)){const[o,d]=Array.isArray(n)?n:[n,n],[u,a]=t,s="asc"===o,i="asc"===d;return e.sort(((e,t)=>r(e,t,u,s)||r(e,t,a,i)))}const o="asc"===n;return e.sort(((e,n)=>r(e,n,t,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:()=>u,CE:()=>a,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),u=n(1226),a=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,u.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 a=await d.fetch(o.ee,e,d.Type.Json);if(!a&&(n&&await S(),a=await async function(e){const t=await(0,u.t9)("fetchLangPack",{sourceLangPacks:o.Bg,langCode:e});if(t)return await d.save(o.ee,e,t.langPack),t.langPack}(e),!a))return;l.clear(),y=e,f=a,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,a.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),u=n(9524),a=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]:u.Type.Blob,[r.IU.Lottie]:u.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 u.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"),u=I(e,n,r);g.set(e,u),(0,d.t9)("downloadMedia",{url:e,mediaFormat:t},u)})),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,a.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,a.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 u;null===(u=p.get(e))||void 0===u||u.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 u=await(0,d.t9)("downloadMedia",{mediaFormat:r.IU.Progressive,...o});if(!u)return;const{arrayBuffer:a,mimeType:s,fullSize:i}=u;navigator.serviceWorker.controller.postMessage({type:"partResponse",messageId:n,result:{arrayBuffer:a,mimeType:s,fullSize:i}},[a])}))},735:(e,t,n)=>{n.d(t,{D:()=>r});const r=[]},9203:(e,t,n)=>{n.d(t,{gl:()=>o,$y:()=>a,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={},u={};async function a(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(886),n.e(884),n.e(977)]).then(n.bind(n,6977));break;case o.Extra:d[o.Extra]=Promise.all([n.e(739),n.e(886),n.e(477)]).then(n.bind(n,9477));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 a=await d[e];return u[e]||(u[e]=a),s(e,t)}function s(e,t){const n=u[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),u=n(3716),a=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?(u.eM&&console.warn("[PUSH] The user has blocked push notifications."),!1):"PushManager"in window||(u.eM&&console.warn("[PUSH] Push messaging isn't supported."),!1):(u.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,a.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){u.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,a.Rd)(),n=(0,a.uC)();if(e)try{const t=p(e);return await(0,r.t9)("unregisterDevice",t),await e.unsubscribe(),void n.deleteDeviceToken()}catch(e){u.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,a.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);u.eM&&console.log("[PUSH] Received push subscription: ",n),await(0,r.t9)("registerDevice",n),(0,a.uC)().setDeviceToken(n)}catch(e){"denied"===Notification.permission?u.eM&&console.warn("[PUSH] The user has blocked push notifications."):u.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,a.Rd)());const[e,t]=await Promise.all([(0,r.t9)("fetchNotificationSettings",{serverTimeOffset:(0,a.Rd)().serverTimeOffset}),(0,r.t9)("fetchNotificationExceptions",{serverTimeOffset:(0,a.Rd)().serverTimeOffset})]);if(!e)return(0,l.dZ)((0,a.Rd)());let n=(0,c.BI)((0,a.Rd)(),e);return t&&(n=(0,c.aJ)(n,t)),(0,a.R3)(n),S=!0,(0,l.dZ)(n)}();if(!function(e){if(!S)return!1;const t=(0,a.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||(u.eM&&console.warn("[PUSH] The user has blocked push notifications."),!1):(u.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,a.Rd)(),{senderId:r,replyToMessageId:o}=t,u=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:u;v=(0,d.D)(i.i0,t,n,p,f,m,{asPlain:!0})}else{const n=(0,s.zF)(i.i0,e.id,u),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,a.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;!u.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:()=>u,g3:()=>a,un:()=>s,WZ:()=>i});var r=n(782);const o="X",d="XXX XXX XXX XXX";function u(e,t){return e.filter((e=>e.iso2===t))}function a(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))),u=(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=u[u.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),u=[];let a=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(...u)=>{o=!0,d=u,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 a(g,e)}function u(e){return a(y,e)}function a(e,t){let n,r=!1;return(...o)=>{n=o,r||(r=!0,e((()=>{r=!1,t(...n)})))}}function s(e,t){self.requestIdleCallback?self.requestIdleCallback(e,{timeout:t}):v(e)}n.d(t,{Ds:()=>r,P2:()=>o,mS:()=>d,wT:()=>u,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,W:()=>d});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="string"==typeof t?t.toLowerCase().split(r):t,o=e.toLowerCase();if(1===n.length&&!o.includes(n[0]))return!1;let d;return n.every((e=>!!o.includes(e)&&(d||(d=o.split(r)),d.some((t=>t.startsWith(e))))))}function d(e){const t=e.toLowerCase().split(r);return e=>o(e,t)}},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 u=n(3716),a=n(9524);const s=[1,2,3,4,5];function i(e=!1){if(e&&localStorage.getItem(u.Vx))return!0;const t=localStorage.getItem(u.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(u.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(){[u.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(u.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){u.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(u.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){u.eM&&console.warn("Failed to load legacy session",e)}}async function m(){localStorage.removeItem(u.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([a.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 u=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i,a=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,u=n?0:1,a=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.cK)((()=>{const e=Math.min((Date.now()-s)/200,1);return f(u,a,function(e){return 1-(1-e)**3.5}(e)),e<1})):f(u,a)};function l(e){const t=u.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)),u=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},${u},${i},${c/255})`:`rgb(${d},${u},${i})`),a.has(r)&&document.documentElement.style.setProperty(`${r}-rgb`,`${d},${u},${i}`)}))}},2155:(e,t,n)=>{n.d(t,{kh:()=>d,bi:()=>a,Xv:()=>s});var r=n(3681),o=n(4284);function d(e){return String(e).replace(/\d(?=(\d{3})+$)/g,"$& ")}function u(e){return".0"===String(e.toFixed(1)).substr(-2)?Math.round(e):e.toFixed(1).replace(".",",")}function a(e){return e<1e3?e:e<1e6?`${u(e/1e3)}K`:`${u(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 u,a;const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";async function i(e,t){for(l();!a.wasmReady;)await(0,d.wO)(2e3);const{result:n,width:r,height:o}=await function(e,t){return new Promise((n=>{a.requests||(a.requests=new Map),a.requests.set(e,n),a.postMessage({id:e,blob:t})}))}(e,t);if(r&&o)return function({result:e,width:t,height:n}){return u||(u=document.createElement("canvas")),new Promise((r=>{const o=new ImageData(e,t,n);u.width=t,u.height=n,u.getContext("2d").putImageData(o,0,0),u.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(){a||(a=new Worker(new URL(n.p+n.u(536),n.b)),a.wasmReady=!1,a.onmessage=f)}function f(e){const{id:t}=e.data;switch(e.data.type){case"initialized":a.wasmReady=!0;break;case"result":if(a.requests.has(t)){const n=a.requests.get(t);a.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 u=["t.me","telegram.me"].map((e=>`//${e}/_websync_?`)),a=`${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(u.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:a}),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 u=d.wB&&f(),a=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&&u!==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:()=>a>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"}},a={};function s(e){var t=a[e];if(void 0!==t)return t.exports;var n=a[e]={exports:{}};return u[e].call(n.exports,n,n.exports,s),n.exports}s.m=u,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 u=2&r&&n;"object"==typeof u&&!~e.indexOf(u);u=t(u))Object.getOwnPropertyNames(u).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:"4f4ca33bcc5de5731151",161:"286d0207d962142ad548",354:"b752615a082133d9d0a3",472:"21e5264f606f2b525030",477:"a474b061825f5523f240",501:"72ce4b6e27f459e194cd",524:"df43ecd790ed09f3bb50",532:"a0f46b886f04a00292c0",536:"55dc7dd4ab42a2c9f037",739:"19faf4bab45401118afe",745:"9316c5c2b711c39a20a5",884:"981e966423efd0c3b785",886:"be294f2c708be32963bf",915:"53f46f3c9677172ffcd6",927:"2e770ec779b8804a5d34",941:"e210d50ca759e57387c0",977:"26046ea7d40cd4b1ed2c",993:"f0aad9f6787f211b4e51"}[e]+".js",s.miniCssF=e=>e+"."+{133:"4f4ca33bcc5de5731151",472:"21e5264f606f2b525030",477:"a474b061825f5523f240",532:"a0f46b886f04a00292c0",886:"be294f2c708be32963bf",977:"26046ea7d40cd4b1ed2c"}[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 u,a;if(void 0!==o)for(var i=document.getElementsByTagName("script"),c=0;c{u.onerror=u.onload=null,clearTimeout(h);var o=n[e];if(delete n[e],u.parentNode&&u.parentNode.removeChild(u),o&&o.forEach((e=>e(r))),t)return t(r)},h=setTimeout(f.bind(null,void 0,{type:"timeout",target:u}),12e4);u.onerror=f.bind(null,u.onerror),u.onload=f.bind(null,u.onload),a&&document.head.appendChild(u)}},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 u=d&&("load"===d.type?"missing":d.type),a=d&&d.target&&d.target.href||t,s=new Error("Loading CSS chunk "+e+" failed.\n("+a+")");s.code="CSS_CHUNK_LOAD_FAILED",s.type=u,s.request=a,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,472:1,477:1,532:1,886:1,977: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),u=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;u.message="Loading chunk "+t+" failed.\n("+o+": "+d+")",u.name="ChunkLoadError",u.type=o,u.request=d,r[1](u)}}),"chunk-"+t,t)}};var t=(t,n)=>{var r,o,[d,u,a]=n,i=0;if(d.some((t=>0!==e[t]))){for(r in u)s.o(u,r)&&(s.m[r]=u[r]);a&&a(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.ZT&&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 u=s(2916);const a={isLeftColumnShown:!0,isChatInfoShown:!1,newChatMembersProgress:s(1713).WB.Closed,uiReadyState:0,serverTimeOffset:0,authRememberMe:!0,countryList:{phoneCodes:[],general:[]},blocked:{ids:[],totalCount:0},users:{byId:{},statusesById:{}},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)(S)),5e3,!1);let b,w=!1;function I(){w=!0,b=(0,c.Gq)(S,!0),window.addEventListener("blur",S),(0,t.ll)(v)}function C(){w=!1,(0,t.Iq)(v),window.removeEventListener("blur",S),b&&b()}function S(){if(!w||(0,l.zG)())return;const n=(0,t.Rd)();if(n.isLoggingOut)return;const r={...a,...(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:E(n),users:P(n),chats:M(n),messages:A(n),globalSearch:{recentlyFoundChatIds:n.globalSearch.recentlyFoundChatIds},settings:k(n),chatFolders:T(n),groupCalls:N(n)},o=JSON.stringify(r);localStorage.setItem(e.Uh,o)}function E(t){return window.innerWidth>e._m&&t.isChatInfoShown}function P(t){const{users:{byId:n,statusesById:r,selectedId:o}}=t,d=(t.chats.listIds.active||[]).slice(0,e.gJ).filter(y.YC),u=Object.keys(n),a=d.concat(u).slice(0,e.lO);return{byId:(0,f.ei)(n,a),statusesById:(0,f.ei)(r,a),selectedId:window.innerWidth>e._m?o:void 0}}function M(t){const n=(t.chats.listIds.active||[]).slice(0,e.gJ),{chatId:r}=(0,h.Bt)(t)||{},o=n.concat(r?[r]:[]);return{...t.chats,byId:(0,f.ei)(t.chats.byId,o),listIds:{active:n},isFullyLoaded:{},orderedPinnedIds:{active:t.chats.orderedPinnedIds.active}}}function A(t){const n={},{chatId:r}=(0,h.Bt)(t)||{};return(t.chats.listIds.active||[]).slice(0,e.gJ).concat(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 k(e){const{byKey:t,themes:n}=e.settings;return{byKey:t,themes:n,privacy:{},notifyExceptions:{}}}function T(e){return{...e.chatFolders,activeChatFolder:0}}function N(e){return{...e.groupCalls,byId:{},activeGroupCallId:void 0,isGroupCallPanelHidden:void 0,isFallbackConfirmOpen:void 0}}e.sd||((0,t.Q6)("saveSession",(()=>{w||I()})),(0,t.Q6)("reset",(()=>{localStorage.removeItem(e.Uh),w&&C()}))),(0,t.Q6)("init",(()=>{const t=(0,f.Xh)(a);return function(t){if(!e.sd)return(0,m.ti)(!0)?(I(),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:u,...a}=t.settings.byKey;t.settings.byKey={...a,canAutoLoadPhotoFromContacts:e,canAutoLoadVideoFromContacts:e,canAutoLoadPhotoInPrivateChats:n,canAutoLoadVideoInPrivateChats:n,canAutoLoadPhotoInGroups:r,canAutoLoadVideoInGroups:r,canAutoLoadPhotoInChannels:o,canAutoLoadVideoInChannels:o,canAutoPlayVideos:d,canAutoPlayGifs:u}}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),t.groupCalls||(t.groupCalls=n.groupCalls),t.users.statusesById||(t.users.statusesById={})}(o,t);const d={...t,...o},u=n.wB?void 0:(0,p.V)(g.Oy);return{...d,messages:{...d.messages,messageLists:u?[u]:[]}}}(t)):void C()}(t)||t}));var L=s(4050),R=s(3858);const D="tt-active-tab",O=String(Date.now()+Math.random());let Z;localStorage.setItem(D,O);const x=window.setInterval((()=>{Z&&localStorage.getItem(D)!==O&&(Z(),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 W(){if("fonts"in document)return Promise.all(U.map((e=>document.fonts.load(e))))}var j=s(647),G=s(9203),H=s(6752),V=s(4128),Q=s(2162);function z(){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?j.he(r,i.IU.BlobUrl):void 0})))}const K={main:()=>Promise.all([(0,G.$y)(G.gl.Main,"Main").then(W),z()]),authPhoneNumber:()=>Promise.all([W(),(0,$.pt)(V)]),authCode:()=>(0,$.pt)(Q),authPassword:()=>(0,$.pt)(Q),authQrCode:W},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:u,setIsUiReady:a})=>{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(),a({uiReadyState:1}),t=window.setTimeout((()=>{a({uiReadyState:2})}),1e3)})),()=>{t&&(clearTimeout(t),t=void 0),a({uiReadyState:0})}}),[]),L.ZP.createElement("div",{id:"UiLoader"},t,l&&!d&&L.ZP.createElement("div",{className:(0,H.Z)("mask",f)},"main"===e?L.ZP.createElement(L.ZP.Fragment,null,L.ZP.createElement("div",{className:"left",style:u?`width: ${u}px`:void 0}),L.ZP.createElement("div",{className:(0,H.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),ue=s(5765),ae=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)(),u=(0,L.sO)(null),[a,s]=(0,L.eJ)(),[i,c]=(0,L.eJ)([]),l=(0,L.I4)((e=>{s(e),c(function(e,t=""){if(!t.length)return e;const n=(0,ue.W)(t);return e.filter((e=>n(e.defaultName)||e.name&&n(e.name)))}(o,e))}),[o]);(0,ie.Z)((([e])=>{0===(null==e?void 0:e.length)&&o.length>0&&l(a)}),[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===a&&(n.value=""),l(n.value)}),[a,l,t]);return L.ZP.createElement(ce.Z,{className:"CountryCodeInput",trigger:({onTrigger:r,isOpen:o})=>{const s=()=>{if(o)return;setTimeout((()=>{u.current.select()}),50),r();const e=document.getElementById("auth-phone-number-form");e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},i=null!=a?a:(null==t?void 0:t.name)||(null==t?void 0:t.defaultName)||"";return L.ZP.createElement("div",{className:(0,H.Z)("input-group",t&&"touched")},L.ZP.createElement("input",{ref:u,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}),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,H.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,ae.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:u,authRememberMe:a,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)(),O=C?`+${C.countryCode} ${E||""}`:E,Z=O&&O.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}))}),[]),j=(0,L.I4)((e=>{S(e),P("")}),[]),G=(0,L.I4)((e=>{u&&p(),pe||(pe=!0,W(),(0,$.pt)(Q));const{value:t,selectionStart:r,selectionEnd:o}=e.target;T(r&&o&&o1&&!B.current;x(d?`${C.countryCode} ${t}`:t)}),[u,p,C,O,x]),H=(0,L.I4)((e=>{f(e.target.checked)}),[f]),V="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||Z&&l({phoneNumber:O})}},L.ZP.createElement(me,{id:"sign-in-phone-code",value:C,isLoading:!s&&!C,onChange:j}),L.ZP.createElement(oe.Z,{ref:b,id:"sign-in-phone-number",label:v("Login.PhonePlaceholder"),value:O,error:u&&v(u),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(a),onChange:H}),Z&&(V?L.ZP.createElement(ne.Z,{type:"submit",ripple:!0,isLoading:o},v("Login.Next")):L.ZP.createElement(de.Z,null)),V&&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={},u=e(r,n);u.u(t),u.J(),o=o||0;var a=u.h(),s=u.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>=a||0>t||t>=a)&&u.a(e,t)},d}function n(e,t,n,r,o,d,u,a,s,i){function c(t,n,r,o,u,a,s){t?(e.lineTo(n+a,r+s),e.arcTo(n,r,o,u,d)):e.lineTo(n,r)}u?e.moveTo(t+d,n):e.moveTo(t,n),c(a,r,n,r,o,-d,0),c(s,r,o,t,o,0,-d),c(i,t,o,t,n,d,0),c(u,t,n,r,n,0,d)}function r(e,t,n,r,o,d,u,a,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)}u&&c(t,n,d,d),a&&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,u=o.v,a=o.N,s=o.K,i=o.P;for(a=Math.max(1,a||1),s=Math.min(40,s||40);a<=s;a+=1)try{var c=t(d,u,a,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)),u=c.O,s=o.size/u,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,u){function a(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 u=l=4*o+17,s=Array(u),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(u=8;us;s+=1)m=!e&&1==(u>>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(u=r.A(o),s=0;18>s;s+=1)m=!e&&1==(u>>s&1),c[Math.floor(s/3)][s%3+l-8-3]=m;for(s=0;18>s;s+=1)m=!e&&1==(u>>s&1),c[s%3+l-8-3][Math.floor(s/3)]=m}if(null==f){for(e=d.I(o,i),u=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. ("+u.f()+">"+8*m+")");for(u.f()+4<=8*m&&u.put(0,4);0!=u.f()%8;)u.m(!1);for(;!(u.f()>=8*m||(u.put(236,8),u.f()>=8*m));)u.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+=u)||l<=s){s-=u,u=-u;break}}}var i=n[u],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()),u=0;ur?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=a;a+=1)if(!(0>r+a||t<=r+a))for(var s=-1;1>=s;s+=1)0>o+s||t<=o+s||(0!=a||0!=s)&&u==e.a(r+a,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:t,authState:n,authQrCode:r,language:o,returnToAuthPhoneNumber:d,setSettingOption:u})=>{const a=te(),s=(0,X.Z)(),i=(0,L.sO)(null),c=ee(a,"ContinueOnThisLanguage"),[l,f,h]=(0,_.Z)();(0,L.d4)((()=>{if(!r||"connectionStateReady"!==t)return;const e=i.current;e.innerHTML="",e.classList.remove("pre-animate"),Se.render({text:`tg://login?token=${r.token}`,radius:.5,ecLevel:"M",fill:"#4E96D4",size:280},e)}),[t,r]),(0,L.d4)((()=>{"connectionStateReady"===t&&(0,Y.m0)(e.sR)}),[t]);const m=(0,L.I4)((()=>{f(),(0,Y.m0)(a,(()=>{h(),u({language:a})}))}),[f,u,a,h]),p="authorizationStateWaitQrCode"===n;return L.ZP.createElement("div",{id:"auth-qr-form",className:"custom-scroll"},L.ZP.createElement("div",{className:"auth-form qr"},r?L.ZP.createElement("div",{key:"qr-container",className:"qr-container pre-animate",ref:i}):L.ZP.createElement("div",{key:"qr-loading",className:"qr-loading"},L.ZP.createElement(de.Z,null)),L.ZP.createElement("h3",null,s("Login.QR.Title")),L.ZP.createElement("ol",null,L.ZP.createElement("li",null,L.ZP.createElement("span",null,s("Login.QR.Help1"))),L.ZP.createElement("li",null,L.ZP.createElement("span",null,(0,ae.Z)(s("Login.QR.Help2"),["simple_markdown"]))),L.ZP.createElement("li",null,L.ZP.createElement("span",null,s("Login.QR.Help3")))),p&&L.ZP.createElement(ne.Z,{isText:!0,onClick:d},s("Login.QR.Cancel")),a&&a!==o&&c&&L.ZP.createElement(ne.Z,{isText:!0,isLoading:l,onClick:m},c)))}))),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 u="iOS"===n.Lt||"Android"===n.Lt;switch((0,g.ZP)(!u&&"authorizationStateWaitPhoneNumber"===e||u&&"authorizationStateWaitQrCode"===e,(()=>{u?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 u?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)(),Z=()=>{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"),u.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.d87e612a2f2945a65d28.js.map \ No newline at end of file diff --git a/dist/main.d87e612a2f2945a65d28.js.map b/dist/main.d87e612a2f2945a65d28.js.map deleted file mode 100644 index 71f66ed93..000000000 --- a/dist/main.d87e612a2f2945a65d28.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"main.d87e612a2f2945a65d28.js","mappings":"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E,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,CAAC2xC,EAAE,SAAS1xC,EAAED,GAAG,IAAI5uC,EAAE0xD,EAAE7iB,EAAED,GAAG,QAAG,IACje5uC,EAAE,MAAMjG,MAAM,6BAA6B80C,EAAE,sBAAsBD,GAAGC,EAAE7uC,EAAEnD,OAAO,EAAE+xC,EAAE,GAAG,IAAI,IAAItwB,EAAE,EAAEA,EAAEuwB,EAAEvwB,GAAG,EAAE,IAAI,IAAI0vD,EAAEhuE,EAAE,EAAEse,GAAG4gE,EAAEl/E,EAAE,EAAEse,EAAE,GAAG9gB,EAAEwC,EAAE,EAAEse,EAAE,GAAG0C,EAAE,EAAEA,EAAEgtD,EAAEhtD,GAAG,EAAE,CAAC,IAAIm/D,EAAE3iF,EAAE4rD,EAAE,GAAGA,EAAE4oB,EAAEkN,EAAE91B,EAAEjsD,EAAEgjF,EAAEvxC,EAAE/wC,KAAKurD,GAAG,OAAOxa,IAPkQ,GAOlP,OAAO0wC,EAnBoE,IAoB9S,mBCgFA,IAAelgF,EAAAA,EAAAA,KAAKiD,EAAAA,EAAAA,KACjBuI,IACC,MAAM,gBACJ8jB,EADI,UACa+F,EADb,WACwBO,EAAYzE,UAAY+B,OAAO,SAAEwB,KAC3DlpB,EAEJ,MAAO,CACL8jB,gBAAAA,EACA+F,UAAAA,EACAO,WAAAA,EACAlB,SAAAA,MAGJ,CAACvxB,EAAWC,KAA2BC,EAAAA,EAAAA,IAAKD,EAAS,CACnD,0BAA2B,sBAdXH,EA7E6B,EAC/CqsB,gBAAAA,EACA+F,UAAAA,EACAO,WAAAA,EACAlB,SAAAA,EACA+tD,wBAAAA,EACA5tD,iBAAAA,MAEA,MAAMymD,EAAoBD,KACpBn3E,GAAO8J,EAAAA,EAAAA,KAEP00E,GAAYx1E,EAAAA,EAAAA,IAAuB,MACnCowE,EAAeC,GAAcjC,EAAmB,2BAC/C7uE,EAAWqxE,EAAeC,IAAmB/C,EAAAA,EAAAA,MAEpDpqE,EAAAA,EAAAA,KAAU,KACR,IAAKglB,GAAkC,yBAApBtG,EACjB,OAGF,MAAMrd,EAAYywE,EAAU1zE,QAE5BiD,EAAU5J,UAAY,GACtB4J,EAAUgO,UAAU6Y,OAAO,eAE3B+mD,GAAAA,OAAiB,CACf5/E,KAAO,oBAAgB21B,EAAW+sD,QAClCZ,OAAQ,GACRD,QAAS,IACTT,KAAM,UACN33E,KAAM,KACLuI,KACF,CAACqd,EAAiBsG,KAErBhlB,EAAAA,EAAAA,KAAU,KACgB,yBAApB0e,IACG4F,EAAAA,EAAAA,IAAY3c,EAAAA,MAElB,CAAC+W,IAEJ,MAAMgvD,GAAmB39E,EAAAA,EAAAA,KAAY,KACnCm9E,KAEK5oD,EAAAA,EAAAA,IAAYomD,GAAmB,KAClCyC,IAEAlpD,EAAiB,CAAEH,SAAU4mD,SAE9B,CAACwC,EAAejpD,EAAkBymD,EAAmByC,IAElDiB,EAA4B,iCAAd3pD,EAEpB,OACE,0BAAK7xB,GAAG,eAAetD,UAAU,iBAC/B,0BAAKA,UAAU,gBACZ01B,EACC,0BAAKtR,IAAI,eAAepkB,UAAU,2BAA2B2L,IAAK62E,IAElE,0BAAKp+D,IAAI,aAAapkB,UAAU,cAAa,mBAACm/E,GAAA,EAAD,OAE/C,6BAAKn7E,EAAK,mBACV,6BACE,6BAAI,+BAAOA,EAAK,oBAChB,6BAAI,gCAAO2B,EAAAA,GAAAA,GAAW3B,EAAK,kBAAmB,CAAC,sBAC/C,6BAAI,+BAAOA,EAAK,qBAEjB86E,GACC,mBAACI,GAAA,EAAD,CAAQ5yE,QAAM,EAAC/K,QAASghF,GAA0Bv+E,EAAK,oBAExDo3E,GAAqBA,IAAsB5mD,GAAY4oD,GACtD,mBAAC8B,GAAA,EAAD,CAAQ5yE,QAAM,EAACC,UAAWA,EAAWhL,QAAS68E,GAAmBhB,SC3B3E,IAAet9E,EAAAA,EAAAA,KAAKiD,EAAAA,EAAAA,KACjBuI,IAAuBnI,EAAAA,EAAAA,IAAKmI,EAAQ,CAAC,gBACtC,CAACA,EAAQpI,KAA2BC,EAAAA,EAAAA,IAAKD,EAAS,CAAC,QAAS,UAAW,0BAA2B,oBAFhFH,EAlDyB,EAC3CoyB,UAAAA,EAAWrG,MAAAA,EAAOn2B,QAAAA,EAAS4pF,wBAAAA,EAAyBpF,eAAAA,OAEpDzsE,EAAAA,EAAAA,KAAU,KACRoe,IACAn2B,MACC,CAACm2B,EAAOn2B,IAEX,MAAM+pF,EAA4B,QAAjB/0D,EAAAA,IAA2C,YAAjBA,EAAAA,GAwB3C,QAdA/c,EAAAA,EAAAA,KACI8xE,GAA0B,sCAAdvtD,GACVutD,GAA0B,iCAAdvtD,GAVsB,KACjCutD,EAGHH,IAFApF,QAYJzsE,EAAAA,EAAAA,KAAU,KACRsgE,EAAAA,EAAAA,iBAEO,KACLA,EAAAA,EAAAA,mBAED,IAEK77C,GACN,IAAK,6BACH,OAAO,mBAAC,EAAD,CAAUqrC,KAAK,WAAWp8C,IAAI,YAAW,mBAAC,GAAD,OAClD,IAAK,iCACH,OAAO,mBAAC,EAAD,CAAUo8C,KAAK,eAAep8C,IAAI,gBAAe,mBAAC,GAAD,OAC1D,IAAK,qCACH,OAAO,mBAAC,GAAD,MACT,IAAK,oCACH,OAAO,mBAAC,EAAD,CAAUo8C,KAAK,kBAAkBp8C,IAAI,mBAAkB,mBAAC,GAAD,OAChE,IAAK,+BACH,OAAO,mBAAC,EAAD,CAAUo8C,KAAK,aAAap8C,IAAI,cAAa,mBAACu+D,GAAD,OACtD,QACE,OAAOD,EACH,mBAAC,EAAD,CAAUliB,KAAK,kBAAkBp8C,IAAI,mBAAkB,mBAAC,GAAD,OACvD,mBAAC,EAAD,CAAUo8C,KAAK,aAAap8C,IAAI,cAAa,mBAACu+D,GAAD,YC1DvD,IAAe7iF,EAAAA,EAAAA,KANO,KACpB,MAAMqjE,GAAOkc,EAAAA,GAAAA,GAAgBtc,EAAAA,GAAAA,KAAc,QAE3C,OAAOI,EAAO,mBAACA,EAAD,WAAWngE,K,eCD3B,MAuBA,GAvBwB,IAMpB,0BAAKM,GAAG,eACN,0BAAKtD,UAAU,WACb,0BAAKiK,IAAK24E,GAAiB14E,IAAI,KAC/B,yBAAIlK,UAAU,SAAd,yBACA,0BAAKA,UAAU,eAAf,sDAEE,8BAFF,mEAKA,0BAAKA,UAAU,WACb,mBAACk/E,GAAA,EAAD,CAAQ5yE,QAAM,EAACK,QAAM,EAACpL,QAfT,KACnBrH,OAAOY,SAASC,WAcV,iBCoCV,SAAS8nF,KACP,OACE,mBAAC,EAAD,CAAUriB,KAAK,OAAOp8C,IAAI,QACxB,mBAAC,GAAD,OAKN,UAAerhB,EAAAA,EAAAA,KACZuI,IAAuBnI,EAAAA,EAAAA,IAAKmI,EAAQ,CAAC,gBACtC,CAACrI,EAAWC,KAA2BC,EAAAA,EAAAA,IAAKD,EAAS,CAAC,gBAFxD,EA9C4C,EAAGiyB,UAAAA,EAAW2tD,WAAAA,MACxD,MAAOC,EAAYC,IAAgBlI,EAAAA,EAAAA,IAAQ,GAc3C,IAZApqE,EAAAA,EAAAA,KAAU,MACRugE,EAAAA,EAAAA,KfRFn3E,EeS6B,KACzBgpF,IACA/gF,SAASX,MAAS,GAAEqR,EAAAA,KAAaC,EAAAA,KAEjCswE,OAED,CAACF,EAAYE,IAIZD,EACF,OAAO,mBAAC,GAAD,MAGT,GAAI5tD,EACF,OAAQA,GACN,IAAK,oCACL,IAAK,6BACL,IAAK,iCACL,IAAK,qCACL,IAAK,+BACH,OAAO,mBAAC,GAAD,MACT,IAAK,2BACL,IAAK,4BACL,IAAK,+BACL,IAAK,0BACH,OAAO0tD,KAIb,OAAOzW,EAAAA,EAAAA,KAAiB,GAAQyW,KAAe,mBAAC,GAAD,SC1C7C/pF,EAAAA,IAEFC,QAAQC,IAAI,aAGdqH,EAAAA,EAAAA,MAAc8uB,OAEVr2B,EAAAA,IAEFC,QAAQC,IAAI,4BAGdiqF,EAAAA,EAAAA,OACE,mBAAC,GAAD,MACAlhF,SAASs6E,eAAe,SAGtBvjF,EAAAA,IAEFC,QAAQC,IAAI,6BAGd+I,SAAS5I,iBAAiB,YAAY,KAEpCJ,QAAQqC,KAAK,gBAAgBwxB,EAAAA,EAAAA,W","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,\"472\":1,\"477\":1,\"532\":1,\"886\":1,\"977\":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 seenByUserIds?: string[];\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 result.push(part);\n return result;\n }\n\n divEl.innerText = part;\n result.push(divEl.innerHTML);\n\n return result;\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 result.push(part);\n return result;\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: TextPart[], part) => {\n if (typeof part !== 'string') {\n result.push(part);\n return result;\n }\n\n const splittenParts = 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\n return [...result, ...splittenParts];\n }, []);\n}\n\nfunction addHighlight(textParts: TextPart[], highlight: string | undefined): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string' || !highlight) {\n result.push(part);\n return result;\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 result.push(part);\n return result;\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 result.push(part);\n return result;\n }\n\n const links = part.match(RE_LINK);\n if (!links || !links.length) {\n result.push(part);\n return result;\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 result.push(part);\n return result;\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// TODO Get values from `getConfig` method once it's available\nexport const SEEN_BY_MEMBERS_CHAT_MAX = 50;\nexport const SEEN_BY_MEMBERS_EXPIRE = 604680; // One week - 2 min\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\nconst ANIMATION_START_EVENT = 'tt-event-heavy-animation-start';\nconst ANIMATION_END_EVENT = 'tt-event-heavy-animation-end';\n\nlet timeout: number | undefined;\nlet isAnimating = false;\n\n// Make sure to end even if end callback was not called (which was some hardly-reproducible bug)\nconst AUTO_END_TIMEOUT = 1000;\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\nexport function isHeavyAnimating() {\n return isAnimating;\n}\n\nexport function dispatchHeavyAnimationEvent(duration = AUTO_END_TIMEOUT) {\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 // Race condition may happen if another `dispatchHeavyAnimationEvent` is called before `onEnd`\n function onEnd() {\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n isAnimating = false;\n document.dispatchEvent(new Event(ANIMATION_END_EVENT));\n }\n\n timeout = window.setTimeout(onEnd, duration);\n\n return onEnd;\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', 'role']);\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 // eslint-disable-next-line no-null/no-null\n if (DEBUG && isRealElement($newChild) && (key === undefined || key === null)) {\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 // eslint-disable-next-line no-null/no-null\n const isKeyPresent = key !== undefined && key !== null;\n\n // First we handle removed children\n if (isKeyPresent && !newKeys.has(key)) {\n renderWithVirtual(currentEl, $currentChild, undefined, $new, -1);\n\n return acc;\n } else if (!isKeyPresent) {\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-') || key.startsWith('aria-') || 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-') || key.startsWith('aria-') || 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\nconst DEBUG_RENDER_THRESHOLD = 7;\nconst DEBUG_EFFECT_THRESHOLD = 7;\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 duration = performance.now() - DEBUG_startAt!;\n const componentName = componentInstance.name;\n if (duration > DEBUG_RENDER_THRESHOLD) {\n // eslint-disable-next-line no-console\n console.warn(`[Teact] Slow component render: ${componentName}, ${Math.round(duration)} ms`);\n }\n DEBUG_components[componentName].renderTimes.push(duration);\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 // 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 cleanup();\n\n if (DEBUG) {\n const duration = performance.now() - DEBUG_startAt!;\n const componentName = componentInstance.name;\n if (duration > DEBUG_EFFECT_THRESHOLD) {\n // eslint-disable-next-line no-console\n console.warn(\n `[Teact] Slow cleanup at effect cursor #${cursor}: ${componentName}, ${Math.round(duration)} ms`,\n );\n }\n }\n } catch (err) {\n handleError(err);\n }\n }\n }\n\n function exec() {\n if (!componentInstance.isMounted) {\n return;\n }\n\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 byCursor[cursor].cleanup = effect() as Function;\n\n if (DEBUG) {\n const duration = performance.now() - DEBUG_startAt!;\n const componentName = componentInstance.name;\n if (duration > DEBUG_EFFECT_THRESHOLD) {\n // eslint-disable-next-line no-console\n console.warn(`[Teact] Slow effect at cursor #${cursor}: ${componentName}, ${Math.round(duration)} ms`);\n }\n }\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 {\n GlobalState, GlobalActions, ActionTypes, DispatchOptions,\n} from '../../global/types';\nimport { handleError } from '../../util/handleError';\nimport { isHeavyAnimating } from '../../hooks/useHeavyAnimationCheck';\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\nconst runCallbacksThrottled = throttleWithRaf(runCallbacks);\n\nfunction runCallbacks(forceOnHeavyAnimation = false) {\n if (!forceOnHeavyAnimation && isHeavyAnimating()) {\n runCallbacksThrottled();\n return;\n }\n\n callbacks.forEach((cb) => cb(currentGlobal));\n}\n\nexport function setGlobal(newGlobal?: GlobalState, options?: DispatchOptions) {\n if (typeof newGlobal === 'object' && newGlobal !== currentGlobal) {\n currentGlobal = newGlobal;\n if (options?.forceSyncOnIOs) {\n runCallbacks(true);\n } else {\n runCallbacksThrottled(options?.forceOnHeavyAnimation);\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, options?: DispatchOptions) {\n if (reducers[name]) {\n reducers[name].forEach((reducer) => {\n const newGlobal = reducer(currentGlobal, actions, payload);\n if (newGlobal) {\n setGlobal(newGlobal, options);\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, options?: DispatchOptions) => {\n onDispatch(name, payload, options);\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 });\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_SAFARI, 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 if (IS_SAFARI) {\n document.body.classList.add('is-safari');\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 }, { forceSyncOnIOs: 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 { GlobalState } from '../../global/types';\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';\nimport { prepareSearchWordsForNeedle } from '../../util/searchWords';\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 allListIds: GlobalState['chats']['listIds'],\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n notifySettings: NotifySettings,\n notifyExceptions?: Record,\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 = ([] as string[]).concat(allListIds.active || [], allListIds.archived || [])\n .filter((id) => {\n const chat = chatsById[id];\n return chat && filterChatFolder(\n chat,\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\n// This function is the most expensive in the project, so any possible optimizations are welcome\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 const { id: chatId, type, unreadMentionsCount } = chat;\n\n if (excludedChatIds?.has(chatId)) {\n return false;\n }\n\n if (includedChatIds?.has(chatId)) {\n return true;\n }\n\n if (pinnedChatIds?.has(chatId)) {\n return true;\n }\n\n if (folder.excludeArchived && chat.folderId === ARCHIVED_FOLDER_ID) {\n return false;\n }\n\n if (folder.excludeRead && !chat.unreadCount && !unreadMentionsCount && !chat.hasUnreadMark) {\n return false;\n }\n\n if (folder.excludeMuted && !unreadMentionsCount && selectIsChatMuted(chat, notifySettings, notifyExceptions)) {\n return false;\n }\n\n if (type === 'chatTypePrivate') {\n const user = usersById[chatId];\n if (user) {\n const { type: userType, isContact } = user;\n\n if (userType === 'userTypeBot') {\n if (folder.bots) {\n return true;\n }\n } else {\n if (folder.contacts && isContact) {\n return true;\n }\n\n if (folder.nonContacts && !isContact) {\n return true;\n }\n }\n }\n } else if (type === 'chatTypeChannel') {\n return !!folder.channels;\n } else if (type === 'chatTypeBasicGroup' || type === 'chatTypeSuperGroup') {\n return !!folder.groups;\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 noOrder = false,\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) && checkChat(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)) && checkChat(chat, folderType)) {\n acc.push(chat);\n }\n\n return acc;\n }, [] as ApiChat[]);\n\n return {\n pinnedChats,\n otherChats: noOrder ? otherChats : orderBy(otherChats, getChatOrder, 'desc'),\n };\n}\n\nfunction checkChat(chat: ApiChat, folderType: 'all' | 'archived' | 'folder') {\n return (\n chat.lastMessage && !chat.migratedTo && !chat.isRestricted && !chat.isNotJoined\n && !(folderType === 'all' && chat.folderId === ARCHIVED_FOLDER_ID)\n && !(folderType === 'archived' && chat.folderId !== ARCHIVED_FOLDER_ID)\n );\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 allListIds: GlobalState['chats']['listIds'],\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n notifySettings: NotifySettings,\n notifyExceptions?: Record,\n) {\n const [listIds] = prepareFolderListIds(allListIds, chatsById, usersById, folder, notifySettings, notifyExceptions);\n\n let hasActiveDialogs = false;\n const unreadDialogsCount = listIds.reduce((acc, id) => {\n const chat = chatsById[id];\n if (!chat?.lastMessage || chat?.isRestricted || chat?.isNotJoined) {\n return acc;\n }\n\n const isUnread = chat.unreadCount || chat.hasUnreadMark;\n\n if (isUnread) {\n acc++;\n }\n\n if (!hasActiveDialogs && (\n chat.unreadMentionsCount || (isUnread && !selectIsChatMuted(chat, notifySettings, notifyExceptions))\n )) {\n hasActiveDialogs = true;\n }\n\n return acc;\n }, 0);\n\n return {\n unreadDialogsCount,\n hasActiveDialogs,\n };\n}\n\nexport function getFolderDescriptionText(\n lang: LangFn,\n allListIds: GlobalState['chats']['listIds'],\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\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(allListIds, chatsById, usersById, folder, 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 allListIds: GlobalState['chats']['listIds'],\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n notifySettings: NotifySettings,\n notifyExceptions?: Record,\n) {\n const [listIds, pinnedIds] = prepareFolderListIds(\n allListIds, chatsById, usersById, folder, notifySettings, notifyExceptions,\n );\n const { pinnedChats, otherChats } = prepareChatList(chatsById, listIds, pinnedIds, 'folder', true);\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\nexport function filterChatsByName(\n lang: LangFn,\n chatIds: string[],\n chatsById: Record,\n query?: string,\n currentUserId?: string,\n) {\n if (!query) {\n return chatIds;\n }\n\n const searchWords = prepareSearchWordsForNeedle(query);\n\n return chatIds.filter((id) => {\n const chat = chatsById[id];\n if (!chat) {\n return false;\n }\n\n return searchWords(getChatTitle(lang, chat, undefined, id === currentUserId));\n });\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, ApiUserStatus } 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';\nimport { prepareSearchWordsForNeedle } from '../../util/searchWords';\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(\n lang: LangFn, user: ApiUser, userStatus: ApiUserStatus | undefined, serverTimeOffset: number,\n) {\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 (!userStatus) {\n return '';\n }\n\n switch (userStatus.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 } = userStatus;\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, userStatus?: ApiUserStatus) {\n const { id, type } = user;\n\n if (!userStatus) {\n return false;\n }\n\n if (id === SERVICE_NOTIFICATIONS_USER_ID) {\n return false;\n }\n\n return userStatus.type === 'userStatusOnline' && type !== 'userTypeBot';\n}\n\nexport function isDeletedUser(user: ApiUser) {\n if (user.noStatus || 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 userStatusesById: 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 const userStatus = userStatusesById[id];\n if (!user || !userStatus) {\n return 0;\n }\n\n if (userStatus.type === 'userStatusOnline') {\n return userStatus.expires;\n } else if (userStatus.type === 'userStatusOffline' && userStatus.wasOnline) {\n return userStatus.wasOnline;\n }\n\n switch (userStatus.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 filterUsersByName(userIds: string[], usersById: Record, query?: string) {\n if (!query) {\n return userIds;\n }\n\n const searchWords = prepareSearchWordsForNeedle(query);\n\n return userIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n\n const name = getUserFullName(user);\n return (name && searchWords(name)) || searchWords(user.username);\n });\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\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 if (!updatedChat) {\n return global;\n }\n\n return replaceChats(global, {\n ...byId,\n [chatId]: updatedChat,\n });\n}\n\nexport function updateChats(global: GlobalState, newById: Record): GlobalState {\n const updatedById = Object.keys(newById).reduce((acc: Record, id) => {\n const updatedChat = getUpdatedChat(global, id, newById[id]);\n if (updatedChat) {\n acc[id] = updatedChat;\n }\n\n return acc;\n }, {});\n\n global = replaceChats(global, {\n ...global.chats.byId,\n ...updatedById,\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, newById: Record): GlobalState {\n const { byId } = global.chats;\n let isUpdated = false;\n\n const addedById = Object.keys(newById).reduce>((acc, id) => {\n if (!byId[id] || (byId[id].isMin && !newById[id].isMin)) {\n const updatedChat = getUpdatedChat(global, id, newById[id]);\n if (updatedChat) {\n acc[id] = updatedChat;\n if (!isUpdated) {\n isUpdated = true;\n }\n }\n }\n return acc;\n }, {});\n\n if (!isUpdated) {\n return global;\n }\n\n global = replaceChats(global, {\n ...byId,\n ...addedById,\n });\n\n return global;\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) {\n const { byId } = global.chats;\n const chat = byId[chatId];\n const shouldOmitMinInfo = chatUpdate.isMin && chat && !chat.isMin;\n const updatedChat: ApiChat = {\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 undefined;\n }\n\n return updatedChat;\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, ApiUserStatus } from '../../api/types';\n\nimport { omit, pick } 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\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 if (!updatedUser) {\n return global;\n }\n\n global = updateContactList(global, [updatedUser]);\n\n return replaceUsers(global, {\n ...byId,\n [userId]: updatedUser,\n });\n}\n\nexport function updateUsers(global: GlobalState, newById: Record): GlobalState {\n const updatedById = Object.keys(newById).reduce((acc: Record, id) => {\n const updatedUser = getUpdatedUser(global, id, newById[id]);\n if (updatedUser) {\n acc[id] = updatedUser;\n }\n\n return acc;\n }, {});\n\n global = replaceUsers(global, {\n ...global.users.byId,\n ...updatedById,\n });\n\n global = updateContactList(global, Object.values(updatedById));\n\n return global;\n}\n\n// @optimization Allows to avoid redundant updates which cause a lot of renders\nexport function addUsers(global: GlobalState, newById: Record): GlobalState {\n const { byId } = global.users;\n let isUpdated = false;\n\n const addedById = Object.keys(newById).reduce>((acc, id) => {\n if (!byId[id] || (byId[id].isMin && !newById[id].isMin)) {\n const updatedUser = getUpdatedUser(global, id, newById[id]);\n if (updatedUser) {\n acc[id] = updatedUser;\n if (!isUpdated) {\n isUpdated = true;\n }\n }\n }\n return acc;\n }, {});\n\n if (!isUpdated) {\n return global;\n }\n\n global = replaceUsers(global, {\n ...byId,\n ...addedById,\n });\n\n global = updateContactList(global, Object.values(addedById));\n\n return global;\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) {\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 undefined;\n }\n\n return updatedUser;\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\nexport function replaceUserStatuses(global: GlobalState, newById: Record): GlobalState {\n return {\n ...global,\n users: {\n ...global.users,\n statusesById: newById,\n },\n };\n}\n\n// @optimization Allows to avoid redundant updates which cause a lot of renders\nexport function addUserStatuses(global: GlobalState, newById: Record): GlobalState {\n const { statusesById } = global.users;\n\n const newKeys = Object.keys(newById).filter((id) => !statusesById[id]);\n if (!newKeys.length) {\n return global;\n }\n\n global = replaceUserStatuses(global, {\n ...statusesById,\n ...pick(newById, newKeys),\n });\n\n return global;\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 (\n userId !== global.currentUserId\n && global.users.byId[userId]\n && isUserOnline(global.users.byId[userId], global.users.statusesById[userId])\n ) {\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, ApiUserStatus } from '../../api/types';\n\nexport function selectUser(global: GlobalState, userId: string): ApiUser | undefined {\n return global.users.byId[userId];\n}\n\nexport function selectUserStatus(global: GlobalState, userId: string): ApiUserStatus | undefined {\n return global.users.statusesById[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\nexport type TimingFn = (t: number) => number;\n\nexport type AnimateNumberProps = {\n to: number | number[];\n from: number | number[];\n duration: number;\n onUpdate: (value: any) => void;\n timing?: TimingFn;\n onEnd?: () => void;\n};\n\nexport const timingFunctions = {\n linear: (t: number) => t,\n easeIn: (t: number) => t ** 1.675,\n easeOut: (t: number) => 1 - (1 - t ** 1.675),\n easeInOut: (t: number) => 0.5 * (Math.sin((t - 0.5) * Math.PI) + 1),\n easeInQuad: (t: number) => t * t,\n easeOutQuad: (t: number) => t * (2 - t),\n easeInOutQuad: (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n easeInCubic: (t: number) => t * t * t,\n easeOutCubic: (t: number) => (--t) * t * t + 1,\n easeInOutCubic: (t: number) => (t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1),\n easeInQuart: (t: number) => t * t * t * t,\n easeOutQuart: (t: number) => 1 - (--t) * t * t * t,\n easeInOutQuart: (t: number) => (t < 0.5 ? 8 * t * t * t * t : 1 - 8 * (--t) * t * t * t),\n easeInQuint: (t: number) => t * t * t * t * t,\n easeOutQuint: (t: number) => 1 + (--t) * t * t * t * t,\n easeInOutQuint: (t: number) => (t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * (--t) * t * t * t * t),\n};\n\nexport function animateNumber({\n timing = timingFunctions.linear,\n onUpdate,\n duration,\n onEnd,\n from,\n to,\n}: AnimateNumberProps) {\n const t0 = Date.now();\n let canceled = false;\n\n animate(() => {\n if (canceled) return false;\n const t1 = Date.now();\n let t = (t1 - t0) / duration;\n if (t > 1) t = 1;\n const progress = timing(t);\n if (typeof from === 'number' && typeof to === 'number') {\n onUpdate(from + ((to - from) * progress));\n } else if (Array.isArray(from) && Array.isArray(to)) {\n const result = from.map((f, i) => f + ((to[i] - f) * progress));\n onUpdate(result);\n }\n if (t === 1 && onEnd) onEnd();\n return t < 1;\n });\n\n return () => {\n canceled = true;\n if (onEnd) onEnd();\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 =\n 'asc'\n | '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 orderRule: (keyof T) | OrderCallback | ((keyof T) | OrderCallback)[],\n mode: OrderDirection | [OrderDirection, OrderDirection] = 'asc',\n): T[] {\n function compareValues(a: T, b: T, currentOrderRule: (keyof T) | OrderCallback, isAsc: boolean) {\n const aValue = (typeof currentOrderRule === 'function' ? currentOrderRule(a) : a[currentOrderRule]) || 0;\n const bValue = (typeof currentOrderRule === 'function' ? currentOrderRule(b) : b[currentOrderRule]) || 0;\n\n return isAsc ? aValue - bValue : bValue - aValue;\n }\n\n if (Array.isArray(orderRule)) {\n const [mode1, mode2] = Array.isArray(mode) ? mode : [mode, mode];\n const [orderRule1, orderRule2] = orderRule;\n const isAsc1 = mode1 === 'asc';\n const isAsc2 = mode2 === 'asc';\n\n return collection.sort((a, b) => {\n return compareValues(a, b, orderRule1, isAsc1) || compareValues(a, b, orderRule2, isAsc2);\n });\n }\n\n const isAsc = mode === 'asc';\n return collection.sort((a, b) => {\n return compareValues(a, b, orderRule, isAsc);\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\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 fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n waitingTimeout = self.setTimeout(() => {\n if (shouldRunLast) {\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 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 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 fn(...args);\n });\n }\n };\n}\n\nexport function onIdle(cb: NoneToVoidFunction, timeout?: number) {\n // eslint-disable-next-line no-restricted-globals\n if (self.requestIdleCallback) {\n // eslint-disable-next-line no-restricted-globals\n self.requestIdleCallback(cb, { timeout });\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 | string[]) {\n if (!haystack || !needle) {\n return false;\n }\n\n const needleWords = typeof needle === 'string' ? needle.toLowerCase().split(RE_NOT_LETTER) : needle;\n const haystackLower = haystack.toLowerCase();\n\n // @optimization\n if (needleWords.length === 1 && !haystackLower.includes(needleWords[0])) {\n return false;\n }\n\n let haystackWords: string[];\n\n return needleWords.every((needleWord) => {\n if (!haystackLower.includes(needleWord)) {\n return false;\n }\n\n if (!haystackWords) {\n haystackWords = haystackLower.split(RE_NOT_LETTER);\n }\n\n return haystackWords.some((haystackWord) => haystackWord.startsWith(needleWord));\n });\n}\n\nexport function prepareSearchWordsForNeedle(needle: string) {\n const needleWords = needle.toLowerCase().split(RE_NOT_LETTER);\n\n return (haystack: string) => searchWords(haystack, needleWords);\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\":\"4f4ca33bcc5de5731151\",\"161\":\"286d0207d962142ad548\",\"354\":\"b752615a082133d9d0a3\",\"472\":\"21e5264f606f2b525030\",\"477\":\"a474b061825f5523f240\",\"501\":\"72ce4b6e27f459e194cd\",\"524\":\"df43ecd790ed09f3bb50\",\"532\":\"a0f46b886f04a00292c0\",\"536\":\"55dc7dd4ab42a2c9f037\",\"739\":\"19faf4bab45401118afe\",\"745\":\"9316c5c2b711c39a20a5\",\"884\":\"981e966423efd0c3b785\",\"886\":\"be294f2c708be32963bf\",\"915\":\"53f46f3c9677172ffcd6\",\"927\":\"2e770ec779b8804a5d34\",\"941\":\"e210d50ca759e57387c0\",\"977\":\"26046ea7d40cd4b1ed2c\",\"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\":\"4f4ca33bcc5de5731151\",\"472\":\"21e5264f606f2b525030\",\"477\":\"a474b061825f5523f240\",\"532\":\"a0f46b886f04a00292c0\",\"886\":\"be294f2c708be32963bf\",\"977\":\"26046ea7d40cd4b1ed2c\"}[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, DEBUG_MORE } 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_MORE) {\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 statusesById: {},\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 { isHeavyAnimating } 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 unsubscribeFromBeforeUnload: NoneToVoidFunction | undefined;\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) {\n cached.groupCalls = initialState.groupCalls;\n }\n\n if (!cached.users.statusesById) {\n cached.users.statusesById = {};\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, statusesById, selectedId } } = global;\n const chatIds = (global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT).filter(isUserId);\n const userIds = Object.keys(byId);\n const idsToSave = chatIds.concat(userIds).slice(0, GLOBAL_STATE_CACHE_USER_LIST_LIMIT);\n\n return {\n byId: pick(byId, idsToSave),\n statusesById: pick(statusesById, 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 newListIds = (global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT);\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const idsToSave = newListIds.concat(currentChatId ? [currentChatId] : []);\n\n return {\n ...global.chats,\n byId: pick(global.chats.byId, idsToSave),\n listIds: {\n active: newListIds,\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 chatIds = (global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT);\n const chatIdsToSave = chatIds.concat(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","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 { prepareSearchWordsForNeedle } 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 if (!filter.length) {\n return countryList;\n }\n\n const searchWords = prepareSearchWordsForNeedle(filter);\n\n return countryList.filter((country) => (\n searchWords(country.defaultName) || (country.name && searchWords(country.name))\n ));\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 useEffect(() => {\n if (connectionState === 'connectionStateReady') {\n void setLanguage(DEFAULT_LANG_CODE);\n }\n }, [connectionState]);\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","splittenParts","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","SEEN_BY_MEMBERS_CHAT_MAX","SEEN_BY_MEMBERS_EXPIRE","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","handleAnimationStart","handleAnimationEnd","removeEventListener","isHeavyAnimating","duration","onEnd","clearTimeout","dispatchEvent","Event","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","isKeyPresent","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","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","runCallbacksThrottled","runCallbacks","forceOnHeavyAnimation","newGlobal","forceSyncOnIOs","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","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","IS_SAFARI","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","allListIds","folder","excludedChatIds","includedChatIds","pinnedChatIds","active","archived","isListed","unreadMentionsCount","excludeArchived","excludeRead","unreadCount","hasUnreadMark","excludeMuted","userType","isContact","bots","contacts","nonContacts","channels","groups","filterChatFolder","prepareChatList","listIds","orderedPinnedIds","folderType","noOrder","listIdsSet","orderedPinnedIdsSet","pinnedChats","checkChat","otherChats","reduceChatList","chatArrays","filteredIds","filteredIdsSet","getFolderUnreadDialogs","hasActiveDialogs","unreadDialogsCount","isUnread","getFolderDescriptionText","emoticon","description","pinnedIds","getFolderChatsCount","getMessageSenderName","getUserFirstOrLastName","sortChatIds","chatIds","shouldPrioritizeVerified","priorityIds","priority","isVerified","filterChatsByName","query","searchWords","prepareSearchWordsForNeedle","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","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","userStatus","wasOnline","getTime","wasOnlineDate","diff","today","setHours","yesterday","setDate","getDate","formatFullDate","isUserOnline","noStatus","isUserBot","getCanAddContact","sortUserIds","userIds","userStatusesById","getServerTime","expires","filterUsersByName","getUserIdDividend","abs","getUserColorKey","peer","replaceChatListIds","newIds","updateChatListIds","idsUpdate","replaceChats","newById","updateChat","chatUpdate","updatedChat","getUpdatedChat","updatedById","addChats","isUpdated","addedById","isMin","shouldOmitMinInfo","omit","photos","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","updateContactList","updatedUsers","contactUserIds","contactList","newContactUserIds","userUpdate","updatedUser","getUpdatedUser","updateUsers","updateSelectedUserId","selectedId","deleteUser","MEMO_EMPTY_ARRAY","updateUserSearch","searchStatePartial","userSearch","updateUserSearchFetchingStatus","newState","fetchingStatus","updateUserBlockedState","isBlocked","replaceUserStatuses","statusesById","addUserStatuses","getComplexKey","updateGlobalSearch","globalSearch","updateGlobalSearchContent","currentContent","updateGlobalSearchResults","newFoundMessages","nextRate","resultsByType","newFoundMessagesById","foundIdsForType","foundIds","updateGlobalSearchFetchingStatus","prevFoundIds","newFoundIds","foundOrPrevFoundIds","nextOffsetId","replaceLocalTextSearch","chatThreadKey","searchParams","localTextSearch","byChatThreadKey","updateLocalTextSearch","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","selectIsChatListed","targetList","list","selectChatFolder","chatFolders","selectIsChatPinned","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","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","selectUserStatus","selectIsUserBlocked","LoadMoreDirection","FocusDirection","SettingsScreens","LeftColumnContent","GlobalSearchContent","MediaViewerOrigin","AudioOrigin","ChatCreationProgress","ManagementProgress","ProfileState","PaymentStep","ManagementScreens","currentInstance","animateSingle","tick","instance","isCancelled","animate","timingFunctions","linear","easeIn","easeOut","easeInOut","sin","PI","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","animateNumber","timing","t0","canceled","f","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","orderRule","mode","compareValues","currentOrderRule","isAsc","aValue","bValue","mode1","mode2","orderRule1","orderRule2","isAsc1","isAsc2","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","privateChatUser","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","haystack","needle","needleWords","haystackLower","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","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","hasErrorKey","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","setupCaching","clearCaching","reducedGlobal","reduceShowChatInfo","reduceUsers","reduceChats","reduceMessages","recentlyFoundChatIds","reduceSettings","reduceChatFolders","reduceGroupCalls","idsToSave","newListIds","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 acac71dea..bb88aa4e2 100644 --- a/dist/report.html +++ b/dist/report.html @@ -3,7 +3,7 @@ - telegram-t [24 Dec 2021 at 01:38] + telegram-t [25 Dec 2021 at 12:42]